Циклический таймер

olivergreen
olivergreen аватар
Offline
Зарегистрирован: 15.08.2016

Всех приветствую!

Учусь тут себе решать всякие задачи программированием и задумал сделать циклический таймер для проветривания. Но не тут то было. Обычный суточный таймер получился (и то на основе чужого кода), а циклический пока что не по зубам.

Помогите осилить логику данного таймера. Он должен работать Х времени и У простаивать без delay() и с rtc. 

Блинк мог бы подойти, то там время работы равно времени ожидания. 

DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

Ответил на форуме амперки, нефик плодить одни и те же темы по форумам.

braslav
braslav аватар
Offline
Зарегистрирован: 25.02.2017

Может это подойдет "Как Blink встроить в таймер"

#include <Wire.h>
#include <LiquidCrystal_I2C.h> // Подключение библиотеки для LCD с кириллицей
#include "RTClib.h"

LiquidCrystal_I2C lcd(0x38,16,2);
// *******************************************
// Здесь задаем время включения и выключения
int on=16; // Часов
int off=23; // Часов
// *******************************************
//----Класс отображающий время на ЛСД 1602
class ShowTime {
  uint32_t om;
  public:
  ShowTime() {};
  void setup() {om=millis();}
  void loop(DateTime now) 
  {
    char s[16] = "  00:00:00   ";
    uint32_t cm = millis();
    if (cm - om > 999)
    {
      lcd.setCursor(2,1);
      s[2] = '0'+ now.hour()/10;
      s[3] = '0'+ now.hour()%10;
      s[5] = '0'+ now.minute()/10;
      s[6] = '0'+ now.minute()%10;
      s[8] = '0'+ now.second()/10;
      s[9] = '0'+ now.second()%10;
      lcd.print(s);
      om=cm;
    }
  }
};

////----Cl_tik_tak---задержка-работа--------------
const int Map[] = {30000, 300};
const byte num = 2;


class Cl_tik_tak {
    byte takt;
    byte pin;
    bool led;
    uint32_t past;
  public:
    Cl_tik_tak(byte _pin): pin(_pin) {}
    void setup() {
      pinMode(pin, OUTPUT);
      takt = 0;
      past = millis();
      digitalWrite(pin, led = 0);
    }
    void loop() {
      if (millis() - past > Map[takt]) {
        past = millis();
        digitalWrite(pin, led = !led);
        ++takt;
        if (takt >= num) takt = 0;
      }
    }
};
//-------------компоновка-----------------
RTC_DS1307 RTC;
Cl_tik_tak Tak(/*нога*/13);
ShowTime showTime;
//--------------main---------------------
void setup() {
  Tak.setup();
  showTime.setup();

lcd.init();                      // initialize the lcd 
 
  // Print a message to the LCD.
  lcd.backlight();
  lcd.setCursor(2,0);
  lcd.print(on);
lcd.print("-ON, ");
  lcd.print(off);
  lcd.print("-OFF");
}

void loop() {
  DateTime now = RTC.now();
  showTime.loop(now);
  if  ( (now.hour() >= on ) && ( (now.hour() < off )))  Tak.loop();
 
}

 

ulis
ulis аватар
Offline
Зарегистрирован: 09.03.2011

olivergreen пишет:

и задумал сделать циклический таймер. Но не тут то было. Обычный суточный таймер получился (и то на основе чужого кода), а циклический пока что не по зубам.

Помогите осилить логику данного таймера. Он должен работать Х времени и У простаивать без delay() и с rtc. 

Что значит циклический и чем отличается от суточного?