настройка DS1307+ Реле + TFT 3,2" (Mega 2560)
- Войдите на сайт для отправки комментариев
Чт, 16/06/2016 - 13:48
Всем привет, собираю для черепах автоматический контроль температуры и автокормушку, с аппаратной частью проблем нет, помогите с програмной, не могу понять как настроить срабатывание реле по времени, что написать с 145 по 155 строку?
[code]
#include <DS1307.h>
#include <UTFT.h>
#include <Wire.h>
#include <dht11.h> // Добавляем библиотеку DHT11
dht11 DHT; // Объявление переменной класса dht11
#define DHT11_PIN A1
#define RELAY_ON LOW
#define RELAY_OFF HIGH
#define Relay_1 9 // температура воды
//#define Relay_2 2 // температура суши
//#define Relay_3 10 // реле лампы
//#define Relay_4 11 // реле кормушки
long Temperature = 0, Pressure = 0;
extern uint8_t SmallFont[];
extern uint8_t BigFont[];
DS1307 rtc(6, 7);
Time t;
UTFT myGLCD(CTE32HR, 38, 39, 40, 41);
void setup()
{
Serial.begin(9600);
Serial.println("DHT11 test!");
Wire.begin();
rtc.halt(false); //Запускаем часы
//rtc.setDOW(THURSDAY); // настройка дня недели
//rtc.setTime(11, 30, 0); // настройка часов
//rtc.setDate(16, 6, 2016); // настройка даты
digitalWrite(Relay_1, RELAY_OFF); //
//digitalWrite(Relay_2, RELAY_OFF);
// digitalWrite(Relay_3, RELAY_OFF);
// digitalWrite(Relay_4, RELAY_OFF);
pinMode(Relay_1, OUTPUT);
// pinMode(Relay_2, OUTPUT);
// pinMode(Relay_3, OUTPUT);
// pinMode(Relay_4, OUTPUT);
delay(1000);
myGLCD.InitLCD();
// Нарисовать несколько линий
myGLCD.setColor(VGA_WHITE);
int x1, x2, y1, y2;
myGLCD.clrScr();
myGLCD.drawLine(0, 184, 479, 184);
myGLCD.drawLine(0, 49, 479, 49);
myGLCD.drawLine(0, 319, 479, 319);
myGLCD.drawLine(239, 49, 239, 319);
myGLCD.setColor(VGA_WHITE);
myGLCD.setBackColor(0, 0, 0);
myGLCD.setFont(BigFont);
// водоем
myGLCD.print("VODA", 55, 59);
myGLCD.print("Temp. :", LEFT, 89);
// суша
myGLCD.setColor(VGA_WHITE);
myGLCD.print("SUSHA", 303, 59);
myGLCD.print("Temp. :", 240, 89);
myGLCD.print("Hum. :", 240, 109);
//время работы лампы
myGLCD.setColor(VGA_WHITE);
myGLCD.print("SVET", 29, 194);
myGLCD.print("Time : 9-21", LEFT, 224);
// время кормления
myGLCD.setColor(VGA_WHITE);
myGLCD.print("KORM", 300, 194);
myGLCD.print("Time : 10-00", 240, 224);
myGLCD.print("Time : 18-00", 240, 244);
}
void loop()
{
int chk;
;
// Мониторинг ошибок
chk = DHT.read(DHT11_PIN); // Чтение данных
switch (chk){
case DHTLIB_OK:
break;
case DHTLIB_ERROR_CHECKSUM:
Serial.println("Checksum error, \t");
break;
case DHTLIB_ERROR_TIMEOUT:
Serial.println("Time out error, \t");
break;
default:
Serial.println("Unknown error, \t");
break;
}
digitalWrite(12,HIGH); ////
t = rtc.getTime();
String stringOne = rtc.getTimeStr();
myGLCD.setColor(VGA_WHITE); //Цвет отображения
myGLCD.setFont(BigFont); //Шрифт для отображения
myGLCD.print(rtc.getTimeStr(), CENTER, 1); //Отображаем часы
myGLCD.setColor(VGA_WHITE); //Цвет отображения
myGLCD.setFont(SmallFont); //Шрифт для отображения
myGLCD.print(rtc.getDateStr(), CENTER, 20); //Отображаем дату
// Выводим показания влажности и температуры
Serial.print("Humidity = ");
Serial.print(DHT.humidity, 1);
Serial.print(", Temp = ");
Serial.println(DHT.temperature,1);
// Реле подогрева суши
if (DHT.temperature <= 28) digitalWrite(Relay_1, RELAY_ON); //включаем реле если температура ниже
else if (DHT.temperature > 30) digitalWrite(Relay_1, RELAY_OFF); //выключаем реле если температура выше
// Реле подогрева воды
// if (DHT.temperature <= 25) digitalWrite(Relay_2, RELAY_ON); //включаем реле если температура ниже
// else if (DHT.temperature > 28) digitalWrite(Relay_2, RELAY_OFF); //выключаем реле если температура выше
// Реле включения выключения лампы уф
// if (??) digitalWrite(Relay_3, RELAY_ON); //включаем реле если время 09-00
// else if (??) digitalWrite(Relay_3, RELAY_OFF); //выключаем реле если время 21-00
// реле включения кормушки
//if (??) digitalWrite(Relay_4, RELAY_ON); //включаем реле в 10-00 на 2 секунды
//else if (??) digitalWrite(Relay_4, RELAY_OFF);
// реле включения кормушки
//if (??) digitalWrite(Relay_4, RELAY_ON); //включаем реле в 18-00 на 2 секунды
// else if (??) digitalWrite(Relay_4, RELAY_OFF);
myGLCD.setFont(BigFont);
myGLCD.setColor(VGA_WHITE);
// myGLCD.print(String(Temperature*0.1), 144,89); // температура воды
myGLCD.setColor(VGA_WHITE);
myGLCD.print(String(DHT.temperature), 368,89) ;
myGLCD.print("C ", 432,89 );
myGLCD.print(String(DHT.humidity), 368,109);
myGLCD.print("%", 432,109);
delay (5000);
}
[/code]
Всем привет, собираю для черепах автоматический контроль температуры и автокормушку,
А черепахи на каком контроллере?
Всем привет, собираю для черепах автоматический контроль температуры и автокормушку,
А черепахи на каком контроллере?
живые...
живые...
Ой, блин, простите. Честное слово не стёб. Как раз смотрел на шестиного робота-паука и был абсолютно уверен, что у Вас черепахи-роботы. Даже подумал - "кормушка", это они типа сами походят к зарядке и подзаряжаются, что-ли? :))))))
неужели ни кто не может помочь?
Не знаю какую библиотеку Вы ипользуете, но Вам надо прочитать значение 1)-часов, 2)минут, 3)секунд, Например так:
// Реле включения выключения лампы уф if (chasA == 9) digitalWrite(Relay_3, RELAY_ON); //включаем реле если время 09-00 if (chasA == 21 digitalWrite(Relay_3, RELAY_OFF); //выключаем реле если время 21-00 // реле включения кормушки if (chasA == 10 && minA == 0 && sekA == 0) digitalWrite(Relay_4, RELAY_ON); //включаем реле в 10-00 на 2 секунды if (chasA == 10 && minA == 0 && sekA==2) digitalWrite(Relay_4, RELAY_OFF); // реле включения кормушки if (chasA == 18 && minA == 0 && sekA == 0) digitalWrite(Relay_4, RELAY_ON); //включаем реле в 18-00 на 2 секунды if (chasA == 18 && minA == 0 && sekA==2) digitalWrite(Relay_4, RELAY_OFF);И уберите в конце delay 5сек. потому что Вы не сможете открыть/закрыть комушку на 2 сек.
Не знаю какую библиотеку Вы ипользуете, но Вам надо прочитать значение 1)-часов, 2)минут, 3)секунд, Например так:
// Реле включения выключения лампы уф if (chasA == 9) digitalWrite(Relay_3, RELAY_ON); //включаем реле если время 09-00 if (chasA == 21 digitalWrite(Relay_3, RELAY_OFF); //выключаем реле если время 21-00 // реле включения кормушки if (chasA == 10 && minA == 0 && sekA == 0) digitalWrite(Relay_4, RELAY_ON); //включаем реле в 10-00 на 2 секунды if (chasA == 10 && minA == 0 && sekA==2) digitalWrite(Relay_4, RELAY_OFF); // реле включения кормушки if (chasA == 18 && minA == 0 && sekA == 0) digitalWrite(Relay_4, RELAY_ON); //включаем реле в 18-00 на 2 секунды if (chasA == 18 && minA == 0 && sekA==2) digitalWrite(Relay_4, RELAY_OFF);И уберите в конце delay 5сек. потому что Вы не сможете открыть/закрыть комушку на 2 сек.
Спасибо, за совет, что то при компиляции ошибка 'sekA' was not declared in this scope я так понимаю ее надо прописать где то...
Канешно этоже переменные, их нужно декларировать!!!
Теперь опять ошибка 'DS1307_SEC' was not declared in this scope
Я же Вам написал "Например так" Это значит что каждая библиотека по своему определяет часы, минуты, секунды. В самой библиотеке должны быть примеры, посмотрите их и определите как присвоить значение.
Понял, прошу прощения за глупые вопросы
Все равно не получается, подскажите с какой библиотекой у Вас пример написан? может скините ссылочку?
Вот ссылка на сайт где есть библиотека которую я описал, но там надо регистрироваться а мне это не надо. Почитайте и скачаете. http://full-chip.net/17-arduino-rtc-ds1307-chasy-realnogo-vremeni-i-arduino-s-vyvodom-na-displey-16x2.html
У себе найти не могу!
Вот код на той библиотеке что у Вас (если я угадал) _ проверяйте:
#include <DS1307.h> // Init the DS1307 DS1307 rtc(6, 7); #define RELAY_ON LOW #define RELAY_OFF HIGH #define Relay_1 9 // температура воды #define Relay_2 2 // температура суши #define Relay_3 10 // реле лампы #define Relay_4 11 // реле кормушки // Init a Time-data structure Time t; int chasA; int minA; int sekA; void setup() { // Set the clock to run-mode rtc.halt(false); // Setup Serial connection Serial.begin(9600); } void loop() { // Get data from the DS1307 t = rtc.getTime(); chasA = t.hour; minA = t.min; sekA = t.sec; // Реле включения выключения лампы уф if (chasA == 9) digitalWrite(Relay_3, RELAY_ON); //включаем реле если время 09-00 if (chasA == 21) digitalWrite(Relay_3, RELAY_OFF); //выключаем реле если время 21-00 // реле включения кормушки if (chasA == 10 && minA == 0 && sekA == 0) digitalWrite(Relay_4, RELAY_ON); //включаем реле в 10-00 на 2 секунды if (chasA == 10 && minA == 0 && sekA==2) digitalWrite(Relay_4, RELAY_OFF); // реле включения кормушки if (chasA == 18 && minA == 0 && sekA == 0) digitalWrite(Relay_4, RELAY_ON); //включаем реле в 18-00 на 2 секунды if (chasA == 18 && minA == 0 && sekA==2) digitalWrite(Relay_4, RELAY_OFF); }Теперь компиляция проходит удачно, но реле не включается, попробывал Ваш отдельно залить, та же проблема реле не хочет работать.
Включилось реле убрав одно равно
if(chasA = 9)В 38 строчку пропишите Serial.println(chasA);
Выдало другое число, как настроить что реле работало с 9 до 21?
В принцепе там в коде все настроено (Правда я его не проверял) необходимо дождаться времени срабатывания и проверять все с помощью Serial. Просто проведите суточную проверку!!!
Хорошо попробую
Выдало другое число, как настроить что реле работало с 9 до 21?
Попробуйте так:
#include <DS1307.h> // Init the DS1307 DS1307 rtc(6, 7); #define RELAY_ON LOW #define RELAY_OFF HIGH #define Relay_1 9 // температура воды #define Relay_2 2 // температура суши #define Relay_3 10 // реле лампы #define Relay_4 11 // реле кормушки // Init a Time-data structure Time t; int chasA; int minA; int sekA; void setup() { // Set the clock to run-mode rtc.halt(false); // Setup Serial connection Serial.begin(9600); } void loop() { // Get data from the DS1307 t = rtc.getTime(); chasA = t.hour; minA = t.min; sekA = t.sec; // Реле включения выключения лампы уф if (chasA >= 9 && chasA <= 21) digitalWrite(Relay_3, RELAY_ON); //включаем реле если время 09-00 else digitalWrite(Relay_3, RELAY_OFF); //выключаем реле если время 21-00 // реле включения кормушки if (chasA == 10 && minA == 0 && sekA == 0) digitalWrite(Relay_4, RELAY_ON); //включаем реле в 10-00 на 2 секунды if (chasA == 10 && minA == 0 && sekA == 2) digitalWrite(Relay_4, RELAY_OFF); // реле включения кормушки if (chasA == 18 && minA == 0 && sekA == 0) digitalWrite(Relay_4, RELAY_ON); //включаем реле в 18-00 на 2 секунды if (chasA == 18 && minA == 0 && sekA == 2) digitalWrite(Relay_4, RELAY_OFF); }Супер, так работает, спасибо большое!
Спасибо работают оба кода, проблема была в delay, тогда другой вопрос как сделать чтоб информация о температуре и влажности не скакала так сильно... обновлялась каждые 5 секунд?
Мерять каждые 0,5 секунды - через 5 сек. получим 10 значений. Вывести среднее