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

serg69
Offline
Зарегистрирован: 27.12.2015

Есть:

Pro mini 5v/16mg

SSD1306 128x64

DS3231 (ZS-042)

DHT11

DS18B20

BH1750 (YG-302)

YG-38 + YG-69

Servo не определился (надо пробовать, какая потянет)

Хотелось объеденить все в общее управление зимним садом из балкона сделаного 10м2.

YRA
Offline
Зарегистрирован: 10.01.2015

Dachnik ссылка на бибилиотеки из 243 поста не работатет, а при компиляции в IDE 1.7.8 выдает 124 строка

Arduino: 1.7.8 (Windows 7), Плата"Arduino Mega or Mega 2560, ATmega2560 (Mega 2560)"
 
sketch_dachnik_16.09.15_V.ino:124:1: error: 'RTC_DS1307' does not name a type
 
sketch_dachnik_16.09.15_V.ino: In function 'void setup()':
 
sketch_dachnik_16.09.15_V.ino:210:3: error: 'rtc' was not declared in this scope
 
sketch_dachnik_16.09.15_V.ino: In function 'void time()':
 
sketch_dachnik_16.09.15_V.ino:919:18: error: 'rtc' was not declared in this scope
 
Ошибка компиляции.
Как я понимаю, библиотеки мною предложенные  до 124 строки были правильные, ну пока не проверенные , как будут работать на железе
Сегодня
Вообще-то часы реального времени ds3231   поэтому пытаюсь несколько изменить Вас скетч в строках
124 #include <DS3231RTC.h>
125 #include <Time.h>
 и соответственно далее получаю
Arduino: 1.7.8 (Windows 7), Плата"Arduino Mega or Mega 2560, ATmega2560 (Mega 2560)"
 
sketch_dachnik_16.09.15_V.ino: In function 'void setup()':
 
sketch_dachnik_16.09.15_V.ino:213:3: error: 'rtc' was not declared in this scope
 
sketch_dachnik_16.09.15_V.ino: In function 'void time()':
 
sketch_dachnik_16.09.15_V.ino:922:18: error: 'rtc' was not declared in this scope
 
Ошибка компиляции.

 

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

serg69 пока времени нет вам помочь, только советом, попробуйте сами разобраться в коде =)

YRA куда выслать библиотеки?

YRA
Offline
Зарегистрирован: 10.01.2015

Спасибо,Dachnik! За труды праведные и быстрый ответ.

D_J_Instruktor
Offline
Зарегистрирован: 10.01.2016

YRA пишет:

Спасибо,Dachnik! За труды праведные и быстрый ответ.

 YRA У тебя получилось скомпилировать скетч без ошибок с новыми часами? 

YRA
Offline
Зарегистрирован: 10.01.2015

Да я поа не подставлял бибиотеку с 3231 я на библиотеках 1307 скомпилировал но в железе не проверял  пока

 

D_J_Instruktor
Offline
Зарегистрирован: 10.01.2016

YRA пишет:

Да я поа не подставлял бибиотеку с 3231 я на библиотеках 1307 скомпилировал но в железе не проверял  пока

 

У меня скомпилировался файл, подключил дисплей на экране не корректно отображается информация, такое ощущение что библиотеки под мой дисплей не подходят.

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

YRA
Offline
Зарегистрирован: 10.01.2015

Где-то было что вроде подходят библиотеки надо порыть в поиске.Сею вот день был тяжелый еще с пол часа покоыряюсь да на боковую сил нет, но  я пробую менять в 127 строке  на  "RTC_DS3231 rtc;", но знания не хватает библиотека DS3231_master, но давно скачанная.

Вот посмотри здесь 

http://lesson.iarduino.ru/page/podklyuchenie-rtc-chasy-realnogo-vremeni-...

D_J_Instruktor
Offline
Зарегистрирован: 10.01.2016

YRA пишет:

Где-то было что вроде подходят библиотеки надо порыть в поиске.Сею вот день был тяжелый еще с пол часа покоыряюсь да на боковую сил нет, но  я пробую менять в 127 строке  на  "RTC_DS3231 rtc;", но знания не хватает библиотека DS3231_master, но давно скачанная.

Вот посмотри здесь 

http://lesson.iarduino.ru/page/podklyuchenie-rtc-chasy-realnogo-vremeni-ds1302-ds1307-ds3231-k-arduino/

Код можно не править под DS3231 он подходит от 1307 ПРосто залить текущую дату и время через скетч в примерах он там есть.

 

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

Прошивка новая по просьбе. Добавлена помпа повышения давления

/* 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 час полива

 Помпа давления
EEPROM 18 1/0 включение отключени помпы давления

*/

//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 2
#define DHTTYPE DHT22
DHT dht(DHTPIN, DHTTYPE); 
//DHT

//кнопка
// задаем константы кнопок и присваиваем им пины
const int buttonPin = 15;     // центральная кнопка
const int buttonPin_1 = 14;  //левая кнопка 
const int buttonPin_0 = 16;  //правая кнопка
const int ledPin =  13;      // номер выхода светодиода индикатора
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 irr_valve_4 = 35; //№ pin'a четвёртая линия полива
const int rele_7 = 36; //№ pin'a четвёртая линия полива
const int pump = 37; //8 канал помпы давления



// пины управления актуатором
const int open_actuator = 30; //открыть актуатор пином 34
const int close_actuator = 31; //закрыть актуатор пином 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;

//
#define PRESURE_PUMP_EEPROM 18
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
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);

pinMode(rele_7, OUTPUT);
pinMode(pump, 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(rele_7, HIGH);
digitalWrite(pump, 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.");
//sd

//DHT
dht.begin();
//DHT




}
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
//#########################################################################################################
void loop() {
//if (LCD_LED){lcd.backlight();}

time();
termostat();
_nasos();
//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.setCursor(8,0);
  lcd.print(" ");

  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("h=");
  lcd.print(Humidity());
  lcd.print(" %");
  lcd.setCursor(7,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(); 
  pompa(1);
   //digitalWrite(ledPin, LOW);             
   //LCD_LED();      
   //delay(del);
   //digitalWrite(ledPin, HIGH);            
       }     
if (rightbtn) {
    lcd.backlight(); 
  close_windows(); 
  pompa(0);
} 


LCD_LED_OFF(); //таймер отключения подсветки

}
//##########################################################################################################33

void menu()
{
actuator_setup();
irrigtion_setup();
irrigation_set_time();
on_off_presure_pump();
}

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);
      }  

 }}


void on_off_presure_pump()
{

lcd.clear(); //очищаем экран
delay(del);
while(1){ //бесконечный цикл 
button_read();

 lcd.setCursor(0,0);
 lcd.print("ON/OFF PRESURE PUMP ");

 lcd.setCursor(0,1);
 lcd.print("=");
 lcd.print(on_or_off(PRESURE_PUMP_EEPROM));
 //lcd.print(on_off);
 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(PRESURE_PUMP_EEPROM, 0);
            digitalWrite(ledPin, HIGH);            
           }       
        
    if (leftbtn) {   
          delay(del); 
          digitalWrite(ledPin, LOW);             
          lcd.clear();
          EEPROM.write(PRESURE_PUMP_EEPROM, 1);
          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);
 int y=EEPROM.read(PRESURE_PUMP_EEPROM);
 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); 
       if (y == 1) {pompa(1);}  
      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);
       pompa(0);  

      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_in() > temp_max) //&& digitalRead(close_actuator)==LOW)
  {
    open_windows();
  }

  if (temp_in() < temp_min)// && digitalRead(open_actuator)==LOW)
  {
  close_windows();
  }
}
void open_windows()
{
    digitalWrite(close_actuator, HIGH);
    delay(100);
    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(100);
    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);
  lcd.setCursor(12,3);
  lcd.print(sensor_min_level_state);
  lcd.setCursor(14,3);
  lcd.print(sensor_max_level_state);

if (sensor_min_level_state == LOW) 
 {

   digitalWrite(nasos, LOW);
      String file_name = "nasos.txt";
      String value = "0";
        lcd.setCursor(12,3);
  lcd.print(sensor_min_level_state);
      sd_write (file_name, value);
 }
if (sensor_max_level_state == HIGH)
 {
 digitalWrite(nasos,HIGH);
      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);
    
  }
  }
}
int Humidity()
{
int h = dht.readHumidity();
return h;
}


void pompa(int value)
{
if (value==1){digitalWrite(pump, LOW);}
if (value==0){digitalWrite(pump, HIGH);}
//else {digitalWrite(pump, HIGH);}

}

 

terminal
Offline
Зарегистрирован: 02.09.2015

Предложение ! Разбить систему на отдельные блоки и создать протокол обмена между блоками.

YRA
Offline
Зарегистрирован: 10.01.2015

dachnik, ну объясни не пойму.

Строка скетча 54 и 53 //№ pin'a четвёртая линия полива 

два выхода на одну линию полива

и далее 148,149, и 150 , если я своим скудным умишкой прикидываю, мы подключаем шильд SD карты, куда по пинам не могу понять, схемку бы????

И поклон, конечно, низкий за туды Ваши, на макетке пока набросил за выходные датчики, часы и  LCD  -залил крайний скет-все заработало. Поскольку коллеги из поднебесной прислали блоки реле 12V? которые работают в инверсном режиме, думаю, как инвернтироватьуправляющие  сигналы реле с ардруины.

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

aleksei84
Offline
Зарегистрирован: 18.01.2016

Доброго времени суток! Подскажите пожалуйста, готовы ли Вы дистанционно проинструктировать создание автоматизации для теплицы, а также написать код под конкретные параметры за согласованное вознаграждение? (alex.baklazhan@yandex.ru) Заранее благодарен за ответ!

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

YRA пишет:

dachnik, ну объясни не пойму.

Строка скетча 54 и 53 //№ pin'a четвёртая линия полива 

два выхода на одну линию полива

 

0051 const int irr_valve_2 = 33; //№ pin'a вторая линия полива
0052 const int irr_valve_3 = 34; //№ pin'a третья линия полива
0053 const int irr_valve_4 = 35; //№ pin'a четвёртая линия полива
0054 const int rele_7 = 36; //№ pin'a четвёртая линия полива
0055

const int pump = 37; //8 канал помпы давления

В упор не вижу? где на однин канал?

YRA пишет:

и далее 148,149, и 150 , если я своим скудным умишкой прикидываю, мы подключаем шильд SD карты, куда по пинам не могу понять, схемку бы????

В инете ищи как подключать модуль SD. я уже не помню, ладно, погуглил за тебя) :

Лучше всего подключать SD карту к пинам hardware SPI, потому-что при ее использовании происходит передача большого количества данных. На "классических платах Arduino (Duemilanove/Diecimila/Uno) это цифровой пин 13 (SCK), 12 (MISO) и 11 (MOSI). Вам также понадобится четвертый пин для цепи 'chip/slave select' (SS). Традиционно используют 10 пин, но можно и другой. Обратите внимание, что если у вас плата Arduino Mega, пины будут отличаться! В этом случае используйте 50 (MISO), 51 (MOSI), 52 (SCK) и 53 (SS) для цепи CS. Опять таки, вы можете изменить пин SS (10 или 53). Но для первого раза рекомендуем подключать именно так для корректной отработки кода, который будет приведен ниже.

  • Подключите пин 5V к пину 5V на Arduino
  • Подключите пин GND к пину GND на Arduino
  • Подключите Пин CLK к пину 13 или 52
  • Подключите DO к пину 12 или 50
  • Подключите DI к пину 11 или 51
  • Подключите CS к пину 10 или 53

 

YRA пишет:

 как инвернтироватьуправляющие  сигналы реле с ардруины.

Если вы читали тему, то я где-то писал, что наткнулся на такойже блок реле, собранным на краснои текстолите. в итоге я поменял на блок из синего текстолита где небыло инвертированного сигнала управления. =)

тут что-то было про инвертирование сигнала:

http://arduino.ru/forum/programmirovanie/rabota-s-knopkami-v-pomoshch-novichku

YRA пишет:

Датчки уровня воды какие использованы Вами????\

 

http://www.ebay.com/sch/i.html?_sacat=0&_nkw=water+level+sensor&_frs=1

Выбирай какие нравятся =)

YRA
Offline
Зарегистрирован: 10.01.2015

Спасибо, за быстрый ответ.С блоками реле буду разбираться, там можно,  решить и с помощью транзисторов, можно самому собрать -вариантов много

За наводку на датчики уровня воды спасибо. 

Вот у меня вопрос так  и не понятен

     const int irr_valve_1 = 32; //№ pin'a первая линия полива
0051 const int irr_valve_2 = 33; //№ pin'a вторая линия полива
0052 const int irr_valve_3 = 34; //№ pin'a третья линия полива
0053 const int irr_valve_4 = 35; //№ pin'a четвёртая линия полива
0054 const int rele_7 = 36; //№ pin'a четвёртая линия полива

 

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

на коммент 0054 строки внимания не обращай, он в программе никак не работает, просто остатки от копирования... =) да и сам канал никак не задействован, просто прописан для дальнейших манипуляций

olegmak3
Offline
Зарегистрирован: 09.10.2014

Женя!

Как увеличить время полива да 8 часов?

В программе можно только да 4-х с копейками.(максимальная величина  1 байта  256)

Мне под дополнительные каналы. Допиливаю потихоньку. Два канала (самых простых) вентиляция и перемешивание воздуха уже сделал.(Мы это в личке обсуждали)

Добавил любое кол-во датчиков 1820. Вроде работает.

Теперь осталось приделать отопление  эл. телым полом в мастерской. Соответственно нужен ночной тариф, а это 8 часов, а не 4 с половиной.

Не обязательно с дискретом в минуту,.Если увеличить дискрет установки в два раза,то одного байта хватит вполне.

Если в функции duration   брать значение байта ,умножать на  2 и дальше уже суммировать ?

Подскажи как.

mrGoReC
Offline
Зарегистрирован: 16.06.2015

Проще всего прикрутить часы реального времени и брать время оттуда и все будет хорошо!!!

mrGoReC
Offline
Зарегистрирован: 16.06.2015

Проще всего прикрутить часы реального времени и брать время оттуда и все будет хорошо!!!

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

Олег, здравствуй.

чтобы значение продолжительности было больше 256 нужно добавить пару этих функций

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]);
}

затем изменить адреса ячеек памяти в массивах клапанов,

0119	int valve_1[5] = {1,2,3,4,5};
0120	int valve_2[5] = {2,6,7,8,9};
0121	int valve_3[5] = {3,10,11,12,13};
0122	int valve_4[5] = {4,14,15,16,17};

(3тий индекс) т.к. теперь на значение продолжительности тратится два байта вместо одного.

0119	int valve_1[5] = {1,2,20,4,5};
0120	int valve_2[5] = {2,6,22,8,9};
0121	int valve_3[5] = {3,10,24,12,13};
0122	int valve_4[5] = {4,14,26,16,17};

Далее где встречается:

EEPROM.read(dur)

заменить на


EEPROM_uint_read(dur)

и

EEPROM.write(dur, duration + 1);

заменить на

EEPROM_uint_write(dur, duration + 1)

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

olegmak3
Offline
Зарегистрирован: 09.10.2014

Женя!

Сгонял сегодня в деревню,т.к. автоматика там.

Вроде все работает. Спасибо.

Вылез косяк со сбросом содержимого EEPROM,но это,видимо, из-за моего БП,особо некогда было тестировать.

На неделе еще посмотрю,и буду уже добавлять отдельные  каналы на отопление (3 канала) и свет.

Сейчас теплый пол висит на 4 канале полива.

Вот какой вопрос будет еще.

Если я установлю время начала ночного тарифа в 23-00,а окончание в 7-00,никаких сюрпризов в обработке алгоритма включения канала (просто хочу скопировать твой алгоритм для полива) не возникнет?

Я имею в виду переход часов от 23-59 к 00-01.

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

olegmak3 пишет:

Если я установлю время начала ночного тарифа в 23-00,а окончание в 7-00,никаких сюрпризов в обработке алгоритма включения канала (просто хочу скопировать твой алгоритм для полива) не возникнет?

Я имею в виду переход часов от 23-59 к 00-01.

Должно всё быть нормуль,

if (minuts > 59) {int x = minuts / 60; hours += x; int y = x * 60; minuts -= y;}

эта строчка это делает

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

Мой проект контроллера теплицы под Arduino Mega: https://www.forumhouse.ru/threads/341712

Страница на гитхабе: https://github.com/Porokhnya/GreenhouseProject

Настраивается многое прямо из написанного конфигуратора. Уже умеет управляться по СМС, в планах - управление через Wi-Fi, со смартфона, с интернета. Обновления выкладываю регулярно. Прошивка пока открытая, нет лишь исходников конфигуратора.

Сейчас написана поддержка: модуль часов DS3231, датчик освещенности BH-1750, модуль управления фрамугами по температуре, модуль управления поливом (настраиваются дни недели, время начала полива, его продолжительность), модуль управления по СМС на базе Neoway M590.

Прошивка в Uno не влезет - надо Мегу, т.к. будет ещё много плюшек. Можно обойтись и без конфигуратора - с контроллером можно общаться по UART текстовыми командами (список команд есть в исходниках прошивки, собирать его в кучу пока не вижу смысла). В общем - неважно, откуда вы получите команду - её можно скормить по UART контроллеру - и он выполнит, что требуется.

Конечно, есть недочёты и фичи, но они оперативно исправляются. Небольшое видео, снятое буквально на днях (хотя там особо не на что смотреть, но тем не менее):

http://www.youtube.com/watch?v=CTE_WIABqKA

Кому интересно - пользуйтесь. Система модульная, можно исключать любой модуль из компиляции. На гитхабе и в теме на форумхаусе всё написано.

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

Всем удачи!

kriss
Offline
Зарегистрирован: 24.01.2014

Библиотеки Вы сами писали для своих модулей?  Где они?

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

kriss пишет:

Библиотеки Вы сами писали для своих модулей?  Где они?

Если вопрос ко мне, то там сейчас используется только одна сторонняя библиотека - DS3231, она есть на гитхабе, в папке LibrariesUsed проекта. Т.е. достаточно скачать весь репозиторий - и библиотека будет входить в комплект. На первой странице проекта всё написано ;)

Впоследствии откажусь от неё, как напишу свой класс для модуля часов.

YRA
Offline
Зарегистрирован: 10.01.2015

DIYMan 

ну не могу скомпилировать в 1,7.8

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

YRA пишет:

DIYMan 

ну не могу скомпилировать в 1,7.8

А что пишет-то? У меня 1.6.7 - всё ок. От сторонних библиотек я избавился - перекачайте проект с гитхаба.

YRA
Offline
Зарегистрирован: 10.01.2015

Да, я скачал проект с гитхаба. Сею попробую вообще все библиотеки удалить, оставить только Ваши,и порбывать скомилировать. IDE сначала требует библиотеку DS3231,ее подставляешь из Вашего архива, он требует далее все библы. Вечером дома  буду пробывать, если только по пятничному варианту не задержусь в гаражах.

YRA
Offline
Зарегистрирован: 10.01.2015

Пробовал искать библы , но что-то не вижу.

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

YRA пишет:

Пробовал искать библы , но что-то не вижу.

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

Вы попробуйте скомпилировать то, что скачали, как есть - откройте файл Main.ino и скомпилируйте. Можно также в файле Globals.h поотключать те модули, которые вам в прошивке не нужны - там есть комментарии.

Если не скомпилируется - выложите плз сообщение об ошибке, если вас не затруднит.

YRA
Offline
Зарегистрирован: 10.01.2015
Добавил еще
 #include <DS3231.h>
#include <EEPROM.h>
#include <Wire.h>
#include <BH1750.h>
и получил  

 

Arduino: 1.7.8 (Windows 7), Плата"Arduino Uno"
 
Main.ino:97:11: error: no matching function for call to 'PinModule::PinModule()'
 
Main.ino:97:11: note: candidates are:
 
In file included from Main.ino:21:0:
 
K:\arduino-1.7.8_DIYMan_Teplichka\libraries\libraries\libraries/PinModule.h:29:5: note: PinModule::PinModule(const String&)
 
     PinModule(const String& id) : AbstractModule(id) {}
 
     ^
 
K:\arduino-1.7.8_DIYMan_Teplichka\libraries\libraries\libraries/PinModule.h:29:5: note:   candidate expects 1 argument, 0 provided
 
K:\arduino-1.7.8_DIYMan_Teplichka\libraries\libraries\libraries/PinModule.h:17:7: note: PinModule::PinModule(const PinModule&)
 
 class PinModule : public AbstractModule
 
       ^
 
K:\arduino-1.7.8_DIYMan_Teplichka\libraries\libraries\libraries/PinModule.h:17:7: note:   candidate expects 1 argument, 0 provided
 
Main.ino:102:12: error: no matching function for call to 'LoopModule::LoopModule()'
 
Main.ino:102:12: note: candidates are:
 
In file included from Main.ino:25:0:
 
K:\arduino-1.7.8_DIYMan_Teplichka\libraries\libraries\libraries/LoopModule.h:61:5: note: LoopModule::LoopModule(const String&)
 
     LoopModule(const String& id) : AbstractModule(id) {}
 
     ^
 
K:\arduino-1.7.8_DIYMan_Teplichka\libraries\libraries\libraries/LoopModule.h:61:5: note:   candidate expects 1 argument, 0 provided
 
K:\arduino-1.7.8_DIYMan_Teplichka\libraries\libraries\libraries/LoopModule.h:51:7: note: LoopModule::LoopModule(const LoopModule&)
 
 class LoopModule : public AbstractModule
 
       ^
 
K:\arduino-1.7.8_DIYMan_Teplichka\libraries\libraries\libraries/LoopModule.h:51:7: note:   candidate expects 1 argument, 0 provided
 
Main.ino:107:12: error: no matching function for call to 'StatModule::StatModule()'
 
Main.ino:107:12: note: candidates are:
 
In file included from Main.ino:29:0:
 
K:\arduino-1.7.8_DIYMan_Teplichka\libraries\libraries\libraries/StatModule.h:12:5: note: StatModule::StatModule(const String&)
 
     StatModule(const String& id) : AbstractModule(id) {}
 
     ^
 
K:\arduino-1.7.8_DIYMan_Teplichka\libraries\libraries\libraries/StatModule.h:12:5: note:   candidate expects 1 argument, 0 provided
 
K:\arduino-1.7.8_DIYMan_Teplichka\libraries\libraries\libraries/StatModule.h:7:7: note: StatModule::StatModule(const StatModule&)
 
 class StatModule : public AbstractModule
 
       ^
 
K:\arduino-1.7.8_DIYMan_Teplichka\libraries\libraries\libraries/StatModule.h:7:7: note:   candidate expects 1 argument, 0 provided
 
Main.ino: In function 'void setup()':
 
Main.ino:250:14: error: 'class ModuleController' has no member named 'begin'
 
Main.ino:260:4: error: 'DS3231Clock' was not declared in this scope
 
Main.ino:260:16: error: expected ';' before 'rtc'
 
Main.ino:261:4: error: 'DS3231Time' was not declared in this scope
 
Main.ino:261:15: error: expected ';' before 'tm'
 
Main.ino:265:9: error: 'rtc' was not declared in this scope
 
Main.ino:265:29: error: 'tm' was not declared in this scope
 
Ошибка компиляции.
 
  Это сообщение будет содержать больше информации чем
  "Отображать вывод во время компиляции"
  включено в Файл > Настройки
 
YRA
Offline
Зарегистрирован: 10.01.2015

Как в сказке:" Чем дальше -тем страшнее!!!"

Тяжело почти в 58 все это осознать.....

Все спать пойдем,любимая женщина уже ргается!!!!

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

YRA пишет:

Arduino: 1.7.8 (Windows 7), Плата"Arduino Uno"
 
K:\arduino-1.7.8_DIYMan_Teplichka\libraries\libraries\libraries/ModuleController.h:12:20: fatal error: DS3231.h: No such file or directory
 #include <DS3231.h>
                    ^
compilation terminated.
Ошибка компиляции.

Юра, все ночные-дневные беты выпускаются для БЕТА-ТЕСТИРОВАНИЯ. И нередко содержат ошибки.

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

Если Вы желаете что-то сделать не имея опыта - то советую использовать стабильную версию софта.

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

На этом форуме неоднократно видел сообщения аналогичные Вашему о проблемах с компиляцией на очередных бетах.

YRA
Offline
Зарегистрирован: 10.01.2015

Да я вроде с 1.7.8 компилирую   и пробую повторять проекты ребят  по тепличкам. Скоро весна у нас еще деньков 25-30 и начнется сезон.Завтра скачаю 1.6.7 как у автора и буду пробывать. Спасибо за учатие и помощь всем, кто разрабатывает ресурс, поклон Вам всем .

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

YRA пишет:

Как в сказке:" Чем дальше -тем страшнее!!!"

Тяжело почти в 58 все это осознать.....

Все спать пойдем,любимая женщина уже ргается!!!!

Ну мне чуть меньше - всего-то 55 %)

НО - рад что попал на проект на ардуино, и на этот форум ;)

Кстати только из-за своего хобби нынешнего - страйкбол.

Если что пиши на мыло at НОЛЬ mix собака bk.ru

 

PS - то что ругается сегодня - ерунда, главное - что любимая ;)

Olezhan
Olezhan аватар
Offline
Зарегистрирован: 01.01.2016

YRA, а почему у вас ардуино уно, если скетч написан под мегу? поменяйте в программе плату и будет счастье!
Спасибо огромное dachnik и DIYMan за ваши хорошие работы.

YRA
Offline
Зарегистрирован: 10.01.2015

Спасибо всем, авторам и всем оказал помощь. Скчал IDE1.6.7 разархивировал https://github.com/Porokhnya/GreenhouseProject  и все скопилировалось в мегу проде записал, но пока только записал буду навешивать оборудывание жду BH1750 из поднебесной, остальное вроде все есть буду пробывать. Спасибо огромное dachnik, его проект повторил и все вроде нормально работает на стапеле, спасибо cofessor, его проект пытаюсь повторить и вроде пока удачно  и DIYMan  буду повторять поклон Вам всем низкий за проделанную работу.

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

Юра, все зависит от отношения.

Некоторые считают что им все во всем обязаны по гроб жизни - и получают люлю.

Другие считают что могут на халяву получить готовый продукт (скетч) не приложив своего ума.

Все эти не-товарищи получают отлуп.

А если человек сам ищет путь, пробует и спотыкается - получает какой-то ответ.....

Вот только результат нужен задающему вопрос а не отвечающему %(

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

YRA, рад, что у вас всё получилось. Если возникнут какие вопросы - обращайтесь. И ещё, такой тонкий момент для запоминания: если захотите протестировать, как работает модуль полива, имейте в виду - мои реле включаются по низкому уровню, соответственно, код прошивки написан именно под это. Если у вас реле включаются высоким уровнем - надо в файле Globals.h найти строчки

#define WATER_RELAY_ON LOW // уровень для включения реле
#define WATER_RELAY_OFF HIGH // уровень для выключения реле
 

и поменять LOW на HIGH и наоборот, чтобы выглядело вот так:

#define WATER_RELAY_ON HIGH// уровень для включения реле
#define WATER_RELAY_OFF LOW// уровень для выключения реле
 

ну и, соответственно, перекомпилировать и закачать прошивку.

YRA
Offline
Зарегистрирован: 10.01.2015

DIYMan спасибо все понял, у меня то же реле работают по низкому уровню, из поднеббесной такие пришли 4-ре блока по 4 шт, но уже собрал самостоятельно,два блока по 4 с управлением на IRF44ZN благодаря этому форуму, но это у мне будет для полива в тепличке с по проекту mrGoReC, поклон ему тоже за помощь и разъяснения.

r00t_krsk
Offline
Зарегистрирован: 12.12.2015

Вот хорошее решение удаленного управления и контроля параметров на мобиле 

http://www.blynk.cc/

http://geektimes.ru/post/268482/

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

Хочу тоже попробовать свои силы на тему ;)

Есть думка использоать гигрометры типа таких

http://ru.aliexpress.com/item/1Pc-Soil-Hygrometer-Humidity-Detection-Module-Moisture-Water-Sensor-Top-Sale/32578782063.html?spm=2114.10010208.100005.1.SQ398D&isOrigTitle=true

http://ru.aliexpress.com/item/Wholesale-10pcs-lot-New-Soil-Hygrometer-Humidity-Detection-Module-Moisture-Water-Sensor-for-Arduino-Register-free/32279127596.html

Вопрос - сколько пинов нужно на их чтение? Можно ли выбор сделать или каждый на свой вход вешать?

Описания подключения пока не нашел....

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

at0mix пишет:

Хочу тоже попробовать свои силы на тему ;)

Есть думка использоать гигрометры типа таких

http://ru.aliexpress.com/item/1Pc-Soil-Hygrometer-Humidity-Detection-Module-Moisture-Water-Sensor-Top-Sale/32578782063.html?spm=2114.10010208.100005.1.SQ398D&isOrigTitle=true

http://ru.aliexpress.com/item/Wholesale-10pcs-lot-New-Soil-Hygrometer-Humidity-Detection-Module-Moisture-Water-Sensor-for-Arduino-Register-free/32279127596.html

Вопрос - сколько пинов нужно на их чтение? Можно ли выбор сделать или каждый на свой вход вешать?

Описания подключения пока не нашел....

полистай тему, может следующие вопросы отпадут...)))

http://arduino.ru/forum/proekty/umnaya-teplitsa?page=7

YRA
Offline
Зарегистрирован: 10.01.2015

Евгения, а вот датчик влажности, кстати, давнхотел спросить Вас и шампуров, живой????

Вот сегодня подключил SD Потихонечку налаживается. Пенсион получу следующий датчики уровня жидкости буду заказывать.

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

В горшке датчик стоял долго, ничего с ним не случилось, можно юзать

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

r00t_krsk пишет:

Вот хорошее решение удаленного управления и контроля параметров на мобиле 

http://www.blynk.cc/

http://geektimes.ru/post/268482/

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

Jaar
Offline
Зарегистрирован: 19.02.2016
Здравствуйте,
Поделитесь, пожалуйста, списком необходимых модулей, датчиков и испол.механизмов. Из скеча все не вытащить новичку и слозжно разбираться в коде  но надеюсь времмено. 

Буду ждать письма на jaar@inbox.lv
Большое спасибо за Вашу работу, и отзывчивость.

 

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

Jaar пишет:

Здравствуйте,
Поделитесь, пожалуйста, списком необходимых модулей, датчиков и испол.механизмов. Из скеча все не вытащить новичку и слозжно разбираться в коде  но надеюсь времмено. 

Буду ждать письма на jaar@inbox.lv
Большое спасибо за Вашу работу, и отзывчивость.

 

Кому, собственно, адресован вопрос?

Олег М.
Олег М. аватар
Offline
Зарегистрирован: 22.11.2015

dachnik пишет:

at0mix пишет:

Хочу тоже попробовать свои силы на тему ;)

Есть думка использоать гигрометры типа таких

http://ru.aliexpress.com/item/1Pc-Soil-Hygrometer-Humidity-Detection-Module-Moisture-Water-Sensor-Top-Sale/32578782063.html?spm=2114.10010208.100005.1.SQ398D&isOrigTitle=true

http://ru.aliexpress.com/item/Wholesale-10pcs-lot-New-Soil-Hygrometer-Humidity-Detection-Module-Moisture-Water-Sensor-for-Arduino-Register-free/32279127596.html

Вопрос - сколько пинов нужно на их чтение? Можно ли выбор сделать или каждый на свой вход вешать?

Описания подключения пока не нашел....

полистай тему, может следующие вопросы отпадут...)))

http://arduino.ru/forum/proekty/umnaya-teplitsa?page=7

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

Правда, такие датчики требуют регулярной доливки воды, но процессами электролиза почву не портят.

Jaar
Offline
Зарегистрирован: 19.02.2016

DIYMan пишет:

Jaar пишет:

Здравствуйте,
Поделитесь, пожалуйста, списком необходимых модулей, датчиков и испол.механизмов. Из скеча все не вытащить новичку и слозжно разбираться в коде  но надеюсь времмено. 

Буду ждать письма на jaar@inbox.lv
Большое спасибо за Вашу работу, и отзывчивость.

 

Кому, собственно, адресован вопрос?

Вопрос адресован Вам и dachniku