Автоматизация аквариума
- Войдите на сайт для отправки комментариев
Хочу автоматизировать аквариум через ардуино, управление светом, отключение фильтра на несколько минут для кормления и включение сервопривода для заслонки, жду когда придут реле с алиэкспресса сама схема 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 и сделать чтобы это происходило в точное время но ни разу этого не делал возможно не будет сбивается при отключение электроэнергии. напишите пож стетч для времени или просто пример как его добавить и забивать команду в определенное время можно ещё добавить дисплей для вывода времени если есть какие ещё идеи напишите, если что извините за скетч только начал разбиратся в ардуино, заранее спасибо)
Сделал себе. Присутствует регклеровка срабатывания помпы, света (также режим закат/рассвет), кормление по расписанию(управление сервоприводом) всё управляется энкодером контроллируется дисплеем. Есть возможность вывода температуры воды(датчик не подключен).
Установка реального времени
Такая задержка без сторожевого таймера?!
Этого я не знал то есть это активация этого режима?
<strong>delay(42600000);</strong>?Круто, дадите схему и скечт если не жалко?
watchdog для ардуины лучше используйте как внешнее устройство. Погуглите. И осторожнее, при неловком эксперименте можете угробить свою плату.
strong это не режим :) Хотел выделить строчку в вашем коде :)
Посмотрите здесь. Кормушки и меню для них придется самому добавлять. И ликвидируйте свои безумные delay .
Давно на
strongeпишете? ;)1)включается реле для света назовем №1
2)сервопривод откраывает заслонку его ещё я буду настривать для необходимой дозации и закрывается
проходит 10 минут
скечт я думаю может ещё добавить схему 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 и подобное , т.к. пины надо будет задать.
И я фотками похвастаюсь. В правом верхнем углу - кормушка для "сухарика", на сервомашинке, используется восновном как в отпуск уеду, правый нижний - галогенка, как "шоу" подсвет, в центре экран с тачем в корпусе (короб от воздуховода) , корпус стоит на "ноге" (тоже короб от воздуховода) в которой фильтр, вода в нем текет снизу вверх, дабы низвергнутся по сливу водопадиком в аквариум. Подсветка светодиодная.
Экран крупно. При не активности на экране крутится заставка - цветные пузырьки на черном фоне плавают туды-сюды, блуждают, лопаются и надуваются. Фон черный, т.к. ночю ярко светится, мешает.
В голове крутится бредовая идея - сделать кормушку на замороженом корме, с поддержанием его в замороженом состоянии, с холодильничком на термоэлементе ))))
Экран крупно. При не активности на экране крутится заставка - цветные пузырьки на черном фоне плавают туды-сюды, блуждают, лопаются и надуваются. Фон черный, т.к. ночю ярко светится, мешает.
У меня по прошедшии времени если не нажата ни одна кнопка (около 30 секунд) выключается подсветка экрана
На моем экране так не получалось. Питание подсветки и буферов преобразующих уровни 3.3В и 5В от одной цепи. Потому сделал темный "скринсейвер", который включаетс тоже после паузы без нажатий.