Проблема с кодом (Таймер)
- Войдите на сайт для отправки комментариев
Приветствую народ! Глючит данный скетч. По работе программы в идеале как я задумал. По RTC часам и состоянию геркон-поплавка(Poplavok1_PIN притянут к земле и установлен в LOW) включается нагрузка на rele1, при достижении контрольного времени, или замыкании геркона Poplavok1_PIN нагрузка отключается и происходит перелив во вторую ёмкость, в которой срабатывает Poplavok2_PIN и активирует rele2. Проблема в том, что програма работает не стабильно, бывает 2 дня нормально, а бывает выставляет все выходы в хай и зависает намертво. Поплавки руками замыкал во время "удачных" пусков по таймеру - работали. сама плата ардуино уно р3 мега32у4 + мега328 дип питается от кренки и от необслуживаемой батареи 12в, поплавки герконы через резистор 10к подтянуты к земле. модуль ds1307 готовый китайчатинка, проверял на другой самоделке - работает. и собственно сам код
#include <Wire.h>
#define DS1307_I2C_ADDRESS 0x68
int Poplavok1_PIN = 4;
int Poplavok2_PIN = 5;
int rele1 = 6;
int rele2 = 7;
int val = 0;
/////////// часы
byte decToBcd(byte val) {
return ( (val / 10 * 16) + (val % 10) );
}
byte bcdToDec(byte val) {
return ( (val / 16 * 10) + (val % 16) );
}
void getDateDs1307(byte *second,
byte *minute,
byte *hour,
byte *dayOfWeek,
byte *dayOfMonth,
byte *month,
byte *year)
{
Wire.beginTransmission(DS1307_I2C_ADDRESS);
Wire.write(0);
Wire.endTransmission();
Wire.requestFrom(DS1307_I2C_ADDRESS, 7);
*second = bcdToDec(Wire.read() & 0x7f);
*minute = bcdToDec(Wire.read());
*hour = bcdToDec(Wire.read() & 0x3f);
*dayOfWeek = bcdToDec(Wire.read());
*dayOfMonth = bcdToDec(Wire.read());
*month = bcdToDec(Wire.read());
*year = bcdToDec(Wire.read());
}
void setup() {
Wire.begin();
pinMode(rele1, OUTPUT);
digitalWrite(rele1, LOW);
pinMode(rele2, OUTPUT);
pinMode(Poplavok1_PIN, INPUT);
pinMode(Poplavok2_PIN, INPUT);
}
void loop() {
byte second, minute, hour, dayOfWeek, dayOfMonth, month, year;
getDateDs1307(&second, &minute, &hour, &dayOfWeek, &dayOfMonth, &month, &year);
int currentTime = hour * 60 + minute;
int tOn1 = 540;
int tOff1 = 548;
if (currentTime >= tOn1 && digitalRead(Poplavok1_PIN) == LOW) {
digitalWrite(rele1, HIGH);
}
if (currentTime >= tOff1 || digitalRead(Poplavok1_PIN) == HIGH)
{
digitalWrite(rele1, LOW);
}
//first timer
int tOn2 = 720;
int tOff2 = 728;
if (currentTime >= tOn2 && digitalRead(Poplavok1_PIN) == LOW) {
digitalWrite(rele1, HIGH);
}
if (currentTime >= tOff2 || digitalRead(Poplavok1_PIN) == HIGH)
{
digitalWrite(rele1, LOW);
}
//second timer
int tOn3 = 900;
int tOff3 = 908;
if (currentTime >= tOn3 && digitalRead(Poplavok1_PIN) == LOW) {
digitalWrite(rele1, HIGH);
}
if (currentTime >= tOff3 || digitalRead(Poplavok1_PIN) == HIGH)
{
digitalWrite(rele1, LOW);
}
// 3 timer
int tOn4 = 1080;
int tOff4 = 1088;
if (currentTime >= tOn4 && digitalRead(Poplavok1_PIN) == LOW) {
digitalWrite(rele1, HIGH);
}
if (currentTime >= tOff4 || digitalRead(Poplavok1_PIN) == HIGH)
{
digitalWrite(rele1, LOW);
}
//4 timer
val = digitalRead(Poplavok2_PIN);
digitalWrite(rele2, val);
}
http://arduino.ru/forum/obshchii/vstavka-programmnogo-koda-v-temukommentarii
Напиши словами алгоритм - как это все должно работать, а то непонятно.
Как минимум - надо убедиться, что requestFrom таки получил 7 байт от часов ;)
Запрос requuestFrom 100% и без запинов работает в другом скетче - недельном таймере, плата ch340 + 328р sop корпус. Алгоритм простейший. По временным интервалам в loop и состоянию поплавков(Poplavok1_PIN) включается нагрузка rele1. И вне зависимости от времени включается нагрузка на rele2 при замыкании геркона-поплавка Poplavok2_PIN. Всё. Последний пункт с реле2 выполняется беспроблемно и как я понял "затык" происходит во время включения по временным интервалам. Сегодня ещё заметил плохое крепление штекера от б/п, плата вообще отрубилась, пофиксил штекер, посмотрим что будет дальше. В пути дс3231.
Если затык происходит во время включения/выключения реле - смотрите помехи по питанию, как минимум. RC-фильтр хотя бы стоит? Имхо, если с программой всё норм - значит первое, на что надо смотреть - питание.
Скорее всего дело может быть в этом, других вариантов я не вижу. Хотя на реле1 работает помпа на 400ватт 220в, на реле2 помпа на 30ватт, но наверное первая всё же создаёт искру при пуске и этого хватает, что б мега затупила. В общем буду разбираться... Спасибо за наводку!