Публикации
Гроупедия
Перейти к содержанию

Автоматический климат-контроль своими руками

Привет, сын Джа! Мир тебе! Некоторое время назад я написал вот этот пост про полноценную автоматизацию гидропоники «на коленке», который многим олдовым гроверам показался полезным, но уж очень заумным. Так что сейчас, мой юный падаван, я снижу планку и расскажу тебе, как своими руками сделать автоматический блок управления микроклиматом в боксе, потратив при этом не более $30 и почти не заморочив себе голову. 

Поскольку свой первый, чрезмерно навороченный проект я обозвал гордым именем «Робот-садовник», то это упрощенное устройство будет называться «Мой младший брат – дебил». Готовься, будет много картинок!

 

Что мы собираем?

Назначение блока: управление тремя приборами в боксе – вентилятором, обогревателем и увлажнителем - с помощью «умного удлинителя» под руководством самого дешевого и, при этом, очень надежного контроллера Ардуино.

Автоматический климат-контроль своими руками

Итак, нам понадобится:

  • Контроллер Arduino Nano - $2
  • Блок питания на 5 вольт - $2
  • Датчик температуры/влажности DHT22 (микросхема AM2321) - $3
  • Резистор на 1 кОм
  • Модуль на 4 реле - $3
  • Пластиковый кабель-канал 100x60 и две торцевых заглушки - $6
  • 3 электрических розетки для скрытого монтажа с заземлением - $6
  • Электрический кабель ПВС 3x1,5 и евровилка с землей - $2
  • Ножовка, дрель, отвертка, паяльник, клеевой пистолет
  • Компьютер под виндой или линуксом для настройки контроллера
  • Относительно прямые руки

Где всё это покупать, расскажу в конце, если ты до туда дочитаешь, конечно :)


Как это собрать?

Начнем с самого простого – соберем блок розеток. Не хочу ограничивать твою фантазию, просто расскажу, как это сделал я. Отрезаем кусок кабель-канала с таким расчетом, чтобы разместить три розетки и все остальные потроха. Размечаем и вырезаем отверстия, прикручиваем розетки и переходим к подключению проводов. Провода в электрокабеле обычно различаются по цветам. Ноль - синий, земля - желто-зеленый, фаза - коричневый. Ноль и землю разводим по соответствующим клеммам розеток, а фазу (коричневый) разводим на центральные контакты реле.

Автоматический климат-контроль своими руками

Автоматический климат-контроль своими руками

Автоматический климат-контроль своими руками

!! Часто у электриков-энтузиастов возникает желание забить на «землю». Я – сторонник теории естественного отбора, поэтому активно поддерживаю такие желания. Для не-энтузиастов  сообщаю: вентилятор – это прибор, особо хорошо накапливающий статические заряды, которым надо куда-то стекать. И лучше бы им стекать на землю, а не тебе в руку. Делай выводы.

У каждого реле – три силовых контакта. Центральный контакт – общий, а два по краям – нормально-замкнутый и нормально-разомкнутый. Нам нужно соединить нормально-разомкнутый контакт каждого реле с клеммой «фаза» на соответствующей розетке.

Автоматический климат-контроль своими руками

С электричеством на 220 вольт разобрались. Займемся питанием контроллера. Разбираем блок питания на 5 вольт. Провода, идущие к вилке, обрезаем и наращиваем. Подсоединяем к ближайшим клеммам фаза и ноль. Отрезаем штекер от низковольтового выхода и подсоединяем «плюс» (обычно по этому проводнику идет текстовая маркировка кабеля) к контактам [5V] на контроллере и модуле реле, а «минус» (обычно или без маркировки, или с маркировкой «-») соответственно, к контактам [Gnd]. Лучше проверить напряжение и полярность мультиметром, иначе устройства можно сжечь.

Автоматический климат-контроль своими руками

Автоматический климат-контроль своими руками

Автоматический климат-контроль своими руками

Теперь нужно подсоединить модуль реле к контроллеру. Тут всё просто. [1] соединяем с [D2], [2] соединяем с [D3], [3] соединяем с [D4]. Всё, релейный модуль подключен. Внимательно смотри схему.

Автоматический климат-контроль своими руками

Автоматический климат-контроль своими руками

Теперь займемся датчиком температуры/влажности. У датчика четыре ножки, нам нужны только 3 из них. Крайний левый контакт цепляем к «плюсу» от блока питания. Второй слева (передача данных) – к [D12] на контроллере. Крайний правый контакт – к «минусу» на блоке питания. Внимательно смотри схему! Для того, чтобы датчик нормально работал, обязательно нужно включить «подтягивающий» резистор на 1 кОм между [5V] и [D12].

 

Автоматический климат-контроль своими руками

 

Автоматический климат-контроль своими руками


Чтобы всё смотрелось аккуратно, подготовим заглушки. В одной сверлим отверстие для провода (я воспользовался сальником, купленным в элетротоварах), во второй вырезаем прямоугольное отверстие для датчика. Датчик вставляем и сажаем на клей, чтобы случайно не оторвался. По бокам сверлим маленькие отверстия под саморезы, чтобы зафиксировать конструкцию.
Полезный совет: ничего не крепи и не приклеивай на этом этапе, сначала добейся устойчивой работы системы. Иначе наверняка все придется разбирать, особенное, если ты уверенный в себе профессионал.

Автоматический климат-контроль своими руками

 

Автоматический климат-контроль своими руками


Как заставить это работать?

Теперь – самое интересное! В контроллер нужно загрузить прошивку. Для начала, скачай программу Arduino с сайта Arduino.cc и установи её. Запускаем программу и подсоединяем контроллер к компьютеру.

Делаем предварительные настройки программы – выбираем модель контроллера и порт, к которому он присоединен.

 

(изображение кликабельны)
Автоматический климат-контроль своими руками

Автоматический климат-контроль своими руками

Устанавливаем необходимые для нашей прошивки библиотеки: DHT, Time и TimeAlarms.

Автоматический климат-контроль своими руками

Автоматический климат-контроль своими руками


Автоматический климат-контроль своими руками

Заменяем всё содержимое окна на этот код:
 

#include  // Подключаем библиотеку для работы с таймерами#include          // Подключаем библиотеку для работы с датчиками температуры/влажности на базе чипов 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[i].socketPin, socketStatus[i]);}}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[i] = S_OFF; // Устанавливаем розетку в ВЫКЛЮЧЕНО по умолчаниюpinMode(sockets[i].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[i] = 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[s].tempMode) {         case NO_ACTION:         tempStatus = S_ON;         break;         case IN_RANGE:         if ((temp >= sockets[s].tempBegin) && (temp  sockets[s].tempEnd)) tempStatus = S_ON;         break;         case OUT_RANGE:         if ((temp  sockets[s].tempBegin) || (temp >= sockets[s].tempEnd)) tempStatus = S_ON;         break; }// Проверяем условия для включения розетки по датчику влажностиint humStatus = S_OFF;switch (sockets[s].humMode) {         case NO_ACTION:         humStatus = S_ON;         break;         case IN_RANGE:         if ((hum >= sockets[s].humBegin) && (hum  sockets[s].humEnd)) humStatus = S_ON;         break;         case OUT_RANGE:         if ((hum  sockets[s].humBegin) || (hum >= sockets[s].humEnd)) humStatus = S_ON;         break; }// Объединяем оба результата в один новый статус розеткиint newStatus = S_OFF;if ((tempStatus == S_ON) && (humStatus == S_ON)) newStatus = S_ON;if (socketStatus[s] != newStatus) {         // Статус розетки изменился! Отправим сообщение об этом в консоль и установим новое значение.         Serial.print("[ OK ] Socket #"); Serial.print(s); Serial.print(" status has changed to "); Serial.println(newStatus);         socketStatus[s] = newStatus;}// Обновляем статусы розетокsetSockets();}// Конец функции loop. Сейчас контроллер запустит ее снова.}

Специально для новичков в программировании я снабдил код очень подробными комментариями. Если тебе захочется что-то изменить или добавить – дерзай! Буду рад помочь советом.
В первую очередь, нас интересует фрагмент кода, где задаются условия для включения розеток (выделен желтым цветом). Измени эти значения по своему усмотрению.

Автоматический климат-контроль своими руками

Прошивка загружается в контроллер нажатием на кнопку [Upload] на панели быстрого запуска. Если всё прошло хорошо, в строке состояния появится сообщение «Done uploading».

Сразу после загрузки контроллер начнет работу с новой прошивкой. Чтобы посмотреть ход выполнения программы, выбери в меню [Tools] -> [Serial Monitor].  Если в окошке монитора ничего не отображается или сыплется «мусор», проверь скорость com-порта – нужно выбрать 115200.

Автоматический климат-контроль своими руками

Прежде чем отключать контроллер от компьютера и приступать к сборке, погоняй систему в тестовом режиме. Чтобы повысить температуру и влажность, можно несколько раз выдохнуть прямо в сенсор. Если хочешь повысить температуру, не повышая влажность, воспользуйся феном для волос. Чтобы охладить датчик, поможет лёд из морозилки.

Если контроллер четко выполняет инструкции (а куда он, гад, денется?), можно приступать к окончательной сборке. Аккуратно запихиваем все платы в корпус. В идеале, чтобы ничего не болталось, нужно прихватить платы клеевым пистолетом или посадить на двухсторонний скотч.

Автоматический климат-контроль своими руками

Автоматический климат-контроль своими руками

Советы бывалых

Известно, что электроника – наука о контактах. Так что, если что-то не работает, значит, или не контачит, или замкнуло. Так что все советы – по этой теме:
  • Собери всю схему на столе с помощью перемычек, и заставь её работать, ПРЕЖДЕ, чем браться за паяльник и запихивать все потроха в корпус.
  • Когда отладил работу на перемычках – бери паяльник. Только не любимый дедулин паяльник на 200 ватт и размером с ментовский дубинал, а маленький, ватт на 30, чтобы температура жала была не больше 300 градусов. Соответственно, припой (олово) должен быть тоже легкоплавким. Иначе рискуешь спалить всю нежную электронику. Если никогда до этого не паял – посмотри ролики на Ютубе, как это правильно делать.
  • Открытые контакты нужно изолировать. Конечно, покатит и изолента, но намного удобнее пользоваться термоусаживающимеся трубками. Спроси на радиорынке или в магазе радиодеталей.
  • Пользуй мультиметр для проверки напряжения и полярности.
Развитие системы

Если ты внимательно посмотрел на код и попытался в нем разобраться, ты наверняка заметил, что я не стал в нем фиксировать количество розеток, которыми можно управлять. Фактически, количество управляемых розеток на контроллере Nano может быть до 10 штук – по количеству свободных цифровых выходов D2…D11. Добавь еще один релейный модуль на 8 реле, поставь блок питания помощнее, и вперед!

Следующая логичная вещь – подключить к контроллеру LCD экран и выводить на него всякую полезную инфу. Экранов для Ардуино продается немеряно, так что ничего невозможного нет.

Ну и почитай мой репорт про автоматизацию гидры. Контроллер там используется из этой же серии, только программирование немного сложнее. В общем, добро пожаловать в мир микроконтроллеров!

Где брать детали?

Розетки, кабель-канал, вилку, провод и блок питания я купил в ближайших элетротоварах. Вообще, у гроувера со стажем, как правило, найдется всё это барахло в кладовке :)Контроллер, блок реле и датчик я купил на сайте Aliexpress. Правильные названия для поиска такие:
  • Arduino Nano 3.0 ATmega328
  • 5V 4 Channel Relay Module
  • DHT22 Module AM2302

Если по почте заказывать не хочешь или не можешь, или просто впадлу ждать посылку три недели, обратись к местным реселлерам, ищутся по словам «Arduino купить дешево в Мухосранске». Продадут тебе всё, что надо, но раза в 1.5 – 2 дороже, естественно. Хотя суммы всё равно копеечные.

Всё, пионеры, я устал! Пойду придумывать, чем вас удивить в следующий раз. СЛАВА РОБОТАМ! 

 

Обсудить на форуме

mixturator
  • Респект! 5
Нашли ошибку?

Успех! Найденная ошибка зафиксирована и отправлена, совсем скоро она будет еще и исправлена!

Реклама






Обратная связь

Рекомендуемые комментарии



я хочу еще камеру usb подключить сюда, это реально?

надо что-то дополнительно заказать?

Поделиться этим комментарием


Ссылка на комментарий
Поделиться на другие сайты

вообщем все детали пришли, начинаю сборку,

буду сегодня разбираться с кодом по розеткам.

Поделиться этим комментарием


Ссылка на комментарий
Поделиться на другие сайты

Прочитал ветку на одном дыхании.

Автору спасибо, проделанная тобой работа достойна уважения.  :ny_icon_old:

 

А систему смешения и подучи удобрений разработать интересно? Я удивлён, почеу еще нет OpenSorce проета аналогичного OverGrower например. 

 

Три-пять перельстатических насоса и управление "большим" насосом, и ардуино или расбери. Подскажите, тут подобное обсуждалось? если нет, то предлагаю обсудить и начать делать.  :hello:

Поделиться этим комментарием


Ссылка на комментарий
Поделиться на другие сайты

Три-пять перельстатических насоса и управление "большим" насосом, и ардуино или расбери. Подскажите, тут подобное обсуждалось? если нет, то предлагаю обсудить и начать делать.  :hello:

я видел только тему о продаже готового продукта.

 

по моему мнению этим никто не занимается, т.к. например стоимость проекта, описанного в этой теме, пару соток, когда как самый простецкий ph-метр стоит от 15 тысяч.  это как бы никому не нужно, многим проще ручками

Изменено пользователем Doomnik

Поделиться этим комментарием


Ссылка на комментарий
Поделиться на другие сайты

я видел только тему о продаже готового продукта.

 

по моему мнению этим никто не занимается, т.к. например стоимость проекта, описанного в этой теме, пару соток, когда как самый простецкий ph-метр стоит от 15 тысяч.  это как бы никому не нужно, многим проще ручками

 

Ох, и я так думал, что проще самому сделать. Да что уж там системы автоматизации.

Вот, казалось бы, что стоит сделать машинку которая будет по монорельсе туда-сюда перемещаться?

А там нюансов УЙМА, если не ТЬМА. LightMover мы сейчас создали полноприводный, я скоро покажу его миру.

 

А на данный момент, мы в Ростове-на-Дону делаем самые качественные муверы по образцу американского LightRail, только намного лучше, современнее. И дешевле.  :brows:  И это точно дешевле второго комплекта света.

 

Удивлён я как у нас растениеводство еще слабо развито.

Поделиться этим комментарием


Ссылка на комментарий
Поделиться на другие сайты

Ох, и я так думал, что проще самому сделать. Да что уж там системы автоматизации.

Вот, казалось бы, что стоит сделать машинку которая будет по монорельсе туда-сюда перемещаться?

А там нюансов УЙМА, если не ТЬМА. LightMover мы сейчас создали полноприводный, я скоро покажу его миру.

 

А на данный момент, мы в Ростове-на-Дону делаем самые качественные муверы по образцу американского LightRail, только намного лучше, современнее. И дешевле.  :brows:  И это точно дешевле второго комплекта света.

 

Удивлён я как у нас растениеводство еще слабо развито.

Вспомнил.

Поищи тему "робот садовник" в названии темы ещё будет слово "эволюция". Там было. Я с телефона, не очень удобно искать.

Поделиться этим комментарием


Ссылка на комментарий
Поделиться на другие сайты

Доброго времени суток. Собрал и настроил автоматику на ардуино, регулирует освещение, дневную и ночную температуры, влажность, содержание СО2, организован полив два дня удобрение, один день вода, поливает три раза в день время подачи раствора регулируется, цикличная вентиляция. Все параметры регулируются есть возможность включать или выключать по отдельность. Для кокоса огонь просто пришлось пока разобрать на летающие, 228/1 год условно дружочек сдал

Поделиться этим комментарием


Ссылка на комментарий
Поделиться на другие сайты

е**ть тут кулибины, слишком сложно, лучше накопить, учитывая мою кривизну рук - могу нахер спалить все

Поделиться этим комментарием


Ссылка на комментарий
Поделиться на другие сайты

Определился с тем, что буду делать бокс для одного растения, не совсем стелс, но и не сервант )

 

Покурив форум на повод освещения принял решение купить комплект ДнаТ 150 (VS) и лампу GE.

 

Бокс примерно будет 60*50*90 см.  (думаю для ондной лампы с досветами как раз)

 

с фильтром пока не определился но это не так страшо пока, так как гров планирую на балконе.

 

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

Пока думаю, что на этот размер бокса лампы будет достаточно, а что если нет?

Даже если достаточно то свет 24-0. а это только автики.

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

 

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

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

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

Поделиться этим комментарием


Ссылка на комментарий
Поделиться на другие сайты

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

Пока думаю, что на этот размер бокса лампы будет достаточно, а что если нет?

Даже если достаточно то свет 24-0. а это только автики.

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

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

Опыта не имею, просто посидел подумал так... Засасывать холодный воздух и пытаться его нагреть при этом выплевывать теплый наружу... Это ппц как не рационально. Хотя если халявное электричество то можно.

Надо как-то подумать о возврате теплого воздуха обратно в бокс...

Может даже вообще сделать гроубокс с теплоизолированными стенками, без вентиляции, а внутрь подавать CO2 +датчик CO2. Хотя лампа будет нагревать всё внутри... Тогда к примеру гонять воздух по замкнутому контуру,  а контур это алюминиевая гофра которая бы немного охлаждала идущий внутри воздух за счет того, что ее стенки имели бы контакт с холодным воздухом на балконе. Т.е. был бы сброс тепла.. А регулировать температуру можно было бы меня скорость потока. Хотя здесь плесень может пойти...

 

по мне так гемор еще тот и вообще стоит ли браться.

Изменено пользователем Doomnik

Поделиться этим комментарием


Ссылка на комментарий
Поделиться на другие сайты

 

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

Опыта не имею, просто посидел подумал так... Засасывать холодный воздух и пытаться его нагреть при этом выплевывать теплый наружу... Это ппц как не рационально. Хотя если халявное электричество то можно.

Надо как-то подумать о возврате теплого воздуха обратно в бокс...

Может даже вообще сделать гроубокс с теплоизолированными стенками, без вентиляции, а внутрь подавать CO2 +датчик CO2. Хотя лампа будет нагревать всё внутри... Тогда к примеру гонять воздух по замкнутому контуру,  а контур это алюминиевая гофра которая бы немного охлаждала идущий внутри воздух за счет того, что ее стенки имели бы контакт с холодным воздухом на балконе. Т.е. был бы сброс тепла.. А регулировать температуру можно было бы меня скорость потока. Хотя здесь плесень может пойти...

 

по мне так гемор еще тот и вообще стоит ли браться.

Думаю утеплить бокс пеноплексом и отражающим пенофолом обклеить, а вот как регулировать все это, еще та задача. Однозначно время есть, орешки есть, днат есть, буду думать дальше.

Стоит бро того.

Поделиться этим комментарием


Ссылка на комментарий
Поделиться на другие сайты

Думаю утеплить бокс пеноплексом и отражающим пенофолом обклеить, а вот как регулировать все это, еще та задача. Однозначно время есть, орешки есть, днат есть, буду думать дальше.

Стоит бро того.

напиши потом что получилось, интересно узнать результат. ))

Поделиться этим комментарием


Ссылка на комментарий
Поделиться на другие сайты

 

напиши потом что получилось, интересно узнать результат. ))

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

Поделиться этим комментарием


Ссылка на комментарий
Поделиться на другие сайты

На самом деле код сретча не работает, перелопатил кучувсего, в итоге опытным путём пришел к правильному коду, может кому то пригодится:

 

#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

Поделиться этим комментарием


Ссылка на комментарий
Поделиться на другие сайты

Написано резистор на 1 кОм, а на фото резистор на 4.7, так какой все же нужен?

Поделиться этим комментарием


Ссылка на комментарий
Поделиться на другие сайты

Написано резистор на 1 кОм, а на фото резистор на 4.7, так какой все же нужен?

Проблема решается тем, что берется описание к датчику dht22.

Я нашел инфу, которая говорит о том, что резистор должен быть в диапазоне 5-10 кОм.

Поэтому вешай 4,7 кОм

https://cleverdiy.ru/wp-content/uploads/2019/11/Catcatcat_dht-11_01a.png

Изменено пользователем Doomnik

Поделиться этим комментарием


Ссылка на комментарий
Поделиться на другие сайты

Проблема решается тем, что берется описание к датчику dht22.

Я нашел инфу, которая говорит о том, что резистор должен быть в диапазоне 5-10 кОм.

Поэтому вешай 4,7 кОм

https://cleverdiy.ru..._dht-11_01a.png

Спасибо!

Поделиться этим комментарием


Ссылка на комментарий
Поделиться на другие сайты

Опять про скетч, для версии 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

 

Вот так укладено

Так де показано релизация отопления

post-157425-0-42426200-1590852626_thumb.jpeg

post-157425-0-22082600-1590852627_thumb.jpeg

post-157425-0-96478200-1590852651_thumb.jpeg

Поделиться этим комментарием


Ссылка на комментарий
Поделиться на другие сайты

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

 

Разумеется у ардуино большой потенциал в плане расширения функций, да и данные о температуре можно в память записывать...

Поделиться этим комментарием


Ссылка на комментарий
Поделиться на другие сайты

Можете, пожалуйста скинуть код построчно! А то все сжалось и перепечатывать самому код на си когда ты джаваскриптер не очень-то комильфо)

Поделиться этим комментарием


Ссылка на комментарий
Поделиться на другие сайты

Опять про скетч, для версии 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 1

expected ')' before 'if'

 

 

Помогите решить хоть, буду признателен)

Поделиться этим комментарием


Ссылка на комментарий
Поделиться на другие сайты
В 19/05/2016 в 17:15, mixturator сказал:

Если ты внимательно посмотрел на код и попытался в нем разобраться, ты наверняка заметил, что я не стал в нем фиксировать количество розеток, которыми можно управлять. Фактически, количество управляемых розеток на контроллере Nano может быть до 10 штук – по количеству свободных цифровых выходов D2…D11. Добавь еще один релейный модуль на 8 реле, поставь блок питания помощнее, и вперед!

А еще А0-А5 вполне себе работают как и D2-D11. Для освобождения портов в этой ситуации, я бы использовал сдвиговый регистр, а лучше сборку. И вот у нас уже 64 управляемых реле и 3 занятыйх контакта. А вообще тема хорошая. Даешь микроконтроллеры в массы!!!!

Поделиться этим комментарием


Ссылка на комментарий
Поделиться на другие сайты
В 01/06/2020 в 20:59, Doomnik сказал:

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

 

Разумеется у ардуино большой потенциал в плане расширения функций, да и данные о температуре можно в память записывать...

Одну только температуру регулировать смысла нет. А вот автополив, температуру, влажность, свет, вытяжку, приточку и т.д. смысл уже появляется.

Поделиться этим комментарием


Ссылка на комментарий
Поделиться на другие сайты

Мне кажется, что не нужно все так усложнять. На влажность пох, темпа регулируется вытяжкой и открытым окном. Полив, если земля, то руками легко, а если кокос или серамис, то автополив, который тоже руками корректируешь.

Поделиться этим комментарием


Ссылка на комментарий
Поделиться на другие сайты
1 час назад, Ping сказал:

Мне кажется,

когда кажется креститься надо =)

а так ты ездишь на машине или скачишь на конях?

Поделиться этим комментарием


Ссылка на комментарий
Поделиться на другие сайты

всем джа кто делал климат контроль этот и у кого заработало отпишите пожалуйста, не могу разобраться с кодом

 

Поделиться этим комментарием


Ссылка на комментарий
Поделиться на другие сайты
11 часов назад, doomsix сказал:

всем джа кто делал климат контроль этот и у кого заработало отпишите пожалуйста, не могу разобраться с кодом

Привет. Выкладывай код и задавай вопросы. Что конкретно в коде не можешь сделать или не понятно?

Изменено пользователем СуперМодерДзаги

Поделиться этим комментарием


Ссылка на комментарий
Поделиться на другие сайты



Для публикации сообщений создайте учётную запись или авторизуйтесь

Вы должны быть пользователем, чтобы оставить комментарий

Создать учетную запись

Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!

Регистрация нового пользователя

Войти

Уже есть аккаунт? Войти в систему.

Войти
  • Создать...

Успех! Новость принята на премодерацию. Совсем скоро ищите в ленте новостей!