На базе отладочной платы 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
Вот что видно при повторе
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’
удалите старую библиотеку и установите новую http://rcl-radio.ru/wp-content/uploads/2020/02/STM32_TM1637_V1_3.zip
Удалить stm32master ?
нет, надо удалить STM32_TM1637
Я решил эту проблему так.
В папку с данным скетчем скопировал указанные библиотеки ,а в программе Arduino ide ( в настройках ) указал путь к папке где находится скетч и библиотеки указанные автором. Все работает