Arduino контролирует в подвале температуру, влажность и затопление и выдает данные на веб-страницу
Всем привет.Хочу поделиться опытом создания системы контроля и предупреждения.
На одном из строительных объектов делали строение с бассейном, сауной, тренажёрным залом и комнатой отдыха. Все это было в приличных размерах как для одного хозяина. Чисто технически понадобилось 2 подвала: 1-й для обслуживания насосов бассейна — маленький, 2-й для обслуживания систем обогрева и накопления тепла
Закуплены были 2 напольных евро-люка разных размеров для двух подвалов. Люки зарывались 4-мя винтами и имели очень плотные резиновые уплотнения. Чтобы открыть подвал, необходимо было 4 человека (и немного здоровья). При работе всей техники в подвале поднималась температура и влажность, при этом контролировать что там происходит практически неудобно.
В итоге было принято решение о создании устройства, которое бы показывало, а также управляло вентилятором, звуковым сигнализатором, электро-клапаном (воды), и контролировать его можно было с любого смарт устройства.
За основу взял Arduino Pro Mini плюс Ethernet ENC28J60. Для замера влажности и температуры датчик DHT11 и FC-28 (датчик влажности почвы — в роли датчика затопления).
Тех задание:
1) Управление и информирование через Web интерфейс;2) Включение и отключение вентиляции по заданному уровню влажности;3) Включение и отключение клапана водопровода (возможно, ревун, откачивающий насос) при затоплении.
В выборе Arduino Pro Mini тоже надо подумать, так как существуют разные исполнения:
Лучше брать ту, в которой стабилизатор по мощнее, так как та, что по слабее, при активных реле и сетевом контроллера закипит стабилизатор, что приводит к зависанию системы (я упустил был этот нюанс –, но приобрел более ценное — опыт).Сетевые контроллеры также надо выбирать внимательно, так как есть те которые от 5В (стабилизатор на обратной стороне модуля) и на 3,3В. Нужен будет дополнительный стабилизатор на 3,3В.
Блок питания взял от обычного свитча (или роутера) TP-Link 9В 500 мА (примерно), они часто встречаются за копейки от паленых свитчей или роутеров.
Принцип работы простой: есть 2 датчика, которые сливают информацию на контроллер. В зависимости от ситуации контроллер включает и выключает реле (клапана водопровода, возможно ревун, откачивающий насос, вентилятор). Управление и мониторинг через WEB интерфейс который реализован программой на базе модуля ENC28J60.
1) Сработка датчика затопления = включение реле (клапана водопровода (ревун, откачивающий насос); + информирование на web странице крупным шрифтом;2) Повышение влажности выше установленного уровня = включение реле вентилятора;3) Вся информация о температуре влажности и затоплению выводится на web страницу;4) При понижении температуры ниже 5 градусов оповещение на web сайте о угрозе.
Наглядно можно увидеть на видео:
[embedded content]
На практике все очень удобно. Всегда можно посмотреть с Телевизора (Smart), телефона или планшета — что творится в закрытых помещениях, не открывая их.
Люблю создавать устройства, которые облегчают жизнь, а не просто создать игрушку поиграться и выбросить.С дизайном странички сильно не напрягался, так как носит технический характер и должна быть практичной, а не сложной и красивой.
Надеюсь, эта статья кому-то поможет, а кого то вдохновит на создание своего проекта.
Прогамма для Arduino
#include «etherShield.h»
#include «ETHER_28J60.h»
#include
//выбор используемого датчика #define DHTTYPE DHT11 // DHT 11 //#define DHTTYPE DHT22 // DHT 22 (AM2302) //#define DHTTYPE DHT21 // DHT 21 (AM2301)
// Connect pin 1 (on the left) of the sensor to +5V // Connect pin 2 of the sensor to whatever your DHTPIN is // Connect pin 4 (on the right) of the sensor to GROUND // Connect a 10K resistor from pin 2 (data) to pin 1 (power) of the sensor
//инициализация датчика DHT dht (DHTPIN, DHTTYPE); int VlagInPin = 3; int RelPin = 4; int PotPin = 5; byte vlaga = 75; int temp = 55; int vent =85; int pot; // переменная датчика затопления byte vf; // переменная для значения влаги во флеше
static uint8_t mac[6] = {0×54,0×55,0×58,0×10,0×00,0×24}; static uint8_t ip[4] = {192,168,88,24}; static uint16_t port = 80;
ETHER_28J60 ethernet;
void setup () { dht.begin (); // pinMode (VlagInPin, INPUT); pinMode (RelPin, OUTPUT); digitalWrite (RelPin, HIGH); pinMode (PotPin, OUTPUT); digitalWrite (PotPin, HIGH); vf = EEPROM.read (0); //чтение из флеш значение влаги для сработки вентилятора if (vf > 110) { EEPROM.write (0, 110); // Запись нового значения в Флеш } ethernet.setup (mac, ip, port); }
void loop () { // чтение температуры и влажности займет примерно 250 миллисекунд //float h = dht.readHumidity (); //float t = dht.readTemperature (); vlaga = dht.readHumidity (); temp = dht.readTemperature (); pot = digitalRead (VlagInPin); if (pot == LOW) { // Условие включения и отключения затопления digitalWrite (PotPin, LOW); } if (pot == HIGH) { // Условие включения и отключения затопления digitalWrite (PotPin, HIGH); } if (vlaga >= vf) { // Условие включения и отключения вентиляции digitalWrite (RelPin, LOW); } if (vlaga < vf-1) { // Условие включения и отключения вентиляции digitalWrite(RelPin, HIGH); } String param; if (param = ethernet.serviceRequest()) { ethernet.print("
БОЛЬШОЙ ПОДВАЛ
»); ethernet.print (»ОБНОВИТЬ СОСТОЯНИЕ»); if (pot == LOW) { // Условие включения и отключения затопления ethernet.print (»
Внимание Затопление!!!
»); } if (temp <= 3) { // Условие вывода сообщения Угроза разморозки системы ethernet.print("Угроза разморозки системы
»); } if (param == «plus») { vf++; // Увеличить значение переменной влаги if (vf > 110) { vf=110; } EEPROM.write (0, vf); // Запись нового значения в Флеш } if (param == «minus») { vf--; // Уменьшить значение переменной влаги if (vf < 5) { vf=5; } EEPROM.write(0, vf); // Запись нового значения в Флеш } ethernet.print("Температура
»); ethernet.print (»»); ethernet.print (temp); ethernet.print (»
»); ethernet.print (»Влага
»); ethernet.print (»»); ethernet.print (vlaga); ethernet.print (»
»); ethernet.print (»Сработка Вентиляции
»); ethernet.print (»»); ethernet.print (vf); ethernet.print (»
»); ethernet.print (»Уменьшить Увеличить»); ethernet.respond (); } }