Подскажите пож-та как реализовать таймеры?

sparrow
Offline
Зарегистрирован: 04.12.2014

Здравствуйте. собираю потихотьку небольшой парничок. его задача поддерживать темературу, выводить её (и время) на дисплей 16*2, показывая при этом включен или выключен нагрев. Так же задача по таймерам включать и выключать реле (3шт - каждому свой таймер нужен).

с температурой и отображением разобрался кое-как, а вот с т. засада.

для вывода реального времени использую модуль tiny RTC по i2c.

уровень мой мягко говоря не очень) 

"изящный" код:



#include <Wire.h> 
#include <LiquidCrystal_I2C.h>
#include <OneWire.h>
#include <DallasTemperature.h>
#define ONE_WIRE_BUS 10
LiquidCrystal_I2C lcd(0x27,16,2);
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);
#include "RTClib.h"
RTC_DS1307 RTC;
float (temp1) = 25.00; 
float (temp2) = 24.54; 
float (C);
const int ledPin1 = 8;  

void setup (void)
{
  Wire.begin();
  lcd.init(); 
  lcd.backlight();
  lcd.print("     hello!");
  sensors.begin();
  pinMode(ledPin1, OUTPUT);
  RTC.begin();
  delay (2000);
}
void loop (void)
{ 
  DateTime now = RTC.now();
  sensors.requestTemperatures(); 
  C = (sensors.getTempCByIndex(0));
      lcd.clear();
      lcd.print("t=");
      lcd.print(C);
      lcd.print("  heat on");
      lcd.setCursor(0,1);
      lcd.print("time ");
    lcd.print(now.hour(), DEC);
    lcd.print(':');
    lcd.print(now.minute(), DEC);
      
  delay (1000);
    if (C < temp1) 
    {
    digitalWrite(ledPin1, LOW);
     }
     else if (C >= temp1)
     {
       while(C >= temp2)
       {
       digitalWrite(ledPin1, HIGH);
       DateTime now = RTC.now();
         sensors.requestTemperatures(); 
         C = (sensors.getTempCByIndex(0));
    lcd.clear();
    lcd.print("t=");
    lcd.print(C);
    lcd.print(" heat off");
    lcd.setCursor(0,1);
    lcd.print("time ");
    lcd.print(now.hour(), DEC);
    lcd.print(':');
    lcd.print(now.minute(), DEC);
         delay (1000);
     }
     }
    
}

 

bodriy2014
bodriy2014 аватар
Offline
Зарегистрирован: 12.05.2015

Может логичней включать обогреватели до тех пор пока температура не подымется до нужной?

Мониторим температуру-упала ниже установленной включили обогрев, поднялась выше выключили.

Или реле включают по таймерам полив? или вентиляцию?

И как должны работать таймеры, считать время которое включенно реле?

или считать через сколько это реле включить?

или все вместе-считать сколько до включения реле затем включить и считать сколько включенно и так циклично для трех независимых реле?

sparrow
Offline
Зарегистрирован: 04.12.2014

Регулирование температуры (гестерезис) реализовано в коде через while:

if (C < temp1) 
    {
    digitalWrite(ledPin1, LOW);
     }
     else if (C >= temp1)
     {
       while(C >= temp2)
       {
       digitalWrite(ledPin1, HIGH);

Всё работает, проверено. Хотя я уверен можно было и лучше придумать. 

а таймеры нужны как раз для полива, вентиляции, освещения.

sparrow
Offline
Зарегистрирован: 04.12.2014

Вообще я пытался вытащить время из модуля (преобразовать в int) и путём сравнений сваять таймеры, но как-то не задалось.

хотелось бы без счёта. т.е. например стукнуло 12.15 - реле включилось, стукнуло 13.25 - выключилось.

смотрел примеры библиотеки RTC, ничего подходящего не нашёл(

Клапауций 911
Offline
Зарегистрирован: 18.10.2015

заходи в топик брата по несчастью http://arduino.ru/forum/programmirovanie/rabota-s-vremenem-i-datoi

sparrow
Offline
Зарегистрирован: 04.12.2014

благодарю.

заходил туда, подумал - не моя тема. 

сейчас начал вьезжать.   проблемка в том что библиотека time в моём ide 1.0.6. не арбайтен, а код стряпан именно там)

попробую разобраться.

Клапауций 911
Offline
Зарегистрирован: 18.10.2015

sparrow пишет:

проблемка в том что библиотека time в моём ide 1.0.6. не арбайтен

эта http://www.pjrc.com/teensy/td_libs_Time.html у меня работает.

inspiritus
Offline
Зарегистрирован: 17.12.2012

Вам в помощь псевдомультизадачный таймер управления процессами

http://www.pjrc.com/teensy/td_libs_TimerOne.html