| Ваш IP: 34.236.145.124 | Online(17) - гости: 7, боты: 10 | Загрузка сервера: 2.28 ::::::::::::

Часы с будильником (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 на сайт и опубликуйте на него ссылку в комментариях, или разместите статью на сайте с новым кодом скетча.

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

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

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

  • Драйвер светодиода белого свечения с напряжением 1,5В

    Для свечения диода белого свечения необходимо напряжение 3…4В, что не позволяет использовать одну батарею на 1,5В, но если применить схему показанную на рисунке то можно использовать светодиод белого свечения от напряжения 1,2…1,5В. На микросхеме МАХ1722 собран повышающий преобразователь, на микросхеме МАХ4073Т собран регулятор с обратной связью который позволяет регулировать выходной …Подробнее...
  • НЕКОТОРЫЕ ВОПРОСЫ ЭКСПЛУАТАЦИИ АККУМУЛЯТОРНЫХ БАТАРЕЙ

    При эксплуатации аккумуляторных батарей следует всегда четко помнить следующее: • после покупки батареи находятся в разряженном состоянии и перед началом эксплуатации их необходимо зарядить; • напряжение на заряженном элементе аккумуляторной батареи составляет 1,2 В; • напряжение конца разряда (напряжение, ниже которого элемент разряжать не следует) составляет 1,0…1,05 В; • емкость …Подробнее...
  • Фазоинвертор (ламповый усилитель)

    В двухтактный ламповый усилитель входит каскад фазоинвертор, его назначение — разделение входного сигнала на две противофазные полуволны . Так как любой каскад с нагрузкой анодной цепи инвертирует сигнал, часто применяется простая схема фазоинвертора на двух усилительных каскадах. Фазоинвертор — это два усилительных каскада с общим катодом, сигнал с выхода первого …Подробнее...
  • ЭЛЕКТРОННЫЕ ИГРОВЫЕ КОСТИ

    ЭЛЕКТРОННЫЕ ИГРОВЫЕ КОСТИ

    На рисунке показана простая схема «Электронные игровые кости», состоящая из простых недорогих элементах. Схема «Игровые кости» состоит из таймера, счетчика и нескольких светодиодов. При нажатии переключателя S1, таймер 555 вырабатывает импульсы, которые поступают на счетчик. Из-за быстроты переключений счетчика человек не может отследить момент зажигания светодиодов, поэтому данную схему можно …Подробнее...
  • Семиполосный эквалайзер с активными фильтрами

    Ниже приведен вариант эквалайзера с 7-ю полосами регулирования и глубиной регулирования ±15дБ на всех частотах. Номинальная величина входного сигнала — 250мВ. ОУ DA1 выполняет роль нормирующего усилителя. В цепи ОС ОУ DA2 включены фильтры F1-F7 с центральными частотами40, 100, 270, 700, 2000, 5000, 12500 Гц. Ширина полосы фильтра определяется параметрами …Подробнее...