Автоматизация аквариума

Ljhnrbr
Offline
Зарегистрирован: 19.09.2016

Хочу автоматизировать аквариум через ардуино, управление светом, отключение фильтра на несколько минут для кормления и включение сервопривода для заслонки, жду когда придут реле с алиэкспресса сама схема http://prnt.sc/cng66o   

принцип примерно такой 

1)включается реле для света назовем №1

2)сервопривод откраывает заслонку его ещё я буду настривать для необходимой дозации и закрывается 

проходит 10 минут

3) реле для фильтра включается №2

проходит 11 часов 50 минут

4) реле №2 выключается

5) сервопривод отрывается и закрывается 

проход 10 минут

6) реле №2 включается проходит 4 часа

7) реле № 1 выключается проходит 7 часов 50 минут

и цикл повторяется снова

int Relay_1 = 3;
int Relay_2 = 4;
#include <Servo.h> //используем библиотеку для работы с сервоприводом

Servo servo; //объявляем переменную servo типа Servo

void setup() //процедура setup

{
servo.attach(10); //привязываем привод к порту 10
             
  pinMode(Relay_1, OUTPUT);
  pinMode(Relay_2, OUTPUT);
}
void loop() 
{
  digitalWrite(Relay_1, LOW);   // реле включено

servo.write(0); //ставим вал под 0

delay(2000); //ждем 2 секунды

servo.write(180); //ставим вал под 180

delay(600000); //ждем 2 секунды
digitalWrite(Relay_2, LOW);   // реле включено
 delay(42600000);
digitalWrite(Relay_2, HIGH);
servo.write(0); //ставим вал под 0

delay(2000); //ждем 2 секунды

servo.write(180); //ставим вал под 180

delay(600000); //ждем 2 
digitalWrite(Relay_2, LOW);
delay(14400000);
digitalWrite(Relay_1, HIGH);
delay(28200000);
}

скечт я думаю может ещё добавить схему real_time и сделать чтобы это происходило в точное время но ни разу этого не делал возможно не будет сбивается при отключение электроэнергии. напишите пож стетч для времени или просто пример как его добавить и забивать команду в определенное время можно ещё добавить дисплей для вывода времени если есть какие ещё идеи напишите, если что извините за скетч только начал разбиратся в ардуино, заранее спасибо)

by_ruslan
Offline
Зарегистрирован: 15.08.2015

Сделал себе. Присутствует регклеровка срабатывания помпы, света (также режим закат/рассвет), кормление по расписанию(управление сервоприводом) всё управляется энкодером контроллируется дисплеем. Есть возможность вывода температуры воды(датчик не подключен).
Установка реального времени

alexvp
Offline
Зарегистрирован: 09.10.2015

Ljhnrbr пишет:

digitalWrite(Relay_2, LOW);   // реле включено
 delay(42600000);

Такая задержка без сторожевого таймера?!

Ljhnrbr
Offline
Зарегистрирован: 19.09.2016

Этого я не знал то есть это активация этого режима?

 <strong>delay(42600000);</strong>?

Ljhnrbr
Offline
Зарегистрирован: 19.09.2016

Круто, дадите схему и скечт если не жалко?

alexvp
Offline
Зарегистрирован: 09.10.2015

watchdog для ардуины лучше используйте как внешнее устройство. Погуглите. И осторожнее, при неловком эксперименте можете угробить свою плату.

strong это не режим :) Хотел выделить строчку в вашем коде :)

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

Посмотрите здесь. Кормушки и меню для них придется самому добавлять. И ликвидируйте свои безумные delay .

Logik
Offline
Зарегистрирован: 05.08.2014

Давно на  stronge пишете? ;)

Ljhnrbr пишет:

1)включается реле для света назовем №1

Неее. Рыбы пугаются резкого включения. Нужен ШИМ и плавный "рассвет" - "закат"

 

Ljhnrbr пишет:

2)сервопривод откраывает заслонку его ещё я буду настривать для необходимой дозации и закрывается 

проходит 10 минут

Что за заслонка - нипонял. Надеюсь кормушка и дозация таки корма;) Делайте сразу легко настраиваемой, чтоб не перешивать ардуину при каждом чихе. Временных отметок это тоже касается в полной мере.

Ljhnrbr пишет:

скечт я думаю может ещё добавить схему real_time и сделать чтобы это происходило в точное время 

 Учтите что комутация силовых цепей рядом с часиками создает помеху постепенно уаодящую часики вперед. Они импульсы помех считают, собаки.

Очень советую не скромничать, закладывать каналы света и управления с запасом, проект довольно непростой на самом деле, я свой третий год допиливаю. У Вас явно не хватает термометра. Закладуйте сразу режим ручного управления, чтоб можно было вкл/откл устройства. Продумайте как оно должно быть при пропусках событий (например был отключен и рыб не покормил вовремя). Очень приветствуется ИК управление, т.к. расположить контроллер возле аквариума чтоб удобно для доступа, красиво и безопасно (не залило водой) не просто. 

Для часиков вроде шото стандартное есть, я работаю так

// Interface for the DS1302 timekeeping chip. Use burst mode.

// Distributed under the 2-clause BSD license.
#ifndef DS1302_BURST_H_
#define DS1302_BURST_H_

#ifndef WIN32
#include <Arduino.h>
#include <PINs.h>
#endif



  enum Day {
    kSunday    = 1,
    kMonday    = 2,
    kTuesday   = 3,
    kWednesday = 4,
    kThursday  = 5,
    kFriday    = 6,
    kSaturday  = 7
  };

typedef struct SDateTime
  {
      uint8_t sec;
      uint8_t min;
      uint8_t hr;
      uint8_t date;
      uint8_t mon;
      uint8_t day;
      uint8_t yr;
  } *PSDateTime;

  /* Доступ к датевремени в формате представления DS1302 т.е. BCD и флаги*/
#define DS1302_GetDateTimeRec(DateTime) DS1302_IO(0xBF, DateTime, 7); //получаем 7 байт датывремени
#define DS1302_SetDateTimeRec(DateTime) DS1302_Run(true, DateTime);   //устанавливаем 7 байт датывремени и запускаем часы



/*
   Основная функция обмена с DS1302. Направление обмена задает младший бит в adr. Настраивает режимы пинов.
*/
void DS1302_IO(byte adr, byte* data, byte len);

/*
   Запуск, остановка часов и установка времени.
*/
void DS1302_Run(boolean Enable, void* DateTime=NULL);

/*
  Текущее датевремени строкой. Размер возвращаемой строки 19 символов + завершающий 0.
*/
void DS1302_GetDateTimeStamp(void* dt);

/*
  Текущее датевремени в цифровом формате.
*/
bool DS1302_GetDateTime(void* dt);


#endif  // DS1302_BURST_H_
// Interface for the DS1302 timekeeping chip.  Use burst mode.

#ifndef WIN32
#include "Arduino.h"
#else
#include "PINs.h"
#endif

#include "ArduinoPort.h"
#include "DS1302_burst.h"

/*
   Основная функция обмена с DS1302. Направление обмена задает младший бит в adr. Настраивает режимы пинов.
*/
void DS1302_IO(byte adr, byte* data, byte len=1)
{
  byte b;
  byte i=16; //обмениваемся не менее чем двумя байтами, т.е. 16 бит

  BSET(ARDUINO_DDR(PortRst), ARDUINO_PIN_NUM(PortRst)); //режим вывода на PortRst

  BSET(ARDUINO_DDR(PortClk), ARDUINO_PIN_NUM(PortClk)); //режим вывода на PortClk

  PINSET(PortRst);
  delayMicroseconds(10);

  PINCLR(PortClk);
  delayMicroseconds(10);

  BSET(ARDUINO_DDR(PortDat), ARDUINO_PIN_NUM(PortDat)); //режим вывода на PortDat

  b=adr;

  for(;len;len--)
  {
    for(;i;i--)
    {

      if((i>8) || (!(adr&1))) //выводим адрес или пишем байт
      {
        if(b&1)
          PINSET(PortDat)
        else
          PINCLR(PortDat);

        delayMicroseconds(10); //0,2 mks
        PINSET(PortClk);
        b>>=1;
      }
      else
      {
        /* ввод бита */
        b>>=1;

        delayMicroseconds(10);
        if (BIT_IS_SET(PortDat))
          b|=0x80;

        PINSET(PortClk);
      }

      delayMicroseconds(10);
      PINCLR(PortClk);

      if(i==9) //переходим ко второму байту
      {
         if(adr&1)  // начинаем прием байта
         {
            b=0;

            BCLR(ARDUINO_DDR(PortDat), ARDUINO_PIN_NUM(PortDat)); //режим ввода на PortDat
            PINSET(PortDat);
        }
         else
         {
            b=*data;  // начинаем передавать данные
        }
      }
    }

    if(adr&1) //чтение
    {
      *data=b;
      data++;
      b=0;
    }
    else
    {
      data++; //запись
      b=*data;
    }
    i=8;
  }

  BCLR(ARDUINO_DDR(PortDat), ARDUINO_PIN_NUM(PortDat)); //на всяк случай, мало ли че, режим ввода на PortDat

  PINCLR(PortRst);


}

/*
   Запуск, остановка часов и установка времени.
*/
void DS1302_Run(boolean Enable, void* DateTime)
{
  byte d;
  byte* p;

   DS1302_IO(0x81, &d);                       //проверяем запущены ли часы
   if((!(d&0x80)) && Enable && !DateTime)     //уже идут и тебуется запуск без установки времени
     return;                                  //завершаемся т.к. перезапуск запущеного обнулит секунды

   d=0;   DS1302_IO(0x8E, &d);                 //снимаем защиту записи
   delayMicroseconds(1);

   d=Enable?0:0x80;   DS1302_IO(0x80, &d);     //запускаем или останавливаем часы

   delayMicroseconds(1);

   if(DateTime)
   {
     /* преобразуем бинарный формат в формат DS1302 т.е. в BCD*/
     p= (byte*)DateTime;
//     DateTime->yr=DateTime-2000; //принимаем что век 21-й
     for(byte i=0;i<7;i++)
     {
       *p=(((*p)/10)<<4)+((*p)%10);
       p++;
     }
     *p=0;

     DS1302_IO(0xBE, (byte*)DateTime, 8); //если знаем время то устанавливаем его

     delayMicroseconds(1);
   }

   d=0x80;   DS1302_IO(0x8E, &d);      //включаем защиту записи

   if(DateTime)
        DS1302_GetDateTime(DateTime);  //контрольный, т.к. переданые нам данные попорчены в BCD
}

/*
  Текущее датевремени в цифровом формате.
*/
bool DS1302_GetDateTime(void* dt)
{
  byte* p;

  p=(byte*)dt;
  DS1302_GetDateTimeRec(p);
  for(byte i=0;i<7;i++)
  {
     //в секундах и часах старший бит - флаг остановки часов и 12-часового режима, игнорим считая что они в 0
    *p=((*p)>>4)*10+((*p)&0x0f); //BCD в байт
    p++;
  }
//  *p=0; //обнуляем старший байт года
 // (*(word*)(--p))+=2000; //принимаем что век 21-й
return true;
}

#define BCD2STR(dst,src)   p[dst+1]=0x30|(p[src]&0x0f);p[dst]=0x30|((p[src]>>4)&0x0f);

/*
  Текущее датевремени строкой. Размер возвращаемой строки 19 символов + завершающий 0.
*/
void DS1302_GetDateTimeStamp(void* dt)
{
  byte* p;

  p=(byte*)dt;
  DS1302_GetDateTimeRec(p);

  BCD2STR(17,6);
  p[16]='0';
  p[15]='2';
  p[14]='/';
  BCD2STR(12,4);
  p[11]='/';
  BCD2STR(9,3);
  p[8]=' ';
  BCD2STR(6,0);
  p[5]=':';
  BCD2STR(3,1);
  BCD2STR(0,2);
  p[2]=':';
  p[19]=0;


 }

Там ругатся будет на BSET и подобное , т.к. пины надо будет задать.

Logik
Offline
Зарегистрирован: 05.08.2014

И я фотками похвастаюсь. В правом верхнем углу - кормушка для "сухарика", на сервомашинке, используется восновном как в отпуск уеду, правый нижний - галогенка, как "шоу" подсвет, в центре экран с тачем в корпусе (короб от воздуховода) , корпус стоит на "ноге" (тоже короб от воздуховода) в которой фильтр, вода в нем текет снизу вверх, дабы низвергнутся по сливу водопадиком в аквариум. Подсветка светодиодная.

Экран крупно. При не активности на экране крутится заставка - цветные пузырьки на черном фоне плавают туды-сюды, блуждают, лопаются и надуваются. Фон черный, т.к. ночю ярко светится, мешает.

В голове крутится бредовая идея - сделать кормушку на замороженом корме, с поддержанием его в замороженом состоянии, с холодильничком на термоэлементе ))))

by_ruslan
Offline
Зарегистрирован: 15.08.2015

Logik пишет:

Экран крупно. При не активности на экране крутится заставка - цветные пузырьки на черном фоне плавают туды-сюды, блуждают, лопаются и надуваются. Фон черный, т.к. ночю ярко светится, мешает.

 

У меня по прошедшии времени если не нажата ни одна кнопка (около 30 секунд) выключается подсветка экрана

Logik
Offline
Зарегистрирован: 05.08.2014

На моем экране так не получалось. Питание подсветки и буферов преобразующих уровни 3.3В и 5В от одной цепи. Потому сделал темный "скринсейвер", который включаетс тоже после паузы без нажатий.