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

На базе отладочной платы STM32 (базе микроконтроллера STM32F103C8T6) и семисегментном четырех разрядном дисплее TM1637 можно собрать простые часы с будильником. В уст-ве используются часы реального времени DS3231 (DS1307).

Часы с будильником имеют четыре кнопки управления, которые позволяют корректировать время, время будильника и настраивать яркость индикатора. Яркость индикатора и время будильника заносятся в энергонезависимую память. При срабатывании будильника из пьезоизлучателя раздается звуковой сигнал, длительность звукового сигнала 1 минута, прервать который можно путем нажатия на любую кнопку.

Для коррекции времени и времени будильника необходимо нажать и удерживать кнопку коррекция времени или коррекция будильника и кнопками часы++ и минуты ++ установить нужное время (для точной установки секунд, установите минуты на 1 минуту больше, при смене минуты нажмите кнопку «Коррекция времени» для обнуления секунд ).

Часы реального времени DS3231 содержат датчик температуры, показания датчика температуры выводятся на индикатор каждые 10 секунд.

Перед заливкой скетча в STM32 Вам необходимо ознакомиться со следующей статьей — STM32 Arduino IDE

#include <Wire.h>
#include <STM32_TM1637.h>                // http://rcl-radio.ru/wp-content/uploads/2020/02/STM32_TM1637_V1_3.zip
#include <uRTCLib.h>                     // https://github.com/Naguissa/uRTCLib.git
#include <EEPROM.h>                      // http://rcl-radio.ru/wp-content/uploads/2019/12/Arduino_STM32-master.zip
   STM32_TM1637 tm(PB0,PB1);// CLK, DIO
   uRTCLib rtc(0x68);       
 
   // PB7 = SDA DS1307 (DS3231) 
   // PB6 = SCL DS1307 (DS3231)
   // PB0 = CLK TM1637
   // PB1 = DIO TM1637
   // PB5 = коррекция времени
   // PB10 = часы++, яркость++
   // PB11 = минуты++, яркость--
   // PA7 = коррекция будильника
   // PA1 = пьезоизлучатель
 
float h;
int i,hh,mm,brig,al_hh,al_mm;
byte w,alarm,w1;
 
void setup(){  
   Wire.begin();
   EEPROM.init(0x801F000,0x801F800,0x400);// 1024 byte
   brig = EEPROM.read(10);al_hh = EEPROM.read(11);al_mm = EEPROM.read(12);
  // rtc.set(30, 37, 23, 2, 17, 12, 19);
  // RTCLib::set(byte second, byte minute, byte hour, byte dayOfWeek, byte dayOfMonth, byte month, byte year)
  pinMode(PB5,INPUT);pinMode(PB10,INPUT);pinMode(PB11,INPUT);pinMode(PA7,INPUT);
  pinMode(PA1, PWM);
  if(brig>4){brig=4;}tm.brig(brig);
}
 
void loop(){alarm=0;
////////////////////////////////////// вывод времени  
  if(digitalRead(PB5)==LOW&&alarm==0&&digitalRead(PA7)==LOW){
   hh=rtc.hour();mm=rtc.minute();
   rtc.refresh();// опрос времени
   h = rtc.hour()*100 + rtc.minute();tm.print_time(h, 0);delay(500);
   tm.print_time(h, 1);delay(500);i++;
//if(i==10){i=0;tm.print_float(rtc.temp()/100,0 ,0b1111000,0,0,0);delay(2000);}// вывод температуры DS3231 (t 27)
if(i==10){i=0;tm.print_float(rtc.temp(),0 ,0,0,0b01100011,0b00111001);delay(2000);}// вывод температуры DS3231 (27*C)
  }
///////////////////////////////////// коррекция времени - часы и минуты
  if(digitalRead(PB5)==HIGH&&digitalRead(PB10)==HIGH){w=1;hh++;if(hh>23){hh=0;}delay(300);tm.print_time(hh*100+mm, 1);}
  if(digitalRead(PB5)==HIGH&&digitalRead(PB11)==HIGH){w=1;mm++;if(mm>59){mm=0;}delay(300);tm.print_time(hh*100+mm, 1);}
  if(digitalRead(PB5)==HIGH&&digitalRead(PB10)==LOW&&digitalRead(PB11)==LOW){rtc.set(0, mm, hh, -1, -1, -1, -1);}
  if(w==1){w=0;rtc.set(0, mm, hh, -1, -1, -1, -1);}  
///////////////////////////////////// яркость индикатора  
  if(digitalRead(PB10)==HIGH&&digitalRead(PA7)==LOW&&digitalRead(PB5)==LOW){brig++;if(brig>4){brig=4;}tm.brig(brig);EEPROM.update(10, brig);}
  if(digitalRead(PB11)==HIGH&&digitalRead(PA7)==LOW&&digitalRead(PB5)==LOW){brig--;if(brig<0){brig=0;}tm.brig(brig);EEPROM.update(10, brig);}
///////////////////////////////////// будильник
  if(digitalRead(PA7)==HIGH&&digitalRead(PB10)==HIGH){w1=0;al_hh++;if(al_hh>23){al_hh=0;}delay(300);EEPROM.update(11, al_hh);}
  if(digitalRead(PA7)==HIGH&&digitalRead(PB11)==HIGH){w1=0;al_mm++;if(al_mm>59){al_mm=0;}delay(300);EEPROM.update(12, al_mm);}
  if(digitalRead(PA7)==HIGH){tm.print_time(al_hh*100+al_mm, 1);}
 
  if(hh*100+mm==al_hh*100+al_mm&&w1==0){alarm=1;}else{alarm=0;}
  if(alarm==1&&(digitalRead(PA7)==HIGH||digitalRead(PB5)==HIGH||digitalRead(PB10)==HIGH||digitalRead(PB11)==HIGH)){alarm=0;w1=1;}
  if(alarm==1){pwmWrite(PA1,35000);delay(200);pwmWrite(PA1,0);delay(100);}else{pwmWrite(PA1,0);}
  }// loop

Comments

  1. Вот что видно при повторе

    C:\Users\zigzag\Documents\Arduino\tm1637_stm32\tm1637_stm32.ino: In function ‘void loop()’:

    tm1637_stm32:38:41: error: ‘class STM32_TM1637’ has no member named ‘print_time’

    h = rtc.hour()*100 + rtc.minute();tm.print_time(h, 0);delay(500);

    ^

    tm1637_stm32:39:7: error: ‘class STM32_TM1637’ has no member named ‘print_time’

    tm.print_time(h, 1);delay(500);i++;

    ^

    tm1637_stm32:44:94: error: ‘class STM32_TM1637’ has no member named ‘print_time’

    if(digitalRead(PB5)==HIGH&&digitalRead(PB10)==HIGH){w=1;hh++;if(hh>23){hh=0;}delay(300);tm.print_time(hh*100+mm, 1);}

    ^

    tm1637_stm32:45:94: error: ‘class STM32_TM1637’ has no member named ‘print_time’

    if(digitalRead(PB5)==HIGH&&digitalRead(PB11)==HIGH){w=1;mm++;if(mm>59){mm=0;}delay(300);tm.print_time(hh*100+mm, 1);}

    ^

    tm1637_stm32:53:33: error: ‘class STM32_TM1637’ has no member named ‘print_time’

    if(digitalRead(PA7)==HIGH){tm.print_time(al_hh*100+al_mm, 1);}

    ^

    Несколько библиотек найдено для «Wire.h»
    Используется: C:\Program Files (x86)\Arduino\hardware\Arduino_STM32-master\STM32F1\libraries\Wire
    Не используется: C:\Program Files (x86)\Arduino\hardware\Arduino_STM32-master\STM32F1\libraries\WireSlave
    Несколько библиотек найдено для «STM32_TM1637.h»
    Используется: C:\Users\zigzag\Documents\Arduino\libraries\STM32_TM1637
    Не используется: C:\Program Files (x86)\Arduino\libraries\STM32_TM1637
    Несколько библиотек найдено для «uRTCLib.h»
    Используется: C:\Users\zigzag\Documents\Arduino\libraries\uRTCLib-master
    Не используется: C:\Program Files (x86)\Arduino\libraries\uRTCLib-master
    Несколько библиотек найдено для «EEPROM.h»
    Используется: C:\Program Files (x86)\Arduino\hardware\Arduino_STM32-master\STM32F1\libraries\EEPROM
    Не используется: C:\Users\zigzag\Documents\Arduino\libraries\EEPROM-master
    exit status 1
    ‘class STM32_TM1637’ has no member named ‘print_time’

  2. Я решил эту проблему так.
    В папку с данным скетчем скопировал указанные библиотеки ,а в программе Arduino ide ( в настройках ) указал путь к папке где находится скетч и библиотеки указанные автором. Все работает

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

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