RPSVoloch Опубликовано: 25 ноября 2015 Автор Поделиться Опубликовано: 25 ноября 2015 (изменено) Почему не построю ? Квалификации хватает - построю. Веб-сервер это всего лишь программа, которая обрабатывает http запросы от клиента и возвращает ответ. Необязательно это всегда ответ в виде html страницы, необязательно веб-сервер сам генерирует страницу обрабатывая серверные php или asp или какие-либо другие скрипты. Может просто загрузить ее с диска и отправить. Клиентские джава-скрипты выполняет клиент (браузер), веб-сервер в основном занимается обработкой AJAX-запросов, и отправляет ответ в виде XML (обычно очень небольшие), данные из которых клиент отображает в нужных местах на странице. SD модуль идет встроенный на Ethernet Shield, там расположена стартовая страничка, клиентские скрипты, иконки и прочий контент для веб-сервера. У ардуины встроенного EEPROM всего лишь 4 Кб и там файлы неудобно хранить. У каждого свой подход. Веб-сервер нормально живет на ардуине и может нагружаться не сильно и не отнимать много вычислительных ресурсов. Можно больше нагрузить клиента скриптами. О наконец то грамотный попался) Но тут споры наши могут зайти очень далеко. Всё же как технарь с достаточным уровнем умений и знаний выберу комп так как он более приспособлен к поставленным мною задачам. Ардуинка тут только как исполняемый модуль и увы нагружать её сильно не очень то правильное решение. А тебе например я бы посоветовал полноценно использовать возможности ардуинки с карточной (научи её обновляться с карты памяти и по локальной сети) Сюда же будет выложен образ ОС со всеми настройками и сайтом (но только после полной отладки) Изменено 25 ноября 2015 пользователем RPSVoloch Цитата Ссылка на комментарий Поделиться на других сайтах Больше способов поделиться...
RPSVoloch Опубликовано: 5 декабря 2015 Автор Поделиться Опубликовано: 5 декабря 2015 (изменено) Пришла очередная идея для более удобного обслуживания бокса (опускать и поднимать основной свет) Что то я тут посмотрел и ни у кого такой штуки не увидел... А ведь она реально упростит поднятие и опускание света в высоких но узких боксах... Да и нагрузку держет приличную. Изменено 5 декабря 2015 пользователем RPSVoloch Цитата Ссылка на комментарий Поделиться на других сайтах Больше способов поделиться...
Logik Опубликовано: 6 декабря 2015 Поделиться Опубликовано: 6 декабря 2015 Пришла очередная идея для более удобного обслуживания бокса (опускать и поднимать основной свет) Что то я тут посмотрел и ни у кого такой штуки не увидел... А ведь она реально упростит поднятие и опускание света в высоких но узких боксах... Да и нагрузку держет приличную. Войдите или зарегистрируйтесь для просмотра содержимого. Купить семена конопли. Прелесть - ток два момента: 1 - организовать фиксацию. 2.И подходит только для строго параллельных вертикальных стен - шкаф, например. В моем случае расхождения стен - 12 мм. на метр - уже не проходит((. Самый оптимальный вариант- цепочки и на верху, рядом с фиксатором - крючок. Поднял на нужную высоту - повесил звено на крючок. Просто и технологично! Хотя идея с напровляющими - шикарна! Цитата Ссылка на комментарий Поделиться на других сайтах Больше способов поделиться...
RPSVoloch Опубликовано: 6 декабря 2015 Автор Поделиться Опубликовано: 6 декабря 2015 (изменено) Решил провести эксперимент: Прелесть - ток два момента: 1 - организовать фиксацию. 2.И подходит только для строго параллельных вертикальных стен - шкаф, например. В моем случае расхождения стен - 12 мм. на метр - уже не проходит((. Самый оптимальный вариант- цепочки и на верху, рядом с фиксатором - крючок. Поднял на нужную высоту - повесил звено на крючок. Просто и технологично! Хотя идея с напровляющими - шикарна! Фиксацыя это не самый большой геморрой поверь) Что бы зафиксировать достаточно дополнить конструкцию: на самой направляющей сделать небольшие насечки и прикрепить механизм (как в трещётках на калесе велосипеда со скоростями) или же рядом прекрепить зубчатую полоску и на саму лампу упор подпружиненный который будет упираться в зубчатую полоску. Решил провести эксперимент со всетом (какой свет лучше для веги). Результат: При использовании 2 ЭСЛ на 85W температура в боксе 37 - 38 градусов и пельтье не справляется!!! Вентиляция работает на всю катушку постоянно( Стена гарячая так как пельтье крепится на алюминевую пластину, а она на стену через термопрокладку от телека для отвода тепла. В помещении где нагодится бокс температура подскочила до 43 градусов и приходится сидеть в трусах иначе пот ручьём. При использовании ЛЕД такого нету и приходится даж обогревать бокс. Временно отключаю элементы пельтье и посмотрим что будет. С выдува снимаю все фильтры и надеюсь температура упадёт и продув будет лучше. Если же нет поставлю обратно ЛЕД и не буду выпендриваться со своими экспериментами. Не знала баба горя так купила порося! Изменено 6 декабря 2015 пользователем RPSVoloch Цитата Ссылка на комментарий Поделиться на других сайтах Больше способов поделиться...
RaZoR Опубликовано: 6 декабря 2015 Поделиться Опубликовано: 6 декабря 2015 А если, как вариант, делать связку ардуинка (исполнитель) + малинка (веб-сервер, sql и т.д.) через i2c, и крутить всем этим через rdp или вебморду? Цитата Ссылка на комментарий Поделиться на других сайтах Больше способов поделиться...
RPSVoloch Опубликовано: 7 декабря 2015 Автор Поделиться Опубликовано: 7 декабря 2015 А если, как вариант, делать связку ардуинка (исполнитель) + малинка (веб-сервер, sql и т.д.) через i2c, и крутить всем этим через rdp или вебморду? Можно как угодно) Было бы желание и время на исполнение. Цитата Ссылка на комментарий Поделиться на других сайтах Больше способов поделиться...
RPSVoloch Опубликовано: 10 декабря 2015 Автор Поделиться Опубликовано: 10 декабря 2015 (изменено) В связи с изменением вида основного освещения для эксперимента временно пришлось отказаться от досвета и системы циркуляции. На програмном коде это отражаться не будет. Система опрыскивания после долгих испытаний работает не стабильно. Сабака прыскает не пойми каким раствором рэндомно. Система охлождения и обогрева бокса отключена (слишком сильно поднимает температуру в помещении где находится бокс), на коде не отразится. Выкладываю новый скетч без PH и опрыскивания. Добавлена функция подключения DNAT. Отдельно выведен досвет. Убрана возможность выбора когда какой свет включать (слишком геморно пока что настраивать каждый по отдельности) Убрана отладочная информация выводимая в консоль PC (выводит только время и температуру с влажностью) #include <DS3231.h> #include <DHT.h> DS3231 rtc(SDA, SCL); Time RTC_T; // Основные настройки скрипта. Изменения необходимо произвести под свои нужды!!! // Скрипт расчитан на день но для тех кому необходимо сберечь деньги советую переключить на ночной режим и счётчик будет считать по другому тарифу. int led_on = 05; // Время включения диодов (устанавливается в часах) int led_off = 23; // Время выключения диодов (устанавливается в часах) int circ_on = 05; // Цыркуляция воздуха внутри. Время включения (устанавливается в часах). int circ_off = 23; // Цыркуляция воздуха внутри (устанавливаем хоть постоянно) время выключения (устанавливается в часах). int ventilation_on = 05; // Включение вентиляции (устанавливается в часах) рекомендую устанавливать во время включения света. int ventilation_off = 23; // Отключение вентиляции (устанавливается в часах) рекомендую устанавливать через час после выключения света. int breeze_on = 01; // Обдув растишек on (устанавливается в часах). int breeze_off = 23; // Обдув растишек off (устанавливается в часах). int compressor_on = 05; // Запуск компрессора для нагнетания воздуха в раствор. int compressor_off = 23; // Остановка компрессора для нагнетания воздуха в раствор. int sprayings_on = 23; // Запускается после выключения света, указываются минуты начала опрыскивания. int sprayings_off = 24; // Минуты остановки опрыскивания. int a_heating_on = 25; // Температура включения обогрева воздуха (градусы цельсия) int a_heating_off = 25; // Температура выключения обогрева воздуха (градусы цельсия) int a_cooling_on = 25; // Температура включения охлаждения воздуха (градусы цельсия) int a_cooling_off = 25; // Температура выключения охлождения воздуха (градусы цельсия) int w_heating_on = 25; // Температура включения обогрева воды (градусы цельсия) int w_heating_off = 25; // Температура выключения обогрева воды (градусы цельсия) int w_cooling_on = 25; // Температура включения охлаждения воды (градусы цельсия) int w_cooling_off = 25; // Температура выключения охлождения воды (градусы цельсия) int humidifier_on = 50; // Минимальная влажность для включения увлажнителя воздуха. int humidifier_off = 80; // Максимальная влажность для выключения увлажнителя воздуха. int ph_on = 6; // Уровень PH в растворе. Рекомендую ставить 6 так как 5.5 это нижний предел, а 6.5 это верхний предел. // Пины для подключения к Ардуино датчиков и исполняемых модулей. // Исполняемые модули int dnat = 20; // DNAT Вместо того реле что покупается на али обязательно поставить по мощьности превышающее в 2 раза потребление лампы иначе залипнет и не будет работать!!!! int dosvet = 21; // То что будет использоваться для досвета. (в моём случае это люминисцентные лампы с цоколем G5) int lumen = 22; // Люмен int led = 23; // Диоды int circulation = 24; // Цыркуляция int breeze = 25; // Эмитация ветра int ventilation = 26; // Вентиляция int compressor = 27; // Компрессор int sprayings = 28; // опрыскивание int humidifier = 29; // Увлажнение воздуха int a_heating = 30; // обогрев воздуха int a_cooling = 31; // охлождение воздуха int w_heating = 32; // обогрев воды (раствора) int w_cooling = 33; // охлождение воды (раствора) //Датчики int W_Temp = 46; // Температура воды #define DHTPIN 47 // Температура и влажность воздуха #define solution 40 // Датчик уровня раствора #define DHTTYPE DHT11 // DHT 11 //#define DHTTYPE DHT22 // DHT 22 //#define DHTTYPE DHT21 // DHT 21 DHT dht(DHTPIN, DHTTYPE); void setup() { rtc.begin(); dht.begin(); Serial.begin(115200); pinMode(dnat, OUTPUT); // Лампа ДНАТ pinMode(lumen, OUTPUT); // Люмен pinMode(led, OUTPUT); // Диоды pinMode(circulation, OUTPUT); // Цыркуляция pinMode(ventilation, OUTPUT); // Вентиляция pinMode(breeze, OUTPUT); // Эмитация ветра pinMode(compressor, OUTPUT); // Компрессор pinMode(a_heating, OUTPUT); // обогрев воздуха pinMode(a_cooling, OUTPUT); // охлождение вохдуха pinMode(w_heating, OUTPUT); // обогрев воды pinMode(w_cooling, OUTPUT); // охлождение воды } void loop() { RTC_T = rtc.getTime(); Serial.println(rtc.getTimeStr()); float a_humidity = dht.readHumidity(); float a_temp = dht.readTemperature(); delay (2000); if (isnan(a_temp) || isnan(a_humidity)) { Serial.println("Failed to read from DHT"); } else { Serial.print("Humidity: "); Serial.print(a_humidity); Serial.print(" %\t"); Serial.print("Temperature: "); Serial.print(a_temp); Serial.println(" *C"); } double val = analogRead(W_Temp); double voltage = val*5.0/1024; double w_temp = voltage*100 - 273.15; /* //////////////////////////////////////////////////// ////////////////////Освещение////////////////////// //////////////////////////////////////////////////// */ // LUMEN if ((RTC_T.hour) >= led_on && (RTC_T.hour) < led_off) { digitalWrite(lumen, HIGH); } else { digitalWrite(lumen, LOW); } // LED if ((RTC_T.hour) >= led_on && (RTC_T.hour) < led_off) { digitalWrite(led, HIGH); } else { digitalWrite(led, LOW); } // DNAT if ((RTC_T.hour) >= led_on && (RTC_T.hour) < led_off) { digitalWrite(dnat, HIGH); } else { digitalWrite(dnat, LOW); } // Досвет if ((RTC_T.hour) >= led_on && (RTC_T.hour) < led_off) { digitalWrite(dosvet, HIGH); } else { digitalWrite(dosvet, LOW); } /* //////////////////////////////////////////////////// ////////////////////Вентиляция////////////////////// //////////////////////////////////////////////////// */ // //Цыркуляция // if ((RTC_T.hour) >= circ_on && (RTC_T.hour) < circ_off) { // Включить digitalWrite(circulation, HIGH); } else { // Выключить digitalWrite(circulation, LOW); } // // Проветривание // if (a_temp > a_cooling_on && a_temp < a_cooling_off) { // Включить digitalWrite(ventilation, HIGH); } else { // Выключить digitalWrite(ventilation, LOW); } // // Обдув (эмитация ветра) // if ((RTC_T.hour) >= breeze_on && (RTC_T.hour) < breeze_off) { // Включить digitalWrite(breeze, HIGH); } else { // Выключить digitalWrite(breeze, LOW); } // //Обогрев // if (a_temp <= a_heating_on && a_temp < a_heating_off) { // Включить обогрев воздуха digitalWrite(a_heating, HIGH); } else { // Выключить обогрев воздуха digitalWrite(a_heating, LOW); } if (w_temp <= w_heating_on && w_temp < w_heating_off) { // Включить обогрев воды digitalWrite(a_heating, HIGH); } else { // Выключить обогрев воды digitalWrite(a_heating, LOW); } // // Охлаждение // if (a_temp <= a_cooling_on && a_temp < a_cooling_off) { // Включить охлождение воздуха digitalWrite(a_cooling, HIGH); } else { // Выключить охлождение воздуха digitalWrite(a_cooling, LOW); } if (w_temp <= w_cooling_on && w_temp < w_cooling_off) { // Включить охлождение воды digitalWrite(w_cooling, HIGH); } else { // Выключить охлождение воды digitalWrite(w_cooling, LOW); } // Компрессор if ((RTC_T.hour) >= compressor_on && (RTC_T.hour) < compressor_off) { // Включить digitalWrite(compressor, HIGH); } else { // Выключить digitalWrite(compressor, LOW); } // Опрыскивание // Увлажнение воздуха if (a_humidity > humidifier_on && a_humidity > humidifier_off) { // Включить digitalWrite(humidifier, HIGH); } else { // Выключить digitalWrite(humidifier, LOW); } // Датчик уровня раствора if (!digitalRead(solution)) { // Что делать пропишете сами) // Низкий уровень раствора } else { // Раствор в норме доливать не надо. } delay (1000); } Изменено 11 декабря 2015 пользователем RPSVoloch Цитата Ссылка на комментарий Поделиться на других сайтах Больше способов поделиться...
RPSVoloch Опубликовано: 11 декабря 2015 Автор Поделиться Опубликовано: 11 декабря 2015 Модуль с лампами ЭСЛ из полепропилена обклеиного фольгой и ДВП толщиной 8мм Цитата Ссылка на комментарий Поделиться на других сайтах Больше способов поделиться...
RaZoR Опубликовано: 11 декабря 2015 Поделиться Опубликовано: 11 декабря 2015 (изменено) Баги в логике: // Увлажнение воздуха if (a_humidity > humidifier_on && a_humidity > humidifier_off) При таком условии увлажнитель будет включатся только при достижении влажности humidifier_off и будет работать постоянно. Вообще, при регулировании подобных процессов не обойтись без переменной, в которой хранится состояние исполняющего механизма.Например, так: // Увлажнение воздуха bool isHumidifying = false; if (a_humidity < humidifier_on) //Влажность низкая? { digitalWrite(humidifier, HIGH); //Включаем увлажнение isHumidifying = true; //Увлажнитель включен } if (isHumidifying == true) //Увлажнитель включен? { if (a_humidity > humidifier_off) //Влажность стала выше нормы? { digitalWrite(humidifier, LOW); //Выключаем увлажнение isHumidifying = false; //Увлажнитель выключен } } Та же ошибка в логике охлаждения и обогрева. // // Проветривание // if (a_temp > a_cooling_on && a_temp < a_cooling_off) { // Включить digitalWrite(ventilation, HIGH); } else { // Выключить digitalWrite(ventilation, LOW); } Предположим, заданный диапазон температуры воздуха - 25-27°C. Соответственно, cooling_on = 27, cooling_off = 25.При 27-ми охлаждение должно включиться, а при достижении 25-ти выключиться.Допустим, температура подскочила до 30°.При твоей логике охлаждение НЕ ВКЛЮЧИТСЯ, т.к. (30 > 27 && 30 < 25) = false.Переделываем логику: // Проветривание bool isCooling = false; if (a_temp > cooling_on) //Температура выше нормы? { digitalWrite(a_cooling, HIGH); //Включаем охлаждение isCooling = true; } if (isCooling == true) // Если охлаждение включено { if (a_temp < cooling_off) //Температура снизилась ниже нормы { digitalWrite(a_cooling, LOW); //Выключаем охлаждение isCooling = false; } } Теперь при достижении верхнего предела включится охлаждение и будет работать, пока температура не опустится ниже нижнего предела. Изменено 11 декабря 2015 пользователем RaZoR Цитата Ссылка на комментарий Поделиться на других сайтах Больше способов поделиться...
RaZoR Опубликовано: 11 декабря 2015 Поделиться Опубликовано: 11 декабря 2015 ... Система опрыскивания после долгих испытаний работает не стабильно. Сабака прыскает не пойми каким раствором рэндомно ... Скорей всего тоже баги в логике Цитата Ссылка на комментарий Поделиться на других сайтах Больше способов поделиться...
Logik Опубликовано: 11 декабря 2015 Поделиться Опубликовано: 11 декабря 2015 Решил провести эксперимент: Решил провести эксперимент со всетом (какой свет лучше для веги). Результат: При использовании 2 ЭСЛ на 85W температура в боксе 37 - 38 градусов и пельтье не справляется!!! Вентиляция работает на всю катушку постоянно( Стена гарячая так как пельтье крепится на алюминевую пластину, а она на стену через термопрокладку от телека для отвода тепла. В помещении где нагодится бокс температура подскочила до 43 градусов и приходится сидеть в трусах иначе пот ручьём. При использовании ЛЕД такого нету и приходится даж обогревать бокс. Временно отключаю элементы пельтье и посмотрим что будет. С выдува снимаю все фильтры и надеюсь температура упадёт и продув будет лучше. Если же нет поставлю обратно ЛЕД и не буду выпендриваться со своими экспериментами. Не знала баба горя так купила порося! У меня LED 260 W, 100 диодов 3W на 20-ти 60 см. алюминеевых швеллерах. Темпа выше 27 не поднимается причем это в перерывах между работой вытяжки - сейчас на режиме 15 через 15 минут. Можешь посмотреть у меня в альбоме "Начало". Цитата Ссылка на комментарий Поделиться на других сайтах Больше способов поделиться...
RPSVoloch Опубликовано: 12 декабря 2015 Автор Поделиться Опубликовано: 12 декабря 2015 (изменено) Баги в логике: // Увлажнение воздуха if (a_humidity > humidifier_on && a_humidity > humidifier_off) При таком условии увлажнитель будет включатся только при достижении влажности humidifier_off и будет работать постоянно. Вообще, при регулировании подобных процессов не обойтись без переменной, в которой хранится состояние исполняющего механизма. Например, так: // Увлажнение воздуха bool isHumidifying = false; if (a_humidity < humidifier_on) //Влажность низкая? { digitalWrite(humidifier, HIGH); //Включаем увлажнение isHumidifying = true; //Увлажнитель включен } if (isHumidifying == true) //Увлажнитель включен? { if (a_humidity > humidifier_off) //Влажность стала выше нормы? { digitalWrite(humidifier, LOW); //Выключаем увлажнение isHumidifying = false; //Увлажнитель выключен } } Та же ошибка в логике охлаждения и обогрева. // // Проветривание // if (a_temp > a_cooling_on && a_temp < a_cooling_off) { // Включить digitalWrite(ventilation, HIGH); } else { // Выключить digitalWrite(ventilation, LOW); } Предположим, заданный диапазон температуры воздуха - 25-27°C. Соответственно, cooling_on = 27, cooling_off = 25. При 27-ми охлаждение должно включиться, а при достижении 25-ти выключиться. Допустим, температура подскочила до 30°. При твоей логике охлаждение НЕ ВКЛЮЧИТСЯ, т.к. (30 > 27 && 30 < 25) = false. Переделываем логику: // Проветривание bool isCooling = false; if (a_temp > cooling_on) //Температура выше нормы? { digitalWrite(a_cooling, HIGH); //Включаем охлаждение isCooling = true; } if (isCooling == true) // Если охлаждение включено { if (a_temp < cooling_off) //Температура снизилась ниже нормы { digitalWrite(a_cooling, LOW); //Выключаем охлаждение isCooling = false; } } Теперь при достижении верхнего предела включится охлаждение и будет работать, пока температура не опустится ниже нижнего предела. А зечем так код усложнять то ? Ну ошибся на символ) Как есть: if (a_humidity > humidifier_on && a_humidity < humidifier_off) если влажность больше настройки включения и влажность меньше настройки выключения. То включить опрыскивание. В противном случае выключить всё. Как должно быть: if (a_humidity < humidifier_on && a_humidity < humidifier_off) если влажность меньше настройки включения и влажность меньше настройки выключения. То включить опрыскивание. В противном случае выключить всё. И не надо городить огромные скетчи... Всё решается проще) По поводу охлаждения ты не прав: У тебя написано тож самое с теми же условиями только код получился размашестей (зачем усложнять себе жизнь когда всё вписывается в 1 строчку?). Моя влажность в боксе днём до 81%, ночью 91 и после этого уалажнитель отключается. По поводу True и False ещё пока рановасто сюда выкладывать. Это необходимо только для управления через консоль или веб морду. Изменено 12 декабря 2015 пользователем RPSVoloch Цитата Ссылка на комментарий Поделиться на других сайтах Больше способов поделиться...
RPSVoloch Опубликовано: 12 декабря 2015 Автор Поделиться Опубликовано: 12 декабря 2015 (изменено) У меня LED 260 W, 100 диодов 3W на 20-ти 60 см. алюминеевых швеллерах. Темпа выше 27 не поднимается причем это в перерывах между работой вытяжки - сейчас на режиме 15 через 15 минут. Можешь посмотреть у меня в альбоме "Начало". Не 260 ват, а 300 ват у тебя светильник так как диоды по 3 вата каждый (3*100) С розетки кушать будет конечно меньше так как должен работать преобразователь (драйвер) И 27 градусов чё то как то много... Но для растений самое то! Единственное когда на улице тепло будет будут проблемы. У меня при выключеном вентиле со светом и лед понелькой было 24 градуса и приходилось бокс обогревать. Но стоял только лед который имел выход наружу и не грелся практически. Так же стоял и досвет но он включался только в те моменты когда солнце якобы вставало в зените (попытка эмитировать природные условия). После установки 2 ЭСЛ темпа зашкаливала и пришлось убрать всё что может нагревать комнату и бокс. Так же убрал все фильтры (пока зима не настанет увы придётся без них... Благо растишки мелкие и не дают пока что запаха толком но влажностью тянет и я это чувствую. Изменено 13 декабря 2015 пользователем RPSVoloch Цитата Ссылка на комментарий Поделиться на других сайтах Больше способов поделиться...
RPSVoloch Опубликовано: 13 декабря 2015 Автор Поделиться Опубликовано: 13 декабря 2015 Ртказываюсь напрочь от PH так как эта тварь врёт на прополую спустя время работы!!!!!! Лучше ручками чем потом задохликов выхаживать. Скоро выложу новый скетч для работы непосредственно с базой MySQL (по ЮСБ порту без особого гемора) Правда не уверен что он будет работать достойно так как проверок пока что не производил, а только проверил конекты к MySQL и отклики MySQL. Ну если будут интузиасы то помогут мне в этом не лёгком деле... 1 Цитата Ссылка на комментарий Поделиться на других сайтах Больше способов поделиться...
4e? Опубликовано: 13 декабря 2015 Поделиться Опубликовано: 13 декабря 2015 нужно еще гестерезис сделать для температуры и влажности. зы: у меня контроллер просто поддерживает заданные температуру и влажность (одно релле для увлажнителя и серва для воздушной заслонки) работает отлично. не нарадуюсь)) когда нибудь добавлю сд карту для функции логгера и мнфракрасный датчик для измерения температуры планта. Цитата Ссылка на комментарий Поделиться на других сайтах Больше способов поделиться...
RaZoR Опубликовано: 13 декабря 2015 Поделиться Опубликовано: 13 декабря 2015 При условии if (a_humidity < humidifier_on && a_humidity < humidifier_off), увлажнитель будет поднимать влажность только до нижнего предела, без запаса. Тогда какой смысл в использовании humidifier_off? При таком подходе можно вообще упростить условие до if (a_humidity < humidifier_on). Влажность будет просто подтягиваться до минимальной нормы. В моем же варианте, при падении влажности ниже нормы, увлажнитель будет работать, пока влажность не поднимется до верхнего предела. В этом-то и различие. Тут прав 4e?, без гистерезиса не обойтись. Цитата Ссылка на комментарий Поделиться на других сайтах Больше способов поделиться...
RPSVoloch Опубликовано: 13 декабря 2015 Автор Поделиться Опубликовано: 13 декабря 2015 (изменено) // Запуск скетча #include <LiquidCrystal.h> #include <DS3231.h> #include <DHT.h> DS3231 rtc(SDA, SCL); Time RTC_T; // Загрузка начальных настроек // Основные настройки скрипта. Изменения необходимо произвести под свои нужды!!! // Скрипт расчитан на день но для тех кому необходимо сберечь деньги советую переключить на ночной режим и счётчик будет считать по другому тарифу. long led_on = 05; // Время включения диодов (устанавливается в часах) long led_off = 23; // Время выключения диодов (устанавливается в часах) long dnat_on = 05; // Время включения DNAT (устанавливается в часах) long dnat_off = 23; // Время выключения DNAT (устанавливается в часах) long lumen_on = 05; // Время включения ЭСЛ (устанавливается в часах) long lumen_off = 23; // Время выключения ЭСЛ (устанавливается в часах) long dosvet_on = 05; // Время включения досвета (устанавливается в часах) long dosvet_off = 23; // Время выключения досвета (устанавливается в часах) long circ_on = 05; // Цыркуляция воздуха внутри. Время включения (устанавливается в часах). long circ_off = 23; // Цыркуляция воздуха внутри. Время выключения (устанавливается в часах). long ventilation_on = 05; // Включение вентиляции (устанавливается в часах) рекомендую устанавливать во время включения света. long ventilation_off = 23; // Отключение вентиляции (устанавливается в часах) рекомендую устанавливать через час после выключения света. long breeze_on = 01; // Обдув растишек on (устанавливается в часах). long breeze_off = 23; // Обдув растишек off (устанавливается в часах). long compressor_on = 05; // Запуск компрессора для нагнетания воздуха в раствор. long compressor_off = 23; // Остановка компрессора для нагнетания воздуха в раствор. long sprayings_on = 23; // Запускается после выключения света, указываются минуты начала опрыскивания. long sprayings_off = 24; // Минуты остановки опрыскивания. long a_heating_on = 25; // Температура включения обогрева воздуха (градусы цельсия) long a_heating_off = 25; // Температура выключения обогрева воздуха (градусы цельсия) long a_cooling_on = 25; // Температура включения охлаждения воздуха (градусы цельсия) long a_cooling_off = 25; // Температура выключения охлождения воздуха (градусы цельсия) long w_heating_on = 25; // Температура включения обогрева воды (градусы цельсия) long w_heating_off = 25; // Температура выключения обогрева воды (градусы цельсия) long w_cooling_on = 25; // Температура включения охлаждения воды (градусы цельсия) long w_cooling_off = 25; // Температура выключения охлождения воды (градусы цельсия) long humidifier_on = 50; // Минимальная влажность для включения увлажнителя воздуха. long humidifier_off = 91; // Максимальная влажность для выключения увлажнителя воздуха. long ph_on = 6; // Уровень PH в растворе. Рекомендую ставить 6 так как 5.5 это нижний предел, а 6.5 это верхний предел. // Инициализация железа // Пины для подключения к Ардуино датчиков и исполняемых модулей. // Исполняемые модули int dnat = 20; // DNAT Вместо того реле что покупается на али обязательно поставить по мощьности превышающее в 2 раза потребление лампы иначе залипнет и не будет работать!!!! int dosvet = 21; // То что будет использоваться для досвета. (в моём случае это люминисцентные лампы с цоколем G5) int lumen = 22; // Люмен int led = 23; // Диоды int circulation = 24; // Цыркуляция int breeze = 25; // Эмитация ветра int ventilation = 26; // Вентиляция int compressor = 27; // Компрессор int sprayings = 28; // опрыскивание int humidifier = 29; // Увлажнение воздуха int a_heating = 30; // обогрев воздуха int a_cooling = 31; // охлождение воздуха int w_heating = 32; // обогрев воды (раствора) int w_cooling = 33; // охлождение воды (раствора) //Датчики int W_Temp = 46; // Температура воды #define DHTPIN 47 // Температура и влажность воздуха #define solution 40 // Датчик уровня раствора #define DHTTYPE DHT11 // DHT 11 //#define DHTTYPE DHT22 // DHT 22 //#define DHTTYPE DHT21 // DHT 21 DHT dht(DHTPIN, DHTTYPE); LiquidCrystal lcd(12, 11, 10, 5, 4, 3, 2); // инициализируем LCD, указывая контакты данных float max_a_temp = 0, min_a_temp = 90; // max/min значения температуры воды float max_w_temp = 0, min_w_temp = 90; // max/min значения температуры раствора // Устанавливаем системные переменные для начала работы. void setup() { rtc.begin(); dht.begin(); Serial.begin(115200); pinMode(dnat, OUTPUT); // Лампа ДНАТ pinMode(lumen, OUTPUT); // Люмен pinMode(led, OUTPUT); // Диоды pinMode(circulation, OUTPUT); // Цыркуляция pinMode(ventilation, OUTPUT); // Вентиляция pinMode(breeze, OUTPUT); // Эмитация ветра pinMode(compressor, OUTPUT); // Компрессор pinMode(a_heating, OUTPUT); // обогрев воздуха pinMode(a_cooling, OUTPUT); // охлождение вохдуха pinMode(w_heating, OUTPUT); // обогрев воды pinMode(w_cooling, OUTPUT); // охлождение воды lcd.begin(16, 2); lcd.print("Loading"); delay(500); // ждем 0.5 секунды lcd.print("."); delay(500); // ждем 0.5 секунды lcd.print("."); delay(500); // ждем 0.5 секунды lcd.print("."); delay(1000); // ждем 1 секунду lcd.clear(); //очистка экрана } void loop() { lcd.clear(); //очистка экрана RTC_T = rtc.getTime(); Serial.println(rtc.getTimeStr()); float a_humidity = dht.readHumidity(); float a_temp = dht.readTemperature(); delay (2000); if (isnan(a_temp) || isnan(a_humidity)) { Serial.println("Failed to read from DHT"); lcd.print("Failed read DHT."); } else { Serial.print("Humidity: "); Serial.print(a_humidity); Serial.print(" %\t"); Serial.print("Temperature: "); Serial.print(a_temp); Serial.println(" *C"); lcd.print("T="); lcd.print(a_temp); lcd.print(" H="); lcd.print(a_humidity); } double val_W = analogRead(W_Temp); double voltage = val_W*5.0/1024; double w_temp = voltage*100 - 273.15; if(a_temp > max_a_temp) { max_a_temp = a_temp; } // max температура воздуха if(a_temp < min_a_temp) { min_a_temp = a_temp; } // min температура воздуха if(w_temp > max_w_temp) { max_w_temp = w_temp; } // max температура воды if(w_temp < min_w_temp) { min_w_temp = w_temp; } // min температура воды // попытка подключения к базе данных MqSQL через консоль int val_serial = 0; if (Serial.available() > 0) { val_serial = Serial.read(); Serial.println("mysql -u root -p"); // Подключаемся к базе MySQL с пользователем root Serial.println("12345"); // Вводим пароль 12345 // Необходимо установить проверку, а то мало ли херь какую нить зашлёт в скетч и будет свет мерцать и включать не то то нужно) // Подключение удалось считываем данные с ком порта для постоянной работы. Serial.println("mysql SELECT * FROM 'box' WHERE [field name] = 'led_on' "); // Отправляем запрос на получение данных из MySQL if (val_serial) led_on = (val_serial); // Считываем с консоли показатель и присваиваем его. Serial.println("mysql SELECT * FROM 'box' WHERE [field name] = 'led_off' "); // Отправляем запрос на получение данных из MySQL if (val_serial) led_off = (val_serial); // Считываем с консоли показатель и присваиваем его. Serial.println("mysql SELECT * FROM 'box' WHERE [field name] = 'dnat_on' "); // Отправляем запрос на получение данных из MySQL if (val_serial) dnat_on = (val_serial); // Считываем с консоли показатель и присваиваем его. Serial.println("mysql SELECT * FROM 'box' WHERE [field name] = 'dnat_off' "); // Отправляем запрос на получение данных из MySQL if (val_serial) dnat_off = (val_serial); // Считываем с консоли показатель и присваиваем его. Serial.println("mysql SELECT * FROM 'box' WHERE [field name] = 'lumen_on' "); // Отправляем запрос на получение данных из MySQL if (val_serial) lumen_on = (val_serial); // Считываем с консоли показатель и присваиваем его. Serial.println("mysql SELECT * FROM 'box' WHERE [field name] = 'lumen_off' "); // Отправляем запрос на получение данных из MySQL if (val_serial) lumen_off = (val_serial); // Считываем с консоли показатель и присваиваем его. Serial.println("mysql SELECT * FROM 'box' WHERE [field name] = 'dosvet_on' "); // Отправляем запрос на получение данных из MySQL if (val_serial) dosvet_on = (val_serial); // Считываем с консоли показатель и присваиваем его. Serial.println("mysql SELECT * FROM 'box' WHERE [field name] = 'dosvet_off' "); // Отправляем запрос на получение данных из MySQL if (val_serial) dosvet_off = (val_serial); // Считываем с консоли показатель и присваиваем его. Serial.println("mysql SELECT * FROM 'box' WHERE [field name] = 'circ_on' "); // Отправляем запрос на получение данных из MySQL if (val_serial) circ_on = (val_serial); // Считываем с консоли показатель и присваиваем его. Serial.println("mysql SELECT * FROM 'box' WHERE [field name] = 'circ_off' "); // Отправляем запрос на получение данных из MySQL if (val_serial) circ_off = (val_serial); // Считываем с консоли показатель и присваиваем его. Serial.println("mysql SELECT * FROM 'box' WHERE [field name] = 'ventilation_on' "); // Отправляем запрос на получение данных из MySQL if (val_serial) ventilation_on = (val_serial); // Считываем с консоли показатель и присваиваем его. Serial.println("mysql SELECT * FROM 'box' WHERE [field name] = 'ventilation_off' "); // Отправляем запрос на получение данных из MySQL if (val_serial) ventilation_off = (val_serial); // Считываем с консоли показатель и присваиваем его. Serial.println("mysql SELECT * FROM 'box' WHERE [field name] = 'breeze_on' "); // Отправляем запрос на получение данных из MySQL if (val_serial) breeze_on = (val_serial); // Считываем с консоли показатель и присваиваем его. Serial.println("mysql SELECT * FROM 'box' WHERE [field name] = 'breeze_off' "); // Отправляем запрос на получение данных из MySQL if (val_serial) breeze_off = (val_serial); // Считываем с консоли показатель и присваиваем его. Serial.println("mysql SELECT * FROM 'box' WHERE [field name] = 'compressor_on' "); // Отправляем запрос на получение данных из MySQL if (val_serial) compressor_on = (val_serial); // Считываем с консоли показатель и присваиваем его. Serial.println("mysql SELECT * FROM 'box' WHERE [field name] = 'compressor_off' "); // Отправляем запрос на получение данных из MySQL if (val_serial) compressor_off = (val_serial); // Считываем с консоли показатель и присваиваем его. Serial.println("mysql SELECT * FROM 'box' WHERE [field name] = 'sprayings_on' "); // Отправляем запрос на получение данных из MySQL if (val_serial) sprayings_on = (val_serial); // Считываем с консоли показатель и присваиваем его. Serial.println("mysql SELECT * FROM 'box' WHERE [field name] = 'sprayings_off' "); // Отправляем запрос на получение данных из MySQL if (val_serial) sprayings_off = (val_serial); // Считываем с консоли показатель и присваиваем его. Serial.println("mysql SELECT * FROM 'box' WHERE [field name] = 'a_heating_on' "); // Отправляем запрос на получение данных из MySQL if (val_serial) a_heating_on = (val_serial); // Считываем с консоли показатель и присваиваем его. Serial.println("mysql SELECT * FROM 'box' WHERE [field name] = 'a_heating_off' "); // Отправляем запрос на получение данных из MySQL if (val_serial) a_heating_off = (val_serial); // Считываем с консоли показатель и присваиваем его. Serial.println("mysql SELECT * FROM 'box' WHERE [field name] = 'a_cooling_on' "); // Отправляем запрос на получение данных из MySQL if (val_serial) a_cooling_on = (val_serial); // Считываем с консоли показатель и присваиваем его. Serial.println("mysql SELECT * FROM 'box' WHERE [field name] = 'a_cooling_off' "); // Отправляем запрос на получение данных из MySQL if (val_serial) a_cooling_off = (val_serial); // Считываем с консоли показатель и присваиваем его. Serial.println("mysql SELECT * FROM 'box' WHERE [field name] = 'w_heating_on' "); // Отправляем запрос на получение данных из MySQL if (val_serial) w_heating_on = (val_serial); // Считываем с консоли показатель и присваиваем его. Serial.println("mysql SELECT * FROM 'box' WHERE [field name] = 'w_heating_off' "); // Отправляем запрос на получение данных из MySQL if (val_serial) w_heating_off = (val_serial); // Считываем с консоли показатель и присваиваем его. Serial.println("mysql SELECT * FROM 'box' WHERE [field name] = 'w_cooling_on' "); // Отправляем запрос на получение данных из MySQL if (val_serial) w_cooling_on = (val_serial); // Считываем с консоли показатель и присваиваем его. Serial.println("mysql SELECT * FROM 'box' WHERE [field name] = 'w_cooling_off' "); // Отправляем запрос на получение данных из MySQL if (val_serial) w_cooling_off = (val_serial); // Считываем с консоли показатель и присваиваем его. Serial.println("mysql SELECT * FROM 'box' WHERE [field name] = 'humidifier_on' "); // Отправляем запрос на получение данных из MySQL if (val_serial) humidifier_on = (val_serial); // Считываем с консоли показатель и присваиваем его. Serial.println("mysql SELECT * FROM 'box' WHERE [field name] = 'humidifier_off' "); // Отправляем запрос на получение данных из MySQL if (val_serial) humidifier_off = (val_serial); // Считываем с консоли показатель и присваиваем его. // Записываем в базу показания датчиков. Serial.println("mysql SELECT * FROM 'box' WHERE [field name] = 'humidifier_off' "); // Отправляем данные в базу Serial.println("min_a_temp"); Serial.println("max_a_temp"); Serial.println("min_w_temp"); Serial.println("max_w_temp"); Serial.println("a_temp"); Serial.println("w_temp"); Serial.println("a_humidity"); Serial.println("mysql exit"); // Отключаемся от MySQL дабы не натворить бед) } // Lumen if ((RTC_T.hour) >= lumen_on && (RTC_T.hour) < lumen_off) { digitalWrite(lumen, HIGH); } else { digitalWrite(lumen, LOW); } // LED if ((RTC_T.hour) >= led_on && (RTC_T.hour) < led_off) { digitalWrite(led, HIGH); } else { digitalWrite(led, LOW); } // DNAT if ((RTC_T.hour) >= dnat_on && (RTC_T.hour) < dnat_off) { digitalWrite(dnat, HIGH); } else { digitalWrite(dnat, LOW); } // Досвет if ((RTC_T.hour) >= dosvet_on && (RTC_T.hour) < dosvet_off) { digitalWrite(dosvet, HIGH); } else { digitalWrite(dosvet, LOW); } //Цыркуляция if ((RTC_T.hour) >= circ_on && (RTC_T.hour) < circ_off) { // Включить digitalWrite(circulation, HIGH); } else { // Выключить digitalWrite(circulation, LOW); } // Проветривание if (a_temp > a_cooling_on && a_temp < a_cooling_off) { // Включить digitalWrite(ventilation, HIGH); } else { // Выключить digitalWrite(ventilation, LOW); } // Обдув (эмитация ветра) if ((RTC_T.hour) >= breeze_on && (RTC_T.hour) < breeze_off) { // Включить digitalWrite(breeze, HIGH); } else { // Выключить digitalWrite(breeze, LOW); } //Обогрев if (a_temp <= a_heating_on && a_temp < a_heating_off) { // Включить обогрев воздуха digitalWrite(a_heating, HIGH); } else { // Выключить обогрев воздуха digitalWrite(a_heating, LOW); } if (w_temp <= w_heating_on && w_temp < w_heating_off) { // Включить обогрев воды digitalWrite(a_heating, HIGH); } else { // Выключить обогрев воды digitalWrite(a_heating, LOW); } // Охлаждение if (a_temp <= a_cooling_on && a_temp < a_cooling_off) { // Включить охлождение воздуха digitalWrite(a_cooling, HIGH); } else { // Выключить охлождение воздуха digitalWrite(a_cooling, LOW); } if (w_temp <= w_cooling_on && w_temp < w_cooling_off) { // Включить охлождение воды digitalWrite(w_cooling, HIGH); } else { // Выключить охлождение воды digitalWrite(w_cooling, LOW); } // Компрессор if ((RTC_T.hour) >= compressor_on && (RTC_T.hour) < compressor_off) { // Включить digitalWrite(compressor, HIGH); } else { // Выключить digitalWrite(compressor, LOW); } // Опрыскивание // Увлажнение воздуха if (a_humidity < humidifier_on && a_humidity > humidifier_off) { // Включить digitalWrite(humidifier, HIGH); } else { // Выключить digitalWrite(humidifier, LOW); } // Датчик уровня раствора if (!digitalRead(solution)) { // Что делать пропишете сами) // Низкий уровень раствора lcd.setCursor(0, 1); // устанавливаем курсор в 0-ом столбце, 2 строке lcd.print("RASTVOR WARNING"); } else { // Раствор в норме доливать не надо. lcd.setCursor(0, 1); // устанавливаем курсор в 0-ом столбце, 2 строке lcd.print("RASTVOR OK"); } } Скетч НЕ проверен но я его выложу иначе потряю в своих дебрях. Реализовано подключение к базе MySQL Реализована работа как с базой так и без неё. Реализована поддержка дисплея (мало ли кому нить захочется посмотреть как оно там не на телефоне, а на старом монохромном дисплее - ностальджи) Выводит температуру и влажность, а так же уровень раствора (надо доливать или нет) Реализована запись максимальной и минимальной температуры в боксе (а максимальная и минимальная влажность вообще нужна ? Тож хотел сделать но передумал) Если у кого есть желание можете поставить себе Ubuntu на комп и пересобрать ядро с доступом до консоли из СОМ порта (геморрой если честно). Себе для теста поставил на виртуалку линь и терь мучаюсь так как с виртуалки работает всё не ахти как стабильно. В скетче есть ошибки (специальные) и не дописана часть сохранения в БД температуры и влажности. Изменено 13 декабря 2015 пользователем RPSVoloch Цитата Ссылка на комментарий Поделиться на других сайтах Больше способов поделиться...
RPSVoloch Опубликовано: 13 декабря 2015 Автор Поделиться Опубликовано: 13 декабря 2015 В данном случае Ардуина выступает в роли пользователя который просто вводит команды. Ну компьютер естественно их просто выполняет. Сложного нет вообще ничего. Только вот пока допёр до этого прошло много времени и куча испытаний того как оно должно работать. Чуть было не заказал себе плату с ЛАН для ардуинки но вовремя еврей пересилил. Цитата Ссылка на комментарий Поделиться на других сайтах Больше способов поделиться...
RPSVoloch Опубликовано: 13 декабря 2015 Автор Поделиться Опубликовано: 13 декабря 2015 (изменено) При условии if (a_humidity < humidifier_on && a_humidity < humidifier_off), увлажнитель будет поднимать влажность только до нижнего предела, без запаса. Тогда какой смысл в использовании humidifier_off? При таком подходе можно вообще упростить условие до if (a_humidity < humidifier_on). Влажность будет просто подтягиваться до минимальной нормы. В моем же варианте, при падении влажности ниже нормы, увлажнитель будет работать, пока влажность не поднимется до верхнего предела. В этом-то и различие. Тут прав 4e?, без гистерезиса не обойтись. НО у меня всё зачётно работает кстате.... Так что не вижу смысла переделывать то что и так хорошо работает) Момент.... Я щас соображаю туго) Надо срочно мозг разгрузить.... Кто нить отсыпьте а.... ))))) Изменено 13 декабря 2015 пользователем RPSVoloch Цитата Ссылка на комментарий Поделиться на других сайтах Больше способов поделиться...
4e? Опубликовано: 13 декабря 2015 Поделиться Опубликовано: 13 декабря 2015 @ RPS внимательно прочитал первый пост и не понял что именно ты делаешь? какая цель? брат, пойми првильно, вижу твой проект как → "хочу впихнуть все впихуемое". не сомневаюсь в твоих хакерских способностях, но любой проект нужно начинать с ТЗ. в двух словах, скажи, какая твоя цель? зы: [sppoiler]НО у меня всё зачётно работает кстате.... сколько gpw, thc или что угодно еще выдает твоя зачетная работа. зыы: есть охуительные заводские системмы у которых цена 2-4к американских рублей и выдают на гора (с минимальными трудозатратами) 2-5кг в месяц. деньги не большие, но нахуйа нам столько стафа?!)) мне лично нужно 2 кг в год... это с хорошим запасом ;) Цитата Ссылка на комментарий Поделиться на других сайтах Больше способов поделиться...
RPSVoloch Опубликовано: 13 декабря 2015 Автор Поделиться Опубликовано: 13 декабря 2015 (изменено) @ RPS внимательно прочитал первый пост и не понял что именно ты делаешь? какая цель? брат, пойми првильно, вижу твой проект как → "хочу впихнуть все впихуемое". не сомневаюсь в твоих хакерских способностях, но любой проект нужно начинать с ТЗ. в двух словах, скажи, какая твоя цель? зы: [sppoiler]НО у меня всё зачётно работает кстате.... сколько gpw, thc или что угодно еще выдает твоя зачетная работа. зыы: есть охуительные заводские системмы у которых цена 2-4к американских рублей и выдают на гора (с минимальными трудозатратами) 2-5кг в месяц. деньги не большие, но нахуйа нам столько стафа?!)) мне лично нужно 2 кг в год... это с хорошим запасом ;) Цель избавить себя от части проблем с которыми может столкнуться как начинающий так и опытный гровер. Сделать универсальную систему которая способна легко раскладываться и маштабироваться. Которую осилит настроить и запустить даже школьник не задавая лишних вопросов. Которая будет стоить не дорого и компоненты всегда можно найти. Управлять БЕЗОПАСНО ей должен смочь и ребёнок (который хоть чуть понимает принцип работы) с мобильного телефона\планшета\компьютера находясь внутри домашней сети. Хотел бы денег не писал это в шару и не создавал постов. В принципе уже можно не плохо заработать применяя то что было до последнего скетча так как в последнем не всё так гладко как хотелось) Хотя не буду отрицать что мне предлогали продать бокс за очень хорошие деньги, так же предлогали собрать автономную систему тож за не плохие деньги. 2кг стафа будет с лихвой и попрёт лень со всех щелей. Хакер из меня уже некудышный поверь) 8 лет ни чего не делал и слава богу. Но знания остались и это важно. Изменено 13 декабря 2015 пользователем RPSVoloch 3 Цитата Ссылка на комментарий Поделиться на других сайтах Больше способов поделиться...
Logik Опубликовано: 14 декабря 2015 Поделиться Опубликовано: 14 декабря 2015 to Войдите или зарегистрируйтесь для просмотра содержимого. Купить семена конопли. - Все правильно делаешь! Твой труд ценен и будет востребован многими гроверами. И то что тратишь время, мозги и силы - воздастся нашими благодарностями. Продалжай обязательно! Цитата Ссылка на комментарий Поделиться на других сайтах Больше способов поделиться...
RPSVoloch Опубликовано: 14 декабря 2015 Автор Поделиться Опубликовано: 14 декабря 2015 to Войдите или зарегистрируйтесь для просмотра содержимого. Купить семена конопли. - Все правильно делаешь! Твой труд ценен и будет востребован многими гроверами. И то что тратишь время, мозги и силы - воздастся нашими благодарностями. Продалжай обязательно! Благодарю за поддержку) Надеюсь мои труды будут нужны и не поступят в продажу как очередная разработка какого нитьбудь ушлого мудака. Ну а теперь к делу: Скетч работает криво так как отправляет запросы на получение информации с базы очень быстро... придётся делать задержки и скорее всего что бы не мучаться придётся переводить именно часть работы с базой на милисы что бы основной код не тормозился пока загружает информацию с базы. Конект к базе осуществляется нормально (относительно) но если железяка будет сильно нагружена то будут ошибки так что эту часть придётся допилить. Опрыскивание из 4 растворов пока что не возможно по причине моей не грамотности (это единственное что приходит мне в голову) Сделал для люда только 1 раствор но думаю когда нибудь допишу или мне помогут разобраться форумчане. PH полностью убираю из скетча так как датчик показал себя не с лучшей стороны, а выхаживать задохликов нет никакого желания (хватит с меня канабиоидного голодания из за экспериментов) Цитата Ссылка на комментарий Поделиться на других сайтах Больше способов поделиться...
hamilio Опубликовано: 17 декабря 2015 Поделиться Опубликовано: 17 декабря 2015 трава скоро будет? Цитата Ссылка на комментарий Поделиться на других сайтах Больше способов поделиться...
RPSVoloch Опубликовано: 17 декабря 2015 Автор Поделиться Опубликовано: 17 декабря 2015 трава скоро будет? Это тема про бокс но не про траву) Бокс универсален и что в нём растить будут это не важно. 1 Цитата Ссылка на комментарий Поделиться на других сайтах Больше способов поделиться...
Рекомендованные сообщения
Присоединяйтесь к обсуждению
Вы можете опубликовать сообщение сейчас, а зарегистрироваться позже. Если у вас есть аккаунт, войдите в него для написания от своего имени.
Примечание: вашему сообщению потребуется утверждение модератора, прежде чем оно станет доступным.