Спасибо.Я использовал старый вариант меню переделав его под 16*2дисплей добавив свою часть с термостатом.Но после обьеденеия перестала работать моя часть все компилируется но не работает ,часть с меню работает отлично.Если dachnik не против я могу выложить здесь то что вышло.
Мне понравился ваш проект. Возможно доделать по заказу если надо даже оплачу работу. И хотелось его соеденить по wi-fi с пк и работа через программу типо Manager.
Здравствуйте. Я снова в деле) Я поставил задачи/ вопросы для реализации моего дипломного проекта. Как Вы помните (наверное) у меня макет умной теплицы. Мои задачи/вопросы:
1. Автономное орошение (полив) почвы теплицы, подавая воду близко к корню растения.
2. Автономная подача воды в теплице по 2-м параметрам:
a. По определенному периоду времени;
b. По влажности почвы.
3. Автономное отопление теплицы по данным датчика измерения температуры воздуха.
Автономная подача воды в теплице по 2-м параметрам:
a. По определенному периоду времени;
b. По влажности почвы.
По мне, выбери, что-то одно. Пример, датчик влажности почвы сказал то надо полить, земля пролилась и через минуту включается таймер и заливает ещё. В итоге растения залиты, помидорам плохо.... огурцам хз=)
kanibekasset пишет:
3. Автономное отопление теплицы по данным датчика измерения температуры воздуха.
Если речь идёт о зимнем периоде отопления, то так же надо добавить обогрев почвы. т.к. в ледяной земле расти ничего не будет....
По мне дешевле будет открывать форточки, чем тратить эл-во на вентиляцию канальниками.
kanibekasset пишет:
5. Автоматическое открывание и закрывание штор в теплице в зависимости от времени суток (в зимнее время).
ты хочешь закрывать шторы зимой когда итак нет света? ИМХО это актульно для культур которые чувствительны к светопериоду. Для овощей не нужно. Лучше добавить возможность досветки лампами в зимнее время года, когда световой день короткий и солнца почти нет.
kanibekasset пишет:
Как Вам? Не слишком много ли я беру на себя? Возможно ли их реализовать?
Реализовать очень даже несложно, было бы время, руки и желание...
ты хочешь закрывать шторы зимой когда итак нет света? ИМХО это актульно для культур которые чувствительны к светопериоду. Для овощей не нужно. Лучше добавить возможность досветки лампами в зимнее время года, когда световой день короткий и солнца почти нет.
Шторы будут отражать поток холодного воздуха в ночное время. Так как солнечного луча нет и воздух будет холодным. Это я в одном сайте прочитал, про отражающие шторы)
Про освещение, да. Можно добавить.
Вот, теперь вопрос. Как мне найти серво привод для моих штор?
Сперва хочу просто открыть/закрыть шторы, только потом добавить туда фоторезистор. Можете подсказать?
Шторы будут отражать поток холодного воздуха в ночное время. Так как солнечного луча нет и воздух будет холодным. Это я в одном сайте прочитал, про отражающие шторы)
Кроме того светлые с внутренней стороны шторы будут отражать и рассеивать обратно хоть часть света от искуственных источников, а не выпускать его беспрепятственно наружу, для освещения ночного космического пространства...
kanibekasset пишет:
Лучше мотор посоветуйте ;)
в зависимости от конструкции штор. но уверен, что вполне справится моторчик от автомобильного стеклоподьемника, вместе с редуктором и шкивом для троссика или, если крутить нужно не очень много, можно взять многооборотную серву пример 6 оборотов, они обычно используются для моделей яхт.
в зависимости от конструкции штор. но уверен, что вполне справится моторчик от автомобильного стеклоподьемника, вместе с редуктором и шкивом для троссика или, если крутить нужно не очень много, можно взять многооборотную серву пример 6 оборотов, они обычно используются для моделей яхт.
Всем привет, было время поработал ещё над прошивкой. Добавил возможность рулить сразу 4мя линиями полива. Записи логов на SDшку. Ну и всяких мелочей... С каждым разом всё сложней становится ориентация в коде=)
/* adress eeprom
EEPROM 0 Минимальное значение температуры актуатора
EEPROM 1 Максимальное значение темп актуатора
1 линия полива
EEPROM 2 1/0 включение отключение полива (0=off / 1=on)
EEPROM 3 Продолжительность минут полива
EEPROM 4 минута полива
EEPROM 5 час полива
2 линия полива
EEPROM 6 1/0 включение отключение полива (0=off / 1=on)
EEPROM 7 Продолжительность минут полива
EEPROM 8 минута полива
EEPROM 9 час полива
3 линия полива
EEPROM 10 1/0 включение отключение полива (0=off / 1=on)
EEPROM 11 Продолжительность минут полива
EEPROM 12 минута полива
EEPROM 13 час полива
4 линия полива
EEPROM 14 1/0 включение отключение полива (0=off / 1=on)
EEPROM 15 Продолжительность минут полива
EEPROM 16 минута полива
EEPROM 17 час полива
*/
//LCD I2C 20x4
#include <EEPROM.h>
#include <LiquidCrystal_I2C.h>
#include <Wire.h>
LiquidCrystal_I2C lcd(0x27,20,4);
//LCD
//кнопка
// задаем константы кнопок и присваиваем им пины
const int buttonPin = 15; // центральная кнопка
const int buttonPin_1 = 14; //левая кнопка
const int buttonPin_0 = 16; //правая кнопка
const int ledPin = 13; // номер выхода светодиода индикатора
const int irr_valve_1 = 30; //№ pin'a первая линия полива
const int irr_valve_2 = 31; //№ pin'a вторая линия полива
const int irr_valve_3 = 32; //№ pin'a третья линия полива
const int irr_valve_4 = 33; //№ pin'a четвёртая линия полива
// пины управления актуатором
const int open_actuator = 34; //открыть актуатор пином 34
const int close_actuator = 35; //закрыть актуатор пином 35
//пин управления насосом, который заполняет бочку для полива
const int nasos = 36;
const int sensor_min_level_tank = 26; //дискретный датчик нижнего уровня воды на 26 пине.
const int sensor_max_level_tank = 27;
int sensor_min_level_state= 1; //
int sensor_max_level_state= 1;
/*
int on_off_1 = EEPROM.read(2);
int dur_1 = EEPROM.read(3);
int min_dur_1 = EEPROM.read(4);
int hour_dur_1 = EEPROM.read(5);
int on_off_2 = EEPROM.read(6);
int dur_2 = EEPROM.read(7);
int min_dur_2 = EEPROM.read(8);
int hour_dur_2 = EEPROM.read(9);
int on_off_3 = EEPROM.read(10);
int dur_3 = EEPROM.read(11);
int min_dur_3 = EEPROM.read(12);
int hour_dur_3 = EEPROM.read(13);
int on_off_4 = EEPROM.read(14);
int dur_4 = EEPROM.read(15);
int min_dur_4 = EEPROM.read(16);
int hour_dur_4 = EEPROM.read(17);
*/
// глобальные переменные
int centreBtn = 0; // переменная для хранения состояния центральной кнопки
int leftbtn = 0; // переменная для хранения состояния левой кнопки
int rightbtn = 0; // переменная для хранения состояния правой кнопки
/*
String irr_time =""; //переменная строки времени полива
String irr_time_2 =""; //переменная строки времени полива
String irr_time_3 =""; //переменная строки времени полива
String irr_time_4 =""; //переменная строки времени полива
String end_irr_time ="";
String end_irr_time_2 ="";
String end_irr_time_3 ="";
String end_irr_time_4 ="";
*/
int del = 500; // переменная ожидания между выборами меню(время горения ledpin в милисек)
//подсветка LCD
//int r=0;
long previousMillis = 0; // храним время
long interval_2 = 10000; //задержка подсветки
long interval_3 = 1000; //задержка записи на SD
// интервал
//переменные автовозврата в loop
int interval = 50; // интервал сколько будет длиться цикл while, после чего перейдёт к следующему меню.(кол-во итераций)
//
int valve_1[5] = {1,2,3,4,5};
int valve_2[5] = {2,6,7,8,9};
int valve_3[5] = {3,10,11,12,13};
int valve_4[5] = {4,14,15,16,17};
//ds1307 модуль часов реального времени
#include <Wire.h>
#include "RTClib.h"
RTC_DS1307 rtc;
//строка времени
String Date; //строка даты
String Time; //времени
//--ds1307
//ds1820 temp
#include <OneWire.h>
#include <DallasTemperature.h>
// Data wire is plugged into port 2 on the Arduino
#define ONE_WIRE_BUS 3
// Setup a oneWire instance to communicate with any OneWire devices (not just Maxim/Dallas temperature ICs)
OneWire oneWire(ONE_WIRE_BUS);
// Pass our oneWire reference to Dallas Temperature.
DallasTemperature sensors(&oneWire);
//float in_tempC;
//float out_tempC;
//--ds1820
//SD card
#include <SPI.h>
#include <SD.h>
File myFile;
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
void setup() {
//LCD
#ifdef AVR
Wire.begin();
#else
Wire1.begin(); // Shield I2C pins connect to alt I2C bus on Arduino Due
#endif
lcd.init(); // initialize the lcd
lcd.backlight();
//--LCD
// initialize the button pin as a input:
// initialize the LED as an output:
pinMode(ledPin, OUTPUT);
pinMode(irr_valve_1, OUTPUT);
pinMode(irr_valve_2, OUTPUT);
pinMode(irr_valve_3, OUTPUT);
pinMode(irr_valve_4, OUTPUT);
pinMode(open_actuator, OUTPUT);
pinMode(close_actuator, OUTPUT);
digitalWrite(irr_valve_1, HIGH);
digitalWrite(irr_valve_2, HIGH);
digitalWrite(irr_valve_3, HIGH);
digitalWrite(irr_valve_4, HIGH);
digitalWrite(open_actuator, HIGH);
digitalWrite(close_actuator, HIGH);
digitalWrite(ledPin, HIGH);
// initialize serial communication:
Serial.begin(9600);
// инициализируем пин, подключенный к кнопке, как вход
pinMode(buttonPin, INPUT);
pinMode(buttonPin_0, INPUT);
pinMode(buttonPin_1, INPUT);
pinMode(nasos, OUTPUT);
pinMode(sensor_min_level_tank, INPUT);
pinMode(sensor_max_level_tank, INPUT);
//ds1307
#ifdef AVR
Wire.begin();
#else
Wire1.begin(); // Shield I2C pins connect to alt I2C bus on Arduino Due
#endif
rtc.begin();
if (! rtc.isrunning()) {
Serial.println("RTC is NOT running!");
// following line sets the RTC to the date & time this sketch was compiled
rtc.adjust(DateTime(__DATE__, __TIME__)); //строка установки системного времени во время компиляции скеча
}
//--ds1307
//sd
pinMode(53, OUTPUT);
if (!SD.begin(53)) {
Serial.println("initialization SD flash card failed!");
return;
}
Serial.println("initialization SD flash card done.");
}
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
//#########################################################################################################
void loop() {
//if (LCD_LED){lcd.backlight();}
time();
termostat();
//temp();
irrigation(valve_1[0],valve_1[1],valve_1[2],valve_1[3],valve_1[4], irr_valve_1);
irrigation(valve_2[0],valve_2[1],valve_2[2],valve_2[3],valve_2[4], irr_valve_2);
irrigation(valve_3[0],valve_3[1],valve_3[2],valve_3[3],valve_3[4], irr_valve_3);
irrigation(valve_4[0],valve_4[1],valve_4[2],valve_4[3],valve_4[4], irr_valve_4);
lcd.setCursor(0,0);
lcd.print("in= ");
lcd.print(temp_in());
lcd.print(" out= ");
lcd.print(temp_out());
// lcd.setCursor(0,1);
// lcd.print(irr_time);
lcd.print("");
// lcd.print(end_irr_time);
lcd.print("");
// lcd.print(EEPROM.read(2));
lcd.setCursor(0,2);
lcd.print(Date);
lcd.print(" ");
lcd.print(Time);
lcd.setCursor(0,3);
lcd.print(" MENU ");
button_read(); //читаем кнопки // проверяем нажата ли кнопка
if (centreBtn) { // проверяем нажата ли кнопка если нажата, то
// LCD_LED = 1;
// lcd.backlight();
lcd.backlight();
digitalWrite(ledPin, LOW);
delay(del);// включаем светодиод
lcd.clear(); //очищаем экран
digitalWrite(ledPin, HIGH);
menu();
}
if (leftbtn) { //включить подсветочку
lcd.backlight();
open_windows();
//digitalWrite(ledPin, LOW);
//LCD_LED();
//delay(del);
//digitalWrite(ledPin, HIGH);
}
if (rightbtn) {
lcd.backlight();
close_windows();
}
LCD_LED_OFF(); //таймер отключения подсветки
}
//##########################################################################################################33
void menu()
{
actuator_setup();
irrigtion_setup();
irrigation_set_time();
}
void actuator_setup()
{
int x =0;
lcd.clear(); //очищаем экран
while(1){ // цикл
x++;
if (x>interval){break;}
button_read();
lcd.setCursor(0,0);
lcd.print(" -=ACTUATOR SETUP=- ");
int t_mini = EEPROM.read(0);
lcd.setCursor(0,1);
lcd.print("min = ");
lcd.print(t_mini);
lcd.print((char)223);
int t_maxi = EEPROM.read(1);
lcd.setCursor(11,1);
lcd.print("max = ");
lcd.print(t_maxi);
lcd.print((char)223);
lcd.setCursor(0,2);
lcd.print("____________________");
lcd.setCursor(0,3);
lcd.print("T_MIN NEXT T_MAX");
digitalWrite(ledPin, HIGH);
if (centreBtn) {
digitalWrite(ledPin, LOW);
delay(del);// включаем светодиод
lcd.clear(); //очищаем экран
digitalWrite(ledPin, HIGH);
break; }
if (leftbtn) {
digitalWrite(ledPin, LOW);
lcd.clear();
t_min();
delay(del);
lcd.clear(); //очищаем экран
x =0;
digitalWrite(ledPin, HIGH);
}
if (rightbtn) {
digitalWrite(ledPin, LOW);
lcd.clear();
t_max();
delay(del);// включаем светодиод
lcd.clear(); //очищаем экран
x =0;
digitalWrite(ledPin, HIGH);
}
}}
void irrigtion_setup()
{
int y =0;
lcd.clear(); //очищаем экран
while(1){ //бесконечный цикл
y++;
if (y>interval){break;} //выйти из цикла при y>interval
button_read();
lcd.setCursor(0,0);
lcd.print("-=IRRIGATION SETUP=-");
// int on_off = EEPROM.read(2);
//String x;
// if (on_off == 1) {x="ON";}
// if (on_off == 0) {x="OFF";}
lcd.setCursor(0,1);
lcd.print("1 ch=");
lcd.print(on_or_off(valve_1[1])); //вызываем функцию on_or_off передаём ей параметр 2 символ массива, возвращаем string ON или OFF
lcd.setCursor(10,1);
lcd.print("3 ch=");
lcd.print(on_or_off(valve_3[1]));
lcd.setCursor(0,2);
lcd.print("2 ch=");
lcd.print(on_or_off(valve_2[1]));
lcd.setCursor(10,2);
lcd.print("4 ch=");
lcd.print(on_or_off(valve_4[1]));
/*
int duration = EEPROM.read(3);
lcd.setCursor(10,1);
lcd.print("dur=");
lcd.print(duration);
lcd.print("min");
lcd.setCursor(0,2);
lcd.print("____________________");
*/
lcd.setCursor(0,3);
lcd.print("ON/OFF NEXT DURATION");
// digitalWrite(ledPin, HIGH);
if (centreBtn) {
digitalWrite(ledPin, LOW);
delay(del);// включаем светодиод
lcd.clear(); //очищаем экран
break;
}
if (rightbtn) {
digitalWrite(ledPin, LOW);
lcd.clear();
durration_irrigation(valve_1[0],valve_1[1],valve_1[2],valve_1[3],valve_1[4]);
durration_irrigation(valve_2[0],valve_2[1],valve_2[2],valve_2[3],valve_2[4]);
durration_irrigation(valve_3[0],valve_3[1],valve_3[2],valve_3[3],valve_3[4]);
durration_irrigation(valve_4[0],valve_4[1],valve_4[2],valve_4[3],valve_4[4]);
delay(del);// включаем светодиод
lcd.clear(); //очищаем экран
y =0;
digitalWrite(ledPin, HIGH);
}
if (leftbtn) {
digitalWrite(ledPin, LOW);
lcd.clear();
on_off_irrigation(valve_1[0],valve_1[1]);
on_off_irrigation(valve_2[0],valve_2[1]);
on_off_irrigation(valve_3[0],valve_3[1]);
on_off_irrigation(valve_4[0],valve_4[1]);
//on_off_irrigation();
delay(del);// включаем светодиод
lcd.clear(); //очищаем экран
y =0;
digitalWrite(ledPin, HIGH);
}
}}
void irrigation_set_time()
{
int x =0;
lcd.clear(); //очищаем экран
while(1){ //бесконечный цикл
x++;
if (x>interval){break;}
button_read();
//string_irrigation_time(); //выполняем функцию строки времени полива для отображения переменной irr_time
lcd.setCursor(0,0);
lcd.print("IRRIGATION SET TIME");
lcd.setCursor(0,1);
lcd.print("1: ");
lcd.print(string_irrigation_time(valve_1[0],valve_1[1],valve_1[2],valve_1[3],valve_1[4]));
lcd.print(" ");
lcd.print(string_irrigation_time(valve_3[0],valve_3[1],valve_3[2],valve_3[3],valve_3[4]));
lcd.setCursor(0,2);
lcd.print("2: ");
lcd.print(string_irrigation_time(valve_2[0],valve_2[1],valve_2[2],valve_2[3],valve_2[4]));
lcd.print(" ");
lcd.print(string_irrigation_time(valve_4[0],valve_4[1],valve_4[2],valve_4[3],valve_4[4]));
// lcd.print(irr_time); //выводим переменную строки времени полива
lcd.setCursor(0,3);
lcd.print("hours NEXT minuts");
digitalWrite(ledPin, HIGH);
if (centreBtn) {
digitalWrite(ledPin, LOW);
delay(del);// включаем светодиод
lcd.clear(); //очищаем экран
digitalWrite(ledPin, HIGH);
break;
}
if (leftbtn) {
digitalWrite(ledPin, LOW);
lcd.clear();
irrigation_set_hours(valve_1[0],valve_1[1],valve_1[2],valve_1[3],valve_1[4]);
irrigation_set_hours(valve_2[0],valve_2[1],valve_2[2],valve_2[3],valve_2[4]);
irrigation_set_hours(valve_3[0],valve_3[1],valve_3[2],valve_3[3],valve_3[4]);
irrigation_set_hours(valve_4[0],valve_4[1],valve_4[2],valve_4[3],valve_4[4]);
delay(del);
lcd.clear(); //очищаем экран
x =0;
digitalWrite(ledPin, HIGH);
}
if (rightbtn) {
digitalWrite(ledPin, LOW);
lcd.clear();
irrigation_set_minuts(valve_1[0],valve_1[1],valve_1[2],valve_1[3],valve_1[4]);
irrigation_set_minuts(valve_2[0],valve_2[1],valve_2[2],valve_2[3],valve_2[4]);
irrigation_set_minuts(valve_3[0],valve_3[1],valve_3[2],valve_3[3],valve_3[4]);
irrigation_set_minuts(valve_4[0],valve_4[1],valve_4[2],valve_4[3],valve_4[4]);
delay(del);// включаем светодиод
lcd.clear(); //очищаем экран
x =0;
digitalWrite(ledPin, HIGH);
}
}}
//////--------------------------------------------------------------------------
//SUB MENU
void t_min()
{
lcd.clear(); //очищаем экран
delay(del);
while(1){ //бесконечный цикл
button_read();
lcd.setCursor(0,0);
lcd.print(" TEMP MINIMUM SETUP");
int t_min = EEPROM.read(0);
lcd.setCursor(0,1);
lcd.print("t = ");
lcd.print(t_min);
lcd.print((char)223);
lcd.print("C");
lcd.setCursor(0,3);
lcd.print("t_min-1 NEXT t_min+1");
lcd.setCursor(0,2);
lcd.print("____________________");
digitalWrite(ledPin, HIGH);
if (centreBtn) {
digitalWrite(ledPin, LOW);
delay(del);// включаем светодиод
lcd.clear(); //очищаем экран
digitalWrite(ledPin, HIGH);
break;
}
if (rightbtn) {
delay(del);
digitalWrite(ledPin, LOW);
lcd.clear();
EEPROM.write(0, t_min + 1);
digitalWrite(ledPin, HIGH);
}
if (leftbtn) {
delay(del);
digitalWrite(ledPin, LOW);
lcd.clear();
EEPROM.write(0, t_min - 1);
digitalWrite(ledPin, HIGH);
}
}
}
void t_max()
{
lcd.clear(); //очищаем экран
delay(del);
while(1){ //бесконечный цикл
button_read();
lcd.setCursor(0,0);
lcd.print(" TEMP MAXIMUM SETUP");
int t_max = EEPROM.read(1);
lcd.setCursor(0,1);
lcd.print("t = ");
lcd.print(t_max);
lcd.print((char)223);
lcd.print("C");
lcd.setCursor(0,3);
lcd.print("t_max-1 NEXT t_max+1");
lcd.setCursor(0,2);
lcd.print("____________________");
digitalWrite(ledPin, HIGH);
if (centreBtn) {
digitalWrite(ledPin, LOW);
delay(del);// включаем светодиод
lcd.clear(); //очищаем экран
digitalWrite(ledPin, HIGH);
break;
}
if (rightbtn) {
delay(del);
digitalWrite(ledPin, LOW);
lcd.clear();
EEPROM.write(1, t_max + 1);
digitalWrite(ledPin, HIGH);
}
if (leftbtn) {
delay(del);
digitalWrite(ledPin, LOW);
lcd.clear();
EEPROM.write(1, t_max - 1);
digitalWrite(ledPin, HIGH);
}
}
}
void on_off_irrigation(int ch,int on_off_x)
{
lcd.clear(); //очищаем экран
delay(del);
while(1){ //бесконечный цикл
button_read();
lcd.setCursor(0,0);
lcd.print("ON/OFF IRRIGATION");
//int on_off = EEPROM.read(on_off_x);
//String x;
//if (on_off == 1) {x="ON";}
//if (on_off == 0) {x="OFF";}
lcd.setCursor(0,2);
lcd.print("irrigation = ");
lcd.print(on_or_off(on_off_x));
//lcd.print(on_off);
lcd.setCursor(0,1);
lcd.print("chanel N=");
lcd.print(ch);
lcd.setCursor(0,3);
lcd.print("ON NEXT OFF");
digitalWrite(ledPin, HIGH);
if (centreBtn) {
digitalWrite(ledPin, LOW);
delay(del);// включаем светодиод
lcd.clear(); //очищаем экран
digitalWrite(ledPin, HIGH);
break;
}
if (rightbtn) {
delay(del);
digitalWrite(ledPin, LOW);
lcd.clear();
EEPROM.write(on_off_x, 0);
digitalWrite(ledPin, HIGH);
}
if (leftbtn) {
delay(del);
digitalWrite(ledPin, LOW);
lcd.clear();
EEPROM.write(on_off_x, 1);
digitalWrite(ledPin, HIGH);
}
}
}
void durration_irrigation(int ch,int on_off_x, int dur, int min_dur, int hour_dur)
{
lcd.clear(); //очищаем экран
delay(del);
while(1){ //бесконечный цикл
button_read();
string_end_irrigation_time(ch, on_off_x, dur, min_dur, hour_dur);
lcd.setCursor(0,0);
lcd.print("DURRATION IRRIGATIN");
int duration = EEPROM.read(dur);
lcd.setCursor(0,1);
lcd.print("ch N=");
lcd.print(ch);
lcd.print(" dur=");
lcd.print(duration);
lcd.print(" min");
lcd.setCursor(0,3);
lcd.print("-1min NEXT +1min");
lcd.setCursor(0,2);
lcd.print(string_irrigation_time(ch, on_off_x, dur, min_dur, hour_dur));
lcd.print(" ");
lcd.print(string_end_irrigation_time(ch, on_off_x, dur, min_dur, hour_dur));
digitalWrite(ledPin, HIGH);
if (centreBtn) {
digitalWrite(ledPin, LOW);
delay(del);// включаем светодиод
lcd.clear(); //очищаем экран
digitalWrite(ledPin, HIGH);
break;
}
if (rightbtn) {
delay(del);
digitalWrite(ledPin, LOW);
lcd.clear();
EEPROM.write(dur, duration + 1);
digitalWrite(ledPin, HIGH);
}
if (leftbtn) {
delay(del);
digitalWrite(ledPin, LOW);
lcd.clear();
EEPROM.write(dur, duration - 1);
digitalWrite(ledPin, HIGH);
}
}
}
void irrigation_set_minuts(int ch,int on_off_x, int dur, int min_dur, int hour_dur)
{
lcd.clear(); //очищаем экран
delay(del);
while(1){ //бесконечный цикл
button_read();
//string_irrigation_time();
lcd.setCursor(0,0);
lcd.print("SET IRR-TION MINUTES");
int minuts = EEPROM.read(min_dur);
lcd.setCursor(0,1);
lcd.print("ch N_");
lcd.print(ch);
lcd.print("= ");
lcd.print(string_irrigation_time(ch, on_off_x, dur, min_dur, hour_dur));
// lcd.print("min");
lcd.setCursor(0,2);
lcd.print("____________________");
lcd.setCursor(0,3);
lcd.print("-1min NEXT +1min");
digitalWrite(ledPin, HIGH);
if (centreBtn) {
digitalWrite(ledPin, LOW);
delay(del);// включаем светодиод
lcd.clear(); //очищаем экран
digitalWrite(ledPin, HIGH);
break;
}
if (rightbtn) {
delay(del);
digitalWrite(ledPin, LOW);
lcd.clear();
minuts = minuts + 1;
if (minuts >59){minuts=0;}
EEPROM.write(min_dur, minuts);
digitalWrite(ledPin, HIGH);
}
if (leftbtn) {
delay(del);
digitalWrite(ledPin, LOW);
lcd.clear();
minuts = minuts - 1;
if (minuts < 0) {minuts=59;}
EEPROM.write(min_dur, minuts);
digitalWrite(ledPin, HIGH);
}
}
}
void irrigation_set_hours(int ch,int on_off_x, int dur, int min_dur, int hour_dur)
{
lcd.clear(); //очищаем экран
delay(del);
while(1){ //бесконечный цикл
button_read();
//string_irrigation_time();
lcd.setCursor(0,0);
lcd.print(" SET IRR-TION HOURS");
int hours = EEPROM.read(hour_dur);
lcd.setCursor(0,1);
lcd.print("ch N_");
lcd.print(ch);
lcd.print("= ");
lcd.print(string_irrigation_time(ch, on_off_x, dur, min_dur, hour_dur));
// lcd.print("min");
lcd.setCursor(0,2);
lcd.print("____________________");
lcd.setCursor(0,3);
lcd.print("-1hour NEXT +1hour");
digitalWrite(ledPin, HIGH);
if (centreBtn) {
digitalWrite(ledPin, LOW);
delay(del);// включаем светодиод
lcd.clear(); //очищаем экран
digitalWrite(ledPin, HIGH);
break;
}
if (rightbtn) {
delay(del);
digitalWrite(ledPin, LOW);
lcd.clear();
hours = hours + 1;
if (hours >23){hours=0;}
EEPROM.write(hour_dur, hours);
digitalWrite(ledPin, HIGH);
}
if (leftbtn) {
delay(del);
digitalWrite(ledPin, LOW);
lcd.clear();
hours = hours - 1;
if (hours < 0) {hours=23;}
EEPROM.write(hour_dur, hours);
digitalWrite(ledPin, HIGH);
}
}
}
String string_irrigation_time(int ch, int on_off_x, int dur, int min_dur, int hour_dur) // функция формирования строки времни полива
{
String irr_time = ""; //очистим глобальную переменную навсякий случай.
int minuts = EEPROM.read(min_dur); //читаем память
int hours = EEPROM.read(hour_dur);
if (hours >= 0 && hours <=9) {irr_time += 0; irr_time += hours;} else{irr_time += hours;} //дописываем нолик для hours
irr_time += ":";
if (minuts >= 0 && minuts <=9){irr_time += 0; irr_time += minuts;} else{irr_time += minuts;} //дописываем нолик для minuts
irr_time += ":";
irr_time += "00"; //собрали строку времени полива
// lcd.setCursor(0,1);
// lcd.print("irr_time=");
// lcd.print(irr_time);
return irr_time;
}
String string_end_irrigation_time(int ch, int on_off_x, int dur, int min_dur, int hour_dur) // функция формирования строки времни полива
{
String end_irr_time = ""; //очистим глобальную переменную навсякий случай.
int minuts = EEPROM.read(min_dur) + EEPROM.read(dur); //читаем память
int hours = EEPROM.read(hour_dur);
if (minuts > 59) {int x = minuts / 60; hours += x; int y = x * 60; minuts -= y;}
if (hours >= 0 && hours <=9) {end_irr_time += 0; end_irr_time += hours;} else{end_irr_time += hours;} //дописываем нолик для hours
end_irr_time += ":";
if (minuts >= 0 && minuts <=9){end_irr_time += 0; end_irr_time += minuts;} else{end_irr_time += minuts;} //дописываем нолик для minuts
end_irr_time += ":";
end_irr_time += "00"; //собрали строку времени полива
// lcd.setCursor(0,1);
// lcd.print("irr_time=");
// lcd.print(irr_time);
return end_irr_time;
}
void button_read() //функция проверки нажатия кнопки
{
centreBtn = digitalRead(buttonPin); //запоминаем значение кнопки
rightbtn = digitalRead(buttonPin_0); //запоминаем значение кнопки
leftbtn = digitalRead(buttonPin_1); //запоминаем значение кнопки
}
void LCD_LED_OFF()//таймер отключения подсветки
{
unsigned long currentMillis = millis();
//проверяем не прошел ли нужный интервал, если прошел то
if(currentMillis - previousMillis > interval_2) {
// сохраняем время последнего переключения
previousMillis = currentMillis;
lcd.noBacklight();
// lcd.setCursor(0,3);
// lcd.print("led");
// if(r==0)
// {lcd.print("led off"); r=1; lcd.noBacklight(); }
// else if(r==1)//если кнопка НЕ нажата
// {lcd.print("led on"); r=0; lcd.backlight(); }
}
}
void time() //функция строки времени
{
// int x;
DateTime now = rtc.now();
Date = "";
Date += now.year();
Date += "/";
if (now.month() >=0 && now.month() <=9)
{
Date += "0";
Date += now.month();
} else {Date += now.month();}
Date += "/";
if (now.day() >= 0 && now.day() <=9)
{
Date += "0";
Date += now.day();
} else {Date += now.day();}
//dataString += " ";
Time ="";
if (now.hour() >= 0 && now.hour() <=9 )
{
Time += "0";
Time += now.hour();
} else {Time += now.hour();}
Time += ":";
if (now.minute() >= 0 && now.minute() <=9 )
{
Time += "0";
Time += now.minute();
} else {Time += now.minute();}
Time += ":";
if (now.second() >= 0 && now.second() <= 9)
{
Time += "0";
Time += now.second();
}
else {Time += now.second();}
// Time += " ";
}
float temp_in()
{
sensors.requestTemperatures(); // Send the command to get temperatures
float in_tempC = sensors.getTempCByIndex(0);
return in_tempC;
}
float temp_out()
{
sensors.requestTemperatures(); // Send the command to get temperatures
float out_tempC = sensors.getTempCByIndex(1);
return out_tempC;
}
void irrigation(int ch, int on_off_x, int dur, int min_dur, int hour_dur, int irr_valve)
{
int x=EEPROM.read(on_off_x);
if (x == 1){
// string_irrigation_time(ch, on_off_x, dur, min_dur, hour_dur);
// string_end_irrigation_time(ch, on_off_x, dur, min_dur, hour_dur);
if(string_irrigation_time(ch, on_off_x, dur, min_dur, hour_dur) == Time)
{
digitalWrite(irr_valve, LOW);
Serial.print("ch: ");
Serial.print(ch);
Serial.print(" ");
Serial.print("pin: ");
Serial.print(irr_valve);
Serial.print(" ");
Serial.print("Status: ");
Serial.println(" ON");
String file_name = "irrigat.txt";
String value = "";
value += ch;
value += ";1;";
sd_write (file_name, value);
}
if(string_end_irrigation_time(ch, on_off_x, dur, min_dur, hour_dur) == Time)
{
digitalWrite(irr_valve, HIGH);
Serial.print("ch: ");
Serial.print(ch);
Serial.print(" ");
Serial.print("pin: ");
Serial.print(irr_valve);
Serial.print(" ");
Serial.print("Status: ");
Serial.println(" OFF");
String file_name = "irrigat.txt";
String value = "" ;
value += ch;
value += ";0;";
sd_write (file_name, value);
}
}
}
String on_or_off (int on_off)
{
int z = EEPROM.read(on_off);
String x;
if (z == 1) {x="ON";}
if (z == 0) {x="OFF";}
return x;
}
int termostat ()
{
int temp_min = EEPROM.read(0);
int temp_max = EEPROM.read(1);
if (temp_out() > temp_max && digitalRead(close_actuator)==LOW)
{
open_windows();
}
if (temp_out() < temp_min && digitalRead(open_actuator)==LOW)
{
close_windows();
}
}
void open_windows()
{
digitalWrite(close_actuator, HIGH);
delay(1000);
digitalWrite(open_actuator, LOW);
// lcd.setCursor(0,0);
// lcd.print("Open window");
lcd.setCursor(0,1);
lcd.print("OPEN ACTUATOR");
String file_name = "actuator.txt";
String value = "1";
sd_write (file_name, value);
}
void close_windows()
{
digitalWrite(open_actuator, HIGH);
delay(1000);
digitalWrite(close_actuator, LOW);
// lcd.setCursor(0,0);
// lcd.print("Open window");
lcd.setCursor(0,1);
lcd.print("CLOSE ACTUATOR");
String file_name = "actuator.txt";
String value = "0";
sd_write (file_name, value);
}
int _nasos()
{
sensor_min_level_state = digitalRead(sensor_min_level_tank);
sensor_max_level_state = digitalRead(sensor_max_level_tank);
if (sensor_min_level_state == LOW)
{
digitalWrite(nasos, HIGH);
String file_name = "nasos.txt";
String value = "0";
sd_write (file_name, value);
}
if (sensor_max_level_state == HIGH)
{
digitalWrite(nasos,LOW);
String file_name = "nasos.txt";
String value = "1";
sd_write (file_name, value);
}
}
int sd_write (String file_name, String value)
{
unsigned long currentMillis = millis();
//проверяем не прошел ли нужный интервал, если прошел то
if(currentMillis - previousMillis > interval_3) {
// сохраняем время последнего переключения
previousMillis = currentMillis;
char f_n[file_name.length()+1];
file_name.toCharArray(f_n, file_name.length()+1);
myFile = SD.open(f_n , FILE_WRITE);
//myFile = SD.open(file_name.c_str() , FILE_WRITE);
// if the file opened okay, write to it:
if (myFile) {
Serial.print("Writing to ");
Serial.print(f_n);
// Serial.print(file_name.c_str());
Serial.print(" ");
myFile.print(Date);
myFile.print(";");
myFile.print(Time);
myFile.print(";");
myFile.println(value);
// close the file:
myFile.close();
Serial.print("done. Writed: ");
Serial.print(Date);
Serial.print(";");
Serial.print(Time);
Serial.print(";");
Serial.println(value);
return(1);
} else {
// if the file didn't open, print an error:
Serial.println("error opening sd card. File: ");
Serial.print(file_name.c_str());
return(0);
}
}
}
С каждым разом всё сложней становится ориентация в коде=)
Не только сложней, но и перешли рубеж в 32к , прошивка весит 34 466 байт - для уно-нано много, для мега мало. Надо бы этот проект оставить на 32, а дальше новый проект Умная теплица №2.
Зачем измерение влажности в теплице если так по определению осадков не предвидится ? По таймеру надежней.
Если задача израсходовать воду, тогда таймер поможет. Но если в планах обеспечение максимального роста зелени, то нужно создать наиболее оптимальные условия включая, помимо температуры и освещения, влажность как воздуха, так и почвы.
По таймеру обязательно будет либо некоторый недолив, либо, что гораздо хуже и даже опаснее это перелив...
Таймер есть смысл использовать с единственной целью - обеспечить самый минимум, на тот случай если произойдет сбойчик в определении влажности и тп... Таймер должен включать полив если прошло слишком много времени после последнего включения. Короче принцип тот же как запуск скринсейвера ну или что то типа WDT.
Таймер есть смысл использовать с единственной целью - обеспечить самый минимум, на тот случай если произойдет сбойчик в определении влажности и тп... Таймер должен включать полив если прошло слишком много времени после последнего включения. Короче принцип тот же как запуск скринсейвера ну или что то типа WDT.
Вы делали полив на основе датчика влажности ? Так чтобы он не один день поработал, поливал теплицу, а не горшок ?
я рулил реальной теплицей с ручным управлением - полив по таймеру не катит, приходилось ногами идти и руками-глазами проверять состояние грунта на предмет необходимости полива.
А полив по датчику влажности приносит другие проблемы:
1. электроды окисляются. Нержавейка в том числе (чем-то покрывается)
4. Калибровку на каждую грядку одинаково сделать невозможно
3. Датчик будет показывать разные значения в зависимости от место положения относительно системы орошения - вкапывать датчик под каждое растение это не рационально.
4. Почву возле электродом нужно рыхлить постоянно - иначе она быстро трамбуется и меняет свои свойства по намачиваемости относительно первоначально выставленных.
Я поливаю (год) огород по таймеру. В теплице таймер поливает за жестко заданным показателям, в огороде у меня есть одна тестовая грядка (пустой горшок) с датчиком влажности относительно которой поливаются и другие грядки. Калибровка всего хозяйства и настройка таймера заняла несколько поливов.
В этом году я хочу больше уделить внимания по объему полива не на глаз, а согласно потребностей культуры. Не всегда влажность полезна, как и сухость.
Таймер есть смысл использовать с единственной целью - обеспечить самый минимум, на тот случай если произойдет сбойчик в определении влажности и тп... Таймер должен включать полив если прошло слишком много времени после последнего включения. Короче принцип тот же как запуск скринсейвера ну или что то типа WDT.
Probelzaelo, Вы практик или теоретик ?
Если уж на то пошло, то специалист. это и практик и теоретик с одним флаконом.
А полив по датчику влажности приносит другие проблемы:
1. электроды окисляются. Нержавейка в том числе (чем-то покрывается)
первое -Электроды бывают совсем не металлические.
Второе измерительная схема вносит не малый вклад в окислительные процессы.
General пишет:
4. Калибровку на каждую грядку одинаково сделать невозможно
Обсалютно одинаково и не нужно. Все относительно, а полупроцентная точность тут не нужна.
General пишет:
3. Датчик будет показывать разные значения в зависимости от место положения относительно системы орошения - вкапывать датчик под каждое растение это не рационально.
Датчик будет измерять влажность там где его установили. в наиболее ответственном месте. под каждым кустом датчики ставить не нужно. достаточно в пределах грядки поставить датчики в наиболее сыром(в дальнем от окон и дверей и тп) и в наиболее сухом(как правило сохнет быстрее на сквозняках) местах. и следить чтобы в сухом не спускалось ниже минимума, а в сыром не поднималось выше максимума. в идеале же полив нужно распределять максимально равномерно
General пишет:
4. Почву возле электродом нужно рыхлить постоянно - иначе она быстро трамбуется и меняет свои свойства по намачиваемости относительно первоначально выставленных.
Да, за датчиками нужно следить. нельзя надеяться что воткнутый в землю датчик проработает на отлично весь сезон. Датчики нуждаются в обслуживании - периодической чистке, мойке, замене, калибровке. это гораздо реже чем регулярный полив. можно с этой задачей и смириться.
General пишет:
Я поливаю (год) огород по таймеру. В теплице таймер поливает за жестко заданным показателям, в огороде у меня есть одна тестовая грядка (пустой горшок) с датчиком влажности относительно которой поливаются и другие грядки. Калибровка всего хозяйства и настройка таймера заняла несколько поливов.
Прекрасно. получается значит...
General пишет:
В этом году я хочу больше уделить внимания по объему полива не на глаз, а согласно потребностей культуры. Не всегда влажность полезна, как и сухость.
Все правильно потребности культуры главный норматив. если бы еще эту культуры научить включать поливалку...
О влажности и сухости, да, без воды никак, но корням нужно дышать значит почва не должна быть слишком сырой, залить можно но на короткое время, не на всегда.
Всем привет. Прошлый сезон в теплице сделали капельный полив и столкнулись с проблемой засорения сопл, также т.к. погода была холодная и мокрая, полив по таймеру привел к переливу. Решил осваивать Arduino и все автомитизировать. В январе только привезли. 3 месяца ждал.
В наличии есть такой сенсор влажности, yl-38 + yl-69. Еще не подключал. Может кто имел практику с таким сенсором?
Всем привет. Прошлый сезон в теплице сделали капельный полив и столкнулись с проблемой засорения сопл, также т.к. погода была холодная и мокрая, полив по таймеру привел к переливу. Решил осваивать Arduino и все автомитизировать. В январе только привезли. 3 месяца ждал.
В наличии есть такой сенсор влажности, yl-38 + yl-69. Еще не подключал. Может кто имел практику с таким сенсором?
Засорение сопл это стандартная проблема... Жёсткая вода, грязь, налёт....
По сенсору: cразу меняй на электроды из нержавейки=) Эта тема уже не раз обсуждалась. И этот сенсор больше подходит для одного горшка. И подумай, как ты одним сенсором будешь определять влажность нескольких грядок? В идеале сенсор надо ставить под каждое растение.
Понимаю что стандартная проблема. Я вот, пробовал использовать топливный фильтр для авто. Помогает конечно, но приходилось менять каждую вторую неделю. Наверное нужен отстойник для воды. У меня вода подается из общей бочки самотеком.
Про проблемы сдатчика влажности читал в обсуждениях. Контакты окисляются только в рабочем состоянии сенсора? Конечно по хорошему, надо за ними следить, ставить сенсор под каждое растение и поливать каждое по необходимости. Но мне кажется это уже слишком. И как полить одно растение?
Согласен что сенсор необходим и актуален только для горшка или для общей картины в теплице. И следить за ним тоже необходимо.
Подключил свой сенсор и вот что сранно незамкнутый показывает 1023, в воде 430-480, а в мокрой земле 250, непонимаю почему в воде показывает влажность меньше чем в мокрой земле?
Вчера спалил 4 канальный релейный модуль. 5 вольтовый подключил к 12 вольтам, что то переклинело меня:). Жаль.
Конечно по хорошему, надо за ними следить, ставить сенсор под каждое растение и поливать каждое по необходимости. Но мне кажется это уже слишком. И как полить одно растение?
зачем? В допустимых пределах такая же влажность будет не только у соседних растений, но и на 5-6 ближайших грядках.
Это сильно зависит от глубины погружения сенсора, т.к. "горизонт" у грядок даже на наших болотах может быть чуть разный. И если для цветочного горшка достаточно 10 см, то на грунт, как мне кажется, надо щупы делать длиной сантиметров 20-25 (как раз длина 3мм сварочного электрода).
На плате есть транзистеры с маркеровкой J3Y. Возможно и они. Думаю починим.
прозвонить и поменять, на любые N-P-N в том же размере. но я бы предварительно прозвонил и релюшки. они тоже запросто могли накрыться при пробое транзисторов. все же 2.5 раза перенапряжение ...
Поставь кнопки, всё заработает. Сам пробовал отключать кнопку, начинается хаос)
а кнопки с резистором или без
у меня с резисторами =)
а можно еще последнюю версию кода после "правки"
И еще резисторі к кнопкам какого ниминала?(сами кнопки я так понимаю без фиксации?)
"А ты, вот это, читал!?"(С)Жеглов
Работа с кнопками. В помощь новичку.
спасибо почитаю
а можно еще последнюю версию кода после "правки"
Держи
Спасибо.Я использовал старый вариант меню переделав его под 16*2дисплей добавив свою часть с термостатом.Но после обьеденеия перестала работать моя часть все компилируется но не работает ,часть с меню работает отлично.Если dachnik не против я могу выложить здесь то что вышло.
выкладывай
вот мой вариант кода, как я уже и писал не работае часть "терморегулятор"
а где у тебя в loop() вызывается функция termo()? я вижу, что только меню вызывается....
Здравствуйте а возможно добавить подсветку в зимнее время. досвет.
Нет ничего невозможного, было бы время и руки... =)
Мне понравился ваш проект. Возможно доделать по заказу если надо даже оплачу работу. И хотелось его соеденить по wi-fi с пк и работа через программу типо Manager.
Дайте свои координаты, пообщаемся, чтобы тут не засорять.
Нашел http://forum.amperka.ru/threads/%D0%9C%D0%B8%D0%BD%D0%B8-%D1%82%D0%B5%D0%BF%D0%BB%D0%B8%D1%86%D0%B0-v2-0.1786/
но дисплей надо зделать
Здравствуйте. Я снова в деле) Я поставил задачи/ вопросы для реализации моего дипломного проекта. Как Вы помните (наверное) у меня макет умной теплицы. Мои задачи/вопросы:
1. Автономное орошение (полив) почвы теплицы, подавая воду близко к корню растения.
2. Автономная подача воды в теплице по 2-м параметрам:
a. По определенному периоду времени;
b. По влажности почвы.
3. Автономное отопление теплицы по данным датчика измерения температуры воздуха.
4. Автономная вентиляция теплицы (открытие окон, вентиляция)???
5. Автоматическое открывание и закрывание штор в теплице в зависимости от времени суток (в зимнее время).
Как Вам? Не слишком много ли я беру на себя? Возможно ли их реализовать?
Зачем измерение влажности в теплице если так по определению осадков не предвидится ? По таймеру надежней.
после полива влажность там огого... Даже конденсат выпадает.
Автономная подача воды в теплице по 2-м параметрам:
a. По определенному периоду времени;
b. По влажности почвы.
По мне, выбери, что-то одно. Пример, датчик влажности почвы сказал то надо полить, земля пролилась и через минуту включается таймер и заливает ещё. В итоге растения залиты, помидорам плохо.... огурцам хз=)
3. Автономное отопление теплицы по данным датчика измерения температуры воздуха.
4. Автономная вентиляция теплицы (открытие окон, вентиляция)???
5. Автоматическое открывание и закрывание штор в теплице в зависимости от времени суток (в зимнее время).
Как Вам? Не слишком много ли я беру на себя? Возможно ли их реализовать?
Реализовать очень даже несложно, было бы время, руки и желание...
ты хочешь закрывать шторы зимой когда итак нет света? ИМХО это актульно для культур которые чувствительны к светопериоду. Для овощей не нужно. Лучше добавить возможность досветки лампами в зимнее время года, когда световой день короткий и солнца почти нет.
Шторы будут отражать поток холодного воздуха в ночное время. Так как солнечного луча нет и воздух будет холодным. Это я в одном сайте прочитал, про отражающие шторы)
Про освещение, да. Можно добавить.
Вот, теперь вопрос. Как мне найти серво привод для моих штор?
Сперва хочу просто открыть/закрыть шторы, только потом добавить туда фоторезистор. Можете подсказать?
Предлагаю отказаться от идеи со шторами и вопрос отпадёт =) если у тебя обогрев есть, то шторы не нужны. моё мнение.
нее, так ведь ничего такого там не останется из функционала проекта) проект должен быть не плохим, ибо получить отлично ;)))
Лучше мотор посоветуйте ;)
Ничего по этому подсказать не могу, не интересовался таким вопросом. Поисковик в помощь =)
Кроме того светлые с внутренней стороны шторы будут отражать и рассеивать обратно хоть часть света от искуственных источников, а не выпускать его беспрепятственно наружу, для освещения ночного космического пространства...
в зависимости от конструкции штор. но уверен, что вполне справится моторчик от автомобильного стеклоподьемника, вместе с редуктором и шкивом для троссика или, если крутить нужно не очень много, можно взять многооборотную серву пример 6 оборотов, они обычно используются для моделей яхт.
в зависимости от конструкции штор. но уверен, что вполне справится моторчик от автомобильного стеклоподьемника, вместе с редуктором и шкивом для троссика или, если крутить нужно не очень много, можно взять многооборотную серву пример 6 оборотов, они обычно используются для моделей яхт.
Как Вы думаете, http://freeduino.ru/arduino/motors.html моторчики, которые по ссылке подойдут?
Всем привет, было время поработал ещё над прошивкой. Добавил возможность рулить сразу 4мя линиями полива. Записи логов на SDшку. Ну и всяких мелочей... С каждым разом всё сложней становится ориентация в коде=)
Не только сложней, но и перешли рубеж в 32к , прошивка весит 34 466 байт - для уно-нано много, для мега мало. Надо бы этот проект оставить на 32, а дальше новый проект Умная теплица №2.
я вроде писал что перешёл на мегу из-за нехватки памяти и pinнов на уно.
нее, так ведь ничего такого там не останется из функционала проекта) проект должен быть не плохим, ибо получить отлично ;)))
Лучше мотор посоветуйте ;)
получится идеальный проект - нанотехнологичный.
*видишь суслика? - нанотехнологии!
Если задача израсходовать воду, тогда таймер поможет. Но если в планах обеспечение максимального роста зелени, то нужно создать наиболее оптимальные условия включая, помимо температуры и освещения, влажность как воздуха, так и почвы.
По таймеру обязательно будет либо некоторый недолив, либо, что гораздо хуже и даже опаснее это перелив...
Таймер есть смысл использовать с единственной целью - обеспечить самый минимум, на тот случай если произойдет сбойчик в определении влажности и тп... Таймер должен включать полив если прошло слишком много времени после последнего включения. Короче принцип тот же как запуск скринсейвера ну или что то типа WDT.
Probelzaelo, Вы практик или теоретик ?
Probelzaelo, Вы практик или теоретик ?
я практик - поливать нужно для поддержания влажности почвы, а не потому, что время полива наступило.
я практик - поливать нужно для поддержания влажности почвы, а не потому, что время полива наступило.
Вы делали полив на основе датчика влажности ? Так чтобы он не один день поработал, поливал теплицу, а не горшок ?
Вы делали полив на основе датчика влажности ? Так чтобы он не один день поработал, поливал теплицу, а не горшок ?
я рулил реальной теплицей с ручным управлением - полив по таймеру не катит, приходилось ногами идти и руками-глазами проверять состояние грунта на предмет необходимости полива.
А полив по датчику влажности приносит другие проблемы:
1. электроды окисляются. Нержавейка в том числе (чем-то покрывается)
4. Калибровку на каждую грядку одинаково сделать невозможно
3. Датчик будет показывать разные значения в зависимости от место положения относительно системы орошения - вкапывать датчик под каждое растение это не рационально.
4. Почву возле электродом нужно рыхлить постоянно - иначе она быстро трамбуется и меняет свои свойства по намачиваемости относительно первоначально выставленных.
Я поливаю (год) огород по таймеру. В теплице таймер поливает за жестко заданным показателям, в огороде у меня есть одна тестовая грядка (пустой горшок) с датчиком влажности относительно которой поливаются и другие грядки. Калибровка всего хозяйства и настройка таймера заняла несколько поливов.
В этом году я хочу больше уделить внимания по объему полива не на глаз, а согласно потребностей культуры. Не всегда влажность полезна, как и сухость.
нужен проект ti-tan@yandex.ru
Probelzaelo, Вы практик или теоретик ?
Если уж на то пошло, то специалист. это и практик и теоретик с одним флаконом.
1. электроды окисляются. Нержавейка в том числе (чем-то покрывается)
первое -Электроды бывают совсем не металлические.
Второе измерительная схема вносит не малый вклад в окислительные процессы.
Обсалютно одинаково и не нужно. Все относительно, а полупроцентная точность тут не нужна.
О влажности и сухости, да, без воды никак, но корням нужно дышать значит почва не должна быть слишком сырой, залить можно но на короткое время, не на всегда.
Всем привет. Прошлый сезон в теплице сделали капельный полив и столкнулись с проблемой засорения сопл, также т.к. погода была холодная и мокрая, полив по таймеру привел к переливу. Решил осваивать Arduino и все автомитизировать. В январе только привезли. 3 месяца ждал.
В наличии есть такой сенсор влажности, yl-38 + yl-69. Еще не подключал. Может кто имел практику с таким сенсором?
Всем привет. Прошлый сезон в теплице сделали капельный полив и столкнулись с проблемой засорения сопл, также т.к. погода была холодная и мокрая, полив по таймеру привел к переливу. Решил осваивать Arduino и все автомитизировать. В январе только привезли. 3 месяца ждал.
В наличии есть такой сенсор влажности, yl-38 + yl-69. Еще не подключал. Может кто имел практику с таким сенсором?
Засорение сопл это стандартная проблема... Жёсткая вода, грязь, налёт....
По сенсору: cразу меняй на электроды из нержавейки=) Эта тема уже не раз обсуждалась. И этот сенсор больше подходит для одного горшка. И подумай, как ты одним сенсором будешь определять влажность нескольких грядок? В идеале сенсор надо ставить под каждое растение.
зачем? В допустимых пределах такая же влажность будет не только у соседних растений, но и на 5-6 ближайших грядках.
Понимаю что стандартная проблема. Я вот, пробовал использовать топливный фильтр для авто. Помогает конечно, но приходилось менять каждую вторую неделю. Наверное нужен отстойник для воды. У меня вода подается из общей бочки самотеком.
Про проблемы сдатчика влажности читал в обсуждениях. Контакты окисляются только в рабочем состоянии сенсора? Конечно по хорошему, надо за ними следить, ставить сенсор под каждое растение и поливать каждое по необходимости. Но мне кажется это уже слишком. И как полить одно растение?
Согласен что сенсор необходим и актуален только для горшка или для общей картины в теплице. И следить за ним тоже необходимо.
Подключил свой сенсор и вот что сранно незамкнутый показывает 1023, в воде 430-480, а в мокрой земле 250, непонимаю почему в воде показывает влажность меньше чем в мокрой земле?
Вчера спалил 4 канальный релейный модуль. 5 вольтовый подключил к 12 вольтам, что то переклинело меня:). Жаль.
Вот так поливают каждое по отдельности ))
http://www.youtube.com/watch?v=dL1PuS4LVWQ
Про влажность понятно.
На плате есть транзистеры с маркеровкой J3Y. Возможно и они. Думаю починим.
зачем? В допустимых пределах такая же влажность будет не только у соседних растений, но и на 5-6 ближайших грядках.
Это сильно зависит от глубины погружения сенсора, т.к. "горизонт" у грядок даже на наших болотах может быть чуть разный. И если для цветочного горшка достаточно 10 см, то на грунт, как мне кажется, надо щупы делать длиной сантиметров 20-25 (как раз длина 3мм сварочного электрода).
На плате есть транзистеры с маркеровкой J3Y. Возможно и они. Думаю починим.
Вот так поливают каждое по отдельности ))
http://www.youtube.com/watch?v=dL1PuS4LVWQ
Интересное решение.
На плате есть транзистеры с маркеровкой J3Y. Возможно и они. Думаю починим.
http://www.s-manuals.com/ru/smd/j3
http://www.s-manuals.com/pdf/datasheet/s/8/s8050_galaxy.pdf
Судя по даташиту - не должны они были сгореть от 12 вольт