Подскажите пож-та как реализовать таймеры?
- Войдите на сайт для отправки комментариев
Ср, 04/11/2015 - 20:55
Здравствуйте. собираю потихотьку небольшой парничок. его задача поддерживать темературу, выводить её (и время) на дисплей 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);
}
}
}
Может логичней включать обогреватели до тех пор пока температура не подымется до нужной?
Мониторим температуру-упала ниже установленной включили обогрев, поднялась выше выключили.
Или реле включают по таймерам полив? или вентиляцию?
И как должны работать таймеры, считать время которое включенно реле?
или считать через сколько это реле включить?
или все вместе-считать сколько до включения реле затем включить и считать сколько включенно и так циклично для трех независимых реле?
Регулирование температуры (гестерезис) реализовано в коде через while:
if (C < temp1) { digitalWrite(ledPin1, LOW); } else if (C >= temp1) { while(C >= temp2) { digitalWrite(ledPin1, HIGH);Всё работает, проверено. Хотя я уверен можно было и лучше придумать.
а таймеры нужны как раз для полива, вентиляции, освещения.
Вообще я пытался вытащить время из модуля (преобразовать в int) и путём сравнений сваять таймеры, но как-то не задалось.
хотелось бы без счёта. т.е. например стукнуло 12.15 - реле включилось, стукнуло 13.25 - выключилось.
смотрел примеры библиотеки RTC, ничего подходящего не нашёл(
заходи в топик брата по несчастью http://arduino.ru/forum/programmirovanie/rabota-s-vremenem-i-datoi
благодарю.
заходил туда, подумал - не моя тема.
сейчас начал вьезжать. проблемка в том что библиотека time в моём ide 1.0.6. не арбайтен, а код стряпан именно там)
попробую разобраться.
проблемка в том что библиотека time в моём ide 1.0.6. не арбайтен
эта http://www.pjrc.com/teensy/td_libs_Time.html у меня работает.
Вам в помощь псевдомультизадачный таймер управления процессами
http://www.pjrc.com/teensy/td_libs_TimerOne.html