Ограничение верхнего предела - строки 526-528 из 282 поста, функция обработки с 748, вызов из loop 1088. Карту EEPROM не помню, надо ручками вырисовывать.
Р/S посмотрите блоки if-else в строках 755-780, похоже там ошибка. Мне проверить не на чем. Заодно посмотрите 21 ячейку EEPROM, это гистерезис, где вводится, что то не увидел.
Для проверки, просто добавьте вывод температуры и сравниваемого значения в Serial, и посмотрите правильность срабатывания. По реле №2 явно что то не так.
Получиться то получится. Вопрос, кто прогу писать будет? Да и количество входов-выходов (3) настораживает, напоминает дорогой, цифровой, интеллектуальный терморегулятор, исполняющий функции биметаллического.
Да бойлер накопительный ТЕРМЕКС. Мне не повезло сгорел силовой блок и блок управления. Всё вместе 3т.р и я вот задумался над модернизацией. Либо собрать всё на ардуино а это выкинуть всё же будет дешевле
Термодатчики лучше так (47 пост) для нескольких, в конце топика есть для одного. В оригинале у ТС использован WDT, но здесь лучше его использовать по назначению. Интервалы отрабатывать таким способом, как сейчас у вас, чревато неприятностями. Общую работоспособность, наверно проще на макете проверить.
Всем доброго времени суток. Сам толком программировать пока не научился, поэтому может есть у кого уже готовый с похожим алгоритмом работы скетч?
Ну и по возможности с датчикам температуры и дисплеем.
В наличии валяется датчик температуры DS18B20
Датчик реального времени DS3231 AT24C32 IIC
Парочка релюшак, мосфеты, и ардуинки.
Как собрать это в железе я то понимаю, а вот скетч на это написать ума пока что не хватает.
Буду признателен за помощь.
Ограничение верхнего предела - строки 526-528 из 282 поста, функция обработки с 748, вызов из loop 1088. Карту EEPROM не помню, надо ручками вырисовывать.
Р/S посмотрите блоки if-else в строках 755-780, похоже там ошибка. Мне проверить не на чем. Заодно посмотрите 21 ячейку EEPROM, это гистерезис, где вводится, что то не увидел.
Для проверки, просто добавьте вывод температуры и сравниваемого значения в Serial, и посмотрите правильность срабатывания. По реле №2 явно что то не так.
вроде нашёл ошибку. как проверю, напишу
Получиться то получится. Вопрос, кто прогу писать будет? Да и количество входов-выходов (3) настораживает, напоминает дорогой, цифровой, интеллектуальный терморегулятор, исполняющий функции биметаллического.
Да бойлер накопительный ТЕРМЕКС. Мне не повезло сгорел силовой блок и блок управления. Всё вместе 3т.р и я вот задумался над модернизацией. Либо собрать всё на ардуино а это выкинуть всё же будет дешевле
Я бы на МК сделал, рублей в 500 уложитесь + защит можно навешать. ИМХО.
На каком
Думаю и на Тиньке можно, но сам их не юзал. В основном 168-328. В них ресурсов за глаза хватит.
А пишется как ардуино, а то я сейчас пытаюсь освоить FLProg
на ваш вгляд, этот код будет работать?
#include <OneWire.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C _lcd1(0x27, 16, 2);
int _dispTempLength1=0;
boolean _isNeedClearDisp1;
bool _bounseInputD6S = 0;
bool _bounseInputD6O = 0;
unsigned long _bounseInputD6P = 0UL;
bool _bounseInputD2S = 0;
bool _bounseInputD2O = 0;
unsigned long _bounseInputD2P = 0UL;
bool _count2I = 0;
int _count2P = 0;
bool _trgrt2 = 0;
bool _trgrt2I = 0;
bool _trgs1 = 0;
bool _trgrt3 = 0;
bool _trgrt3I = 0;
bool _trgrt1 = 0;
bool _trgrt1I = 0;
bool _trgt2 = 0;
bool _trgt2I = 0;
bool _bounseInputD3S = 0;
bool _bounseInputD3O = 0;
unsigned long _bounseInputD3P = 0UL;
int _disp1oldLength = 0;
bool _bounseInputD5S = 0;
bool _bounseInputD5O = 0;
unsigned long _bounseInputD5P = 0UL;
unsigned long _d18x2x1Tti = 0UL;
float _d18x2x1O = 0.00;
bool _trgt1 = 0;
bool _trgt1I = 0;
bool _trgrt4 = 0;
bool _trgrt4I = 0;
int _disp2oldLength = 0;
bool _trgs2 = 0;
void setup()
{
Wire.begin();
delay(10);
pinMode(5, INPUT);
digitalWrite(5, HIGH);
pinMode(3, INPUT);
digitalWrite(3, HIGH);
pinMode(6, INPUT);
digitalWrite(6, HIGH);
pinMode(2, INPUT);
digitalWrite(2, HIGH);
pinMode(7, OUTPUT);
pinMode(8, OUTPUT);
_lcd1.backlight();
_bounseInputD3O = digitalRead(3);
_bounseInputD6O = digitalRead(6);
_bounseInputD5O = digitalRead(5);
_bounseInputD2O = digitalRead(2);
}
void loop()
{if (_isNeedClearDisp1) {_lcd1.clear(); _isNeedClearDisp1= 0;}
{
if (millis() >= (_bounseInputD3P + 40))
{_bounseInputD3O= _bounceInputTmpD3; _bounseInputD3S=0;}
}
else
{
if (_bounceInputTmpD3 != _bounseInputD3O )
{_bounseInputD3S=1; _bounseInputD3P = millis();}
}
bool _bounceInputTmpD6 = (digitalRead (6));
{
if (millis() >= (_bounseInputD6P + 40))
{_bounseInputD6O= _bounceInputTmpD6; _bounseInputD6S=0;}
}
else
{
if (_bounceInputTmpD6 != _bounseInputD6O )
{_bounseInputD6S=1; _bounseInputD6P = millis();}
}
bool _bounceInputTmpD5 = (digitalRead (5));
{
if (millis() >= (_bounseInputD5P + 40))
{_bounseInputD5O= _bounceInputTmpD5; _bounseInputD5S=0;}
}
else
{
if (_bounceInputTmpD5 != _bounseInputD5O )
{_bounseInputD5S=1; _bounseInputD5P = millis();}
}
bool _bounceInputTmpD2 = (digitalRead (2));
{
if (millis() >= (_bounseInputD2P + 40))
{_bounseInputD2O= _bounceInputTmpD2; _bounseInputD2S=0;}
}
else
{
if (_bounceInputTmpD2 != _bounseInputD2O )
{_bounseInputD2S=1; _bounseInputD2P = millis();}
}
//Плата:1
if(_isTimer(_d18x2x1Tti, 5000)) {
_d18x2x1Tti = millis();
_d18x2x1O= _readDS18_ow4(_d18x2x1Addr, 0);}
if (((_d18x2x1O)) <= (_count2P)) { if (_trgrt1I) { _trgrt1 = 0;} else {_trgrt1 = 1; _trgrt1I = 1;} } else {_trgrt1 = 0; _trgrt1I = 0;};
if(_trgrt1) _trgs1 = 1;
if(_trgrt2) _trgs1 = 0;
if (((_d18x2x1O)) >= ((_count2P)+(1))) { if (_trgrt2I) { _trgrt2 = 0;} else {_trgrt2 = 1; _trgrt2I = 1;} } else {_trgrt2 = 0; _trgrt2I = 0;};
if (((_d18x2x1O)) <= (_count2P)) { if (_trgrt4I) { _trgrt4 = 0;} else {_trgrt4 = 1; _trgrt4I = 1;} } else {_trgrt4 = 0; _trgrt4I = 0;};
if(_trgrt4) _trgs2 = 1;
if(_trgrt3) _trgs2 = 0;
if (((_d18x2x1O)) >= ((_count2P)+(1))) { if (_trgrt3I) { _trgrt3 = 0;} else {_trgrt3 = 1; _trgrt3I = 1;} } else {_trgrt3 = 0; _trgrt3I = 0;};
if (( (!(_bounseInputD2O)) || (!(_bounseInputD6O)) ))
{
if (! _count2I)
{
if (!(_bounseInputD2O)) {_count2P = _count2P+1;} else {_count2P = _count2P-1;};
_count2I = 1;
}
}
else
{
_count2I=0;
}
if (1) {
_dispTempLength1 = ((( _floatToStringWitRaz((_d18x2x1O),2)))).length();
if (_disp1oldLength > _dispTempLength1) {_isNeedClearDisp1 = 1;}
_disp1oldLength = _dispTempLength1;
_lcd1.setCursor(0, 0);
_lcd1.print((( _floatToStringWitRaz((_d18x2x1O),2))));
} else {
if (_disp1oldLength > 0) {_isNeedClearDisp1 = 1; _disp1oldLength = 0;}
}
digitalWrite(7, !(_trgs1));
digitalWrite(8, !(_trgs2));
if (0) {
_dispTempLength1 = (((String((_count2P)+(1), DEC)))).length();
if (_disp2oldLength > _dispTempLength1) {_isNeedClearDisp1 = 1;}
_disp2oldLength = _dispTempLength1;
_lcd1.setCursor(3, 0);
_lcd1.print(((String((_count2P)+(1), DEC))));
} else {
if (_disp2oldLength > 0) {_isNeedClearDisp1 = 1; _disp2oldLength = 0;}
}
bool _tmp1 = ( (( (!(_bounseInputD5O)) && (!(0)) )) || (0) );
if (_tmp1) { if (! _trgt1I) _trgt1 = ! _trgt1; }
_trgt1I = _tmp1;
bool _tmp2 = ( (( (!(_bounseInputD5O)) && (!(0)) )) || (!(_bounseInputD3O)) );
if (_tmp2) { if (! _trgt2I) _trgt2 = ! _trgt2; }
_trgt2I = _tmp2;
digitalWrite(7, !(_trgt1));
digitalWrite(8, !(_trgt2));
}
String _floatToStringWitRaz(float value, int raz)
{
return String(value,raz);
}
bool _isTimer(unsigned long startTime, unsigned long period )
{
unsigned long currentTime;
currentTime = millis();
if (currentTime>= startTime) {return (currentTime>=(startTime + period));} else {return (currentTime >=(4294967295-startTime+period));}
}
float _convertDS18x2xData(byte type_s, byte data[12])
{
int16_t raw = (data[1] << 8) | data[0];
if (type_s)
{
raw = raw << 3;
if (data[7] == 0x10) { raw = (raw & 0xFFF0) + 12 - data[6]; }
}
else
{
byte cfg = (data[4] & 0x60);
if (cfg == 0x00) raw = raw & ~7; else if (cfg == 0x20) raw = raw & ~3; else if (cfg == 0x40) raw = raw & ~1;
}
return (float)raw / 16.0;
}
float _readDS18_ow4(byte addr[8], byte type_s)
{ byte data[12];
byte i;
_ow4.reset();
_ow4.select(addr);
_ow4.write(0xBE);
for ( i = 0; i < 9; i++) {
data[i] = _ow4.read();}
_ow4.reset();
_ow4.select(addr);
_ow4.write(0x44, 1);
return _convertDS18x2xData(type_s, data);}
Термодатчики лучше так (47 пост) для нескольких, в конце топика есть для одного. В оригинале у ТС использован WDT, но здесь лучше его использовать по назначению. Интервалы отрабатывать таким способом, как сейчас у вас, чревато неприятностями. Общую работоспособность, наверно проще на макете проверить.
Скетч делался в графической среде FLProg по примерам , первый раз пробовал.
А зачем так извращенно? Не проще полсотни операторов выучить?
Всем доброго времени суток. Сам толком программировать пока не научился, поэтому может есть у кого уже готовый с похожим алгоритмом работы скетч?
Ну и по возможности с датчикам температуры и дисплеем.
В наличии валяется датчик температуры DS18B20
Датчик реального времени DS3231 AT24C32 IIC
Парочка релюшак, мосфеты, и ардуинки.
Как собрать это в железе я то понимаю, а вот скетч на это написать ума пока что не хватает.
Буду признателен за помощь.
http://www.aquaforum.ua/showthread.php?t=175844
Есть код такого как в первом посте но с двухстрочным дисплеем http://arduino.ru/forum/proekty/sutochnyi-taimer-na-8-kanalovpomogite