И снова часы с будильником.
- Войдите на сайт для отправки комментариев
Пнд, 27/04/2015 - 08:53
Доброго времени суток.
Я собрал будильник с RTC DS1302.
Схема и код прилагаются.
Критика приветствуется.
#include <Wire.h> #include <LiquidCrystal.h> #include <DS1302RTC.h> #include <Time.h> #include <Streaming.h> #include "pitches.h" #include <Pcint.h> #include <EEPROM.h> Pcint pcint;// создаём экземпляр класса (что такое не знаю, но без этого не работает :) // Init the DS1302 #define CLK 10 #define DAT 11 #define RST 13 // Set pins: CE, IO,CLK DS1302RTC RTC(RST, DAT, CLK); /////////////////////////////////////////////////////////////////////// //Init the LCD //initialize the library with the numbers of the interface pins // #define RS 6 #define E 5 #define D4 4 #define D5 15 #define D6 16 #define D7 17 // lcd(RS,E,d4,d5,d6,d7,bl,polarity) LiquidCrystal lcd(RS, E, D4, D5, D6, D7); /////////////////////////////////////////////////////////////////////// byte set_alarm_hour1 = EEPROM.read(0); byte set_alarm_minute1 = EEPROM.read(1); byte set_alarm_hour2 = EEPROM.read(2); byte set_alarm_minute2 = EEPROM.read(3); int set_date_Year = 2015; byte set_date_Month = 04; byte set_date_Day = 23; byte set_time_Hour = 22; byte set_time_Minute = 22; byte set_time_Second = 0; //////////////////////////////in/out pins////////////////////////////// #define buzz 9 #define led1 18 #define led2 19 #define lcdON 8 #define bitton_set_alarm 14 #define bitton_set_clock 12 #define bitton_up 2 #define bitton_down 3 #define bitton_on_off_alarm 7 /////////////////////////////////////////////////////////////////////// int flag_up = 0; int flag_down = 0; int regim = 9; volatile byte regim_set_alarm = 0; volatile byte regim_set_clock = 0; volatile byte regim_on_off_alarm = 2;//!!!!!!!!!!!!!!!!! volatile int NUMBER; volatile char function; time_t tLast; time_t t; tmElements_t tm; void setup() { Serial.begin(9600); pinMode(bitton_set_alarm, INPUT); pinMode(bitton_set_clock, INPUT); pinMode(bitton_up, INPUT); pinMode(bitton_down, INPUT); pinMode(bitton_on_off_alarm, INPUT); pinMode( buzz, OUTPUT); pinMode( led1, OUTPUT); pinMode( led2, OUTPUT); pinMode( lcdON, OUTPUT); digitalWrite(bitton_set_alarm, 1); digitalWrite(bitton_set_clock, 1); digitalWrite(bitton_up, 1); digitalWrite(bitton_down, 1); digitalWrite(bitton_on_off_alarm, 1); digitalWrite(buzz, 0); // speaker digitalWrite(led1, 0); // alarm1 digitalWrite(led2, 0); // alarm2 digitalWrite(lcdON, 1); // lcd ON /////////////////interrupts /////////////////////////////////////////////////// pcint.Begin(0);//на 12 пине будет выполняться обработчик прерывания PCINT0 pcint.Begin(1);//на 14 пине (A0) будет выполняться обработчик прерывания PCINT1 pcint.Begin(2);//на 7 пине будет выполняться обработчик прерывания PCINT2 attachInterrupt(0, on_off, RISING);//на 2 пине будет выполняться обработчик прерывания UP attachInterrupt(1, DOWN, LOW);//на 3 пине будет выполняться обработчик прерывания DOWN /////////////////////////////////////////////////////////////////////////////// lcd.begin(16, 2);// Setup LCD to 16x2 characters lcd.print("Made by Zahar"); delay(1000); lcd.clear(); if (RTC.haltRTC()) { lcd.print("Clock stopped!"); Serial.println("Clock stopped!"); } else { lcd.print("Clock working."); Serial.println("Clock working."); } lcd.setCursor(0, 1); if (RTC.writeEN()) { lcd.print("Write allowed."); Serial.println("Write allowed."); } else { lcd.print("Write protected."); Serial.println("Write protected."); } delay (1000); lcd.clear(); lcd.print("RTC Sync"); Serial.println("RTC Sync"); setSyncProvider(RTC.get);// the function to get the time from the RTC if (timeStatus() == timeSet) { lcd.print(" Ok!"); Serial.println("OK"); } else { lcd.print(" FAIL!"); Serial.println("FAIL"); } delay (1000); lcd.clear(); } //------------------------------------------- //------------------------------------------- void loop() { clock(); date(); switch (regim_set_alarm) { case 1: function = 'h'; //Переменная для ограничения переменной number NUMBER = EEPROM.read(0); //Начальное значение NUMBER для настройки будильника1 Serial.println("set_hour_alarm1"); set_hour_alarm1(); break; case 2: function = 'm'; //Переменная для ограничения переменной number NUMBER = EEPROM.read(1);//Начальное значение NUMBER для настройки будильника1 Serial.println("set_minute_alarm1"); set_minute_alarm1(); break; case 3: function = 'h'; //Переменная для ограничения переменной number NUMBER = EEPROM.read(2);//Начальное значение NUMBER для настройки будильника2 Serial.println("set_hour_alarm2"); set_hour_alarm2(); break; case 4: function = 'm'; //Переменная для ограничения переменной number NUMBER = EEPROM.read(3);//Начальное значение NUMBER для настройки будильника2 Serial.println("set_minute_alarm2"); set_minute_alarm2(); break; } switch (regim_set_clock) { case 1: function = 'D'; //Переменная для ограничения переменной number NUMBER = set_date_Day;//Начальное значение NUMBER для настройки дня Serial.println("set_date_Day"); set_day_date(); break; case 2: function = 'M'; //Переменная для ограничения переменной number NUMBER = set_date_Month;//Начальное значение NUMBER для настройки месяца Serial.println("set_month_date"); set_month_date(); break; case 3: function = 'Y'; //Переменная для ограничения переменной number NUMBER = set_date_Year;//Начальное значение NUMBER для настройки года Serial.println("set_year_date"); set_year_date(); break; case 4: function = 'h'; //Переменная для ограничения переменной number NUMBER = set_time_Hour;//Начальное значение NUMBER для настройки часов Serial.println("set_hour_time"); set_hour_time(); break; case 5: function = 'm'; //Переменная для ограничения переменной number NUMBER = set_time_Minute;//Начальное значение NUMBER для настройки минут Serial.println("set_minute_time"); set_minute_time(); tm.Second = 0; t = makeTime(tm); if (RTC.set(t) == 0) { // Success setTime(t); } else Serial << F("RTC set failed!") << endl; break; } switch (regim_on_off_alarm) { case 1://Вкл будильник1 digitalWrite(led1, 1); digitalWrite(led2, 0); lcd.setCursor(8, 0); lcd.print(" "); lcd.setCursor(9, 0); lcd.print("AL1 ON"); alarm1(); break; case 2://Вкл будильник2 digitalWrite(led2, 1); digitalWrite(led1, 0); lcd.setCursor(8, 0); lcd.print(" "); lcd.setCursor(9, 0); lcd.print("AL2 ON"); alarm2(); break; case 3://Вкл будильник1 и будильник2 digitalWrite(led1, 1); digitalWrite(led2, 1); lcd.setCursor(8, 0); lcd.print(" "); lcd.setCursor(9, 0); lcd.print("AL12ON"); alarm1(); alarm2(); break; default://Выкл будильник1 и будильник2 digitalWrite(led1, 0); digitalWrite(led2, 0); lcd.setCursor(8, 0); lcd.print(" "); lcd.setCursor(8, 0); lcd.print(" AL OFF"); } lcd.noBlink(); } /////////// INTERRUPT Function//////////////// void on_off() { //обработчик прерывания ON_OFF pin 2 static unsigned long millis_prev1; if (millis() - 400 > millis_prev1) { regim_on_off_alarm++; if (regim_on_off_alarm > 3) //ограничим количество режимов { regim_on_off_alarm = 0; //так как мы используем только одну кнопку то переключать режимы будем циклично } Serial.print("regim_on_off_alarm="); Serial.println(regim_on_off_alarm); } millis_prev1 = millis(); } void DOWN() { //обработчик прерывания DOWN pin 3 static unsigned long millis_prev2; if (millis() - 200 > millis_prev2) { NUMBER--; if (function == 'h' && NUMBER < 0)NUMBER = 23;//Ограничение часов if (function == 'm' && NUMBER < 0)NUMBER = 59;//Ограничение минут if (function == 'Y' && NUMBER < 1970)NUMBER = 2030;//Ограничение лет if (function == 'M' && NUMBER < 1)NUMBER = 12;//Ограничение месяцов if (function == 'D' && NUMBER < 1)NUMBER = 31;//Ограничение дней Serial.print("NUMBER="); Serial.println(NUMBER); } millis_prev2 = millis(); } ISR (PCINT2_vect)//обработчик прерывания UP alarm pin 7 { static unsigned long millis_prev3; if (millis() - 200 > millis_prev3) { NUMBER++; if (function == 'h' && NUMBER > 23)NUMBER = 0;//Ограничение часов if (function == 'm' && NUMBER > 59)NUMBER = 0;//Ограничение минут if (function == 'Y' && NUMBER > 2030)NUMBER = 1970;//Ограничение лет if (function == 'M' && NUMBER > 12)NUMBER = 1;//Ограничение месяцов if (function == 'D' && NUMBER > 31)NUMBER = 1;//Ограничение дней Serial.print("NUMBER="); Serial.println(NUMBER); } millis_prev3 = millis(); } ISR (PCINT1_vect)//обработчик прерывания SET ALARM pin A0 { static unsigned long millis_prev4; if (millis() - 200 > millis_prev4) { regim_set_alarm++; if (regim_set_alarm > 4) //ограничим количество режимов { regim_set_alarm = 0; //так как мы используем только одну кнопку то переключать режимы будем циклично } } millis_prev4 = millis(); } ISR (PCINT0_vect) //обработчик прерывания SET CLOCK pin 12 { static unsigned long millis_prev5; if (millis() - 200 > millis_prev5) { regim_set_clock++; Serial.print("regim_set_clock="); Serial.println(regim_set_clock); if (regim_set_clock > 5) //ограничим количество режимов { regim_set_clock = 0; //так как мы используем только одну кнопку то переключать режимы будем циклично } } millis_prev5 = millis(); } //------------------------------------------- //------------------------------------------- void print2digits(int number) { //delay(10); if (number >= 0 && number < 10) { lcd.write('0'); Serial.print("0"); } lcd.print(number); Serial.print(number); } //------------------------------------------- void clock() { lcd.setCursor(0, 0); print2digits(hour()); lcd.print(":"); Serial.print(":"); print2digits(minute()); lcd.print(":"); Serial.print(":"); print2digits(second()); Serial.println(""); } //------------------------------------------- //------------------------------------------- void date() { lcd.setCursor(0, 1); lcd.print(" ");//Очистка второй строки lcd.setCursor(0, 1); lcd.print(dayShortStr(weekday())); Serial.print(dayShortStr(weekday())); lcd.setCursor(5, 1); lcd.print(" "); Serial.print(" "); print2digits(day()); lcd.print("/"); Serial.print("/"); print2digits(month()); lcd.print("/"); Serial.print("/"); print2digits(year()); lcd.print(year()); Serial.println(" "); //delay (100); } //------------------------------------------- //------------------------------------------- void alarm1() { int set_alarm_minute_max1 = set_alarm_minute1 + 5; if (set_alarm_hour1 == hour() && set_alarm_minute1 <= minute() && set_alarm_minute_max1 >= minute()) { music_call(); } else { Serial.println("ALARM-1 OTHER"); } } //------------------------------------------- //------------------------------------------- void alarm2() { int set_alarm_minute_max2 = set_alarm_minute2 + 5; if (set_alarm_hour2 == hour() && set_alarm_minute2 <= minute() && set_alarm_minute_max2 >= minute()) { music_call(); } else { Serial.println("ALARM-2 OTHER"); } } //------------------------------------------- //------------------------------------------- void music_call() { int melody[] = {NOTE_C5, NOTE_G4, NOTE_G4, NOTE_A4, NOTE_G4, 0, NOTE_B4, NOTE_C5, 0}; int noteDurations[] = { 4, 8, 8, 4, 4, 4, 4, 4, 0}; int size = 8; int tempo = 100; for (int i = 0; i < size; i++) { if (regim_on_off_alarm == 4) break; //Остановка будильника if (melody[i] == 0) { Serial.println("end"); if (regim_on_off_alarm == 4) break; //Остановка будильника delay(noteDurations[i] * tempo); // rest } else { if (regim_on_off_alarm == 4) break; //Остановка будильника Serial.print("notes[i]="); Serial.println(melody[i]); playTone(melody[i], noteDurations[i] * tempo); } // pause between notes delay(tempo / 2); } } void playTone(int tone, int duration) { for (long i = 0; i < duration * 1000L; i += tone * 2) { if (regim_on_off_alarm == 4) break; //Остановка будильника digitalWrite(buzz, HIGH); delayMicroseconds(tone); digitalWrite(buzz, LOW); delayMicroseconds(tone); } } //------------------------------------------- //------------------------------------------- void set_hour_alarm1() { do { delay (50);//Чтобы экран не мерцал print_alarm_set(5, 1); set_alarm_hour1 = NUMBER; } while ( digitalRead(bitton_set_alarm) == HIGH); EEPROM.write(0, set_alarm_hour1); } //------------------------------------------- //------------------------------------------- void set_minute_alarm1() { do { delay (50);//Чтобы экран не мерцал print_alarm_set(8, 1); set_alarm_minute1 = NUMBER; } while ( digitalRead(bitton_set_alarm) == HIGH); EEPROM.write(1, set_alarm_minute1); lcd.clear(); } //------------------------------------------- //------------------------------------------- void set_hour_alarm2() { do { delay (50);//Чтобы экран не мерцал print_alarm_set(5, 2); set_alarm_hour2 = NUMBER; } while ( digitalRead(bitton_set_alarm) == HIGH); EEPROM.write(2, set_alarm_hour2); } //------------------------------------------- //------------------------------------------- void set_minute_alarm2() { do { delay (50);//Чтобы экран не мерцал print_alarm_set(8, 2); set_alarm_minute2 = NUMBER; } while ( digitalRead(bitton_set_alarm) == HIGH); EEPROM.write(3, set_alarm_minute2); lcd.clear(); } //------------------------------------------- //------------------------------------------- void set_year_date() { do { delay (50); print_date_set(12); set_date_Year = NUMBER; } while ( digitalRead(bitton_set_clock) == HIGH); tm.Year = CalendarYrToTm(set_date_Year); Serial.print("tm.Year="); Serial.println(tm.Year); } //------------------------------------------- //------------------------------------------- void set_month_date() { do { delay (50); set_date_Month = NUMBER; print_date_set(7); } while ( digitalRead(bitton_set_clock) == HIGH); tm.Month = set_date_Month; Serial.print("tm.Month="); Serial.println(tm.Month); } //------------------------------------------- //------------------------------------------- void set_day_date() { do { delay (50); set_date_Day = NUMBER; print_date_set(4); } while ( digitalRead(bitton_set_clock) == HIGH); tm.Day = set_date_Day; Serial.print("tm.Day="); Serial.println(tm.Day); } //------------------------------------------- //------------------------------------------- void set_hour_time() { do { delay (50); set_time_Hour = NUMBER; print_time_set(5); } while ( digitalRead(bitton_set_clock) == HIGH); tm.Hour = set_time_Hour; Serial.print("tm.Hour="); Serial.println(tm.Hour); } //------------------------------------------- //------------------------------------------- void set_minute_time() { do { delay (50); set_time_Minute = NUMBER; print_time_set(8); } while ( digitalRead(bitton_set_clock) == HIGH); tm.Minute = set_time_Minute; Serial.print("tm.Minute="); Serial.println(tm.Minute); } //------------------------------------------- //------------------------------------------- void print_alarm_set(int num_blink, int num_alarm) { lcd.clear(); lcd.setCursor(4, 0); if (num_alarm == 1) { lcd.print("ALARM 1"); lcd.setCursor(6, 1); lcd.print(":"); if (set_alarm_minute1 < 10) { lcd.setCursor(7, 1); lcd.print("0"); lcd.setCursor(8, 1); } else { lcd.setCursor(7, 1); } lcd.print(set_alarm_minute1); lcd.print(":00"); if (set_alarm_hour1 < 10) { lcd.setCursor(4, 1); lcd.print("0"); lcd.setCursor(5, 1); } else { lcd.setCursor(4, 1); } lcd.print(set_alarm_hour1); lcd.setCursor(num_blink, 1); lcd.blink(); } else { lcd.print("ALARM 2"); lcd.setCursor(6, 1); lcd.print(":"); if (set_alarm_minute2 < 10) { lcd.setCursor(7, 1); lcd.print("0"); lcd.setCursor(8, 1); } else { lcd.setCursor(7, 1); } lcd.print(set_alarm_minute2); lcd.print(":00"); if (set_alarm_hour2 < 10) { lcd.setCursor(4, 1); lcd.print("0"); lcd.setCursor(5, 1); } else { lcd.setCursor(4, 1); } lcd.print(set_alarm_hour2); lcd.setCursor(num_blink, 1); lcd.blink(); } } //------------------------------------------- //------------------------------------------- void print_date_set(int num_blink) { lcd.clear(); lcd.setCursor(4, 0); lcd.print("DATE SET"); lcd.setCursor(3, 1); if (set_date_Day < 10) lcd.print("0"); lcd.print(set_date_Day); lcd.print("/"); if (set_date_Month < 10) lcd.print("0"); lcd.print(set_date_Month); lcd.print("/"); lcd.print(set_date_Year); lcd.setCursor(num_blink, 1); lcd.blink(); } //------------------------------------------- //------------------------------------------- void print_time_set(int num_blink) { lcd.clear(); lcd.setCursor(4, 0); lcd.print("TIME SET"); lcd.setCursor(4, 1); if (set_time_Hour < 10) lcd.print("0"); lcd.print(set_time_Hour); lcd.print(":"); if (set_time_Minute < 10) lcd.print("0"); lcd.print(set_time_Minute); lcd.print(":00"); lcd.setCursor(num_blink, 1); lcd.blink(); }
а теперь приделай рэле и сделай жене или маме автоматическую поливалку цветов
В качестве пробы сил в электронике -- это вполне достойно. В качестве изготовления полезного утройства -- это никуда не годится. Точность хода -- никакая, время можно считывать только разглядывая дисплей в упор.
а зачем два динамика?
Уха же тоже два. Стереофония. Понимать надо. :)
а зачем два динамика?
У меня были только по 4hom а для LM385 минимум надо 8hom пришлось паролелить.
В качестве пробы сил в электронике -- это вполне достойно. В качестве изготовления полезного утройства -- это никуда не годится. Точность хода -- никакая, время можно считывать только разглядывая дисплей в упор.
1) По поводу пробы сил в электронике, скорее в ардуино.
2) Точность хода вполне приличная. У меня работали около недели , сбились гдето на 3-5 сек.
3) Цифры действительно видно херовато. В следующий раз хочу сделать на лампах. Что то типа этого http://steampunker.ru/uploads/images/00/67/15/2013/05/17/2789d1.jpg
а теперь приделай рэле и сделай жене или маме автоматическую поливалку цветов
Не для поливалки это через чур круто. Но за рацуху спасибо :)
int
flag_up = 0; зачем?
int
flag_down = 0; аналогично. но зачем int для флага, если это конечно флаг
set_minute_alarm разве нельзя одной функцией сделать, но с условиями, передавать ей какое нибудь значение по которому будет срабатывать
if
(set_alarm_hour1 < 10)
lcd.setCursor(4, 1);
lcd.print(
"0"
);
lcd.setCursor(5, 1);//эта строка зачем? курсор вроде сам перейдет в следующую позицию на экране. аналогично в других функциях
вообще вывод цифр и знака ":" можно оптимизировать. просто повнимательнее
1) По поводу пробы сил в электронике, скорее в ардуино.
Тогда принимайте за электронику. Квадратный сигнал усиливать с помощью ОУ -- попахивает извращенчеством. Подбор сопротивления нагрузки числом динамиков, из той же оперы.
2) Точность хода вполне приличная. У меня работали около недели , сбились гдето на 3-5 сек.
Сказки.
How good is a typical crystal ?
A typical crystal has an error of 100ppm (ish) this translates as 100/1e6 or (1e-4) So the total error on a day is 86400 x 1e-4= 8.64 seconds per day. In a month you would loose 30x8.64 = 259 seconds or 4.32 minutes per month.
Error: 8.64 seconds per day
Почти девять секунд в сутки. И это весьма неплохой результат для схем без компенсации.
Под такие часы и интерьер нужен соответствующий.
эм, запараллелив, вы получили 2 Ома, т.е. в 4 раза хуже :)
upd.: пардон, на фото они все-таки последовательно. Тогда все верно.
Вот выход. Ежели еще дисплей взять не LCD, а OLED - вообще будет шикарно смотреться - и ярко и четко.
int
flag_up = 0; зачем?
int
flag_down = 0; аналогично. но зачем int для флага, если это конечно флаг
set_minute_alarm разве нельзя одной функцией сделать, но с условиями, передавать ей какое нибудь значение по которому будет срабатывать
if
(set_alarm_hour1 < 10)
lcd.setCursor(4, 1);
lcd.print(
"0"
);
lcd.setCursor(5, 1);//эта строка зачем? курсор вроде сам перейдет в следующую позицию на экране. аналогично в других функциях
вообще вывод цифр и знака ":" можно оптимизировать. просто повнимательнее
flag_up, flag_down просто лишние переменные ,забыл удалить.
lcd.setCursor(5, 1); действительно лишняя строка.
set_minute_alarm попробую сделать одной функцией.
":" подумаю как это оптимизировать.
jeka_tm большое спасибо.
Тогда принимайте за электронику. Квадратный сигнал усиливать с помощью ОУ -- попахивает извращенчеством. Подбор сопротивления нагрузки числом динамиков, из той же оперы.
Но ведь LM386 усилитель звука. К тому же я его собрал по схеме с усилением 200db. Я пробовал просто транзистор поставить, но звук какой то со свистом получался.
По поводу двух динамиков наверное ты прав можно было оставить один и к нему резистор добавить. Но так громче получаетса. Мёртвого поднимет :)
А что такое схема с компенсацией ? Я имею в виду для моих чясов.
Вот выход. Ежели еще дисплей взять не LCD, а OLED - вообще будет шикарно смотреться - и ярко и четко.
Прикольно но мне нужно больше информации на дисплей. Просто всё не поместица.
Про OLED подумаю в следущем проекте :)
Zahar, вы представляете себе что такое усиление 200 db ? Это цифра асторономических масштабов.
Так написано в datasheet.
И где ж там децибелы? Входной сигнал усиливается в двести раз. 200 децибел -- это усиление в "единица с двадцатью нулями" раз. Не менее интересно звуковое давление близ таких величин. Звуковое давление 194дб вызывает разрыв легких, а больше 200дб, в большинстве случаев, смерть. С такими параметрами будильник будет уже не будить, а, наоборот, усыплять. Навсегда.
Насчет свистящего звучания: меандр 1 кгц имеет 11 гармоник в слышимом диапазоне (3кгц, 5кгц, 7кгц и т.д.). Они и свистят. LM386 делает из прямоугольного сигнала некие горбы замысловатой формы, что тоже весьма неоднозначно с точки зрения звучания. В общем, смысл тащить в схему будильника LM386 крайне сомнителен.
"Схема с компенсацией" это не обязательно схема в ее электрическом понимании. Если кварц имеет некое смещение от заявленной частоты (32768гц в случае часового кварца), то подобный уход можно компенсировать даже чисто программно, вычитая или добавляя секунды с некоторой переодичностью. К компенсации можно отнести и термостабилизированные схемы, где в корпусе с кварцем устанавливаются нагревательный и измерительный элементы, которые поддерживает температуру резонатора вблизи некоторого значения, минимизируя температурные девиации. MAXIM в своих чипах 32KHz и DS3231 использует коммутацию к схеме резонатора дополнительных емкостей в зависимости от температуры кристалла. В общем, разные схемы бывают.
a5021 большое спасибо за разъяснения. Дело в том что я много лет работал в маленькой фирме по производству спутниковых ретрансляторов. Так вот Gain всегда мерился в DB а Power в DBm. Поэтому я на автомате и сказал DB.
прикольный и полезный пример (как для меня).
если об устройстве - то не слишком ли много кнопок?
http://robocraft.ru/blog/3070.html - на заметку. Как один из режимов. Цифры читать удобней :)
вопрос к автору(ну или если кто из знающих зайдёт в тему) :)
так понимаю, что будильник в DS1302 работает по следующему алгоритму:
1. записываем в память АТМ328 значения часов-минут.
2. в скетче их сравниваем с текущим.
3. если есть совпадение - срабатывает.
таким образом, из всех модулей(DS1307 и DS3231) это единственный, который работатет таком вот образом?
верно?
Пишу из "далёкого" 2019
может кто нашел библиотеку <Pcint.h> именно так с Большой буквы!!
пишу #include <pcint.h> - вылазят ошибки...
Alex65, в файловых системах DOS/Windows "Pcint.h" и "pcint.h" - одно и то же.