| Ваш IP: 34.204.43.11 | Online(27) - гости: 14, боты: 13 | Загрузка сервера: 0.72 ::::::::::::


Часы с будильником (Arduino)

Часы с будильником состоят из  нескольких компонентов:

  • Arduino Nano(Uno)
  • Индикатор 1602 на базе контроллера HD44780
  • Пьезоизлучатель (пищалка)
  • Три кнопки + 3 резистора на 6,8…10 кОм

Основой программы часов служит библиотека MsTimer2, которая позволяет получить точные интервалы времени.

MsTimer2 это маленькая и простая в использовании библиотека служит «интерфейсом» между timer2 и пользователем. Она позволяет периодически запускать нужную функцию и настраивать, какой будет продолжительность у этого периода. Она называется «MsTimer2», потому что «зашивает» в timer2 разрешение в 1 миллисекунду (ms).

Соберите схему показанную на рисунке:

Пользоваться часами-будильником очень просто, для начала необходимо установить правильное время, для этого надо нажать один раз кнопку «К» для корректировки минут, и при помощи кнопок + или — установить минуты, далее нажмите кнопку «К» второй раз и установите показания часов. Аналогично устанавливается время будильника если продолжить нажимать кнопку «К». При пятом нажатии кнопки «К» можно включить или отключить будильник (on | off). Шестое нажатие кнопки «К» выключит режим корректировки.

Когда время часов и время будильника будут равны, будет слышен звуковой сигнал в течении минуты, если нажать кнопку + или — звуковой сигнал прекратится.

#include <LiquidCrystal.h>
#include <MsTimer2.h> 
LiquidCrystal lcd(7, 8, 9, 10, 11, 12);// RS,E,D4,D5,D6,D7

unsigned long time0;
byte bud=0, bud0=1, s, m, h, m1, h1, kn, kn1, kn2, korr;

void setup(){ 
  lcd.begin(16, 2);// LCD 16X2
  MsTimer2::set(1000, to_Timer); // задаем период 1с
  MsTimer2::start(); // старт таймера
  pinMode(6,INPUT); // кнопка коррекции
  pinMode(5,INPUT); // кнопка +
  pinMode(4,INPUT); // кнопка -
  pinMode(3,OUTPUT); // выход для пъезоизлучателя
}

void to_Timer(){ //функция таймера
  ++s; // отсчет 1 с
}

void loop(){
  // читаем состояние входов
  kn=digitalRead(6);
  kn1=digitalRead(5);
  kn2=digitalRead(4);
  // коррекция времени, опрос кнопок
  if(kn==HIGH){
    korr++;
    if(korr>=6){
      korr=0;
    }
  }
  if(kn1==HIGH && korr==1){
    m++;
  }
  if(kn1==HIGH && korr==2){
    h++;
  }
  if(kn2==HIGH && korr==1){
    m--;
    if(m>60){
      m=0;
    }
  }
  if(kn2==HIGH && korr==2){
    h--;
  }
  if(kn1==HIGH && korr==3){
    m1++;
    if(m1>59){
      m1=0;
      h1++;
    }
  }
  if(kn1==HIGH && korr==4){
    h1++;
    if(h1>23){
      h1=0;
    }
  }
  // коррекция будильника
  if(kn2==HIGH && korr==3){
    m1--;
    if(m1>60){
      m1=0;
    }
  }
  if(kn2==HIGH && korr==4){
    h1--;
    if(h1>24){
      h1=0;
    }
  }
  // активация и диактивация будильника
  if(kn1==HIGH && korr==5){
    bud0=1;
  }
  if(kn2==HIGH && korr==5){
    bud0=0;
  }

  // Отсчет времени часов
  if(s > 59){
    s = 0; 
    ++m; // отсчет 1 мин
  }
  if(m > 59){
    m = 0;
    ++h; // отсчет 1 час
  }
  if(h > 23){
    h = 0;
  }
  // включение будильника
  if(m!=m1){
    bud=0;
  };
  // запуск будильника
  if(m==m1 && h==h1 && bud==0 && bud0 == 1){
    if(kn1==HIGH || kn2==HIGH){
      bud=1;
    }
    for(int i=0;i<200;i++){ // пищалка
      digitalWrite(3,HIGH);
      delay(1);
      digitalWrite(3,LOW);
      delay(1);
    }
  }

  // вывод информации на экран 1 строка
  lcd.setCursor(1,0); 
  if(h < 10){
    lcd.print("0");
  }
  lcd.print(h); // часы
  lcd.print(":");
  if(m < 10 ){
    lcd.print("0");
  }
  lcd.print(m); // минуты
  lcd.print(":");
  if(s < 10){
    lcd.print("0");
  }
  lcd.print(s);// секунды
  if(korr==1){
    lcd.print(" kor_m");
  }
  if(korr==2){
    lcd.print(" kor_h");
  }
  // вывод информации на экран 1 строка
  lcd.setCursor(1,1);
  if(h1 < 10){
    lcd.print("0");
  }
  lcd.print(h1); // часы
  lcd.print(":");
  if(m1 < 10 ){
    lcd.print("0");
  }
  lcd.print(m1); // минуты

  if( bud0==1){
    lcd.print(" On  ");
  }
  if( bud0==0){
    lcd.print(" Off ");
  }

  if( bud0==1 && korr==5){
    lcd.print(" kor");
  }
  if( bud0==0 && korr==5){
    lcd.print(" kor ");
  }
  if(korr==3){
    lcd.print("kor_m");
  }
  if(korr==4){
    lcd.print("kor_h");
  }
  delay(200);
  lcd.clear();
}

 

Во второй версии часов с будильником улучшено управление коррекцией времени и будильника, добавлены дни недели, будильник можно активировать по будням, по выходным, каждый день или отключить.

#include <LiquidCrystal.h>
#include <MsTimer2.h>
LiquidCrystal lcd(7, 8, 9, 10, 11, 12);// RS,E,D4,D5,D6,D7

void setup(){ 
  lcd.begin(16, 2);// LCD 16X2
  MsTimer2::set(1000, to_Timer);// задаем период 1с
  MsTimer2::start();// старт таймера
  pinMode(A3,INPUT);// кнопка К
  pinMode(A4,INPUT);// кнопка +
  pinMode(A5,INPUT);// кнопка -
  pinMode(3,OUTPUT); // выход для пъезоизлучателя
  pinMode(4,OUTPUT); // 4 - выход TTL // можно что-то подключить 
}
byte s, m, h, m1, h1, dn0 = 1, dn = 1, korr, korr_time, i, korr_bud, bud;
int kn, kn1, kn2;
unsigned long time0;

void to_Timer(){ if(korr_time == 0){s++;} else{s = 0;}} 

void time() { 
  if(s > 59){s = 0;m++;} // отсчет 1 мин
  if(m > 59){m = 0;h++;} // отсчет 1 час
  if(h > 23){h = 0;dn++;}// отсчет дня недели
  if(dn > 7){dn = 1;}
}

void korr_Time(){  
  kn = analogRead(A3); kn1 = analogRead(A4); kn2 = analogRead(A5); 
  if(kn1 && kn2 > 600){korr_time = 1;korr = 1;}
  if(kn > 600 && korr_time == 1){korr++;if(korr >= 4){korr, korr_time = 0;time0 = millis();}}
  if(time0 - millis() <= 200){kn = 0;}
  if(kn1 > 600 && korr == 1){m++;}
  if(kn1 > 600 && korr == 2){h++;}
  if(kn2 > 600 && korr == 1){m--;if(m > 60){m = 0;}}
  if(kn2 > 600 && korr == 2){h--;if(h >= 24){h = 0;}}
  if(kn1 > 600 && korr == 3){dn++;}
  if(kn2 > 600 && korr == 3){dn--;}
}

void korr_Bud(){
  if(kn > 600 && korr_time == 0){korr_bud++;if(korr_bud >= 4){korr_bud = 0;}}
  if(kn1 > 600 && korr_bud == 1){m1++;if(m1 > 59){m1 = 0;}}
  if(kn2 > 600 && korr_bud == 1){m1--;if(m1 > 60){m1 = 0;}}
  if(kn1 > 600 && korr_bud == 2){h1++;if(h1 > 23){h1 = 0;}}
  if(kn2 > 600 && korr_bud == 2){h1--;if(h1 > 24){h1 = 0;}}  
  if(kn1 > 600 && korr_bud == 3){dn0++;if(dn0 >= 5){dn0 = 1;}}
  if(kn2 > 600 && korr_bud == 3){dn0--;if(dn0 >= 5){dn0 = 4;}}
}

void bip(){for(i = 0;i < 200;i++){ digitalWrite(3,HIGH);delay(1);digitalWrite(3,LOW);delay(1);}}// пищалка

void loop(){
  time(); korr_Time(); korr_Bud();

  // вывод информации на экран 1 строка
  lcd.setCursor(1,0);
  if(korr == 2 && i == 1){lcd.print("  ");}else{if(h < 10){lcd.print("0");}lcd.print(h);} // часы
  lcd.print(":");
  if(korr == 1 && i == 1){lcd.print("  ");}else{if(m < 10 ){lcd.print("0");}lcd.print(m);} // минуты
  lcd.print(":");
  if(s < 10){lcd.print("0");}
  lcd.print(s);// секунды
  lcd.print("  ");
  if(korr == 3 && i == 1){lcd.print("   ");}else{
    switch(dn){ // если lcd руссифицирован, указать русские названия дней недели
    case 1: lcd.print("Mon");break;
    case 2: lcd.print("Tue");break;
    case 3: lcd.print("Wed");break;
    case 4: lcd.print("Thu");break;
    case 5: lcd.print("Fri");break;
    case 6: lcd.print("Sat");break;
    case 7: lcd.print("Sun");break;
    }}

  // вывод информации на экран 2 строка
  lcd.setCursor(1,1);
  if(korr_bud == 2 && i == 1){lcd.print("  ");}else{if(h1 < 10){lcd.print("0");}lcd.print(h1);} // часы
  lcd.print(":");
  if(korr_bud == 1 && i == 1){lcd.print("  ");}else{if(m1 < 10 ){lcd.print("0");}lcd.print(m1);} // минуты
  if(korr_bud == 3 && i == 1){lcd.print("          ");}else{
    switch(dn0){
    case 4: lcd.print(" OFF       ");break;// откл
    case 3: lcd.print(" *******");break;// каждый день
    case 2: lcd.print(" _____**");break;// по выходным
    case 1: lcd.print(" *****__");break;// по будням
    }}

  // запуск будильника
  if(m == m1 && h == h1 && bud == 0){switch(dn0){
    case 1: if(dn >= 1 && dn <= 5){bip();digitalWrite(4,HIGH);}break;
    case 2: if(dn >= 6 && dn <= 7){bip();digitalWrite(4,HIGH);}break;
    case 3: bip();digitalWrite(4,HIGH);break;}
    }else{bud=0;digitalWrite(4,LOW);}
  if(kn1 || kn2 > 600){bud = 1;} // нажать + или - для откл. будильника

  i++;
  if(i == 3){i = 0;}
  delay(150);
}

Комментарии

  • Aleksandr:

    Может кому понадобиться. Есть переходники для этого дисплея с подключением по шине I2C. .меньше проводов.поправил скетч под этот переходник:
    #include
    #include
    LiquidCrystal_I2C lcd(0x27,16,2); // Устанавливаем дисплей
    #include

    unsigned long time0;
    byte bud=0, bud0=1, s, m, h, m1, h1, kn, kn1, kn2, korr;

    void setup(){
    lcd.init();
    lcd.backlight();// Включаем подсветку дисплея
    MsTimer2::set(1000, to_Timer); // задаем период 1с
    MsTimer2::start(); // старт таймера
    pinMode(6,INPUT); // кнопка коррекции
    pinMode(5,INPUT); // кнопка +
    pinMode(4,INPUT); // кнопка —
    pinMode(3,OUTPUT); // выход для пъезоизлучателя
    }

    void to_Timer(){ //функция таймера
    ++s; // отсчет 1 с
    }

    void loop(){
    // читаем состояние входов
    kn=digitalRead(6);
    kn1=digitalRead(5);
    kn2=digitalRead(4);
    // коррекция времени, опрос кнопок
    if(kn==HIGH){
    korr++;
    if(korr>=6){
    korr=0;
    }
    }
    if(kn1==HIGH && korr==1){
    m++;
    }
    if(kn1==HIGH && korr==2){
    h++;
    }
    if(kn2==HIGH && korr==1){
    m—;
    if(m>60){
    m=0;
    }
    }
    if(kn2==HIGH && korr==2){
    h—;
    }
    if(kn1==HIGH && korr==3){
    m1++;
    if(m1>59){
    m1=0;
    h1++;
    }
    }
    if(kn1==HIGH && korr==4){
    h1++;
    if(h1>23){
    h1=0;
    }
    }
    // коррекция будильника
    if(kn2==HIGH && korr==3){
    m1—;
    if(m1>60){
    m1=0;
    }
    }
    if(kn2==HIGH && korr==4){
    h1—;
    if(h1>24){
    h1=0;
    }
    }
    // активация и диактивация будильника
    if(kn1==HIGH && korr==5){
    bud0=1;
    }
    if(kn2==HIGH && korr==5){
    bud0=0;
    }

    // Отсчет времени часов
    if(s > 59){
    s = 0;
    ++m; // отсчет 1 мин
    }
    if(m > 59){
    m = 0;
    ++h; // отсчет 1 час
    }
    if(h > 23){
    h = 0;
    }
    // включение будильника
    if(m!=m1){
    bud=0;
    };
    // запуск будильника
    if(m==m1 && h==h1 && bud==0 && bud0 == 1){
    if(kn1==HIGH || kn2==HIGH){
    bud=1;
    }
    for(int i=0;i<200;i++){ // пищалка
    digitalWrite(3,HIGH);
    delay(1);
    digitalWrite(3,LOW);
    delay(1);
    }
    }

    // вывод информации на экран 1 строка
    lcd.setCursor(1,0);
    if(h < 10){
    lcd.print("0");
    }
    lcd.print(h); // часы
    lcd.print(":");
    if(m < 10 ){
    lcd.print("0");
    }
    lcd.print(m); // минуты
    lcd.print(":");
    if(s < 10){
    lcd.print("0");
    }
    lcd.print(s);// секунды
    if(korr==1){
    lcd.print(" kor_m");
    }
    if(korr==2){
    lcd.print(" kor_h");
    }
    // вывод информации на экран 1 строка
    lcd.setCursor(1,1);
    if(h1 < 10){
    lcd.print("0");
    }
    lcd.print(h1); // часы
    lcd.print(":");
    if(m1 < 10 ){
    lcd.print("0");
    }
    lcd.print(m1); // минуты

    if( bud0==1){
    lcd.print(" On ");
    }
    if( bud0==0){
    lcd.print(" Off ");
    }

    if( bud0==1 && korr==5){
    lcd.print(" kor");
    }
    if( bud0==0 && korr==5){
    lcd.print(" kor ");
    }
    if(korr==3){
    lcd.print("kor_m");
    }
    if(korr==4){
    lcd.print("kor_h");
    }
    delay(200);
    lcd.clear();
    }
    Библиотека по ссылке http://iarduino.ru/file/134.html

  • Aleksandr:

    #include
    #include
    LiquidCrystal_I2C lcd(0x27,16,2); // Устанавливаем дисплей
    #include
    Верх скетча почему то не скопировался. Повторю первые 4 строки

    • liman28:

      Здравствуйте! Коментарии режут код, есть не совместимые символы. Залейте скетч в виде архива zip на сайт и опубликуйте на него ссылку в комментариях, или разместите статью на сайте с новым кодом скетча.

Добавить комментарий

Войти с помощью: 

Случайные статьи

  • Регулируемый стабилизатор напряжения с защитой по току (Arduino)

    Регулируемый стабилизатор напряжения с защитой по току (Arduino)

    За основу регуляруемого стабилизатора свята схема со траницы https://rcl-radio.ru/?p=57426 , схема достаточно простая и содержит минимальный набор элементов. Выходное напряжение регулируемого стабилизатора можно регулировать от 0 до 25 В при максимальном токе 3 А. Используя Arduino можно заметно расширить функционал стабилизатора, сделать индикацию и защиту по току и КЗ, добавив …Подробнее...
  • Флюсы для пайки

    Флюсы для пайки припоями типа ПОС Флюсы для пайки чёрных металлов Сильно-кислые флюсы («активные флюсы») Хлорид цинка Флюсы средней и малой активности Хлорид аммония (нашатырь) Флюсы для электротехники Основные требования к таким флюсам — низкий ток утечки и низкая коррозионная активность. Простейшие флюсы такого типа создают на основе канифоли, например растворы …Подробнее...
  • УНЧ на TDA1558Q

    УНЧ на TDA1558Q

    Напряжение питания 6…18В Максимальный ток нагрузки 4А Выходная мощность при Uп=14,4В и Rн=4Ом: КНИ=0,5% — 5Вт КНИ=10% — 6Вт Ток покоя 80мАПодробнее...
  • break (Arduino)

    break (Arduino)

    break используется для принудительного выхода из циклов do, for или while, не дожидаясь завершения цикла по условию. Он также используется для выхода из оператора switch. Пример использования: void setup(){ pinMode(A1,INPUT); } int i; void loop(){ for(i=0;i<100;i++){ if(analogRead(A1)>500){ break; } } } Запускаем цикл for, пока переменная i меньше 100 цикл …Подробнее...
  • Любительская паяльная станция

    Схема станции показана на рис. 1. На ОУ DA3 собран усилитель напряжения термопары ВК1. Плюсовой вывод термопары ВК1 должен быть обязательно подключен к общей точке резисторов R4 R11. На ОУ DA4 выполнен компаратор напряжения. На его не инвертирующий вход поступает напряжение, задаваемое делителем R5R7R8R9, на инвертирующий вход — напряжение с …Подробнее...