| Ваш IP: 54.242.115.55 | Online(22) - гости: 14, боты: 8 | Загрузка сервера: 1.55 ::::::::::::

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

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

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

  • MP3302 — мощный светодиодный драйвер

    MP3302 — мощный светодиодный драйвер

    MP3302 — мощный светодиодный драйвер, микросхема представляет собой повышающий преобразователь способный управлять 27 светодиодами (9 строк по 3 светодиода). КПД преобразователя 88%, частота преобразования 1,3 МГц, максимальный ток 1,33 А. Управление преобразователем происходит при помощи входа EN микросхемы MP3302. При напряжении меньше 0,4В преобразователь выключится, при напряжении 0,7 включится. Для плавной …Подробнее...
  • Регулятор скорости вращения двигателя 24В/20А

    Регулятор скорости вращения двигателя 24В/20А

    На рисунке показана схема привода двигателя 24В 20А. Силовая часть привода состоит из двух полевых транзисторов IRFP7410. Цепь управления силовой частью состоит из микросхемы SG3526B. Регулировка частотой оборотов двигателя осуществляется при помощи потенциометра R3. Источник — http://www.eleccircuit.com/24vdc-motor-speed-control-with-20a-shot-circuit-protection/ Дополнительный материал: IRFP4710 SG3526BПодробнее...
  • Мощный импульсный источник питания

    Мощный импульсный источник питания

    Основные технические характеристики: Напряжение питающей сети • 220В Выходное напряжение • 2*30В Максимальная выходная мощность • 500Вт Максимальный КПД • 92% Схема ИИП показана рисунке. Двух обмоточный дроссель L1 и С1С2 — образуют сетевой фильтр, VD1-VD4 — выпрямитель сетевого напряжения. Узел плавного запуска образуют : тринистор VS1, диод VD5, резисторы …Подробнее...
  • 3-х полосный регулятор тембра на LF351

    3-х полосный регулятор тембра на LF351

    На рисунке показана схема трех полосного регулятора тембра, которая предназначена для регулировки тембра на высоких (10 кГц), средних (1 кГц) и низких частотах (50 Гц). В регуляторе тембра используется ОУ LF351. Глубина регулирования тембра составляет ±20 дБ при напряжении питания 18 В. Схема может работать при напряжении питания в диапазоне …Подробнее...
  • Вольтамперметр для источника питания

    Вольтамперметр для источника питания

    На рисунке показана схема вольтамперметра для лабораторного источника питания с выходным напряжение от 0 до 50 В и максимальным током в 50А. В схеме используется микроконтроллер PIC16F877А и индикатор LCD WH1602D. Уст-во имеет два входа — для тока и напряжения. Вход АЦП AN0 микроконтроллера настроен на максимальное входное напряжение 5В, что …Подробнее...