Суточный таймер с часами и Lcd

Тема в разделе "Arduino & Shields", создана пользователем braslav, 29 ноя 2017.

  1. braslav

    braslav Нерд

    Я в програмировании для ардуино обсолютный ноль. Поэтому хочу попросить помощи. Есть код с часами и отображением на 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);
    }
     
     
  2. qwone

    qwone Гик

    Блин, как не хочется придумывать 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 байт.
    */
     
    Последнее редактирование: 30 ноя 2017
    SergeiL, 9xA59kK, braslav и ещё 1-му нравится это.
  3. braslav

    braslav Нерд

    Спасибо 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);
    }
     
     

    Вложения:

    • IMG_1198.JPG
      IMG_1198.JPG
      Размер файла:
      523,3 КБ
      Просмотров:
      1.118
    Последнее редактирование: 30 ноя 2017
    9xA59kK нравится это.
  4. braslav

    braslav Нерд

    [​IMG]
    Все. Есть простой код.
    #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);}
    }}
     
    Последнее редактирование: 1 дек 2017