Gроект для аквариума (акваконтроллер для led, temp, time, co2)

bwn
Offline
Зарегистрирован: 25.08.2014

Ограничение верхнего предела - строки 526-528 из 282 поста, функция обработки с 748, вызов из loop 1088. Карту EEPROM не помню, надо ручками вырисовывать.

Р/S посмотрите блоки if-else в строках 755-780, похоже там ошибка. Мне проверить не на чем. Заодно посмотрите 21 ячейку EEPROM, это гистерезис, где вводится, что то не увидел.

Для проверки, просто добавьте вывод температуры и сравниваемого значения в Serial, и посмотрите правильность срабатывания. По реле №2 явно что то не так.

serega.gram
Offline
Зарегистрирован: 15.04.2015

вроде нашёл ошибку. как проверю, напишу

serega.gram
Offline
Зарегистрирован: 15.04.2015

 скажите пожалуйста, получится ли подключить ардуино нано вместо этого контроллера. а то эта плата меняеться целиком а это дорого                                                                                                   
bwn
Offline
Зарегистрирован: 25.08.2014

Получиться то получится. Вопрос, кто прогу писать будет?  Да и количество входов-выходов (3) настораживает, напоминает дорогой, цифровой, интеллектуальный терморегулятор, исполняющий функции биметаллического.

serega.gram
Offline
Зарегистрирован: 15.04.2015

Да бойлер накопительный ТЕРМЕКС. Мне не повезло сгорел силовой блок и блок управления. Всё вместе 3т.р и я вот задумался над модернизацией. Либо собрать всё на ардуино а это выкинуть всё же будет дешевле

bwn
Offline
Зарегистрирован: 25.08.2014

Я бы на МК сделал, рублей в 500 уложитесь + защит можно навешать. ИМХО.

serega.gram
Offline
Зарегистрирован: 15.04.2015

На каком

bwn
Offline
Зарегистрирован: 25.08.2014

Думаю и на Тиньке можно, но сам их не юзал. В основном 168-328. В них ресурсов за глаза хватит.

serega.gram
Offline
Зарегистрирован: 15.04.2015

А пишется как ардуино, а то я сейчас пытаюсь освоить FLProg

serega.gram
Offline
Зарегистрирован: 15.04.2015








на ваш вгляд, этот код будет работать?



#include <Wire.h>
#include <OneWire.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C _lcd1(0x27, 16, 2);
int _dispTempLength1=0;
boolean _isNeedClearDisp1;
byte _d18x2x1Addr[8]={0x28, 0xEE, 0x28, 0x50, 0x28, 0x16, 0x1, 0x93};
OneWire  _ow4(4);
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.init();
_lcd1.backlight();
_bounseInputD3O =  digitalRead(3);
_bounseInputD6O =  digitalRead(6);
_bounseInputD5O =  digitalRead(5);
_bounseInputD2O =  digitalRead(2);
}
void loop()
{if (_isNeedClearDisp1) {_lcd1.clear(); _isNeedClearDisp1= 0;}
bool  _bounceInputTmpD3 =  (digitalRead (3));
if (_bounseInputD3S)
    {
     if (millis() >= (_bounseInputD3P + 40))
         {_bounseInputD3O= _bounceInputTmpD3; _bounseInputD3S=0;}
     }
else
    {
     if (_bounceInputTmpD3 != _bounseInputD3O )
         {_bounseInputD3S=1; _bounseInputD3P = millis();}
      }
bool  _bounceInputTmpD6 =  (digitalRead (6));
if (_bounseInputD6S)
    {
     if (millis() >= (_bounseInputD6P + 40))
         {_bounseInputD6O= _bounceInputTmpD6; _bounseInputD6S=0;}
     }
else
    {
     if (_bounceInputTmpD6 != _bounseInputD6O )
         {_bounseInputD6S=1; _bounseInputD6P = millis();}
      }
bool  _bounceInputTmpD5 =  (digitalRead (5));
if (_bounseInputD5S)
    {
     if (millis() >= (_bounseInputD5P + 40))
         {_bounseInputD5O= _bounceInputTmpD5; _bounseInputD5S=0;}
     }
else
    {
     if (_bounceInputTmpD5 != _bounseInputD5O )
         {_bounseInputD5S=1; _bounseInputD5P = millis();}
      }
bool  _bounceInputTmpD2 =  (digitalRead (2));
if (_bounseInputD2S)
    {
     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;}
}
//Плата:2
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);}

 

bwn
Offline
Зарегистрирован: 25.08.2014

Термодатчики лучше так (47 пост) для нескольких, в конце топика есть для одного. В оригинале у ТС использован WDT, но здесь лучше его использовать по назначению. Интервалы отрабатывать таким способом, как сейчас у вас, чревато неприятностями. Общую работоспособность, наверно проще на макете проверить.

serega.gram
Offline
Зарегистрирован: 15.04.2015

Скетч делался в графической среде FLProg по примерам , первый раз пробовал.

bwn
Offline
Зарегистрирован: 25.08.2014

А зачем так извращенно? Не проще полсотни операторов выучить?

Skaunet
Offline
Зарегистрирован: 12.11.2017

Всем доброго времени суток. Сам толком программировать пока не научился, поэтому может есть у кого уже готовый с похожим алгоритмом работы скетч?


Ну и по возможности с датчикам температуры и дисплеем. 

В наличии валяется датчик температуры DS18B20
Датчик реального времени DS3231 AT24C32 IIC
Парочка релюшак, мосфеты, и ардуинки.
Как собрать это в железе я то понимаю, а вот скетч на это написать ума пока что не хватает. 
Буду признателен за помощь.

Витенька
Offline
Зарегистрирован: 03.04.2016
Витенька
Offline
Зарегистрирован: 03.04.2016

Есть код такого как в первом посте но с двухстрочным дисплеем http://arduino.ru/forum/proekty/sutochnyi-taimer-na-8-kanalovpomogite