• Система автоматизации с открытым исходным кодом на базе esp8266/esp32 микроконтроллеров и приложения IoT Manager. Наша группа в Telegram

"Умная теплица" - Совместный проект

humaxoid

New member
Занялся проектом "Умная теплица". Что по силам делаю самостоятельно, какие-то куски кода слизаны. Но все равно знаний чувствую недостаточно. Желающие присоеденится милости просим.
Задача такова:
Монитор состояния и удаленное управление по вэб интерфейсу.
Контроль атмосферного давления температуры, влажности воздуха и почвы. Исходя из показание автоматически включаются исполнительные механизмы полива (полив, проветривание, освещение, обогрев).
Принудительное включение исполнительных механизмов (полив, проветривание, освещение, обогрев).
Реализация на Websocket, SPIFFS.
Проект тут https://github.com/humaxoid/SmartGreenhouse Все правки там-же на гитхабе. Тут обсуждения.
 

enjoynering

Well-known member
первое замечане - дробите код на файлы. сейчас у вас все в одном файле и пока он у вас маленький его еще легко править, но сокоро он разростется и вы утоните в этой лапше.

я у себя делаю так:

//файлы связанные с работой файловой системой
filesys_config.h
filesys.h
filesys.cpp

//все что связанно сервером
server_local_config.h
server_local.h
server_local.cpp

и тд....

сами функции внутри файлов объявляю так:

//файлы связанные с работой фаловой системой
void fs_mountFileSys();
void fs_unmountFileSys();
void fs_factoryReset();
и тд....

//все что связанно сервером
void server_startServer();
bool server_fileRead(String path);
String server_payloadRead(uint16_t size = SERVER_PAYLOAD_SIZE);
и тд.

теперь если в main.cpp я вижу функция начинается с fs_xxxxx - ага это файловая система идем туда. server_xxxxx ага - это сервер. приемущество в том что код чище, им легко управлять и самое главное ЭТИ ФАЛЙЛЫ МОЖНО ЛЕГКО ПЕРЕНОСИТЬ В ДРУГИЕ ПРОЕКТЫ


ПЫ.СЫ. в xxxx__config.h файлах храню настройки и важныне постоянные переменные. вот пример filesys_config.h
/* file system default settings, MODIFY WITH CAUTION! */
#define FS_JSON_FILE_SIZE 1024 //maximum size of any config file & ArduinoJson heap memory pool, in bytes
#define FS_JSON_RW_BUFFER_SIZE 64 //buffer size to improve (de)serialization speed from LittleFS, in bytes

/* file system default path, MODIFY WITH CAUTION! */
#define FS_AP_CONFIG_PATH "/xxxxx" //sofware accsess point config path
#define FS_STA_CONFIG_PATH "/xxxxx" //station-client config path
#define FS_SERVER_CONFIG_PATH "/xxxxx" //server config path
#define FS_NTP_CONFIG_PATH "/xxxxx" //ntp client config path
#define FS_MATRIX_CONFIG_PATH "/xxxxx" //matrix driver config path
#define FS_WEATHER_CONFIG_PATH "/xxxxx" //OpenWeatherMap config path

обратите внимание define в тоже начинаются с FS_xxxxx - значит надо смотреть filesys_config.h

что из этого получилось мотрим тут.
 

volaltd

Member
DHT22 выбросить, в ESP32 влить готовую ESPeasy и реализовать автоматизацию на RPi с HA :)
 

pvvx

Активный участник сообщества
Вся система состоит из датчика влажности почвы, управляемого крана и регулятор температуры для механизма форточки.

Что там удаленно управлять и зачем там ESP32?

На каждый из датчиков влажности почвы на каждом куске грядок ставить по ESP32 с АКБ от Белаза?

Пример полного датчика с правильным методом измерения влажности почвы:
http://modkam.ru/?p=1671#more-1671

Но это дорогой вариант. Есть дешевле - взять пачку Xiaomi LYWSD03MMC по 250 руб шт., вплавить штыри, понавтыкать в парнике (и на поле). На управление распределителем поливки повесить пару управляемых клапанов на JDY-10 по 100 рупь с программой по аналогии c этой. На механизм вентиляции – аналогично.

Вся система настаивается по мобильнику без особых проблем.
 

pvvx

Активный участник сообщества
Для работы описанной системы ничего не требуется, т.к. она является распределенной - каждый датчик имеет настройки когда и что включать. Исполнитель (модуль JDY-10) принимает команды от вписанных датчиков.
Подключить к ней "HA" или что другое для логгирования и спец. управления особых проблем нет, но не имеет никакого смысла кроме "игры".
 

nikolz

Well-known member
рекомендую почитать:
Датчики влажности почвы для планирования орошения
 

nikolz

Well-known member
Одним из наиболее важных факторов, влияющих на выбор датчика влажности почвы, является объем почвы, который будет учитывать датчик для расчета Объемной Влажности Почвы – ОВП (при применении в других средах – ОВС). Для некоторых типов измерений подходят датчики, учитывающие малый объем почвы: в теплицах, при измерении в местах близких к поверхности.
Однако при установке датчиков в полевых условиях, в силу того, что почва имеет часто меняющийся состав (различные примеси – корни, трава и т. д.) использование датчиков с малым объемом контроля, является не практичным. В данном случае датчики, контролирующие больший объем почвы, минимизируют влияние неоднородности почвы, что дает более точные данные об ее объемной влажности.
1620837112512.png
Ссылки: Sakaki, Toshihiro, Limsuwat, Anuchit, Smits, Kathleen M., and Illangasekare, Tissa H. (2008). Empirical two-point a-mixing model for calibrating the ECH2O EC-5 soil moisture sensor in sands. Water Resource Research, 44 4, W00D08
 

pvvx

Активный участник сообщества
У Xiaomi LYWSD03MMC корпус на винтиках, на самой плате выведены тестовые контакты удобные для пайки от всех GPIO. LCD можно выкинуть и покрыть плату лаком – всё равно это дешевле покупки раздельно датчика SHTC3, корпуса с батарейкой и контроллера c BLE/MESH/ZigBee.

Для анализа влажности на один изолированный электрод подается меандр, а на второй, тоже в изоляции, принимается сигнал на ADC. Ресурса CR2032 хватает на непрерывную работу длительностью в годы…

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

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

pvvx

Активный участник сообщества
Если заменить батарейку CR2032 на элементы AA или AAA, то в датчик устанавливают и реле от кротов…
 

nikolz

Well-known member
1620842253102.png
Пример портативного емкостного датчика влажности почвы-зонда. Фото: Delta-T Devices http://www.delta-t.co.uk
--------------------
как подключить к Xiaomi LYWSD03MMC?
 

nikolz

Well-known member
Датчики влажности почвы делятся на две категории в зависимости от используемой технологии:
1) Датчики, измеряющие объемное содержание воды, и
2) Датчики, измеряющие натяжение(tension) грунтовых вод или матричного потенциала.
Натяжение воды в почве указывает на энергию, необходимую корням растений для извлечения воды из частиц почвы.
По мере удаления почвенной воды из почвы натяжение почвы возрастает.
Натяжение почвы выражается в сантибарах (cb) или барах атмосферного давления.
Когда почва полна воды, натяжение воды в почве близко к нулю.
 

nikolz

Well-known member
1620842853223.png
датчик сделан из пористого керамического наконечника, запечатанного к основанию заполненной водой пластиковой трубки, запечатанной сверху съемным герметичным колпачком.
Вакуумметр, подключенный к трубке, измеряет натяжение грунта
----------------------
как подключить к Xiaomi LYWSD03MMC?
 

pvvx

Активный участник сообщества
Вакуумметр, подключенный к трубке, измеряет натяжение грунта
----------------------
как подключить к Xiaomi LYWSD03MMC?
У меня есть огород, но там не лаборатория и не плантация для выращивания на продажу строго одинаковых плодов. Мне нравятся разные и чтобы зрели не все сразу - комбайн на десяток соток выделенный под огород загонять не хочу.
По этому вам придется самому выдумывать где и как вам купить этот бесполезный измеритель и как прикрутить к какому MCU....
 

pvvx

Активный участник сообщества
Датчики влажности почвы делятся на две категории в зависимости от используемой технологии:
С помощью пары правильно расставленных и правильных электродов возможно точно оценить кол-во влаги/воды в большом объеме. На то есть геофизические методологии, которые на неизвестном участке показывают разницу, а на фиксированном это можно свести к абсолютному измерению, покрывая площади в тысячи соток…

Оно вам надо – возиться с этим и созданием оборудования для соответствующей методологии? Она была неизвестна, конкретнее не опробована и отлажена на практике каких-то 20 лет назад... Так что в учебниках не найдете, тем более западных. Что сейчас с той проработанной методологией - не в курсе.
 

humaxoid

New member
первое замечане - дробите код на файлы. сейчас у вас все в одном файле и пока он у вас маленький его еще легко править, но сокоро он разростется и вы утоните в этой лапше.
А смысл дробить? Если бы там была портянка длинной в метр. Так то там SPIFFS и по любому файлы разделены. Код отдельно, джава скрипт отдельно, html и стили css, всё каждый в отдельном файле. Сам код совсем не большой.
 

enjoynering

Well-known member
главное приемущество я описал. если вам нормально, то и мне хорошо. у меня часы щас вот так.
 

Вложения

vrd

Member
Собираюсь сделать гидропонику на балконе.
Посмотрел ваш код и понял что 32-я там лишняя. На одну теплицу и 8266 должно хватить. 4 датчика и 4 исполнителя.
Если захотите в каждый горшок воткнуть по 2 прутка, то 32 понадобится. Но если на ЕСПху поставить расширитель портов, то можно обойтись и 8266.
Как вариант с минимумом проводов - можно поставить jdy-40. Там 10 тыщ каналов и 8 независимых кнопок. На 8 портов расширителя хорошо станут. По периметру прокинуть двухжильный провод(можно антенный) на питание радио модулей и всё.

PS: повесить на аналоговый вход мелкую солнечную панельку, нет света - не поливаем и не проветриваем.
 

anstar

New member
мне нужно для автоматического полива... сценарий простой есть два реле которые должны с 8 утра до 10 утра запускаться через 10 минут на 5 секунда , с 10 утра до 12 утра через 10 минут на 10 секунд и так далее, если нужно по необходимости может еще ночью интервальчик .. и плюс прикрутить температуру и влажность.. если сильно жарко то интенсивней и на оборот
плюс смс информирование на телеграмм?
вроде общими стараниями смогли сделать на проекте wifi-IOT ... но там затык при прерывании цикла из за сбоя питания реле остаются всегда включёнными и могли бы затопить все посадки)))
может если кто в теме данного проекта могу сценарий скинуть может подскажете!
и нюанс у меня сонов реле памяти 1м ... грешат на особенность реле.... но я сомневаюсь....
я не много вник в прошивку в настройки .. есть понятия сетапа если устройство ребутнулось должно залиться исходные данные где все выключено а по факту реле включенное!
спасибо жду помощи
 

Вложения

vrd

Member
Для почасовой проверки времени применил модернизированный ntp пример:
if (millis() - t1 >= check) { //проверка времени
//WiFiClient client;
check = h; //сдвиг на час
//Serial.print(x);
WiFi.hostByName(ntpServerName, timeServerIP);
sendNTPpacket(timeServerIP); // send an NTP packet to a time server
// wait to see if a reply is available
delay(1000);
t1 = millis();
int cb = udp.parsePacket();
delay(20);
if (!cb) {
delay(2);
check = mi;

f++;
//check = 0;
} else {
Serial.print("packet received, length=");
Serial.println(cb);
// We've received a packet, read the data from it
udp.read(packetBuffer, NTP_PACKET_SIZE); // read the packet into the buffer

//the timestamp starts at byte 40 of the received packet and is four bytes,
// or two words, long. First, esxtract the two words:

unsigned long highWord = word(packetBuffer[40], packetBuffer[41]);
unsigned long lowWord = word(packetBuffer[42], packetBuffer[43]);
// combine the four bytes (two words) into a long integer
// this is NTP time (seconds since Jan 1 1900):
unsigned long secsSince1900 = highWord << 16 | lowWord;
Serial.print("Seconds since Jan 1 1900 = ");
Serial.println(secsSince1900);

// now convert NTP time into everyday time:
Serial.print("Unix time = ");
// Unix time starts on Jan 1 1970. In seconds, that's 2208988800:
const unsigned long seventyYears = 2208988800UL;
// subtract seventy years:
unsigned long epoch = secsSince1900 - seventyYears;
// print Unix time:
Serial.println(epoch);
z = (((epoch % 86400L) / 3600));
delay(2);
z = z + tz;
delay(2);
check = (check - (((epoch % 3600) / 60) * mi)); //убираем лишние минуты

// print the hour, minute and second:
Serial.print("The UTC time is "); // UTC is the time at Greenwich Meridian (GMT)
Serial.print((epoch % 86400L) / 3600); // print the hour (86400 equals secs per day)
Serial.print(':');
if (((epoch % 3600) / 60) < 10) {
// In the first 10 minutes of each hour, we'll want a leading '0'
Serial.print('0');
}
Serial.print((epoch % 3600) / 60); // print the minute (3600 equals secs per minute)
Serial.print(':');
if ((epoch % 60) < 10) {
// In the first 10 seconds of each minute, we'll want a leading '0'
Serial.print('0');
}
Serial.println(epoch % 60); // print the second
}
//delay(10);
//Serial.print(" check=");
//Serial.print(check / mi);
//Serial.print(" ");
//Serial.print(check);
}
delay(2);
if ((check / mi) >= 60) {
check = mi; //при ошибке проверяем время через минуту
f++;
}
int check = 0;
uint32_t t1 = 0;
const int h = 3600000;
const int mi = 60000;
int tz = 3; //часовой пояс
z - текущее время.
f - количество ошибок.
Остальное можно обычными if-ми прописать.
if (z >= 8) {
if (z <= 10) {

}
}
Телега
 
Сверху Снизу