Я в програмировании для ардуино обсолютный ноль. Поэтому хочу попросить помощи. Есть код с часами и отображением на LCD дисплее календаря и времени. Помогите, пожалуйста, пристроить к этому коду таймер. Он должен включаться, например, в 17 часов и выключаться в 23 часа каждый день. Код (C++): #include <Wire.h> #include <LiquidCrystal_I2C.h> // Подключение библиотеки для LCD с кириллицей #include "RTClib.h" LiquidCrystal_I2C lcd(0x38,16,2); RTC_DS1307 RTC; void setup () { Wire.begin(); RTC.begin(); lcd.init(); // initialize the lcd lcd.backlight(); } void loop () { DateTime now = RTC.now(); lcd.clear(); lcd.setCursor(0, 0); lcd.print(now.day(), DEC); lcd.print('/'); lcd.print(now.month(), DEC); lcd.print('/'); lcd.print(now.year(), DEC); lcd.setCursor(0, 1); lcd.print(now.hour(), DEC); lcd.print(':'); lcd.print(now.minute(), DEC); lcd.print(':'); lcd.print(now.second(), DEC); delay(1000); }
Блин, как не хочется придумывать ClockManage (Клок Менаджер). ПС: Мудренная штука получилась Спойлер: Клок Менеджер Код (C++): unsigned long mill; // переменная под millis() //---------------------------------------------- // подключение часов #include <Wire.h> #include "RTClib.h" RTC_DS1307 RTC; //-----Cl_ClockManager--------------------------- // класс менеджер задач c RTC struct task_t { void (*Do)(); unsigned long past; unsigned int time; struct task_t (*next); }; struct clockTask_t { void (*Do)(); unsigned long clockTime; struct clockTask_t (*next); }; class Cl_ClockManager { protected: struct task_t (*start) = NULL; struct clockTask_t (*clockStart) = NULL; unsigned long past; public: /*разместить в loop*/ void run() { /*сверка задачи по millis*/ for (struct task_t (**i) = &start; (*i) != NULL; ) { if (mill - (**i).past >= (**i).time) { struct task_t (*_new) = (*i); (*i) = (**i).next; (*_new).Do(); delete _new; } else i = &(**i).next; } /* сверка задачи по RTC*/ if (mill - past >= 100) { past = mill; DateTime now = RTC.now(); unsigned long time = now.second() + 60 * (now.minute() + 60 * now.hour()); for (struct clockTask_t (**i) = &clockStart; (*i) != NULL; ) { if (time >= (**i).clockTime) { struct clockTask_t (*_new) = (*i); (*i) = (**i).next; (*_new).Do(); delete _new; } else i = &(**i).next; } } } /*задать новую задачу*/ void Task(unsigned int time, void (*Do)()) { struct task_t (*_new) = new struct task_t; (*_new).Do = Do; (*_new).past = mill; (*_new).time = time; (*_new).next = start; start = _new; } /*задать новую задачу по RTC*/ void ClockTask(byte hour_, byte minute_, byte second_, void (*Do)()) { struct clockTask_t (*_new) = new struct clockTask_t; (*_new).Do = Do; (*_new).clockTime = second_ + 60 * (minute_ + 60 * hour_); (*_new).next = clockStart; clockStart = _new; } }; Cl_ClockManager Manager; //---Компоновка----------------------- void initBeep() { Manager.ClockTask(/*во столько часов*/17,/*минут*/0,/*секунд*/0,/*сделать это*/&startBeep); } void startBeep() { Serial.println("Beep_ON"); Manager.ClockTask(/*во столько часов*/23,/*минут*/0,/*секунд*/0,/*сделать это*/&stopBeep); } void stopBeep() { Serial.println("Beep_OFF"); } void serial_1() { Manager.Task(/*через 1 сек*/ 1000,/*сделать это*/&serial_1); Serial.println("Tick"); } //---main----------------------------- void setup() { Serial.begin(9600); Wire.begin(); RTC.begin(); initBeep();//<-- первичный запуск serial_1();//<-- запуск тик } void loop() { mill = millis(); Manager.run(); } /* Скетч использует 4398 байт (14%) памяти устройства. Всего доступно 30720 байт. Глобальные переменные используют 438 байт (21%) динамической памяти, оставляя 1610 байт для локальных переменных. Максимум: 2048 байт. */
Спасибо qwone. Я ведь НОЛЬ, а "мудренная штука" чтобы я голову скрутил. Все равно большое тебе спасибо. Добавил, чего не хватало для меня (вывод на LCD, выход на реле) и все это заработало! Готовое изделие на фото. Код (C++): unsigned long mill; // переменная под millis() //---------------------------------------------- // Подключение библиотеки для LCD #include <LiquidCrystal_I2C.h> LiquidCrystal_I2C lcd(0x38,16,2); // подключение часов #include <Wire.h> #include "RTClib.h" RTC_DS1307 RTC; // pin определение int releyPin = 13; // Вписываем время включения и выключения int onH=18; // Включаемся в Часов int onM=36; // Включаемся в Минут int offH=18; // Отключаемся в Часов int offM=39; // Отключаемся в Минут //-----Cl_ClockManager--------------------------- // класс менеджер задач c RTC struct task_t { void (*Do)(); unsigned long past; unsigned int time; struct task_t (*next); }; struct clockTask_t { void (*Do)(); unsigned long clockTime; struct clockTask_t (*next); }; class Cl_ClockManager { protected: struct task_t (*start) = NULL; struct clockTask_t (*clockStart) = NULL; unsigned long past; public: /*разместить в loop*/ void run() { /*сверка задачи по millis*/ for (struct task_t (**i) = &start; (*i) != NULL; ) { if (mill - (**i).past >= (**i).time) { struct task_t (*_new) = (*i); (*i) = (**i).next; (*_new).Do(); delete _new; } else i = &(**i).next; } /* сверка задачи по RTC*/ if (mill - past >= 100) { past = mill; DateTime now = RTC.now(); unsigned long time = now.second() + 60 * (now.minute() + 60 * now.hour()); for (struct clockTask_t (**i) = &clockStart; (*i) != NULL; ) { if (time >= (**i).clockTime) { struct clockTask_t (*_new) = (*i); (*i) = (**i).next; (*_new).Do(); delete _new; } else i = &(**i).next; } } } /*задать новую задачу*/ void Task(unsigned int time, void (*Do)()) { struct task_t (*_new) = new struct task_t; (*_new).Do = Do; (*_new).past = mill; (*_new).time = time; (*_new).next = start; start = _new; } /*задать новую задачу по RTC*/ void ClockTask(byte hour_, byte minute_, byte second_, void (*Do)()) { struct clockTask_t (*_new) = new struct clockTask_t; (*_new).Do = Do; (*_new).clockTime = second_ + 60 * (minute_ + 60 * hour_); (*_new).next = clockStart; clockStart = _new; } }; Cl_ClockManager Manager; //---Компоновка----------------------- void initBeep() { Manager.ClockTask(/*во столько часов*/onH,/*минут*/onM,/*секунд*/0,/*сделать это*/&startBeep); } void startBeep() { digitalWrite(releyPin, HIGH); Manager.ClockTask(/*во столько часов*/offH,/*минут*/offM,/*секунд*/0,/*сделать это*/&stopBeep); } void stopBeep() { digitalWrite(releyPin, LOW); } //---main----------------------------- void setup() { Wire.begin(); RTC.begin(); initBeep();//<-- первичный запуск pinMode(releyPin, OUTPUT); lcd.init(); // initialize the lcd lcd.backlight(); } void loop() { mill = millis(); Manager.run(); DateTime now = RTC.now(); lcd.clear(); lcd.setCursor(0, 0);// от 0 до 8 lcd.print(onH);// час вкл lcd.print(':');// разделитель lcd.print(onM);// мин вкл lcd.setCursor(6, 0); lcd.print("time"); lcd.setCursor(11, 0); lcd.print(offH);// час выкл lcd.print(':');// разделитель lcd.print(offM);// мин выкл lcd.setCursor(0, 1); lcd.print("ON"); lcd.setCursor(3, 1); lcd.print("-"); lcd.print(now.hour(), DEC); lcd.print(':'); lcd.print(now.minute(), DEC); lcd.print(':'); lcd.print(now.second(), DEC); lcd.print("-"); lcd.setCursor(13, 1); lcd.print("OFF"); delay(1000); }
Все. Есть простой код. Спойлер: Суточный таймер #include <Wire.h> #include <LiquidCrystal_I2C.h> #include "RTClib.h" LiquidCrystal_I2C lcd(0x3f,16,2); RTC_DS1307 RTC; int releyPin = 13; // Вписываем время включения и выключения //**************************************** int on=17; // Включаемся в Часов int off=23; // Отключаемся в Часов //**************************************** void setup () { Wire.begin(); RTC.begin(); lcd.init(); // initialize the lcd lcd.backlight(); pinMode(releyPin, OUTPUT); } void loop() { { static byte prevSecond = 0; DateTime now = RTC.now(); if (now.second() != prevSecond) { prevSecond = now.second(); //Здесь вывод на дисплей lcd.setCursor(0,0); lcd.print(on); lcd.print("-ON "); lcd.print(off); lcd.print("-OFF"); lcd.setCursor(4, 1); if (now.hour() < 10) lcd.print("0"); lcd.print(now.hour(), DEC); lcd.print(':'); if (now.minute() < 10) lcd.print("0"); lcd.print(now.minute(), DEC); lcd.print(':'); if (now.second() < 10) lcd.print("0"); lcd.print(now.second(), DEC); } if ( (now.hour() >= on ) && ( (now.hour() < off ))) digitalWrite(releyPin, HIGH); else {digitalWrite(releyPin, LOW);} }}