| Ваш IP: 3.95.63.218 | Online(49) - гости: 11, боты: 38 | Загрузка сервера: 1.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 на сайт и опубликуйте на него ссылку в комментариях, или разместите статью на сайте с новым кодом скетча.

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

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

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

  • Преобразователь напряжения 3В в 9В

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

    Назначение: на основе предложенной схемы можно собрать уст-во которое будет считать прохожих, включать свет при проходе через дверь, охранную сигнализацию и тому подобное. Излучатель ИК VD4 на АЛ147А (он установлен в пультах ДУ ТВ типа 4-УСЦТ) излучает сигнал промодулированный импульсами 1000Гц. Генератор — источник импульсов выполнен на VT2 VT3. Частота …Подробнее...
  • Любительская паяльная станция

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

    При эксплуатации и ремонте электроустановок применяются обмоточные, монтажные и установочные провода и провода специального назначения. Первые используют для изготовления обмоток электрических машин, трансформаторов, приборов и аппаратуры; при помощи вторых осуществляют соединения в различных схемах электрооборудования и электроустройства; третьи используют в качестве нагревательных элементов электроустановок. Обмоточные провода могут иметь волокнистую изоляцию, …Подробнее...
  • Аналоговый ВЧ вольтметр

    Аналоговый ВЧ вольтметр

    На рисунке показана схема простого ВЧ вольтметра. Входное напряжение вольтметра от 0 до 5В. Максимальная частота до 200 МГц. Вольтметр состоит из двух частей — зонда и усилителя которые соединены между собой коаксиальным кабелем. В качестве индикатора используется микроамперметр (100мкА) с линейной шкалой. Для калибровки вольтметра необходимо на его вход …Подробнее...