Оч. заинтересовала тема с ардуинками... Пока обживаюсь в теме, железки разные прикупаю у братьев Китайцев. С последним скетчем никак не пойму - библиотека специальная используется именно для DHT11? У меня почему то не компилится....
На всякий случай попробовал с IDE 1.6 , с разными библиотеками но никак .... Обидно! Очень хочется приспособить джойстик на управление!
Отож... Пришлось 4 разных библиотеки качать и ставить, пока закомпилилось... Но хуже всего, что не могу найти как корректно удалять установленную библиотеку. По своей простоте душевной не нашел ничего надёжнее как сносить установленную ide оставить заново, подключая новую библиотеку... Чувствую что так не должно быть...
В конце концов залил скетч. теперь траблы с ждойстиком...
Тут я похоже сам виноват: я паралельно устанавливал flprog, а у нее собственный arduino ide, и если находит левые библиотеки проблемы с компиляцией....
Тут вот еще с джойстиком вылезла ситуевина: в нулевых положениях значения выходят за пределы в условиях... Может кому поможет☺
Извените всю ветку не осилил прочитать. Тем не мение есть вопрос. Накопительный бак в теплице он зачем? Чтоб колодезная вода грелась? Не проще ли поставить радиатор, скажем печки от Жигулей для нагрева. Тогда и клапан для стиралки будет работать под давлением от сети центрального насоса. А если есть желание удобрение подать в систему полива, так можно врезать в сеть колбу от водного фильтра или даже несколько паралельно. При желание вообще можно сделать как на стиралке (три лотка под разные моющие средства, отбеливатель, кондиционер) и подавать разные удобрения автоматически и в разное время, предварительно зарядив соответствующие колбы.
И вообще полив когда производить - в темное время суток?
Черная емкость не самая эффективная для нагрева. Вот черная поверхность да. Поэтому черный радиатор на солнце - солнечные коллектора - они даже проточную колодезную воду способны прогревать, особенно если поток воды незначительный (регулируем краном). А что касается пасивного аккумулятора тепла в виде бака с водой - так сама земля в теплице обладает достаточной тепловой инерцией и передавать тепло растениям от бака с водой путем теплопередачи через воздух, кажется малоэффективно.
Как я понял весь фокус сдесь в том, чтоб не использовать всякие сервоприводы на низкое давление воды из бака, а именно использовать на большом давлении дешевые клапаны от стиралки для подачи воды и желательно подогретой.
Сегодня заменил синюю бочку на чёную, отказался от наполнения бочки по датчикам(в прошлом году был трэш, когда заклинило датчик...), врезал в бочку наливную гарнитуру за 150р от унитаза, подвёл трубу от магистрали. Красота! теперь не страшно, что всё зальёт, сделал нормальную разводку труб для капельной ленты, по две ленты на грядку на быстросьёмных фитингах, шаг ленты 30см. Ленту купил в леруа по 4.5р метр, чтоб не мелочится взял бухту 500метров =)
Переделал полностью прошивку, теперь скеч влезет в уно. убрал много гавнокода, разбил всё файлам.
вчершнии фото:
К сожалению фото не все, сегодня тестировал работу. Главное отличие от старой прошивки в поливе, теперь полив зависит от темп воды в баке, и влажности почвы
//LCD I2C 20x4
#include <EEPROM.h>
#include <LiquidCrystal_I2C.h>
#include <Wire.h>
LiquidCrystal_I2C lcd(0x27,20,4);
//LCD
//DHT SENSOR
#include <DHT.h>
#define DHTPIN 4 //номер пина dht датчика
#define DHTTYPE DHT22 // тип dht датчика
DHT dht(DHTPIN, DHTTYPE);
//DHT
const byte temp_min = 0;
const byte temp_max = 1;
const byte eeprom_temp_water_var = 2; //eeproom cell
const byte eeprom_solid_var_1 = 3; //eeproom cell
const byte eeprom_solid_var_2 = 4; //eeproom cell
const byte manual_mode = 5; //eeproom cell
const byte poliv_on_off_1 = 6; //eeproom cell
const byte poliv_on_off_2 = 7; //eeproom cell
const byte actuator_on_off = 8; //eeproom cell
const byte odin = 1;
const byte nol = 0;
const byte ds1 = 0; //DS датчик воды INDEX
const byte ds2 = 1; //DS датчик улицы INDEX
const int ledPin = 13; // номер выхода светодиода индикатора
// задаем константы кнопок и присваиваем им пины
const int buttonPin_1 = 14; //левая кнопка
const int buttonPin = 15; // центральная кнопка
const int buttonPin_0 = 16; //правая кнопка
// пины управления актуатором
const int open_actuator = 30; //пин открыть актуатор
const int close_actuator = 31; //пин закрыть актуатор
const int irr_valve_1 = 32; //№ pin'a первая линия полива
const int irr_valve_2 = 33; //№ pin'a вторая линия полива
const int irr_valve_3 = 34; //№ pin'a клапана налива воды в танк
//пин управления насосом, который заполняет бочку для полива
const int sensor_min_level_tank = 26; //дискретный датчик нижнего уровня воды
const int sensor_max_level_tank = 27; //дискретный датчик верхнего уровня воды
const int soil_vcc = 38; //пин питания датчика влажности почвы
const int sensor_soil_1 = 0; //датчик влажности почвы Analog
const int sensor_soil_2 = 1; //датчик влажности почвы Analog
// глобальные переменные
int centreBtn = 0; // переменная для хранения состояния центральной кнопки
int leftbtn = 0; // переменная для хранения состояния левой кнопки
int rightbtn = 0; // переменная для хранения состояния правой кнопки
int del = 1000; // переменная ожидания между выборами меню(время горения ledpin в милисек)
//подсветка LCD
//int r=0;
//long previousMillis = 0; // храним время
//long interval_2 = 10000; //задержка подсветки
// интервал
//переменные автовозврата в loop
int interval = 200; // интервал сколько будет длиться цикл while, после чего перейдёт к следующему меню.(кол-во итераций)
//
unsigned long prevTime1=0;
unsigned long prevTime2=0;
//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);
//SD card
#include <SPI.h>
#include <SD.h>
File myFile;
//флаги
boolean flag_irr_1 = 0; //флаг разрешения/запрещения полива первой линии
boolean flag_irr_2 = 0; //флаг разрешения/запрещения полива второй линии
boolean flag_valve_tank = 0; //флаг разрешения/запрещения налива бочки полива
boolean flag_open_window = 0; //флаг разрешения/запрещения открытия актатора
boolean flag_close_window = 0; //флаг разрешения/запрещения закрытия актатора
String data_serial_input;
boolean abortMenu; //флаг сброса меню если ничего не нажимать в меню
//надписи меню
String irrigation_on_off_str_1 = "ON/OFF IRRIGATION 1 "; //включение / отключения полива первой грядки
String irrigation_on_off_str_2 = "ON/OFF IRRIGATION 2 "; //включение / отключения полива второй грядки
String actuator_on_off_str = " ON/OFF ACTUATOR "; //включение / отключения проветривания
String eeprom_temp_water_var_str = "SET TEMP WATER TANK"; //установка температуры воды для полива
String eeprom_temp_max_var_str = "TEMP MAXIMUM SETUP"; //максимальная темп актуатора
String eeprom_temp_min_var_str = "TEMP MINIMUM SETUP"; //минимальная темп актуатора
String manual_mode_str = " ON/OFF MANUAL MODE "; //ручной режим (при ON все функции отключены)
String close_actuator_str = "CLOSE ACTUATOR"; //температура при которой закроются форточки
String open_actuator_str = "OPEN ACTUATOR"; //температура при которой откроются форточки
String actuator_setup_str = " -=ACTUATOR SETUP=- ";
String actuator_setup_submenu_str = "ACTUATOR";
String soil_eeprom_var_1_str = "HUMIDITY SOIL 1"; //значение влажности первой грядки
String soil_eeprom_var_2_str = "HUMIDITY SOIL 2"; //значение влажности второй грядки
//int (*pi)();
//void up_down_eeprom_var(byte eeprom_val, String label, int (*var)());
//void swap(int *x, int *y);
void up_down_eeprom_var(byte eeprom_val, String label, int func(int), int param);
//flow-metter
byte sensorInterrupt = 0; // 0 = digital pin 2
byte sensorPin = 2;
// The hall-effect flow sensor outputs approximately 4.5 pulses per second per
// litre/minute of flow.
float calibrationFactor = 4.5;
volatile byte pulseCount;
float flowRate;
unsigned int flowMilliLitres;
unsigned long totalMilliLitres;
unsigned long oldTime;
const byte pump_rele = 37; //pin помпа повышения давления
int total_litres;
#define PRESURE_PUMP_EEPROM 20 //ячейка памяти хранения счётчика литров flowmetr'a
//flow-metter
int sensorTempIn;// = temp_in();
int sensorTempOut; //= temp_ds(ds2);
int sensorTempWater; //= temp_ds(ds1);
int sensorHum; //= Humidity();
int sensorSoilHum1; //= solid_read(sensor_soil_1);
int sensorSoilHum2; //= solid_read(sensor_soil_2);
void setup() {
//pi = &temp_in;
//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
pinMode(ledPin, OUTPUT);
digitalWrite(ledPin, LOW);
pinMode(irr_valve_1, OUTPUT);
pinMode(irr_valve_2, OUTPUT);
pinMode(irr_valve_3, OUTPUT);
pinMode(soil_vcc,OUTPUT);
digitalWrite(soil_vcc, LOW);
digitalWrite(irr_valve_1, HIGH);
digitalWrite(irr_valve_2, HIGH);
digitalWrite(irr_valve_3, HIGH);
pinMode(open_actuator, OUTPUT);
pinMode(close_actuator, OUTPUT);
digitalWrite(open_actuator, HIGH);
digitalWrite(close_actuator, HIGH);
Serial.begin(9600);
// инициализируем пин, подключенный к кнопке, как вход
pinMode(buttonPin, INPUT);
pinMode(buttonPin_0, INPUT);
pinMode(buttonPin_1, INPUT);
pinMode(sensor_min_level_tank, INPUT);
pinMode(sensor_max_level_tank, INPUT);
digitalWrite(sensor_min_level_tank, HIGH);
digitalWrite(sensor_max_level_tank, HIGH);
//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
//DHT
dht.begin();
//DHT
//flow-metter
pinMode(sensorPin, INPUT);
digitalWrite(sensorPin, HIGH);
pulseCount = 0;
flowRate = 0.0;
flowMilliLitres = 0;
totalMilliLitres = 0;
oldTime = 0;
attachInterrupt(sensorInterrupt, pulseCounter, FALLING);
pinMode(pump_rele, OUTPUT);
digitalWrite(pump_rele, HIGH);
//sd
pinMode(53, OUTPUT);
if (!SD.begin(53)) {
Serial.println("initialization SD flash card failed!");
return;
}
Serial.println("initialization SD flash card done.");
//sd
//flow-metter
sensorRead();
strat_all();
_lcd_();
}
void loop() {
if(millis()-prevTime1>10000)
{
// lcd.clear(); //очищаем экран
sensorRead(); //читаем датчики
prevTime1=millis();
strat_all();
_lcd_();
}
waterflow ();
button_read(); //читаем кнопки // проверяем нажата ли кнопка
if (centreBtn) { // проверяем нажата ли кнопка если нажата, то
lcd.backlight();
digitalWrite(ledPin, HIGH);
delay(del);// включаем светодиод
lcd.clear(); //очищаем экран
digitalWrite(ledPin, LOW);
menu();
}
if (leftbtn)
{ //включить подсветочку
lcd.backlight();
// EEPROM_uint_write(PRESURE_PUMP_EEPROM, 0);
}
if (rightbtn) {
lcd.noBacklight();
}
}
//##########################################################################################################33
boolean sd_write (byte manual_mode, byte on_off_x, String file_name, String value)
{
if (EEPROM.read(manual_mode) == 0) //если auto mode
{
if (EEPROM.read(on_off_x) == 1) //если включен полив
{
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);
} //
}
else {return 0;}
}
else {return 0;}
}
void _lcd_()
{
lcd.setCursor(0,0);
lcd.print("tIn =");
lcd.print(sensorTempIn); //темп внутри теплицы (dht)
lcd.print((char)223);
lcd.setCursor(0,1);
lcd.print("tOut=");
lcd.print(sensorTempOut); //темп снаружи теплицы (ds2)
lcd.print((char)223);
lcd.setCursor(0,2);
lcd.print("tW =");
lcd.print(sensorTempWater); //темп воды в баке (ds1820)
lcd.print((char)223);
lcd.setCursor(8,0);
lcd.print("%h=");
lcd.print(sensorHum); // влажность в теплице
lcd.print("%");
lcd.setCursor(8,1);
lcd.print("s1=");
lcd.print(sensorSoilHum1); //влажность первой грядки
lcd.print("% ");
lcd.setCursor(8,2);
lcd.print("s2=");
lcd.print(sensorSoilHum2); //влажность второй грядки
lcd.print("% ");
lcd.setCursor(15,0);
lcd.print("");
lcd.print(EEPROM_uint_read(PRESURE_PUMP_EEPROM)); //влажность второй грядки
lcd.setCursor(7,3);
lcd.print("MENU");
lcd.print(" ");
lcd.print(EEPROM.read(manual_mode));
lcd.print(flag_valve_tank);
lcd.print(flag_irr_1);
lcd.print(flag_irr_2);
lcd.print(flag_open_window);
lcd.print(flag_close_window);
lcd.print(!digitalRead(sensor_min_level_tank));
lcd.print(!digitalRead(sensor_max_level_tank));
}
void menu()
{
abortMenu =0;
on_off_function(manual_mode, manual_mode_str);
on_off_function(poliv_on_off_1, irrigation_on_off_str_1);
on_off_function(poliv_on_off_2, irrigation_on_off_str_2);
on_off_function(actuator_on_off, actuator_on_off_str);
up_down_eeprom_var(eeprom_temp_water_var, eeprom_temp_water_var_str, temp_ds, ds1);
up_down_eeprom_var(temp_min, eeprom_temp_min_var_str, temp_in, 0);
up_down_eeprom_var(temp_max, eeprom_temp_max_var_str, temp_in, 0);
up_down_eeprom_var(eeprom_solid_var_1, soil_eeprom_var_1_str, solid_read, sensor_soil_1);
up_down_eeprom_var(eeprom_solid_var_2, soil_eeprom_var_2_str, solid_read, sensor_soil_2);
//actuator_setup();
}
void up_down_eeprom_var(byte eeprom_val, String label, int func(int), int param)
{
if (abortMenu == 1){return;}
int x =0;
lcd.clear(); //очищаем экран
delay(del);
while(1)
{ //бесконечный цикл
x++;
if (x>interval){lcd.clear(); abortMenu =1; break; }
button_read();
//strat_all();
lcd.setCursor(0,0);
lcd.print(label);
lcd.setCursor(0,1);
lcd.print("set=");
lcd.print(EEPROM.read(eeprom_val));
lcd.print(" now=");
lcd.print(func(param));
lcd.print(" ");
lcd.setCursor(0,2);
lcd.print("____________________");
lcd.setCursor(0,3);
lcd.print("-1 NEXT +1");
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(eeprom_val, EEPROM.read(eeprom_val) + 1);
digitalWrite(ledPin, HIGH);
x =0;
}
if (leftbtn) {
delay(del);
digitalWrite(ledPin, LOW);
lcd.clear();
EEPROM.write(eeprom_val, EEPROM.read(eeprom_val) - 1);
digitalWrite(ledPin, HIGH);
x =0;
}
}
}
void button_read() //функция проверки нажатия кнопки
{
centreBtn = digitalRead(buttonPin); //запоминаем значение кнопки
rightbtn = digitalRead(buttonPin_0); //запоминаем значение кнопки
leftbtn = digitalRead(buttonPin_1); //запоминаем значение кнопки
}
void on_off_function(byte eeprom_cell, String label)
{
if (abortMenu == 1){return;}
int x =0;
lcd.clear(); //очищаем экран
delay(del);
while(1){ //бесконечный цикл
x++;
if (x>interval){lcd.clear(); abortMenu =1; break;}
button_read();
//strat_all();
lcd.setCursor(0,0);
lcd.print(label);
lcd.setCursor(8,1);
// lcd.print("irrigation = ");
lcd.print(on_or_off(eeprom_cell));
//lcd.setCursor(0,1);
//lcd.print("eeprom cell = ");
//lcd.print(eeprom_cell);
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(eeprom_cell, 0);
digitalWrite(ledPin, HIGH);
}
if (leftbtn) {
delay(del);
digitalWrite(ledPin, LOW);
lcd.clear();
EEPROM.write(eeprom_cell, 1);
digitalWrite(ledPin, HIGH);
}
}
}
String on_or_off (byte on_off)
{
int z = EEPROM.read(on_off);
String x;
if (z == 1) {x="ON";}
if (z == 0) {x="OFF";}
return x;
}
void sensorRead()
{
sensorTempIn = temp_in(0);
sensorTempOut = temp_ds(ds2);
sensorTempWater = temp_ds(ds1);
sensorHum = Humidity();
sensorSoilHum1 = solid_read(sensor_soil_1);
sensorSoilHum2 = solid_read(sensor_soil_2);
}
int Humidity()
{
int h = dht.readHumidity();
return h;
}
int temp_ds(int index)
{
// int i = index;
sensors.requestTemperatures(); // Send the command to get temperatures
int in_tempC = sensors.getTempCByIndex(index);
return in_tempC;
}
int temp_in(int index)
{
sensors.requestTemperatures(); // Send the command to get temperatures
int t = dht.readTemperature();
return t;
}
int solid_read(int pin)
{
digitalWrite(soil_vcc, HIGH);
delay(10);
int val = analogRead(pin);// считываем значение
val = map(val, 0 , 1023, 100, 0);
digitalWrite(soil_vcc, LOW);
return val; // выводим полученное значение
}
boolean water_tank()
{
if (EEPROM.read(manual_mode) == 0) //если auto mode
{
if (!digitalRead(sensor_max_level_tank) == LOW){return 1;}
else {return 0;}
}
else {return 0;}
}
boolean poliv(byte sensor_pin, byte eeprom_solid_var)
{
if (temp_ds(ds1) > EEPROM.read(eeprom_temp_water_var ))
{
if (solid_read(sensor_pin) < EEPROM.read(eeprom_solid_var))
{
return 1;
}
else {return 0;}
}
else {return 0;}
}
boolean irr_to_flag(byte manual_mode, byte on_off_x, byte sensor_pin, byte eeprom_solid_var)
{
if (EEPROM.read(manual_mode) == 0) //если auto mode
{
if (EEPROM.read(on_off_x) == 1) //если включен полив
{
if (poliv(sensor_pin, eeprom_solid_var))
{return HIGH;}
else {return 0;}
} //
else {return 0;}
}
else {return 0;}
}
boolean open_window_to_flag(byte on_off_x)
{
if (EEPROM.read(manual_mode) == 0) //если auto mode
{
if (EEPROM.read(on_off_x) == 1)
{
if (sensorTempIn > EEPROM.read(temp_max)) {return 1;}
else {return 0;}
}
else {return 0;}
}
else {return 0;}
}
boolean close_window_to_flag(byte on_off_x)
{
if (EEPROM.read(manual_mode) == 0) //если auto mode
{
if (EEPROM.read(on_off_x) == 1)
{
if (sensorTempIn < EEPROM.read(temp_min)) {return 1;}
else {return 0;}
}
else {return 0;}
}
else {return 0;}
}
void open_windows()
{
digitalWrite(close_actuator, HIGH);
delay(50);
digitalWrite(open_actuator, LOW);
}
void close_windows()
{
digitalWrite(open_actuator, HIGH);
delay(50);
digitalWrite(close_actuator, LOW);
}
void waterflow ()
{
if((millis() - oldTime) > 1000) // Only process counters once per second
{
detachInterrupt(sensorInterrupt);
flowRate = ((1000.0 / (millis() - oldTime)) * pulseCount) / calibrationFactor;
oldTime = millis();
flowMilliLitres = (flowRate / 60) * 1000;
totalMilliLitres += flowMilliLitres;
// unsigned int frac;
// frac = (flowRate - int(flowRate)) * 10;
// display.clearDisplay();
// display.setCursor(0,0);
// display.setTextSize(1);
// display.setTextColor(WHITE);
// display.print("L/min :"); display.print(int(flowRate)); display.print("."); display.print(frac, DEC);
// display.setCursor(0,9);
// display.print("mL/sec :"); display.print(flowMilliLitres);
// display.setCursor(0,18);
// display.print("total mL:"); display.print(totalMilliLitres);
// display.setCursor(0,27);
unsigned int litres = totalMilliLitres/1000;
// display.print("Litres :"); display.print(litres);
unsigned int x= EEPROM_uint_read(PRESURE_PUMP_EEPROM);
if (litres>total_litres){total_litres = litres; EEPROM_uint_write(PRESURE_PUMP_EEPROM, x+1);}
// display.setCursor(0,36);
// display.print("Total L:"); display.print(EEPROM_uint_read(PRESURE_PUMP_EEPROM));
//
// display.display();
pulseCount = 0;
attachInterrupt(sensorInterrupt, pulseCounter, FALLING);
if (flowMilliLitres){
digitalWrite(pump_rele, LOW); }
else {digitalWrite(pump_rele, HIGH);}
}
}
unsigned int EEPROM_uint_read(int addr) {
byte raw[2];
for(byte i = 0; i < 2; i++) raw[i] = EEPROM.read(addr+i);
unsigned int &num = (unsigned int&)raw;
return num;
}
void EEPROM_uint_write(int addr, unsigned int num) {
byte raw[2];
(unsigned int&)raw = num;
for(byte i = 0; i < 2; i++) EEPROM.write(addr+i, raw[i]);
}
void pulseCounter()
{
// счетчик импульсов
pulseCount++;
}
void serial_data(){
String z="data";
if(Serial.available() > 0)
{
//
// data_serial_input = Serial.readStringUntil('\=');
// if (z == data_serial_input){
// Serial.print(flag_valve_tank); }
// Serial.print(data_serial_input);
// String x = data_serial_input;
// Serial.print(x);
// Serial.print(" ");
// if (data_serial_input == "flag_irr_1"){
// Serial.print(data_serial_input);
// Serial.print("flag_irr_1:");
// Serial.print(flag_irr_1);
// Serial.print(";");}
// Serial.print("flag_irr_2:");
// Serial.print(flag_irr_2);
// Serial.print(";");
// Serial.print(flag_valve_tank);
// Serial.print(flag_open_window);
// Serial.print(flag_close_window);
// if (data_serial_input == "hum"){
// Serial.print("Humidity:");
// Serial.print(Humidity());
// Serial.print(";");}
// if (data_serial_input == "i_v_3=1"){
// Serial.print("irr_valve_3=0");
// digitalWrite(irr_valve_3,LOW);
// Serial.print(";");}
}
// else {Serial.print("badCommand"); Serial.flush();}
}
void strat_all()
{
flag_irr_1 = irr_to_flag(manual_mode, poliv_on_off_1, sensor_soil_1, eeprom_solid_var_1);
// prevTime2=millis();
flag_irr_2 = irr_to_flag(manual_mode, poliv_on_off_2, sensor_soil_2, eeprom_solid_var_2);
flag_valve_tank = water_tank();
flag_open_window = open_window_to_flag(actuator_on_off);
flag_close_window = close_window_to_flag(actuator_on_off);
if (flag_irr_1 == 1){digitalWrite(irr_valve_1, LOW);}
else {digitalWrite(irr_valve_1, HIGH);}
if (flag_irr_2 == 1){digitalWrite(irr_valve_2, LOW);}
else {digitalWrite(irr_valve_2, HIGH);}
if (flag_valve_tank == 1){digitalWrite(irr_valve_3, LOW);}
if (flag_valve_tank == 0){digitalWrite(irr_valve_3, HIGH);}
if (flag_open_window == 1){open_windows();}
// else {digitalWrite(open_actuator, HIGH);}
if (flag_close_window == 1){close_windows();}
// else {digitalWrite(close_actuator, HIGH);}
}
Аккумулятор теплой воды. Удобное давление для капельной ленты и у меня достаточно места для размещенения бочки под коньком.
Вы писали что пришлось отказаться от клапана стиральной машынки, поскольку давление после бочки было маленькое чтоб он срабатывал. Что вы думаете насчет того, чтобы вместо бочки установить радиатор для нагрева проточной воды из колодца и все же воспользоваться этим клапаном. Радиатор (печка от Жигулей или конденсаторы от больших холодильников) занимает значительно меньше места, его можно установить в самом теплом месте или на солнце. Я вижу пока только один недостаток - полив желательно осуществлять не в жару, когда вода могла бы проточно максимально нагреваться, а утром или вечером. А может полив теплой водой в жару не настолько вреден как прохладная вода утром.
Да, от клапана стир машины пришлось отказаться потому что он рассчитан на высокое давление. Пришлось покупать клапана рассчитанные на мои характеристики.
max кпд этого радиатора будет под лучами солнца, и я сомневаюсь что он достаточно быстро будет нагревать колодезную воду, по любому нужен аккумулятор куда будет этот радиатор складывать и loop'ить нагретое тепло ... И получается, что если он и будет успевать нагревать проточную воду до нужной темп, то полив будет возможен только в солнцепёк =)
Я все же попробую собрать по схеме с высоким давлением и проточным нагревом. У меня все уже есть, поэтому никаких дополнительных затрат не предвидится. А бочки все равно нет. Будет альтернативный проект. Буду мерять температуру воды и подбирать оптимальные условия для полива. Алгоритм у меня простой - датчик влажности грунта, влажности, температуры воздуха и освещенности и две релюшки на подачу воды и включение освещения в теплице.
Я имею довольно большие конденсаторы от промышленных холодильников, а они выдерживают давление фреона. У них довольно большая площадь теплообмена. Во вторых радиатор будет стоять уже после клапана и там давления уже не будет высоким, (дай бог памяти, закон труб скорость*давление=константа), так что думаю и автомобильный радиатор выдержыт.
Да, от клапана стир машины пришлось отказаться потому что он рассчитан на высокое давление. Пришлось покупать клапана рассчитанные на мои характеристики.
А можно сделать и с бочкой и с клапаном на большое давление. Схема следующая. Насос высокого давления в колодце - клапан стиралки -бочка(входим в бочку снизу а на полив берем сверху). Таким образом у нас бочка будет постоянно полная и именно теплая вода, которая собирается вверху пойдет на полив. Просто и сердито, и ничего городить не надо. Открываете клапан и водичка тепленька пошла.
сделал нормальную разводку труб для капельной ленты, по две ленты на грядку на быстросьёмных фитингах, шаг ленты 30см. Ленту купил в леруа по 4.5р метр, чтоб не мелочится взял бухту 500метров =)
Скажите а в чем тут собственно преемущество. Почему нельзя просто проложить металлопластиковую трубу 15мм и наделать в ней сквозные отверстия?
Для теплицы данные с датчиков лучше всего передавать через WiFi а не городить провода. Кто-то знает как это все организовать на ESP2866 модулях. Начал разбираться, совсем устал.
Для теплицы данные с датчиков лучше всего передавать через WiFi а не городить провода. Кто-то знает как это все организовать на ESP2866 модулях. Начал разбираться, совсем устал.
Вай-фай для датчика в теплице - жирно очень по питанию, такое моё имхо. Плюс глючно, применительно к ESP8266 - как-то подразочаровался я в нём для серьёзных проектов: так, игрушка, не более. Опять же - моё имхо.
По беспроводу, опять же имхо - лучше для датчиков юзать NRF, и собирать все показания на контроллере. Под NRF достаточно тиньки, энергопотребление - не чета вай-фай, от батареек будет работать месяцами.
сделал нормальную разводку труб для капельной ленты, по две ленты на грядку на быстросьёмных фитингах, шаг ленты 30см. Ленту купил в леруа по 4.5р метр, чтоб не мелочится взял бухту 500метров =)
Скажите а в чем тут собственно преемущество. Почему нельзя просто проложить металлопластиковую трубу 15мм и наделать в ней сквозные отверстия?
Сделайте, пройденный этап...да и цена металлопласта несоизмерима с капельной лентой.
Сегодня был пробный пуск системы:
Тест показал, что давления в ~2,6 метра водяного столба достаточно для капельной ленты, пробовал и с помпой повышения давления, и без неё, капает одинаково.
китайского соленойдного клапана из первого поста более чем достаточно для 20 метров линии.
По беспроводу, опять же имхо - лучше для датчиков юзать NRF, и собирать все показания на контроллере. Под NRF достаточно тиньки, энергопотребление - не чета вай-фай, от батареек будет работать месяцами.
А какие NRF модули вы предлагаете использовать или они там все одинаковые, Несколько датчиков находящихся в разных местах должны передавать информацию на базу.
Делал другу контроллер для управления микроклиматом теплицы и он захотел, чтобы дома (50 м до теплицы) можно было контролировать температуру в теплице и при аварии или ненормальной ситуации пищал сигнал тревоги.
Сделал ему такой девайс на атмега8 и nRF24L01
По беспроводу, опять же имхо - лучше для датчиков юзать NRF, и собирать все показания на контроллере. Под NRF достаточно тиньки, энергопотребление - не чета вай-фай, от батареек будет работать месяцами.
А какие NRF модули вы предлагаете использовать или они там все одинаковые, Несколько датчиков находящихся в разных местах должны передавать информацию на базу.
Добрый день. Я тут на предыдущей странице интересовался приводом форточки. Так вот построил я так сказать "первую очередь" автоматизации проветривания. Пока приводы двух форточек управляются термореле. Без ардуино. Ее прикручу на следующем этапе.
Всем доброго дня! dachnik подскажите пожалуйста на сколько выдвигается цилиндр .
У меня выдвижение штока регулируется внутри крышки актуатора, путём подкручивания замыкающих микрухи колёс, выставлял под свои условия, на глаз выдвигается на 30-40см. Примерный угол открытия дверцы 45гр.
по цене одного такого - можно два реечных автомобильных стеклоподъемника "Форвард" заказать, и устанавливать их намного проще, позже выложу фото со своей теплички.
управляеет всем своя платка на основе Ардуино. Желающим могу выслать готовый блок 2000 р., или набор для самостоятельной пайки за 1500 с прошитым микрокотроллером.
Делал другу контроллер для управления микроклиматом теплицы и он захотел, чтобы дома (50 м до теплицы) можно было контролировать температуру в теплице и при аварии или ненормальной ситуации пищал сигнал тревоги.
Сделал ему такой девайс на атмега8 и nRF24L01
Вообщет я так спешил сделать девайс (побыстрей отмазаться), что этот момент упустил из виду. Надо прошить заново МК...
Первое, что пришло в голову. Профи может подскажут другое.
Объявляем глобально boolean flag;
При проверке буфера устанавливаем флаг
if (radio.available()) {//если есть данные
flag = 1;
prevMillis = millis(); //засекаем время
radio.read(&data, sizeof(data)); //считываем данные }
в loop() периодически сбрасываем флаг с интервалом большим периодичности поступления данных от передатчика. У меня данные отправляются каждую сек., поэтому сбрасываем флаг каждые 2-3 сек.
Выводим на индикатор flag*data
При разрыве-отсутствии связи на индикаторе будет "0".
Решил поексперементировать с датчиком движения Hc-sr501 для предотвращения краж в теплице. Срабатывает когда хочет. У когото есть опыт с этим датчиком, ну не вставать пять раз за ночь с берданкой. Может какой то другой принцып использовать - растяжку или взвешивание. У кого какие идеи?
Доброго всем времени суток!
Оч. заинтересовала тема с ардуинками... Пока обживаюсь в теме, железки разные прикупаю у братьев Китайцев. С последним скетчем никак не пойму - библиотека специальная используется именно для DHT11? У меня почему то не компилится....
На всякий случай попробовал с IDE 1.6 , с разными библиотеками но никак .... Обидно! Очень хочется приспособить джойстик на управление!
Доброго всем времени суток!
Оч. заинтересовала тема с ардуинками... - библиотека специальная используется именно для DHT11?.....
ага
Отож... Пришлось 4 разных библиотеки качать и ставить, пока закомпилилось... Но хуже всего, что не могу найти как корректно удалять установленную библиотеку. По своей простоте душевной не нашел ничего надёжнее как сносить установленную ide оставить заново, подключая новую библиотеку... Чувствую что так не должно быть...
В конце концов залил скетч. теперь траблы с ждойстиком...
http://files.d-lan.dp.ua/download?file=912e624a4a0873afd2c04a04a7fe3b0f
Библиотеки , я добавляю в папку "libraries" - это в каталоге ide. Затем перезапуск ide, и всё !
Тут я похоже сам виноват: я паралельно устанавливал flprog, а у нее собственный arduino ide, и если находит левые библиотеки проблемы с компиляцией....
Тут вот еще с джойстиком вылезла ситуевина: в нулевых положениях значения выходят за пределы в условиях... Может кому поможет☺
Как ни странно, в моем случае ситуация с нерабочим джойстиком оказалась чисто аппаратного характера: полетел аналоговый вход на ардуинке...
http://files.d-lan.dp.ua/download?file=912e624a4a0873afd2c04a04a7fe3b0f
Библиотеки , я добавляю в папку "libraries" - это в каталоге ide. Затем перезапуск ide, и всё !
Приветствую
Почему то на ваш скетч ругается при компиляции на #include <EEPROM2.h>
установил ваши библиотеки та же беда. у вас библиотека тоже EEPROM.h а вызываете в скетче EEPRO2.h
менял в скетче не помогло
спасибо за совет теперь вылазит вот эта ошибка:
sketch_apr22a:87: error: 'EEPROM_read_byte' was not declared in this scope
Извените всю ветку не осилил прочитать. Тем не мение есть вопрос. Накопительный бак в теплице он зачем? Чтоб колодезная вода грелась? Не проще ли поставить радиатор, скажем печки от Жигулей для нагрева. Тогда и клапан для стиралки будет работать под давлением от сети центрального насоса. А если есть желание удобрение подать в систему полива, так можно врезать в сеть колбу от водного фильтра или даже несколько паралельно. При желание вообще можно сделать как на стиралке (три лотка под разные моющие средства, отбеливатель, кондиционер) и подавать разные удобрения автоматически и в разное время, предварительно зарядив соответствующие колбы.
И вообще полив когда производить - в темное время суток?
если бак именно в теплице, то основная его роль - аккумулятор тепла. Вода, нагревшаяся за день, не дает теплице быстро остыть ночью.
А для подогрева воды для полива эффективнее использовать черную емкость снаружи.
Черная емкость не самая эффективная для нагрева. Вот черная поверхность да. Поэтому черный радиатор на солнце - солнечные коллектора - они даже проточную колодезную воду способны прогревать, особенно если поток воды незначительный (регулируем краном). А что касается пасивного аккумулятора тепла в виде бака с водой - так сама земля в теплице обладает достаточной тепловой инерцией и передавать тепло растениям от бака с водой путем теплопередачи через воздух, кажется малоэффективно.
Как я понял весь фокус сдесь в том, чтоб не использовать всякие сервоприводы на низкое давление воды из бака, а именно использовать на большом давлении дешевые клапаны от стиралки для подачи воды и желательно подогретой.
Сегодня заменил синюю бочку на чёную, отказался от наполнения бочки по датчикам(в прошлом году был трэш, когда заклинило датчик...), врезал в бочку наливную гарнитуру за 150р от унитаза, подвёл трубу от магистрали. Красота! теперь не страшно, что всё зальёт, сделал нормальную разводку труб для капельной ленты, по две ленты на грядку на быстросьёмных фитингах, шаг ленты 30см. Ленту купил в леруа по 4.5р метр, чтоб не мелочится взял бухту 500метров =)
Переделал полностью прошивку, теперь скеч влезет в уно. убрал много гавнокода, разбил всё файлам.
вчершнии фото:
К сожалению фото не все, сегодня тестировал работу. Главное отличие от старой прошивки в поливе, теперь полив зависит от темп воды в баке, и влажности почвы
а как сделан выход воды из бочки? Какая фурнитура? Не капает?
В сантех магазинах есть такая фигня, называется врезка в бочку 1/2"
Штука отличная, прижимает нормально ничего не капает
о, отлично. А то два года назад была только всякая пластиковая фигня.
Вот все пытаюсь доспрашатся - бочка она что только для подогрева воды? С Ардуиной все понятно а вот с бочкой нет. Поясните пожаста.
Аккумулятор теплой воды. Удобное давление для капельной ленты и у меня достаточно места для размещенения бочки под коньком.
Вы писали что пришлось отказаться от клапана стиральной машынки, поскольку давление после бочки было маленькое чтоб он срабатывал. Что вы думаете насчет того, чтобы вместо бочки установить радиатор для нагрева проточной воды из колодца и все же воспользоваться этим клапаном. Радиатор (печка от Жигулей или конденсаторы от больших холодильников) занимает значительно меньше места, его можно установить в самом теплом месте или на солнце. Я вижу пока только один недостаток - полив желательно осуществлять не в жару, когда вода могла бы проточно максимально нагреваться, а утром или вечером. А может полив теплой водой в жару не настолько вреден как прохладная вода утром.
Да, от клапана стир машины пришлось отказаться потому что он рассчитан на высокое давление. Пришлось покупать клапана рассчитанные на мои характеристики.
max кпд этого радиатора будет под лучами солнца, и я сомневаюсь что он достаточно быстро будет нагревать колодезную воду, по любому нужен аккумулятор куда будет этот радиатор складывать и loop'ить нагретое тепло ... И получается, что если он и будет успевать нагревать проточную воду до нужной темп, то полив будет возможен только в солнцепёк =)
Я все же попробую собрать по схеме с высоким давлением и проточным нагревом. У меня все уже есть, поэтому никаких дополнительных затрат не предвидится. А бочки все равно нет. Будет альтернативный проект. Буду мерять температуру воды и подбирать оптимальные условия для полива. Алгоритм у меня простой - датчик влажности грунта, влажности, температуры воздуха и освещенности и две релюшки на подачу воды и включение освещения в теплице.
Автомобильные радиаторы расчитанны на давление 0.9 - 1.2, более высокое давление может их порвать =)
Я имею довольно большие конденсаторы от промышленных холодильников, а они выдерживают давление фреона. У них довольно большая площадь теплообмена. Во вторых радиатор будет стоять уже после клапана и там давления уже не будет высоким, (дай бог памяти, закон труб скорость*давление=константа), так что думаю и автомобильный радиатор выдержыт.
Оживились садоводы )))
спасибо за совет теперь вылазит вот эта ошибка:
sketch_apr22a:87: error: 'EEPROM_read_byte' was not declared in this scope
Спляшем от простого )) - какую плату ардуино вы испольтзуете ???
спасибо за совет теперь вылазит вот эта ошибка:
sketch_apr22a:87: error: 'EEPROM_read_byte' was not declared in this scope
Спляшем от простого )) - какую плату ардуино вы испольтзуете ???
Сейчас на меге проверяю.
Да, от клапана стир машины пришлось отказаться потому что он рассчитан на высокое давление. Пришлось покупать клапана рассчитанные на мои характеристики.
А можно сделать и с бочкой и с клапаном на большое давление. Схема следующая. Насос высокого давления в колодце - клапан стиралки -бочка(входим в бочку снизу а на полив берем сверху). Таким образом у нас бочка будет постоянно полная и именно теплая вода, которая собирается вверху пойдет на полив. Просто и сердито, и ничего городить не надо. Открываете клапан и водичка тепленька пошла.
Открытие, закрытие соленойда происходит коротким импульсом 9 в.
а что за соленоиды с импульсным управлением?
Привет всем.
Это из поста 280 - т.е. они управляются кратковременной подачей питания: открыть - одна полярность, закрыть - смена полярности. Так?
Подсказали бы, уж очень взглянуть на них хочется... Может линк дадите...
Спасибо
сделал нормальную разводку труб для капельной ленты, по две ленты на грядку на быстросьёмных фитингах, шаг ленты 30см. Ленту купил в леруа по 4.5р метр, чтоб не мелочится взял бухту 500метров =)
Скажите а в чем тут собственно преемущество. Почему нельзя просто проложить металлопластиковую трубу 15мм и наделать в ней сквозные отверстия?
Для теплицы данные с датчиков лучше всего передавать через WiFi а не городить провода. Кто-то знает как это все организовать на ESP2866 модулях. Начал разбираться, совсем устал.
Привет всем.
Это из поста 280 - т.е. они управляются кратковременной подачей питания: открыть - одна полярность, закрыть - смена полярности. Так?
Подсказали бы, уж очень взглянуть на них хочется... Может линк дадите...
Спасибо
https://www.youtube.com/watch?v=qU-7KVWGDg8
Для теплицы данные с датчиков лучше всего передавать через WiFi а не городить провода. Кто-то знает как это все организовать на ESP2866 модулях. Начал разбираться, совсем устал.
Вай-фай для датчика в теплице - жирно очень по питанию, такое моё имхо. Плюс глючно, применительно к ESP8266 - как-то подразочаровался я в нём для серьёзных проектов: так, игрушка, не более. Опять же - моё имхо.
По беспроводу, опять же имхо - лучше для датчиков юзать NRF, и собирать все показания на контроллере. Под NRF достаточно тиньки, энергопотребление - не чета вай-фай, от батареек будет работать месяцами.
Опять же - имхо.
сделал нормальную разводку труб для капельной ленты, по две ленты на грядку на быстросьёмных фитингах, шаг ленты 30см. Ленту купил в леруа по 4.5р метр, чтоб не мелочится взял бухту 500метров =)
Скажите а в чем тут собственно преемущество. Почему нельзя просто проложить металлопластиковую трубу 15мм и наделать в ней сквозные отверстия?
Сделайте, пройденный этап...да и цена металлопласта несоизмерима с капельной лентой.
Сегодня был пробный пуск системы:
Тест показал, что давления в ~2,6 метра водяного столба достаточно для капельной ленты, пробовал и с помпой повышения давления, и без неё, капает одинаково.
китайского соленойдного клапана из первого поста более чем достаточно для 20 метров линии.
По беспроводу, опять же имхо - лучше для датчиков юзать NRF, и собирать все показания на контроллере. Под NRF достаточно тиньки, энергопотребление - не чета вай-фай, от батареек будет работать месяцами.
А какие NRF модули вы предлагаете использовать или они там все одинаковые, Несколько датчиков находящихся в разных местах должны передавать информацию на базу.
Делал другу контроллер для управления микроклиматом теплицы и он захотел, чтобы дома (50 м до теплицы) можно было контролировать температуру в теплице и при аварии или ненормальной ситуации пищал сигнал тревоги.
Сделал ему такой девайс на атмега8 и nRF24L01
Ещё фото на ГринТоке http://www.greentalk.ru/gallery/album/483-upravlenie-mikroklimatom-teplitcy/
Фотки буду постепенно добавлять, а тему открою попозже.
По беспроводу, опять же имхо - лучше для датчиков юзать NRF, и собирать все показания на контроллере. Под NRF достаточно тиньки, энергопотребление - не чета вай-фай, от батареек будет работать месяцами.
А какие NRF модули вы предлагаете использовать или они там все одинаковые, Несколько датчиков находящихся в разных местах должны передавать информацию на базу.
NRF24L01
Добрый день. Я тут на предыдущей странице интересовался приводом форточки. Так вот построил я так сказать "первую очередь" автоматизации проветривания. Пока приводы двух форточек управляются термореле. Без ардуино. Ее прикручу на следующем этапе.
Тут пара фоток, если интересно: https://goo.gl/photos/CCnt6tbkS4EEMFPY8
Тут видео: https://youtu.be/QzkHQauAeAg
Всем доброго дня! dachnik подскажите пожалуйста на сколько выдвигается цилиндр .
Всем доброго дня! dachnik подскажите пожалуйста на сколько выдвигается цилиндр .
У меня выдвижение штока регулируется внутри крышки актуатора, путём подкручивания замыкающих микрухи колёс, выставлял под свои условия, на глаз выдвигается на 30-40см. Примерный угол открытия дверцы 45гр.
Доброго дня.Номер модели не подскажете? Спасибо за ранее.Куда только не звонил в Казани пока нет.Кое ,что интересное сегодня нашел.Может кому либо пригодиться. Механизм для теплицы своими руками. http://usamodelkina.ru/4445-mehanika-dlya-teplicy-svoimi-rukami.html
Я тут заказывал
http://antennmarket.ru/index.php?cat=17
по цене одного такого - можно два реечных автомобильных стеклоподъемника "Форвард" заказать, и устанавливать их намного проще, позже выложу фото со своей теплички.
Да цена не плохо!Ждемс фото от lean_74.Если возможно лучше видео.
До кризиса цена была адекватная =)
Да цена не плохо!Ждемс фото от lean_74.Если возможно лучше видео.
https://youtu.be/renpJ0Adv8U
Класс! молоток! Электроника и открывалка заводская.По чем купили?
Класс! молоток! Электроника и открывалка заводская.По чем купили?
Если это мне :) , покупал только стеклопоъемники от производителя две штуки за 2640р
http://www.ts18.ru/forward/price.htm,
управляеет всем своя платка на основе Ардуино. Желающим могу выслать готовый блок 2000 р., или набор для самостоятельной пайки за 1500 с прошитым микрокотроллером.
Делал другу контроллер для управления микроклиматом теплицы и он захотел, чтобы дома (50 м до теплицы) можно было контролировать температуру в теплице и при аварии или ненормальной ситуации пищал сигнал тревоги.
Сделал ему такой девайс на атмега8 и nRF24L01
Ещё фото на ГринТоке http://www.greentalk.ru/gallery/album/483-upravlenie-mikroklimatom-teplitcy/
Фотки буду постепенно добавлять, а тему открою попозже.
А как контролируете, что данные пришли дествительно "свежие", а не, к примеру, час назад ?
Вообщет я так спешил сделать девайс (побыстрей отмазаться), что этот момент упустил из виду. Надо прошить заново МК...
Первое, что пришло в голову. Профи может подскажут другое.
Объявляем глобально boolean flag;
При проверке буфера устанавливаем флаг
prevMillis = millis(); //засекаем время
}
Выводим на индикатор flag*data
При разрыве-отсутствии связи на индикаторе будет "0".
Решил поексперементировать с датчиком движения Hc-sr501 для предотвращения краж в теплице. Срабатывает когда хочет. У когото есть опыт с этим датчиком, ну не вставать пять раз за ночь с берданкой. Может какой то другой принцып использовать - растяжку или взвешивание. У кого какие идеи?