Аквариумный контроллера на 2 аквариума

elfrom
Offline
Зарегистрирован: 28.08.2014

Представляю Вам свою версию простого акваконтроллера
Дано:
1 шт. Arduino nano v3.
1 шт. Oled дисплей 128 X 64 I2C 0,96".
2 шт. Водонепроницаемых DS18B20 температурных датчика.
1 шт. DS3231 модуль часов реального времени.
1 шт. 8 канальный релейный модуль
Итого:
Управление 2мя аквариумами
1 аквариум 4 таймера света + 1 канал на охлаждение (включение вентилятора)
2 аквариум 2 таймера света + 1 канал на охлаждение (включение вентилятора)
вывод на дисплей:
Температуру с 2х датчиков
Статус каналов освещения, охлаждения (включено выключено)
Время контроллера (нужно настроить отображение "0" в скетче код имеется)

Скетч

https://cloud.mail.ru/public/2JgH/LZp3KUEvg

Библиотеки
 https://cloud.mail.ru/public/JjC3/34fWJ6rzA

Stas046
Offline
Зарегистрирован: 10.12.2014

Не понятно, а где акваконтроллер-то? Кроме голого дисплейчика с надписями типа: темпер 1  -1001 (чего-то там)  ничего не вижу. Где органы управления???  А... понял все дело в уникальной софт-начинке... ))))  Пора мне представить в разделе проектов свою версию "мигалки диодиком на 13 ножке" )))))))

elfrom
Offline
Зарегистрирован: 28.08.2014

смысл тыкалок если все в скетче указано когда что ключается, выключается, про температуру датчики не подключены в момент съемки. выкладывайте свою мигалку если она кому то пригодиться тут готовое издели с описанием компанентов и работой аналогичные контроллеры имеются либо с 2хстрочными дисплеями либо усложненные конструкции я преследовал цель 1 дисплей для вывода информации включил и забыл.

Stas046
Offline
Зарегистрирован: 10.12.2014

"смысл тыкалок если все в скетче указано когда что ключается, выключается" А если нужно изменить  световой день на часок в ту или иную сторону? А если нужно поднять или опустить температуру на 1-2 градуса?  если часики убежали и нужна коррекция? Тащить все это к компу и лить новый скетч? 

Смысл от цветного экранчика 128 X 64? Вглядываться в эту кучку пикселей, что бы понять включен свет или нет?

"готовое издели с описанием компанентов и работой" Где оно, это изделие??? 

Вот, к примеру, мои "изделия":

Этот рулит большим аквасом.

А этот :

рулит банкой по-меньше. (Часики к аквариуму отношения не имеют, пока не придумал куда поставить :)  )

Все это собрано самодельной паялкой:

Хоть внешний вид и "ниочем", будет время и желание переделаю, но это хотябы похоже на готовое изделие.

А ваше изделие это дисплейчик+дунька+релейный модуль+пучок проводков на столе ? так?

Так это не изделие, это макет из говна и палок.

P.S. Орфография с пунктуацией жесть )

 

elfrom
Offline
Зарегистрирован: 28.08.2014

пусть так) просто выложил скетч быть может кому будет полезен делов то) пунктуация согласен мне минус)

Udav4ik
Offline
Зарегистрирован: 13.10.2015

Спасибо за скетч. Двое суток лопатил интернет ища именно такой скетч для релюшек. Дисплея нет-это именно то, что мне надо,настроил один раз и забыл.

 
 
Udav4ik
Offline
Зарегистрирован: 13.10.2015

Подскажите, а как на первый канал добавить третий период срабатывания реле "включить"..."выключить"?

4ishops
Offline
Зарегистрирован: 06.10.2012

а кроме освещения и температуры он больше ничегоне умеет? Ph и пр?

 

 

Udav4ik
Offline
Зарегистрирован: 13.10.2015

4ishops пишет:

а кроме освещения и температуры он больше ничегоне умеет? Ph и пр?

нет

Udav4ik
Offline
Зарегистрирован: 13.10.2015
/*Готовая версия контроллера я рад)
 * Роман Четин
 */

//Загрузка библиотек 
#include <OneWire.h>
#include <Wire.h>
#include <RTClib.h>

int TSensorPin1 = 2;
int TSensorPin2 = 3;
OneWire ds1(TSensorPin1);
OneWire ds2(TSensorPin2);

RTC_DS1307 RTC;
//Подключение выходов
const int RelayChn1 = 5;        //Используем цифровой ПОРТ 5  для ПЕРВОГО    канала релейного модуля
const int RelayChn2 = 6;        //Используем цифровой ПОРТ 6  для ВТОРОГО    канала релейного модуля
const int RelayChn3 = 7;        //Используем цифровой ПОРТ 7  для ТРЕТЬЕГО   канала релейного модуля
const int RelayChn4 = 8;        //Используем цифровой ПОРТ 8  для ЧЕТВЕРТОГО канала релейного модуля
const int RelayChn5 = 9;        //Используем цифровой ПОРТ 9  для ПЯТОГО     канала релейного модуля
const int RelayChn6 = 10;       //Используем цифровой ПОРТ 10 для ШЕСТОГО    канала релейного модуля
const int RelayChn7 = 11;       //Используем цифровой ПОРТ 11 для СЕДЬМОГО   канала релейного модуля
const int RelayChn8 = 12;       //Используем цифровой ПОРТ 12 для ВОСЬМОГО   канала релейного модуля
#define sc 1UL
#define mn 60UL
#define hr 3600UL

//----------Настройки времени и продолжительности включения реле

//----------Первый канал  LED 5ШТ.*10ВТ. Реле №3 ------------
const long StartRelCn_1 = 8*hr+00*mn+00*sc;        //Время срабатывания на ПЕРВОМ канале релейного модуля
const long DurationCh_1 = 2*hr+00*mn+00*sc;        //ДЛИТЕЛЬНОСТЬ срабатывания реле на ПЕРВОМ канале
//----------Первый канал  LED 5ШТ.*10ВТ  Реле №3  -------------
const long StartRelCn_1L = 17*hr+00*mn+00*sc;               
const long DurationCh_1L = 5*hr+00*mn+00*sc;
//----------Первый канал----------------------------
//const long StartRelCn_1G = 15*hr+3*mn;               
//const long DurationCh_1G = 0*hr+5*mn;

//----------Второй канал   LED 7ШТ.*10ВТ. Реле №4 ------------
const long StartRelCn_2 = 10*hr+00*mn+00*sc;                    
const long DurationCh_2 = 7*hr+00*mn+00*sc;     
              
//----------Третий канал   LED (24 BLUE+10 RED)*3ВТ. Реле №5 ----
const long StartRelCn_3 = 7*hr+30*mn+00*sc;                      
const long DurationCh_3 = 15*hr+00*mn+00*sc;    
                 
//----------Четвертый канал CO2   Реле №2 --------------
const long StartRelCn_4 = 9*hr+00*mn+00*sc;                     
const long DurationCh_4 = 12*hr+00*mn+00*sc;            

//----------Пятый канал   Удобрения  Реле №1 ------------
const long StartRelCn_5 = 10*hr;                
const long DurationCh_5 = 30*sc;          
          
//----------Шестой канал   Кормушка  ---------------------
const long StartRelCn_6 = 9*hr;                    
const long DurationCh_6 = 0*hr;         
           
//----------Терморегуляторы

//----------Седьмой КАНАЛ----------------------------
float t1 = 24.5;                                     //Уставка температуры для СЕДЬМОГО канала релейного модуля 1 аквариум
float tGistrsis1 = 0.7;                              //Уставка гистерезиса - т.е отклонения от темп-ры уставки т.е. в данном случае 0,7 = плюс минус 0,35 градуса

//----------Восьмой КАНАЛ----------------------------
float t2 = 24.5;                                     //Уставка температуры для ВОСЬМОГО канала релейного модуля 2 аквариум
float tGistrsis2 = 0.7;               
//*********************************************************

void setup () {
  Wire.begin();            
  RTC.begin();
   //  RTC.adjust(DateTime(__DATE__, __TIME__)); // строка только для первой компиляции!!!
  DateTime myTime = RTC.now();

  //Первоначальные установки выходов
    pinMode(RelayChn1,OUTPUT);                       //Инициализируем порт для 1 канала как ВЫХОД
    pinMode(RelayChn2,OUTPUT);                       //Инициализируем порт для 2 канала как ВЫХОД   
    pinMode(RelayChn3,OUTPUT);                       //Инициализируем порт для 3 канала как ВЫХОД  
    pinMode(RelayChn4,OUTPUT);                       //Инициализируем порт для 4 канала как ВЫХОД
    pinMode(RelayChn5,OUTPUT);                       //Инициализируем порт для 5 канала как ВЫХОД   
    pinMode(RelayChn6,OUTPUT);                       //Инициализируем порт для 6 канала как ВЫХОД 
    pinMode(RelayChn7,OUTPUT);                       //Инициализируем порт для 7 канала как ВЫХОД
    pinMode(RelayChn8,OUTPUT);                       //Инициализируем порт для 8 канала как ВЫХОД   
   
    digitalWrite(RelayChn1,LOW);                    //Устанавливаем на входах релейного модуля ВЫСОКИЙ уровень 
    digitalWrite(RelayChn2,LOW);                    //Т.к. используемый релейный модуль с опторазвязкой - управляется инверсной логикой 
    digitalWrite(RelayChn3,LOW);                       
    digitalWrite(RelayChn4,LOW);                   
    digitalWrite(RelayChn5,LOW);                    
    digitalWrite(RelayChn6,HIGH);                     
    digitalWrite(RelayChn7,LOW);                   
    digitalWrite(RelayChn8,LOW);                   
 }
//***************************************************
void loop () {
  DateTime myTime = RTC.now();
  uint32_t utime = myTime.unixtime();
  utime %=86400;
  
//----------------------------релейная настройка начало------------------
    //------------КАНАЛ 1------------------------------
    if ((utime >= StartRelCn_1) && 
       (utime < (StartRelCn_1+DurationCh_1)) or (utime >= StartRelCn_1L) && 
       (utime < (StartRelCn_1L+DurationCh_1L))) 
     
  // if ((utime >= StartRelCn_1) && 
  //     (utime < (StartRelCn_1+DurationCh_1)) or (utime >= StartRelCn_1G) && 
  //     (utime < (StartRelCn_1G+DurationCh_1G)))   
      {
          digitalWrite(RelayChn1,LOW);             //Устанавливаем на входе релейного модуля ВЫСОКИЙ уровень - реле срабатывает
        
       }  
    else
      {
          digitalWrite(RelayChn1,HIGH);              //Устанавливаем на входе релейного модуля НИЗКИЙ уровень - реле выключается
         
      } 

    //------------КАНАЛ 2 ------------------------------
    if ((utime >= StartRelCn_2) && 
       (utime < (StartRelCn_2+DurationCh_2)))
      {
        digitalWrite(RelayChn2,LOW);                 //Устанавливаем на ВТОРОМ входе релейного модуля НИЗКИЙ уровень - реле срабатывает
        
      }  
    else
      {
          digitalWrite(RelayChn2,HIGH);              //Устанавливаем на ВТОРОМ входе релейного модуля ВЫСОКИЙ уровень - реле выключается
         
      } 

//------------КАНАЛ 3------------------------------
    if ((utime >= StartRelCn_3) && 
       (utime < (StartRelCn_3+DurationCh_3)))
      {
          digitalWrite(RelayChn3,LOW);               //Устанавливаем на ТРЕТЬЕМ входе релейного модуля НИЗКИЙ уровень - реле срабатывает
        
      }  
    else
      {
          digitalWrite(RelayChn3,HIGH);              //Устанавливаем на ТРЕТЬЕМ входе релейного модуля ВЫСОКИЙ уровень - реле выключается
          
      } 
//------------КАНАЛ 4------------------------------
    if ((utime >= StartRelCn_4) && 
       (utime < (StartRelCn_4+DurationCh_4)))
      {
          digitalWrite(RelayChn4,LOW);               //Устанавливаем на ЧЕТВЕРТОМ входе релейного модуля НИЗКИЙ уровень - реле срабатывает
         
      }  
    else
      {
          digitalWrite(RelayChn4,HIGH);              //Устанавливаем на ЧЕТВЕРТОМ входе релейного модуля ВЫСОКИЙ уровень - реле выключается
          
      } 
//------------КАНАЛ 5------------------------------
    if ((utime >= StartRelCn_5) && 
       (utime < (StartRelCn_5+DurationCh_5)))
      {
          digitalWrite(RelayChn5,LOW);               //Устанавливаем на ПЯТОМ входе релейного модуля НИЗКИЙ уровень - реле срабатывает
         
      }  
    else
      {
          digitalWrite(RelayChn5,HIGH);              //Устанавливаем на ПЯТОМ входе релейного модуля ВЫСОКИЙ уровень - реле выключается
         
      } 
//------------КАНАЛ 6------------------------------
    if ((utime >= StartRelCn_6) && 
       (utime < (StartRelCn_6+DurationCh_6)))
      {
          digitalWrite(RelayChn6,HIGH);               //Устанавливаем на ШЕСТОМ входе релейного модуля НИЗКИЙ уровень - реле срабатывает
        
      }  
    else
      {
          digitalWrite(RelayChn6,LOW);              //Устанавливаем на ШЕСТОМ входе релейного модуля ВЫСОКИЙ уровень - реле выключается
        
      } 
 //------------КАНАЛ 7 Контроль температуры -------
     float temp1 = getTemp1();                          //Читаем температуру с датчика 

    if (temp1 < t1-tGistrsis1/2)
      {
        digitalWrite(RelayChn7,LOW);                 //Устанавливаем на 7 входе релейного модуля НИЗКИЙ уровень - реле срабатывает
      
      }     
    else if (temp1 > t1+tGistrsis1/2)
      {
        digitalWrite(RelayChn7,HIGH);                //Устанавливаем на 7 входе релейного модуля ВЫСОКИЙ уровень - реле выключается
      
      }     
      
//------------КАНАЛ 8 Контроль температуры -----------
   float temp2 = getTemp2();                          //Читаем температуру с датчика 
  
    //------------КАНАЛ 3 Контроль температуры -------
    if (temp1 < t1-tGistrsis2/2)
      {
        digitalWrite(RelayChn8,LOW);                 //Устанавливаем на 8 входе релейного модуля НИЗКИЙ уровень - реле срабатывает
     
      }     
    else if (temp2 > t2+tGistrsis2/2)
      {
        digitalWrite(RelayChn8,HIGH);                //Устанавливаем на 8 входе релейного модуля ВЫСОКИЙ уровень - реле выключается

      }
}
//*****************************************************
//Функции чтения с датчиков температуры
float getTemp1(){                                       
  byte data[12];
  byte addr[8];
  if ( !ds1.search(addr)) {
    //no more sensors on chain, reset search
    ds1.reset_search();
    return -1001;  
  }

  if ( OneWire::crc8( addr, 7) != addr[7]) {

    return -1002;
  }

  if ( addr[0] != 0x10 && addr[0] != 0x28) {

    return -1003;
  }

  ds1.reset();
  ds1.select(addr);
  ds1.write(0x44,1); 

  byte present = ds1.reset();
  ds1.select(addr); 
  ds1.write(0xBE); 


  for (int i = 0; i < 9; i++) { 
    data[i] = ds1.read();
  }

  ds1.reset_search();

  byte MSB = data[1];
  byte LSB = data[0];

  float TRead = ((MSB<<8) | LSB); 
  float Temperature = TRead / 16;

  return Temperature;
}
float getTemp2(){                                       
  byte data[12];
  byte addr[8];
  if ( !ds2.search(addr)) {
    //no more sensors on chain, reset search
    ds2.reset_search();
    return -1001;  
  }

  if ( OneWire::crc8( addr, 7) != addr[7]) {

    return -1002;
  }

  if ( addr[0] != 0x10 && addr[0] != 0x28) {

    return -1003;
  }

  ds2.reset();
  ds2.select(addr);
  ds2.write(0x44,1); 

  byte present = ds2.reset();
  ds2.select(addr); 
  ds2.write(0xBE); 


  for (int i = 0; i < 9; i++) { 
    data[i] = ds2.read();
  }

  ds2.reset_search();

  byte MSB = data[1];
  byte LSB = data[0];

  float TRead = ((MSB<<8) | LSB); 
  float Temperature = TRead / 16;

  return Temperature;
}

 

Народ, подскажите, кто разбирается, как в этом скетче сделать третье, четвертое срабатывание таймера первого канала на включение\выключение? Автор скетча не появляется в теме, а я нуб в программировании, а скетч очень нужен для аквы, спасибо.