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

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

Рекомендуемые сообщения

warning: 'typedef' was ignored in this declaration тоже выскакивает.

post-120368-0-01932000-1489000678_thumb.png

Чтобы поправить это предупреждение, нужно дописать любое слово вот тут:

https://yadi.sk/i/9yFhgpu23QzMmz

 

А вообще спасибо большое тебе, добрый человек, топик-стартер! Тоже собрал прототип (собрал без дисплея, но с прошивкой 1.1), все работает. Тема очень увлекла, в ближайшей перспективе планирую подключить LCD-дисплей (который у меня есть в наборе). :JC_spliff:

Поделиться сообщением


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

отличненько, будем заказывать! )

Поделиться сообщением


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

я хочу еще камеру 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, так какой все же нужен?

Проблема решается тем, что берется описание к датчику 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 сказал:

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

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

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

Поделиться сообщением


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

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

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

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

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

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

Войти

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

Войти

  • Создать...

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