smonkey 0 Опубликовано 27 декабря, 2017 warning: 'typedef' was ignored in this declaration тоже выскакивает.Чтобы поправить это предупреждение, нужно дописать любое слово вот тут:https://yadi.sk/i/9yFhgpu23QzMmz А вообще спасибо большое тебе, добрый человек, топик-стартер! Тоже собрал прототип (собрал без дисплея, но с прошивкой 1.1), все работает. Тема очень увлекла, в ближайшей перспективе планирую подключить LCD-дисплей (который у меня есть в наборе). Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
PAEH 13 Опубликовано 5 января, 2018 отличненько, будем заказывать! ) Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
PAEH 13 Опубликовано 9 января, 2018 я хочу еще камеру usb подключить сюда, это реально?надо что-то дополнительно заказать? Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
PAEH 13 Опубликовано 14 февраля, 2018 вообщем все детали пришли, начинаю сборку,буду сегодня разбираться с кодом по розеткам. Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
LightMover 7 Опубликовано 7 августа, 2018 Прочитал ветку на одном дыхании.Автору спасибо, проделанная тобой работа достойна уважения. А систему смешения и подучи удобрений разработать интересно? Я удивлён, почеу еще нет OpenSorce проета аналогичного OverGrower например. Три-пять перельстатических насоса и управление "большим" насосом, и ардуино или расбери. Подскажите, тут подобное обсуждалось? если нет, то предлагаю обсудить и начать делать. :hello: Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
Doomnik 1,407 Опубликовано 7 августа, 2018 (изменено) Три-пять перельстатических насоса и управление "большим" насосом, и ардуино или расбери. Подскажите, тут подобное обсуждалось? если нет, то предлагаю обсудить и начать делать. :hello:я видел только тему о продаже готового продукта. по моему мнению этим никто не занимается, т.к. например стоимость проекта, описанного в этой теме, пару соток, когда как самый простецкий ph-метр стоит от 15 тысяч. это как бы никому не нужно, многим проще ручками Изменено 7 августа, 2018 пользователем Doomnik Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
LightMover 7 Опубликовано 9 августа, 2018 я видел только тему о продаже готового продукта. по моему мнению этим никто не занимается, т.к. например стоимость проекта, описанного в этой теме, пару соток, когда как самый простецкий ph-метр стоит от 15 тысяч. это как бы никому не нужно, многим проще ручками Ох, и я так думал, что проще самому сделать. Да что уж там системы автоматизации.Вот, казалось бы, что стоит сделать машинку которая будет по монорельсе туда-сюда перемещаться?А там нюансов УЙМА, если не ТЬМА. LightMover мы сейчас создали полноприводный, я скоро покажу его миру. А на данный момент, мы в Ростове-на-Дону делаем самые качественные муверы по образцу американского LightRail, только намного лучше, современнее. И дешевле. :brows: И это точно дешевле второго комплекта света. Удивлён я как у нас растениеводство еще слабо развито. Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
Doomnik 1,407 Опубликовано 9 августа, 2018 Ох, и я так думал, что проще самому сделать. Да что уж там системы автоматизации.Вот, казалось бы, что стоит сделать машинку которая будет по монорельсе туда-сюда перемещаться?А там нюансов УЙМА, если не ТЬМА. LightMover мы сейчас создали полноприводный, я скоро покажу его миру. А на данный момент, мы в Ростове-на-Дону делаем самые качественные муверы по образцу американского LightRail, только намного лучше, современнее. И дешевле. :brows: И это точно дешевле второго комплекта света. Удивлён я как у нас растениеводство еще слабо развито.Вспомнил. Поищи тему "робот садовник" в названии темы ещё будет слово "эволюция". Там было. Я с телефона, не очень удобно искать. Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
6kazak1 0 Опубликовано 14 сентября, 2018 Доброго времени суток. Собрал и настроил автоматику на ардуино, регулирует освещение, дневную и ночную температуры, влажность, содержание СО2, организован полив два дня удобрение, один день вода, поливает три раза в день время подачи раствора регулируется, цикличная вентиляция. Все параметры регулируются есть возможность включать или выключать по отдельность. Для кокоса огонь просто пришлось пока разобрать на летающие, 228/1 год условно дружочек сдал Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
Гость Опубликовано 31 октября, 2019 е**ть тут кулибины, слишком сложно, лучше накопить, учитывая мою кривизну рук - могу нахер спалить все Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
Fibonacci 1,475 Опубликовано 21 декабря, 2019 Определился с тем, что буду делать бокс для одного растения, не совсем стелс, но и не сервант ) Покурив форум на повод освещения принял решение купить комплект ДнаТ 150 (VS) и лампу GE. Бокс примерно будет 60*50*90 см. (думаю для ондной лампы с досветами как раз) с фильтром пока не определился но это не так страшо пока, так как гров планирую на балконе. А вот с температурой возник пока теоретический вопрос, балкон не отапливаемый но солнечная сторона. И все же бывали холода, что вода в бульбике замерзала за ночь. Пока думаю, что на этот размер бокса лампы будет достаточно, а что если нет?Даже если достаточно то свет 24-0. а это только автики.Если отключать свет с другими режимами то бокс соответственно начнет остывать, что пагубно скажется на растение. Думал купить термоковрик для животных на али есть такие, опять же, лампа включится его коврик отключить.так же и приточка как должна распологаться, чтоб не тянуть ледяной воздух в бокс..термостат выход.. но вот как это все собрать очень для меня трудно, уже несколько дней мучает этот вопрос и вот решил озвучить его.. у кого есть опыт в таком? Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
Doomnik 1,407 Опубликовано 23 декабря, 2019 (изменено) А вот с температурой возник пока теоретический вопрос, балкон не отапливаемый но солнечная сторона. И все же бывали холода, что вода в бульбике замерзала за ночь. Пока думаю, что на этот размер бокса лампы будет достаточно, а что если нет?Даже если достаточно то свет 24-0. а это только автики.Если отключать свет с другими режимами то бокс соответственно начнет остывать, что пагубно скажется на растение.Чет мне кажется, дната 150 будет мало т.к. на сколько я помню лампы такой мощности ставят в стелсы из компьютерных блоков и там растиха не сгорает, а здесь ты еще и воздух нагреть хочешь. Опыта не имею, просто посидел подумал так... Засасывать холодный воздух и пытаться его нагреть при этом выплевывать теплый наружу... Это ппц как не рационально. Хотя если халявное электричество то можно.Надо как-то подумать о возврате теплого воздуха обратно в бокс...Может даже вообще сделать гроубокс с теплоизолированными стенками, без вентиляции, а внутрь подавать CO2 +датчик CO2. Хотя лампа будет нагревать всё внутри... Тогда к примеру гонять воздух по замкнутому контуру, а контур это алюминиевая гофра которая бы немного охлаждала идущий внутри воздух за счет того, что ее стенки имели бы контакт с холодным воздухом на балконе. Т.е. был бы сброс тепла.. А регулировать температуру можно было бы меня скорость потока. Хотя здесь плесень может пойти... по мне так гемор еще тот и вообще стоит ли браться. Изменено 23 декабря, 2019 пользователем Doomnik Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
Fibonacci 1,475 Опубликовано 23 декабря, 2019 Чет мне кажется, дната 150 будет мало т.к. на сколько я помню лампы такой мощности ставят в стелсы из компьютерных блоков и там растиха не сгорает, а здесь ты еще и воздух нагреть хочешь. Опыта не имею, просто посидел подумал так... Засасывать холодный воздух и пытаться его нагреть при этом выплевывать теплый наружу... Это ппц как не рационально. Хотя если халявное электричество то можно.Надо как-то подумать о возврате теплого воздуха обратно в бокс...Может даже вообще сделать гроубокс с теплоизолированными стенками, без вентиляции, а внутрь подавать CO2 +датчик CO2. Хотя лампа будет нагревать всё внутри... Тогда к примеру гонять воздух по замкнутому контуру, а контур это алюминиевая гофра которая бы немного охлаждала идущий внутри воздух за счет того, что ее стенки имели бы контакт с холодным воздухом на балконе. Т.е. был бы сброс тепла.. А регулировать температуру можно было бы меня скорость потока. Хотя здесь плесень может пойти... по мне так гемор еще тот и вообще стоит ли браться.Думаю утеплить бокс пеноплексом и отражающим пенофолом обклеить, а вот как регулировать все это, еще та задача. Однозначно время есть, орешки есть, днат есть, буду думать дальше. Стоит бро того. Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
Doomnik 1,407 Опубликовано 23 декабря, 2019 Думаю утеплить бокс пеноплексом и отражающим пенофолом обклеить, а вот как регулировать все это, еще та задача. Однозначно время есть, орешки есть, днат есть, буду думать дальше.Стоит бро того.напиши потом что получилось, интересно узнать результат. )) Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
Fibonacci 1,475 Опубликовано 23 декабря, 2019 напиши потом что получилось, интересно узнать результат. ))Обязательно, так как еще тестовых заездов будет много. Не хочется орешки от Барни погубить. Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
pten5 1 Опубликовано 17 февраля, 2020 На самом деле код сретча не работает, перелопатил кучувсего, в итоге опытным путём пришел к правильному коду, может кому то пригодится: #include // Подключаем библиотеку для работы с таймерами #include // Подключаем библиотеку для работы с датчиками температуры/влажности на базе чипов AM23xx #define DHTPIN 12 // Цифровой пин, к которому подключен датчик тепрературы/влажности (12 = D12) #define DHTTYPE DHT22 // Модель датчика (AM2301 = DHT21, AM2302 и AM2321 = DHT22) // Релейные модули, в зависимости от модели, включаются либо высоким, либо низким уровнем на порте. #define S_ON 0 // Значение пина для ВКЛЮЧЕНИЯ розетки #define S_OFF 1 // Значение пина для ВЫКЛЮЧЕНИЯ розетки // Режим включения нагрузки #define NO_ACTION 0 // Значение датчика не учитывается #define IN_RANGE 1 // Включать нагрузку, когда значение В ПРЕДЕЛАХ диапазона #define OUT_RANGE 2 // Включать нагрузку, когда значение ВНЕ ПРЕДЕЛОВ диапазона // Определяем структуру, в которой содержатся условия для подключения розетки. typedef struct RunCondition { int socketPin; // Пин, который управляет розеткой float tempBegin; // Температура. Начало диапазона. float tempEnd; // Температура. Конец диапазона. int tempMode; // Режим включения нагрузки по температуре float humBegin; // Влажность. Начало диапазона. float humEnd; // Влажность. Конец диапазона. int humMode; // Режим включения нагрузки по влажности. }; #define NUM_SOCKETS 4 // Количество розеток в системе // Определяем массив структур, определяющих условия для 3-х розеток (нумерация с 0 по 2) RunCondition sockets[NUM_SOCKETS] = { { 1, // Розетка №1: Что угодно можно добавить еще плюспрово. Управляющий пин - D1. 28.0, // Минимальная температура 100.0, // Максимальная температура NO_ACTION, 0.0, 0.0, NO_ACTION // Влажность не учитывается }, { 2, // Розетка №1: Приточный вентилятор. Управляющий пин - D2. 28.0, // Минимальная температура 100.0, // Максимальная температура IN_RANGE, 0.0, 0.0, NO_ACTION // Влажность не учитывается }, { 3, // Розетка №2: Обогреватель. Управляющий пин - D3. -30.0, // Минимальная температура 25.0, // Максимальная температура IN_RANGE, 0.0, // Минимальная влажность 100.0, // Максимальная влажность IN_RANGE }, { 4, // Розетка №5: Увлажнитель. Управляющий пин - D4. 18.0, // Минимальная температура 30.0, // Максимальная температура IN_RANGE, 0.0, // Минимальная влажность 60.0, // Максимальная влажность IN_RANGE } }; int socketStatus[NUM_SOCKETS]; // Определяем массив переменных, в которых хранится текущее состояние розеток. S_OFF - выключено, S_ON - включено. DHT dht(DHTPIN, DHTTYPE); // Создаем объект для работы с датчиком // Определяем глобальные переменные, в которых будем хранить показания датчиков float temp = 0; float hum = 0; void setSockets() {// Эта функция устанавливает состояние розеток for (int i = 0; i < NUM_SOCKETS; i++) {// Перебираем все определенные ранее розетки, устанавливая для них соответствующий статус digitalWrite(sockets.socketPin, socketStatus); } } void printSensors() {// Эта функция выводит в консоль состояние датчиков для помощи при отладке. Serial.print("[ >> ] Температура: "); Serial.print(temp); Serial.print(" C;\tВлажность: "); Serial.print(hum); Serial.println("%"); } void setup() {// Эта функция выполняется один раз при включении контроллера. Serial.begin(115200); // Подключаем COM-порт для вывода информации из контроллера. Serial.println("Данные датчика"); dht.begin(); // Инициализируем датчик температуры/влажности. for (int i = 0; i < NUM_SOCKETS; i++) {socketStatus = S_OFF; // Устанавливаем розетку в ВЫКЛЮЧЕНО по умолчанию pinMode(sockets.socketPin, OUTPUT); // Переключаем управляющие пины всех определенных ранее розеток в режим "выход"} setSockets(); // Переводим розетки в состояние по умолчанию Alarm.timerRepeat(5, printSensors); // Включаем таймер для запуска функции printSensors каждые 4 секунд. }}void loop() {// Эта функция выполняется по бесконечному кругу. Здесь мы будем проверять показания датчиков и управлять нагрузками. Alarm.delay(1000); // Вносим задержку в 1 секунду, чтобы датчик успел передать предыдущие данные. temp = dht.readTemperature(); // Получаем текущую температуру. hum = dht.readHumidity(); // Получаем текущую влажность. if (isnan(temp) || isnan(hum)) {// Что-то пошло не так, потому что данные с датчика не поступают! Отключаем все нагрузки и возвращаемся в начало! for (int i = 0; i < NUM_SOCKETS; i++) socketStatus = S_OFF; setSockets(); Serial.println("[FAIL] Can't read sensor data! Turn everithing OFF!"); return; }// Теперь сравним полученные данные с условиями, заданными для каждой розетки. for (int s = 0; s < NUM_SOCKETS; s++) {// Проверяем условия для включения розетки по датчику температуры. int tempStatus = S_OFF; switch (sockets.tempMode) { case NO_ACTION: tempStatus = S_ON; break; case IN_RANGE: if ((temp >= sockets.tempBegin) && (temp = sockets.humBegin) && (hum Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
danforterevan 0 Опубликовано 13 апреля, 2020 Написано резистор на 1 кОм, а на фото резистор на 4.7, так какой все же нужен? Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
Doomnik 1,407 Опубликовано 13 апреля, 2020 (изменено) Написано резистор на 1 кОм, а на фото резистор на 4.7, так какой все же нужен?Проблема решается тем, что берется описание к датчику dht22.Я нашел инфу, которая говорит о том, что резистор должен быть в диапазоне 5-10 кОм.Поэтому вешай 4,7 кОмhttps://cleverdiy.ru/wp-content/uploads/2019/11/Catcatcat_dht-11_01a.png Изменено 13 апреля, 2020 пользователем Doomnik Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
danforterevan 0 Опубликовано 14 апреля, 2020 Проблема решается тем, что берется описание к датчику dht22.Я нашел инфу, которая говорит о том, что резистор должен быть в диапазоне 5-10 кОм.Поэтому вешай 4,7 кОмhttps://cleverdiy.ru..._dht-11_01a.pngСпасибо! Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
meoplan 0 Опубликовано 30 мая, 2020 Опять про скетч, для версии 1.0 он должен быть такой #include "TimeAlarms.h" // Подключаем библиотеку для работы с таймерами#include "DHT.h" // Подключаем библиотеку для работы с датчиками температуры/влажности на базе чипов AM23xx #define DHTPIN 12 // Цифровой пин, к которому подключен датчик тепрературы/влажности (12 = D12)#define DHTTYPE DHT22 // Модель датчика (AM2301 = DHT21, AM2302 и AM2321 = DHT22) // Релейные модули, в зависимости от модели, включаются либо высоким, либо низким уровнем на порте. Если розетки инвертированы, нужно поменять S_ON и S_OFF местами.#define S_ON 0 // Значение пина для ВКЛЮЧЕНИЯ розетки#define S_OFF 1 // Значение пина для ВЫКЛЮЧЕНИЯ розетки // Режим включения нагрузки#define NO_ACTION 0 // Значение датчика не учитывается#define IN_RANGE 1 // Включать нагрузку, когда значение В ПРЕДЕЛАХ диапазона#define OUT_RANGE 2 // Включать нагрузку, когда значение ВНЕ ПРЕДЕЛОВ ДИАПАЗОНА // Определяем структуру, в которой содержатся условия для подключения розетки.typedef struct RunCondition {int socketPin; // Пин, который управляет розеткойfloat tempBegin; // Температура. Начало диапазона.float tempEnd; // Температура. Конец диапазона.int tempMode; // Режим включения нагрузки по температуреfloat humBegin; // Влажность. Начало диапазона.float humEnd; // Влажность. Конец диапазона.int humMode; // Режим включения нагрузки по влажности.}; #define NUM_SOCKETS 3 // Количество розеток в системе // Определяем массив структур, определяющих условия для 3-х розеток (нумерация с 0 по 2)RunCondition sockets[NUM_SOCKETS] = {{2, // Розетка №1: Приточный вентилятор. Управляющий пин - D2.30.0, // Минимальная температура100.0, // Максимальная температураIN_RANGE, // Вентилятор включается, если температура более 30 градусов и менее 100.0.0,0.0,NO_ACTION // Влажность не учитывается},{3, // Розетка №2: Обогреватель. Управляющий пин - D3.-50.0, // Минимальная температура16.0, // Максимальная температураIN_RANGE, // Обогреватель включается, если температура больше -50 и меньше 16 градусов0.0,0.0,NO_ACTION // Влажность не учитывается},{4, // Розетка №3: Увлажнитель. Управляющий пин - D4.20.0, // Минимальная температура100.0, // Максимальная температураIN_RANGE, // Увлажнитель включается только если температура в диапазоне от 20 до 60 градусов0.0, // Минимальная влажность (в %)50.0, // Максимальная влажностьIN_RANGE // Увлажнитель включается, если влажность в диапазоне от 0% до 50%}};int socketStatus[NUM_SOCKETS]; // Определяем массив переменных, в которых хранится текущее состояние розеток. S_OFF - выключено, S_ON - включено.DHT dht(DHTPIN, DHTTYPE); // Создаем объект для работы с датчиком // Определяем глобальные переменные, в которых будем хранить показания датчиковfloat temp = 0;float hum = 0;void setSockets() {// Эта функция устанавливает состояние розетокfor (int i = 0; i < NUM_SOCKETS; i++) {// Перебираем все определенные ранее розетки, устанавливая для них соответствующий статусdigitalWrite(sockets.socketPin, socketStatus);}}void printSensors() {// Эта функция выводит в консоль состояние датчиков для помощи при отладке.Serial.print("[ >> ] Temperature: "); Serial.print(temp); Serial.print(" C;\tHumidity: "); Serial.print(hum); Serial.println("%");}void setup() {// Эта функция выполняется один раз при включении контроллера. Serial.begin(115200); // Подключаем COM-порт для вывода информации из контроллера.Serial.println("WeedLife Air Controller Lite v.1.0");dht.begin(); // Инициализируем датчик температуры/влажности.for (int i = 0; i < NUM_SOCKETS; i++) {socketStatus = S_OFF; // Устанавливаем розетку в ВЫКЛЮЧЕНО по умолчаниюpinMode(sockets.socketPin, OUTPUT); // Переключаем управляющие пины всех определенных ранее розеток в режим "выход"}setSockets(); // Переводим розетки в состояние по умолчаниюAlarm.timerRepeat(5, printSensors); // Включаем таймер для запуска функции printSensors каждые 5 секунд.}void loop() {// Эта функция выполняется по бесконечному кругу. Здесь мы будем проверять показания датчиков и управлять нагрузками.Alarm.delay(1000); // Вносим задержку в 1 секунду, чтобы датчик успел передать предыдущие данныеtemp = dht.readTemperature(); // Получаем текущую температуруhum = dht.readHumidity(); // Получаем текущую влажность if (isnan(temp) || isnan(hum)) {// Что-то пошло не так, потому что данные с датчика не поступают! Отключаем все нагрузки и возвращаемся в начало!for (int i = 0; i < NUM_SOCKETS; i++) socketStatus = S_OFF;setSockets();Serial.println("[FAIL] Can't read sensor data! Turn everithing OFF!");return;}// Теперь сравним полученные данные с условиями, заданными для каждой розеткиfor (int s = 0; s < NUM_SOCKETS; s++) {// Проверяем условия для включения розетки по датчику температурыint tempStatus = S_OFF;switch (sockets.tempMode) { case NO_ACTION: tempStatus = S_ON; break; case IN_RANGE: if ((temp >= sockets.tempBegin) && (temp = sockets.humBegin) && (hum if ((temp >= sockets.tempBegin) && (temp = sockets.humBegin) && (hum if ((temp >= sockets.tempBegin) && (temp = sockets.humBegin) && (hum Вот так укладеноТак де показано релизация отопления Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
Doomnik 1,407 Опубликовано 1 июня, 2020 Ничего не имею против этой темы, но двухпозиционный регулятор температуры на алике стоит 600 рублей Разумеется у ардуино большой потенциал в плане расширения функций, да и данные о температуре можно в память записывать... Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
misaswag 0 Опубликовано 17 июля, 2020 Можете, пожалуйста скинуть код построчно! А то все сжалось и перепечатывать самому код на си когда ты джаваскриптер не очень-то комильфо) Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
misaswag 0 Опубликовано 17 июля, 2020 Опять про скетч, для версии 1.0 он должен быть такой #include "TimeAlarms.h" // Подключаем библиотеку для работы с таймерами#include "DHT.h" // Подключаем библиотеку для работы с датчиками температуры/влажности на базе чипов AM23xx #define DHTPIN 12 // Цифровой пин, к которому подключен датчик тепрературы/влажности (12 = D12)#define DHTTYPE DHT22 // Модель датчика (AM2301 = DHT21, AM2302 и AM2321 = DHT22) // Релейные модули, в зависимости от модели, включаются либо высоким, либо низким уровнем на порте. Если розетки инвертированы, нужно поменять S_ON и S_OFF местами.#define S_ON 0 // Значение пина для ВКЛЮЧЕНИЯ розетки#define S_OFF 1 // Значение пина для ВЫКЛЮЧЕНИЯ розетки // Режим включения нагрузки#define NO_ACTION 0 // Значение датчика не учитывается#define IN_RANGE 1 // Включать нагрузку, когда значение В ПРЕДЕЛАХ диапазона#define OUT_RANGE 2 // Включать нагрузку, когда значение ВНЕ ПРЕДЕЛОВ ДИАПАЗОНА // Определяем структуру, в которой содержатся условия для подключения розетки.typedef struct RunCondition {int socketPin; // Пин, который управляет розеткойfloat tempBegin; // Температура. Начало диапазона.float tempEnd; // Температура. Конец диапазона.int tempMode; // Режим включения нагрузки по температуреfloat humBegin; // Влажность. Начало диапазона.float humEnd; // Влажность. Конец диапазона.int humMode; // Режим включения нагрузки по влажности.}; #define NUM_SOCKETS 3 // Количество розеток в системе // Определяем массив структур, определяющих условия для 3-х розеток (нумерация с 0 по 2)RunCondition sockets[NUM_SOCKETS] = {{2, // Розетка №1: Приточный вентилятор. Управляющий пин - D2.30.0, // Минимальная температура100.0, // Максимальная температураIN_RANGE, // Вентилятор включается, если температура более 30 градусов и менее 100.0.0,0.0,NO_ACTION // Влажность не учитывается},{3, // Розетка №2: Обогреватель. Управляющий пин - D3.-50.0, // Минимальная температура16.0, // Максимальная температураIN_RANGE, // Обогреватель включается, если температура больше -50 и меньше 16 градусов0.0,0.0,NO_ACTION // Влажность не учитывается},{4, // Розетка №3: Увлажнитель. Управляющий пин - D4.20.0, // Минимальная температура100.0, // Максимальная температураIN_RANGE, // Увлажнитель включается только если температура в диапазоне от 20 до 60 градусов0.0, // Минимальная влажность (в %)50.0, // Максимальная влажностьIN_RANGE // Увлажнитель включается, если влажность в диапазоне от 0% до 50%}};int socketStatus[NUM_SOCKETS]; // Определяем массив переменных, в которых хранится текущее состояние розеток. S_OFF - выключено, S_ON - включено.DHT dht(DHTPIN, DHTTYPE); // Создаем объект для работы с датчиком // Определяем глобальные переменные, в которых будем хранить показания датчиковfloat temp = 0;float hum = 0;void setSockets() {// Эта функция устанавливает состояние розетокfor (int i = 0; i < NUM_SOCKETS; i++) {// Перебираем все определенные ранее розетки, устанавливая для них соответствующий статусdigitalWrite(sockets.socketPin, socketStatus);}}void printSensors(){// Эта функция выводит в консоль состояние датчиков для помощи при отладке.Serial.print("[ >> ] Temperature: "); Serial.print(temp); Serial.print(" C;\tHumidity: "); Serial.print(hum); Serial.println("%");}void setup() {// Эта функция выполняется один раз при включении контроллера. Serial.begin(115200); // Подключаем COM-порт для вывода информации из контроллера.Serial.println("WeedLife Air Controller Lite v.1.0");dht.begin(); // Инициализируем датчик температуры/влажности.for (int i = 0; i < NUM_SOCKETS; i++) {socketStatus = S_OFF; // Устанавливаем розетку в ВЫКЛЮЧЕНО по умолчаниюpinMode(sockets.socketPin, OUTPUT); // Переключаем управляющие пины всех определенных ранее розеток в режим "выход"}setSockets(); // Переводим розетки в состояние по умолчаниюAlarm.timerRepeat(5, printSensors); // Включаем таймер для запуска функции printSensors каждые 5 секунд.}void loop() {// Эта функция выполняется по бесконечному кругу. Здесь мы будем проверять показания датчиков и управлять нагрузками.Alarm.delay(1000); // Вносим задержку в 1 секунду, чтобы датчик успел передать предыдущие данныеtemp = dht.readTemperature(); // Получаем текущую температуруhum = dht.readHumidity(); // Получаем текущую влажность if (isnan(temp) || isnan(hum)) {// Что-то пошло не так, потому что данные с датчика не поступают! Отключаем все нагрузки и возвращаемся в начало!for (int i = 0; i < NUM_SOCKETS; i++) socketStatus = S_OFF;setSockets();Serial.println("[FAIL] Can't read sensor data! Turn everithing OFF!");return;}// Теперь сравним полученные данные с условиями, заданными для каждой розеткиfor (int s = 0; s < NUM_SOCKETS; s++) {// Проверяем условия для включения розетки по датчику температурыint tempStatus = S_OFF;switch (sockets.tempMode) {case NO_ACTION:tempStatus = S_ON;break;case IN_RANGE:if ((temp >= sockets.tempBegin) && (temp = sockets.humBegin) && (hum if ((temp >= sockets.tempBegin) && (temp = sockets.humBegin) && (hum if ((temp >= sockets.tempBegin) && (temp = sockets.humBegin) && (hum Вот так укладеноТак де показано релизация отопления Опять про скетч, для версии 1.0 он должен быть такой #include "TimeAlarms.h" // Подключаем библиотеку для работы с таймерами#include "DHT.h" // Подключаем библиотеку для работы с датчиками температуры/влажности на базе чипов AM23xx #define DHTPIN 12 // Цифровой пин, к которому подключен датчик тепрературы/влажности (12 = D12)#define DHTTYPE DHT22 // Модель датчика (AM2301 = DHT21, AM2302 и AM2321 = DHT22) // Релейные модули, в зависимости от модели, включаются либо высоким, либо низким уровнем на порте. Если розетки инвертированы, нужно поменять S_ON и S_OFF местами.#define S_ON 0 // Значение пина для ВКЛЮЧЕНИЯ розетки#define S_OFF 1 // Значение пина для ВЫКЛЮЧЕНИЯ розетки // Режим включения нагрузки#define NO_ACTION 0 // Значение датчика не учитывается#define IN_RANGE 1 // Включать нагрузку, когда значение В ПРЕДЕЛАХ диапазона#define OUT_RANGE 2 // Включать нагрузку, когда значение ВНЕ ПРЕДЕЛОВ ДИАПАЗОНА // Определяем структуру, в которой содержатся условия для подключения розетки.typedef struct RunCondition {int socketPin; // Пин, который управляет розеткойfloat tempBegin; // Температура. Начало диапазона.float tempEnd; // Температура. Конец диапазона.int tempMode; // Режим включения нагрузки по температуреfloat humBegin; // Влажность. Начало диапазона.float humEnd; // Влажность. Конец диапазона.int humMode; // Режим включения нагрузки по влажности.}; #define NUM_SOCKETS 3 // Количество розеток в системе // Определяем массив структур, определяющих условия для 3-х розеток (нумерация с 0 по 2)RunCondition sockets[NUM_SOCKETS] = {{2, // Розетка №1: Приточный вентилятор. Управляющий пин - D2.30.0, // Минимальная температура100.0, // Максимальная температураIN_RANGE, // Вентилятор включается, если температура более 30 градусов и менее 100.0.0,0.0,NO_ACTION // Влажность не учитывается},{3, // Розетка №2: Обогреватель. Управляющий пин - D3.-50.0, // Минимальная температура16.0, // Максимальная температураIN_RANGE, // Обогреватель включается, если температура больше -50 и меньше 16 градусов0.0,0.0,NO_ACTION // Влажность не учитывается},{4, // Розетка №3: Увлажнитель. Управляющий пин - D4.20.0, // Минимальная температура100.0, // Максимальная температураIN_RANGE, // Увлажнитель включается только если температура в диапазоне от 20 до 60 градусов0.0, // Минимальная влажность (в %)50.0, // Максимальная влажностьIN_RANGE // Увлажнитель включается, если влажность в диапазоне от 0% до 50%}};int socketStatus[NUM_SOCKETS]; // Определяем массив переменных, в которых хранится текущее состояние розеток. S_OFF - выключено, S_ON - включено.DHT dht(DHTPIN, DHTTYPE); // Создаем объект для работы с датчиком // Определяем глобальные переменные, в которых будем хранить показания датчиковfloat temp = 0;float hum = 0;void setSockets() {// Эта функция устанавливает состояние розетокfor (int i = 0; i < NUM_SOCKETS; i++) {// Перебираем все определенные ранее розетки, устанавливая для них соответствующий статусdigitalWrite(sockets.socketPin, socketStatus);}}void printSensors(){// Эта функция выводит в консоль состояние датчиков для помощи при отладке.Serial.print("[ >> ] Temperature: "); Serial.print(temp); Serial.print(" C;\tHumidity: "); Serial.print(hum); Serial.println("%");}void setup() {// Эта функция выполняется один раз при включении контроллера. Serial.begin(115200); // Подключаем COM-порт для вывода информации из контроллера.Serial.println("WeedLife Air Controller Lite v.1.0");dht.begin(); // Инициализируем датчик температуры/влажности.for (int i = 0; i < NUM_SOCKETS; i++) {socketStatus = S_OFF; // Устанавливаем розетку в ВЫКЛЮЧЕНО по умолчаниюpinMode(sockets.socketPin, OUTPUT); // Переключаем управляющие пины всех определенных ранее розеток в режим "выход"}setSockets(); // Переводим розетки в состояние по умолчаниюAlarm.timerRepeat(5, printSensors); // Включаем таймер для запуска функции printSensors каждые 5 секунд.}void loop() {// Эта функция выполняется по бесконечному кругу. Здесь мы будем проверять показания датчиков и управлять нагрузками.Alarm.delay(1000); // Вносим задержку в 1 секунду, чтобы датчик успел передать предыдущие данныеtemp = dht.readTemperature(); // Получаем текущую температуруhum = dht.readHumidity(); // Получаем текущую влажность if (isnan(temp) || isnan(hum)) {// Что-то пошло не так, потому что данные с датчика не поступают! Отключаем все нагрузки и возвращаемся в начало!for (int i = 0; i < NUM_SOCKETS; i++) socketStatus = S_OFF;setSockets();Serial.println("[FAIL] Can't read sensor data! Turn everithing OFF!");return;}// Теперь сравним полученные данные с условиями, заданными для каждой розеткиfor (int s = 0; s < NUM_SOCKETS; s++) {// Проверяем условия для включения розетки по датчику температурыint tempStatus = S_OFF;switch (sockets.tempMode) {case NO_ACTION:tempStatus = S_ON;break;case IN_RANGE:if ((temp >= sockets.tempBegin) && (temp = sockets.humBegin) && (hum if ((temp >= sockets.tempBegin) && (temp = sockets.humBegin) && (hum if ((temp >= sockets.tempBegin) && (temp = sockets.humBegin) && (hum Вот так укладеноТак де показано релизация отопления Чёт я вставил ваш код, у меня ошибки валятся в консоли C:\Users\asus\Desktop\sketch_jul18a\sketch_jul18a.ino: In function 'void loop()': sketch_jul18a:117: error: expected ')' before 'if' if ((temp >= sockets.tempBegin) && (temp = sockets.humBegin) && (hum ^ sketch_jul18a:119: error: expected ')' at end of input if ((temp >= sockets.tempBegin) && (temp = sockets.humBegin) && (hum ^ sketch_jul18a:119: error: expected statement at end of input sketch_jul18a:119: error: expected '}' at end of input sketch_jul18a:119: error: expected '}' at end of input sketch_jul18a:119: error: expected '}' at end of input exit status 1expected ')' before 'if' Помогите решить хоть, буду признателен) Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
Gs674723222 23 Опубликовано 16 июля, 2021 В 19/05/2016 в 17:15, mixturator сказал: Если ты внимательно посмотрел на код и попытался в нем разобраться, ты наверняка заметил, что я не стал в нем фиксировать количество розеток, которыми можно управлять. Фактически, количество управляемых розеток на контроллере Nano может быть до 10 штук – по количеству свободных цифровых выходов D2…D11. Добавь еще один релейный модуль на 8 реле, поставь блок питания помощнее, и вперед! А еще А0-А5 вполне себе работают как и D2-D11. Для освобождения портов в этой ситуации, я бы использовал сдвиговый регистр, а лучше сборку. И вот у нас уже 64 управляемых реле и 3 занятыйх контакта. А вообще тема хорошая. Даешь микроконтроллеры в массы!!!! Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
Gs674723222 23 Опубликовано 16 июля, 2021 В 01/06/2020 в 20:59, Doomnik сказал: Ничего не имею против этой темы, но двухпозиционный регулятор температуры на алике стоит 600 рублей Разумеется у ардуино большой потенциал в плане расширения функций, да и данные о температуре можно в память записывать... Одну только температуру регулировать смысла нет. А вот автополив, температуру, влажность, свет, вытяжку, приточку и т.д. смысл уже появляется. Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
Ping 18 Опубликовано 14 марта, 2022 Мне кажется, что не нужно все так усложнять. На влажность пох, темпа регулируется вытяжкой и открытым окном. Полив, если земля, то руками легко, а если кокос или серамис, то автополив, который тоже руками корректируешь. Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
ЕдинорожикСерёжа 805 Опубликовано 14 марта, 2022 1 час назад, Ping сказал: Мне кажется, когда кажется креститься надо =) а так ты ездишь на машине или скачишь на конях? Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
doomsix 0 Опубликовано 19 апреля, 2022 всем джа кто делал климат контроль этот и у кого заработало отпишите пожалуйста, не могу разобраться с кодом Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
Nei 868 Опубликовано 20 апреля, 2022 (изменено) 11 часов назад, doomsix сказал: всем джа кто делал климат контроль этот и у кого заработало отпишите пожалуйста, не могу разобраться с кодом Привет. Выкладывай код и задавай вопросы. Что конкретно в коде не можешь сделать или не понятно? Изменено 20 апреля, 2022 пользователем СуперМодерДзаги Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты