| Ваш IP: 3.238.186.43 | Online(45) - гости: 29, боты: 16 | Загрузка сервера: 2.55 ::::::::::::

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

Часы с будильником состоят из платы Arduino Nano (Uno), LCD индикатора 1602 с I2C модулем на базе микросхемы PCF8574 и модуля часов реального времени DS3231 (ZS-042). На индикатор LCD 1602 крупными цифрами выводятся часы и минуты, обычными цифрами секунды. Будильник в часах один, он позволяет выставить время срабатывания в минутах и часах, предусмотрено его отключение, а так же работа каждый день, в будние дни и по выходным. Установка времени срабатывания будильника осуществляется кнопками «REG», «+» и «-«. Сигнал будильника звучит в течении одной минуты, но если нажать на кнопку «LED»  сигнал будильника можно прервать. Время срабатывания будильника и режим его работы сохраняются в энергонезависимой памяти. Кнопкой «LED» можно включать и отключать подсветку дисплея.

Устанавливать время на часах не нужно, так как предусмотрена коррекция времени при прошивке микроконтроллера. Для этого необходимо раскомментировать строчку:

// clock.setDateTime(__DATE__, __TIME__);

Далее залейте скетч в плату, закомментируйте строчку и залейте скетч повторно.

  #include <Wire.h> 
  #include <LiquidCrystal_I2C.h> //Библиотека -  http://forum.rcl-radio.ru/misc.php?action=pan_download&item=45&download=1
  #include <DS3231.h>//https://github.com/jarzebski/Arduino-DS3231/archive/master.zip // DS3231.zip
  #include <EEPROM.h> 
      DS3231 clock;RTCDateTime DateTime;
      LiquidCrystal_I2C lcd(0x27,16,2);  // Устанавливаем дисплей    
      byte v1[8] = {31,31,31,31,31,31,31,31};
      byte v2[8] = {31,31,31, 0, 0, 0, 0, 0};      
      byte v3[8] = { 0, 0, 0, 0, 0,31,31,31};
      byte v4[8] = {31,31, 0, 0, 0, 0,31,31};
      byte v5[8] = { 0, 0, 0, 0, 0, 0, 0, 0};
      byte v6[8] = { 0, 0,14,31,31,14, 0, 0}; //*
      byte v7[8] = { 0, 0, 0, 0, 0, 0,31,31};
      byte v8[8] = { 0, 4,14,14,14,31, 4, 0};// alarm
      int a[4],time,k,reg,m,h,w,i0,led,ton,w1;
      byte i,d1,d2,d3,d4,d5,d6,e1,e2,e3;
      unsigned long eeprom;
      byte rom0,rom1,rom2;
 
   void setup(){ Wire.begin(); clock.begin(); 
     pinMode(2,INPUT);pinMode(3,INPUT);pinMode(4,INPUT);pinMode(5,INPUT); // кнопки
     pinMode(13,INPUT); // ds3231 SQW
    //clock.setDateTime(__DATE__, __TIME__);
    lcd.init();lcd.backlight();// Включаем подсветку дисплея
    lcd.createChar(1, v1);lcd.createChar(2, v2);lcd.createChar(3, v3);lcd.createChar(4, v4);lcd.createChar(5, v5);lcd.createChar(6, v6);lcd.createChar(7, v7);lcd.createChar(8, v8);
  rom0 = EEPROM.read(0);if(rom0>59){EEPROM.update(0,0);}
  rom1 = EEPROM.read(1);if(rom1>23){EEPROM.update(1,0);}
  rom2 = EEPROM.read(2);if(rom2>3){EEPROM.update(2,0);}
  m=rom0;h=rom1;w=rom2;
  clock.setOutput(DS3231_1HZ);
   }
 
   void loop(){   if(digitalRead(5)==HIGH&&led==0&&w1==0){led=1;lcd.noBacklight();delay(500);}
                  if(digitalRead(5)==HIGH&&led==1&&w1==0){led=0;lcd.backlight();delay(500);}
 
 
                i0++;if(i0>4){i0=0;}
     if(digitalRead(2)==HIGH){k++;reg=1;lcd.clear();delay(300);}if(k>3){k=0;reg=0;}
      if(reg==1) {
          if(k==1){
              if(digitalRead(3)==HIGH){m++;}if(m>59){m=0;}
              if(digitalRead(4)==HIGH){m--;}if(m<0){m=0;}}
          if(k==2){
              if(digitalRead(3)==HIGH){h++;}if(h>23){h=0;}
              if(digitalRead(4)==HIGH){h--;}if(h<0){h=0;}}
          if(k==3){
              if(digitalRead(3)==HIGH){w++;delay(300);}if(w>3){w=0;}
              if(digitalRead(4)==HIGH){w--;delay(300);}if(w<0){w=3;}
 }
  lcd.setCursor(0,0);lcd.print("Alarm ");
 if(i0==1&&k==2){lcd.print("  ");}else{if(h < 10 ){lcd.print("0");}lcd.print(h);} lcd.print(":");
 if(i0==1&&k==1){lcd.print("  ");}else{if(m < 10 ){lcd.print("0");}lcd.print(m);} 
  lcd.setCursor(0,1);
 if(i0==1&&k==3){lcd.print("                 ");}
 if(w==0){lcd.print("every day");}  //каждый день 1234567
 if(w==1){lcd.print("on weekdays");}//по будням 12345
 if(w==2){lcd.print("on weekends");}//по выходным 67
 if(w==3){lcd.print("off");}
 rom0=m;rom1=h;rom2=w;
 eeprom=0;
 } 
 
 if(reg==0){  if(eeprom==1){EEPROM.update(0,rom0);EEPROM.update(1,rom1);EEPROM.update(2,rom2);}
    DateTime=clock.getDateTime();  
    time = DateTime.hour*100+DateTime.minute;
     a[0]=time/1000;
     a[1]=time/100%10;
     a[2]=time/10%10;
     a[3]=time%10%10;
 
 for(i=0;i<4;i++){
      switch(i){
        case 0: e1=0,e2=1,e3=2;break;
        case 1: e1=4,e2=5,e3=6;break;
        case 2: e1=9,e2=10,e3=11;break;
        case 3: e1=13,e2=14,e3=15;break;}
      switch(a[i]){
        case 0: d1=1,d2=2,d3=1,d4=1,d5=3,d6=1;break;
        case 1: d1=2,d2=1,d3=5,d4=7,d5=1,d6=7;break;
        case 2: d1=2,d2=4,d3=1,d4=1,d5=3,d6=3;break;
        case 3: d1=2,d2=4,d3=1,d4=3,d5=3,d6=1;break;
        case 4: d1=1,d2=3,d3=1,d4=5,d5=5,d6=1;break;
        case 5: d1=1,d2=4,d3=2,d4=3,d5=3,d6=1;break;
        case 6: d1=1,d2=4,d3=2,d4=1,d5=3,d6=1;break;
        case 7: d1=2,d2=2,d3=1,d4=5,d5=5,d6=1;break;
        case 8: d1=1,d2=4,d3=1,d4=1,d5=3,d6=1;break;
        case 9: d1=1,d2=4,d3=1,d4=3,d5=3,d6=1;break;
    }
 
      lcd.setCursor(e1,0);lcd.write((uint8_t)d1);lcd.setCursor(e2,0);lcd.write((uint8_t)d2);lcd.setCursor(e3,0);lcd.write((uint8_t)d3);
      lcd.setCursor(e1,1);lcd.write((uint8_t)d4);lcd.setCursor(e2,1);lcd.write((uint8_t)d5);lcd.setCursor(e3,1);lcd.write((uint8_t)d6);
 
 }
   if(digitalRead(13) == HIGH){lcd.setCursor(7,0);lcd.write((uint8_t)6);}else{ lcd.setCursor(7,0);lcd.write((uint8_t)5);}
   //lcd.setCursor(8,0);lcd.write((uint8_t)8);
   lcd.setCursor(7,1);if(DateTime.second<10){lcd.print("0");}lcd.print(DateTime.second);
 
    if(digitalRead(5)==HIGH&&ton==0){lcd.backlight();ton=1;w1=0;delay(300);}
    if(DateTime.hour*60+DateTime.minute!=h*60+m){ton=0;}
 
    if(w==0){pic();lcd.setCursor(8,0);lcd.write((uint8_t)8);}
    else if(w==1&&(DateTime.dayOfWeek<6)){pic();lcd.setCursor(8,0);lcd.write((uint8_t)8);}
    else if(w==2&&(DateTime.dayOfWeek>5)){pic();lcd.setCursor(8,0);lcd.write((uint8_t)8);}
    else {lcd.setCursor(8,0);lcd.write((uint8_t)5);}
   }//reg=0
     eeprom++;
     delay(100);
   }
 
 void pic(){if(ton==0&&(DateTime.hour*60+DateTime.minute==h*60+m)){w1=1;tone(6,1200,500);delay(500);}}

Форум — http://forum.rcl-radio.ru/viewtopic.php?id=66


Форум — http://forum.rcl-radio.ru/viewtopic.php?pid=1051#p1051

Комментарии

  • Lola:

    Всем Привет, Хочу узнать , кто-нибудь проверял в минус уходит ? У меня стоят по нулям показание с датчика ds18b20

  • ошибка компиляции
    Arduino: 1.8.13 (Windows 7), Плата:»Arduino Uno»

    sketch_jan22a:5:20: error: ‘RTCDateTime’ does not name a type; did you mean ‘DateTime’?

    DS3231 clock;RTCDateTime DateTime;

    ^~~~~~~~~~~

    DateTime

    C:\Users\Aexcey\Desktop\sketch_jan22a\sketch_jan22a.ino: In function ‘void setup()’:

    sketch_jan22a:20:38: error: ‘class DS3231’ has no member named ‘begin’

    void setup(){ Wire.begin(); clock.begin();

    ^~~~~

    sketch_jan22a:30:9: error: ‘class DS3231’ has no member named ‘setOutput’

    clock.setOutput(DS3231_1HZ);

    ^~~~~~~~~

    sketch_jan22a:30:19: error: ‘DS3231_1HZ’ was not declared in this scope

    clock.setOutput(DS3231_1HZ);

    ^~~~~~~~~~

    C:\Users\Aexcey\Desktop\sketch_jan22a\sketch_jan22a.ino:30:19: note: suggested alternative: ‘DS3231_h’

    clock.setOutput(DS3231_1HZ);

    ^~~~~~~~~~

    DS3231_h

    C:\Users\Aexcey\Desktop\sketch_jan22a\sketch_jan22a.ino: In function ‘void loop()’:

    sketch_jan22a:64:13: error: expected unqualified-id before ‘=’ token

    DateTime=clock.getDateTime();

    ^

    sketch_jan22a:65:20: error: expected primary-expression before ‘.’ token

    time = DateTime.hour*100+DateTime.minute;

    ^

    sketch_jan22a:65:38: error: expected primary-expression before ‘.’ token

    time = DateTime.hour*100+DateTime.minute;

    ^

    sketch_jan22a:96:34: error: expected primary-expression before ‘.’ token

    lcd.setCursor(7,1);if(DateTime.second<10){lcd.print("0");}lcd.print(DateTime.second);

    ^

    sketch_jan22a:96:80: error: expected primary-expression before '.' token

    lcd.setCursor(7,1);if(DateTime.second<10){lcd.print("0");}lcd.print(DateTime.second);

    ^

    sketch_jan22a:99:16: error: expected primary-expression before '.' token

    if(DateTime.hour*60+DateTime.minute!=h*60+m){ton=0;}

    ^

    sketch_jan22a:99:33: error: expected primary-expression before '.' token

    if(DateTime.hour*60+DateTime.minute!=h*60+m){ton=0;}

    ^

    sketch_jan22a:101:14: error: 'pic' was not declared in this scope

    if(w==0){pic();lcd.setCursor(8,0);lcd.write((uint8_t)8);}

    ^~~

    sketch_jan22a:102:28: error: expected primary-expression before '.' token

    else if(w==1&&(DateTime.dayOfWeek<6)){pic();lcd.setCursor(8,0);lcd.write((uint8_t)8);}

    ^

    sketch_jan22a:102:43: error: 'pic' was not declared in this scope

    else if(w==1&&(DateTime.dayOfWeek5)){pic();lcd.setCursor(8,0);lcd.write((uint8_t)8);}

    ^

    sketch_jan22a:103:43: error: ‘pic’ was not declared in this scope

    else if(w==2&&(DateTime.dayOfWeek>5)){pic();lcd.setCursor(8,0);lcd.write((uint8_t)8);}

    ^~~

    exit status 1

    ‘RTCDateTime’ does not name a type; did you mean ‘DateTime’?

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

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

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

  • Активный регулятор тембра на транзисторах

    Активный регулятор тембра на транзисторах

    Регулятор тембра на транзисторах BC109 обладает хорошим качеством звучания, низким шумом. Схема не содержит дорогостоящих элементов, проста в сборке. Источник — http://www.eleccircuit.com/active-tone-controls-by-transistor/Подробнее...
  • Стерео усилитель 2*12Вт на TDA7263М

    Стерео усилитель 2*12Вт на TDA7263М

    Стерео усилитель на базе микросхемы TDA7263М  относится к классу АВ и используется в основном в бытовой HI-FI технике. Микросхема имеет защиту от КЗ по переменному току, снабжена тепловой защитой: температура срабатывания тепловой защиты 145°С. TDA7263M имеет в своем составе систему MUTE которая позволяет избежать шумов и щелчков громкоговорителей в момент …Подробнее...
  • Устройство защиты цепей постоянного тока от перегрузок

    Устройство предназначено для защиты от перегрузки (по силе тока) и коротких замыканий в цепи нагрузки. Его подключают между источником питания постоянного тока и потребителем. Во многих системах управления нагрузкой электронных блоков являются электромагнитные механизмы, в которых возможно частичное замыкание между собой витков обмотки или полное короткое замыкание цепи обмотки. Данное …Подробнее...
  • Устройство для автоматического поддержания автомобильной аккумуляторной батареи в заряженном состоянии во время хранения

    В статье Н.Герцена («Радио», 7/2000, стр.36) описано устройство для автоматического поддержания автомобильной аккумуляторной батареи в заряженном состоянии во время хранения. Достоинством устройства (рис.1) является то, что оно не содержит электромеханических реле. Транзисторы VT1, VT3, VT4 и стабилитрон VD5 образуют последовательный стабилизатор напряжения. Напряжение, которое устройство поддерживает на батарее, устанавливают резистором …Подробнее...
  • DAC WM8804 + AK4396 — 24bit 192kHz (Arduino)

    DAC WM8804 + AK4396 — 24bit 192kHz (Arduino)

    Внешний звуковой ЦАП собран на недорогих компонентах, в качестве ресивера используется WM8804, ЦАП на AK4396. ЦАП имеет микроконтроллерное управление на базе платформы Arduino. Входной цифровой сигнал для внешнего ЦАПа имеет формат S/PDIF (цифровой аудио интерфейс разработанный фирмами SONY/PHILIPS, предназначен для передачи цифрового сигнала между аудио устройствами), ресивер на WM8804 преобразует …Подробнее...