Умная теплица

Staryjdub
Offline
Зарегистрирован: 08.04.2016

Доброго всем времени суток!

Оч. заинтересовала тема с ардуинками... Пока обживаюсь в теме, железки разные прикупаю у братьев Китайцев. С последним скетчем никак не пойму - библиотека специальная используется именно для DHT11? У меня почему то не компилится.... 

На всякий случай попробовал с IDE 1.6 , с разными библиотеками но никак .... Обидно! Очень хочется приспособить джойстик на управление!

KOMAPbI4
KOMAPbI4 аватар
Offline
Зарегистрирован: 22.03.2016

Staryjdub пишет:

Доброго всем времени суток!

Оч. заинтересовала тема с ардуинками... - библиотека специальная используется именно для DHT11?.....

 

ага 

Staryjdub
Offline
Зарегистрирован: 08.04.2016

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

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

KOMAPbI4
KOMAPbI4 аватар
Offline
Зарегистрирован: 22.03.2016

http://files.d-lan.dp.ua/download?file=912e624a4a0873afd2c04a04a7fe3b0f

Библиотеки , я добавляю в папку "libraries" - это в каталоге ide. Затем перезапуск ide, и всё ! 

 

Staryjdub
Offline
Зарегистрирован: 08.04.2016

Тут я похоже сам виноват: я паралельно устанавливал flprog, а у нее собственный  arduino ide, и если находит левые библиотеки проблемы с компиляцией....

Тут вот еще с джойстиком вылезла ситуевина: в нулевых положениях значения выходят за пределы в условиях... Может кому поможет☺

Staryjdub
Offline
Зарегистрирован: 08.04.2016

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

dimon8519
Offline
Зарегистрирован: 22.02.2016

KOMAPbI4 пишет:

http://files.d-lan.dp.ua/download?file=912e624a4a0873afd2c04a04a7fe3b0f

Библиотеки , я добавляю в папку "libraries" - это в каталоге ide. Затем перезапуск ide, и всё ! 

 

Приветствую 

Почему то на ваш скетч ругается при компиляции на #include <EEPROM2.h>

установил ваши библиотеки та же беда. у вас библиотека тоже EEPROM.h а вызываете в скетче EEPRO2.h

менял в скетче не помогло 

bpl
Offline
Зарегистрирован: 15.02.2016
Удаление - замена  библиотек в Arduino IDE
 
В папке libraries по пути инсталляции программы (С:\Program Files (x86)\Arduino\libraries) лежат родные библиотеки.
 
 А собственноручно добавленные лежат в папке c: \пользователи\я\мои документы\arduino\libraries\ 
Удалить из обеих мест и установить заново.
 
dimon8519
Offline
Зарегистрирован: 22.02.2016

bpl пишет:

Удаление - замена  библиотек в Arduino IDE
 
В папке libraries по пути инсталляции программы (С:\Program Files (x86)\Arduino\libraries) лежат родные библиотеки.
 
 А собственноручно добавленные лежат в папке c: \пользователи\я\мои документы\arduino\libraries\ 
Удалить из обеих мест и установить заново.
 

спасибо за совет теперь вылазит вот эта ошибка: 

 sketch_apr22a:87: error: 'EEPROM_read_byte' was not declared in this scope    

ИгорьУ
Offline
Зарегистрирован: 24.04.2016

Извените всю ветку не осилил прочитать. Тем не мение есть вопрос. Накопительный бак в теплице он зачем? Чтоб колодезная вода грелась? Не проще ли поставить радиатор, скажем печки от Жигулей для нагрева. Тогда и клапан для стиралки будет работать под давлением от сети центрального насоса. А если есть желание удобрение подать в систему полива, так можно врезать в сеть колбу от водного фильтра или даже несколько паралельно. При желание вообще можно сделать как на стиралке (три лотка под разные моющие средства, отбеливатель, кондиционер) и подавать разные удобрения автоматически и в разное время, предварительно зарядив соответствующие колбы.

И вообще полив когда производить - в темное время суток? 

 

Tomasina
Tomasina аватар
Offline
Зарегистрирован: 09.03.2013

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

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

ИгорьУ
Offline
Зарегистрирован: 24.04.2016

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

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

dachnik
Offline
Зарегистрирован: 26.07.2013

Сегодня заменил синюю бочку на чёную, отказался от наполнения бочки по датчикам(в прошлом году был трэш, когда заклинило датчик...), врезал в бочку наливную гарнитуру за 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);}   

  }

 

Tomasina
Tomasina аватар
Offline
Зарегистрирован: 09.03.2013

а как сделан выход воды из бочки? Какая фурнитура? Не капает?

dachnik
Offline
Зарегистрирован: 26.07.2013

В сантех магазинах есть такая фигня,  называется врезка в бочку 1/2"

Штука отличная, прижимает нормально ничего не капает

Tomasina
Tomasina аватар
Offline
Зарегистрирован: 09.03.2013

о, отлично. А то два года назад была только всякая пластиковая фигня.

ИгорьУ
Offline
Зарегистрирован: 24.04.2016

Вот все пытаюсь доспрашатся - бочка она что только для подогрева воды? С Ардуиной все понятно а вот с бочкой нет. Поясните пожаста.

dachnik
Offline
Зарегистрирован: 26.07.2013

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

ИгорьУ
Offline
Зарегистрирован: 24.04.2016

dachnik пишет:
Аккумулятор теплой воды. Удобное давление для капельной ленты и у меня достаточно места для размещенения бочки под коньком.

Вы писали что пришлось отказаться от клапана стиральной машынки, поскольку давление после бочки было маленькое чтоб он срабатывал. Что вы думаете насчет того, чтобы вместо бочки установить радиатор для нагрева проточной воды из колодца и все же воспользоваться этим клапаном. Радиатор (печка от Жигулей или конденсаторы от больших холодильников) занимает значительно меньше места, его можно установить в самом теплом месте или на солнце. Я вижу пока только один недостаток - полив желательно осуществлять не в жару, когда вода могла бы проточно максимально нагреваться, а утром или вечером. А может полив теплой водой в жару не настолько вреден как прохладная вода утром.

dachnik
Offline
Зарегистрирован: 26.07.2013

Да, от клапана стир машины пришлось отказаться потому что он рассчитан на высокое давление. Пришлось покупать клапана рассчитанные  на мои характеристики.

max кпд этого радиатора будет под лучами солнца, и я сомневаюсь что он достаточно быстро будет нагревать колодезную воду, по любому нужен аккумулятор куда будет этот радиатор складывать и loop'ить нагретое тепло ...  И получается, что если он и будет успевать нагревать проточную воду до нужной темп, то полив будет возможен только в солнцепёк =)

 

ИгорьУ
Offline
Зарегистрирован: 24.04.2016

Я все же попробую собрать по схеме с высоким давлением и проточным нагревом. У меня все уже есть, поэтому никаких дополнительных затрат не предвидится. А бочки все равно нет. Будет альтернативный проект. Буду мерять температуру воды и подбирать оптимальные условия для полива. Алгоритм у меня простой - датчик влажности грунта, влажности, температуры воздуха и освещенности и две релюшки на подачу воды и включение освещения в теплице.

dachnik
Offline
Зарегистрирован: 26.07.2013

Автомобильные радиаторы расчитанны на давление 0.9 - 1.2, более высокое давление может их порвать =)

ИгорьУ
Offline
Зарегистрирован: 24.04.2016

Я имею довольно большие конденсаторы от промышленных холодильников, а они выдерживают давление фреона. У них довольно большая площадь теплообмена. Во вторых радиатор будет стоять уже после клапана и там давления уже не будет высоким, (дай бог памяти, закон труб скорость*давление=константа), так что думаю и автомобильный радиатор выдержыт.

KOMAPbI4
KOMAPbI4 аватар
Offline
Зарегистрирован: 22.03.2016

Оживились садоводы ))) 

KOMAPbI4
KOMAPbI4 аватар
Offline
Зарегистрирован: 22.03.2016

dimon8519 пишет:

bpl пишет:

Удаление - замена  библиотек в Arduino IDE
 
В папке libraries по пути инсталляции программы (С:\Program Files (x86)\Arduino\libraries) лежат родные библиотеки.
 
 А собственноручно добавленные лежат в папке c: \пользователи\я\мои документы\arduino\libraries\ 
Удалить из обеих мест и установить заново.
 

спасибо за совет теперь вылазит вот эта ошибка: 

 sketch_apr22a:87: error: 'EEPROM_read_byte' was not declared in this scope    

 

Спляшем от простого )) - какую плату ардуино вы испольтзуете ???

dimon8519
Offline
Зарегистрирован: 22.02.2016

KOMAPbI4 пишет:

dimon8519 пишет:

bpl пишет:

Удаление - замена  библиотек в Arduino IDE
 
В папке libraries по пути инсталляции программы (С:\Program Files (x86)\Arduino\libraries) лежат родные библиотеки.
 
 А собственноручно добавленные лежат в папке c: \пользователи\я\мои документы\arduino\libraries\ 
Удалить из обеих мест и установить заново.
 

спасибо за совет теперь вылазит вот эта ошибка: 

 sketch_apr22a:87: error: 'EEPROM_read_byte' was not declared in this scope    

 

Спляшем от простого )) - какую плату ардуино вы испольтзуете ???

Сейчас на меге проверяю. 

ИгорьУ
Offline
Зарегистрирован: 24.04.2016

dachnik пишет:

Да, от клапана стир машины пришлось отказаться потому что он рассчитан на высокое давление. Пришлось покупать клапана рассчитанные  на мои характеристики.

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

PaulIV
Offline
Зарегистрирован: 11.10.2015

Serega пишет:

Открытие, закрытие соленойда происходит коротким импульсом 9 в.

Tomasina пишет:

а что за соленоиды с импульсным управлением?

Привет всем.

Это из поста 280 - т.е. они управляются кратковременной подачей питания: открыть - одна полярность, закрыть - смена полярности. Так?

Подсказали бы, уж очень взглянуть на них хочется... Может линк дадите...

Спасибо

ИгорьУ
Offline
Зарегистрирован: 24.04.2016

dachnik пишет:

  сделал нормальную разводку труб для капельной ленты, по две ленты на грядку на быстросьёмных фитингах, шаг ленты 30см. Ленту купил в леруа по 4.5р метр, чтоб не мелочится взял бухту 500метров =) 

Скажите а в чем тут собственно преемущество. Почему нельзя просто проложить металлопластиковую трубу 15мм и  наделать в ней сквозные отверстия?

ИгорьУ
Offline
Зарегистрирован: 24.04.2016

Для теплицы данные с датчиков лучше всего передавать через WiFi а не городить провода. Кто-то знает как это все организовать на ESP2866 модулях. Начал разбираться, совсем устал.

Pyotr
Offline
Зарегистрирован: 12.03.2014

PaulIV пишет:

Привет всем.

Это из поста 280 - т.е. они управляются кратковременной подачей питания: открыть - одна полярность, закрыть - смена полярности. Так?

Подсказали бы, уж очень взглянуть на них хочется... Может линк дадите...

Спасибо

https://www.youtube.com/watch?v=qU-7KVWGDg8

DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

ИгорьУ пишет:

Для теплицы данные с датчиков лучше всего передавать через WiFi а не городить провода. Кто-то знает как это все организовать на ESP2866 модулях. Начал разбираться, совсем устал.

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

По беспроводу, опять же имхо - лучше для датчиков юзать NRF, и собирать все показания на контроллере. Под NRF достаточно тиньки, энергопотребление - не чета вай-фай, от батареек будет работать месяцами.

Опять же - имхо.

dachnik
Offline
Зарегистрирован: 26.07.2013

ИгорьУ пишет:

dachnik пишет:

  сделал нормальную разводку труб для капельной ленты, по две ленты на грядку на быстросьёмных фитингах, шаг ленты 30см. Ленту купил в леруа по 4.5р метр, чтоб не мелочится взял бухту 500метров =) 

Скажите а в чем тут собственно преемущество. Почему нельзя просто проложить металлопластиковую трубу 15мм и  наделать в ней сквозные отверстия?

Сделайте, пройденный этап...да и цена металлопласта несоизмерима с капельной лентой.

Сегодня был пробный пуск системы:

Тест показал, что давления в ~2,6 метра водяного столба достаточно для капельной ленты, пробовал и с помпой повышения давления, и без неё, капает одинаково.

китайского соленойдного клапана из первого поста более чем достаточно для 20 метров линии.

 

ИгорьУ
Offline
Зарегистрирован: 24.04.2016

DIYMan пишет:

По беспроводу, опять же имхо - лучше для датчиков юзать NRF, и собирать все показания на контроллере. Под NRF достаточно тиньки, энергопотребление - не чета вай-фай, от батареек будет работать месяцами.

А какие NRF модули вы предлагаете использовать или они там все одинаковые, Несколько датчиков находящихся в разных местах должны передавать информацию на базу.

 

Pyotr
Offline
Зарегистрирован: 12.03.2014

Делал другу  контроллер для управления микроклиматом теплицы и он захотел, чтобы дома (50 м до теплицы) можно было контролировать температуру в теплице и при аварии или ненормальной ситуации пищал сигнал тревоги.
Сделал ему такой девайс на атмега8 и nRF24L01

Ещё фото на ГринТоке  http://www.greentalk.ru/gallery/album/483-upravlenie-mikroklimatom-teplitcy/
Фотки буду постепенно добавлять, а тему открою попозже.

DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

ИгорьУ пишет:

DIYMan пишет:

По беспроводу, опять же имхо - лучше для датчиков юзать NRF, и собирать все показания на контроллере. Под NRF достаточно тиньки, энергопотребление - не чета вай-фай, от батареек будет работать месяцами.

А какие NRF модули вы предлагаете использовать или они там все одинаковые, Несколько датчиков находящихся в разных местах должны передавать информацию на базу.

 

NRF24L01

Maximus71
Offline
Зарегистрирован: 16.03.2016

Добрый день. Я тут на предыдущей странице интересовался приводом форточки. Так вот построил я так сказать "первую очередь" автоматизации проветривания. Пока приводы двух форточек управляются термореле. Без ардуино. Ее прикручу на следующем этапе.

Тут пара фоток, если интересно: https://goo.gl/photos/CCnt6tbkS4EEMFPY8

Тут видео: https://youtu.be/QzkHQauAeAg

Юра
Offline
Зарегистрирован: 11.05.2016

Всем доброго дня! dachnik подскажите пожалуйста на сколько выдвигается цилиндр .

dachnik
Offline
Зарегистрирован: 26.07.2013

Юра пишет:

Всем доброго дня! dachnik подскажите пожалуйста на сколько выдвигается цилиндр .

У меня выдвижение штока регулируется внутри крышки актуатора, путём подкручивания замыкающих микрухи колёс, выставлял под свои условия, на глаз выдвигается на 30-40см.  Примерный угол открытия дверцы 45гр. 

Юра
Offline
Зарегистрирован: 11.05.2016

Доброго дня.Номер модели не подскажете? Спасибо за ранее.Куда только не звонил в Казани пока нет.Кое ,что интересное сегодня нашел.Может кому либо пригодиться. Механизм для теплицы своими руками. http://usamodelkina.ru/4445-mehanika-dlya-teplicy-svoimi-rukami.html

dachnik
Offline
Зарегистрирован: 26.07.2013

Я тут заказывал

http://antennmarket.ru/index.php?cat=17

lean_74
Offline
Зарегистрирован: 22.12.2015

по цене одного  такого - можно два реечных автомобильных стеклоподъемника "Форвард" заказать, и устанавливать их намного проще, позже выложу фото со своей теплички.

Юра
Offline
Зарегистрирован: 11.05.2016

Да цена не плохо!Ждемс фото от lean_74.Если возможно лучше видео.

dachnik
Offline
Зарегистрирован: 26.07.2013

До кризиса цена была адекватная =)

lean_74
Offline
Зарегистрирован: 22.12.2015

Юра пишет:

Да цена не плохо!Ждемс фото от lean_74.Если возможно лучше видео.

https://youtu.be/renpJ0Adv8U

Юра
Offline
Зарегистрирован: 11.05.2016

Класс! молоток! Электроника и открывалка заводская.По чем купили?

lean_74
Offline
Зарегистрирован: 22.12.2015

Юра пишет:

Класс! молоток! Электроника и открывалка заводская.По чем купили?

Если это мне :) , покупал только стеклопоъемники от производителя две штуки за 2640р

http://www.ts18.ru/forward/price.htm,

управляеет всем своя платка на основе Ардуино. Желающим могу выслать готовый блок 2000 р., или набор для самостоятельной пайки за 1500 с прошитым микрокотроллером.

spa-sam
Offline
Зарегистрирован: 14.12.2012

Pyotr пишет:

Делал другу  контроллер для управления микроклиматом теплицы и он захотел, чтобы дома (50 м до теплицы) можно было контролировать температуру в теплице и при аварии или ненормальной ситуации пищал сигнал тревоги.
Сделал ему такой девайс на атмега8 и nRF24L01

Ещё фото на ГринТоке  http://www.greentalk.ru/gallery/album/483-upravlenie-mikroklimatom-teplitcy/
Фотки буду постепенно добавлять, а тему открою попозже.

 

А как контролируете, что данные пришли дествительно "свежие", а не, к примеру, час назад ?

Pyotr
Offline
Зарегистрирован: 12.03.2014

Вообщет я так спешил сделать  девайс (побыстрей отмазаться), что этот момент упустил из виду. Надо прошить заново МК...

Первое, что пришло в голову. Профи может подскажут другое.
Объявляем глобально  boolean flag;
При проверке буфера устанавливаем флаг

if (radio.available()) {//если есть данные
  flag = 1;
  prevMillis = millis();  //засекаем время
  radio.read(&data, sizeof(data));  //считываем данные
}
в loop() периодически сбрасываем флаг с интервалом большим периодичности поступления данных от передатчика. У меня данные отправляются каждую сек., поэтому сбрасываем флаг каждые 2-3 сек.
Выводим на индикатор    flag*data
При разрыве-отсутствии связи на индикаторе будет "0".
ИгорьУ
Offline
Зарегистрирован: 24.04.2016

Решил поексперементировать с датчиком движения Hc-sr501 для предотвращения краж в теплице. Срабатывает когда хочет. У когото есть опыт с этим датчиком, ну не вставать пять раз за ночь с берданкой. Может какой то другой принцып использовать - растяжку или взвешивание. У кого какие идеи?