• Уважаемые посетители сайта esp8266.ru!
    Мы отказались от размещения рекламы на страницах форума для большего комфорта пользователей.
    Вы можете оказать посильную поддержку администрации форума. Данные средства пойдут на оплату услуг облачных провайдеров для сайта esp8266.ru
  • Система автоматизации с открытым исходным кодом на базе 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) {

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