Помогите с кодом для полива

Marchenko
Marchenko аватар
Offline
Зарегистрирован: 15.12.2014

Помогите с кодом, не могу сообразить с исполнением функции

1) в определённое время по таймеру должен включаться дачик влажности 

и если показания ниже (определённого значения ) запустить реле на канале

вот код 



#include <Time.h>
#include <Wire.h>
#include <LiquidCrystal.h> // Подключение библиотеки для LCD с кириллицей
#include <DS1307.h> //Подключение библиотеки для DS1307
#include <TimeAlarms.h>
//картинка
byte man_with_hat[8] =
{
  B00100,
  B00100,
  B01010,
  B01010,
  B10001,
  B11111,
  B11111,
  B01110,
};
// Указываем пины подключения LCD 20х4 к Arduino
#define pinRS  12 // RS  к аналоговому пину 0
#define pinE   11 // E   к аналоговому пину 1
#define pinDB4  10 // DB4 к цифровому пину 9
#define pinDB5  9 // DB5 к цифровому пину 6
#define pinDB6  8 // DB6 к цифровому пину 8
#define pinDB7  7 // DB7 к цифровому пину 7
LiquidCrystal lcd(pinRS, pinE, pinDB4, pinDB5, pinDB6, pinDB7); //Подключаем дисплей
//******************************************************************************
int SensorPin = A1;
int SensorValue;

void setup()
 
{
  Serial.begin(9600);
  {
 
}
  
 pinMode(6, OUTPUT); 
  
/* Регистрируем собственный символы с кодом 1 */
  lcd.createChar(1, man_with_hat);
//**************************************************************************

  pinMode(SensorPin, INPUT);
   
 
//*************************************************************************
  lcd.begin(20, 4);
  
  //ustanovkaChasov(); //функция настройки часов, если в этом есть необходимость

//RTC.stop();
//RTC.set(DS1307_SEC,0);        //set the seconds
//RTC.set(DS1307_MIN,03);     //set the minutes
//RTC.set(DS1307_HR,23);       //set the hours
//RTC.set(DS1307_DOW,5);       //set the day of the week
//RTC.set(DS1307_DATE,26);       //set the date
//RTC.set(DS1307_MTH,12);        //set the month
//RTC.set(DS1307_YR,14);         //set the year
//RTC.start();


}



void loop()
{
  {}

//*********************************************************************************************
{
SensorValue = analogRead(SensorPin);

lcd.setCursor(2,3);
lcd.print(SensorValue/8);
delay(1000);

  lcd.setCursor(0,2);
  lcd.clear();
  
  lcd.setCursor(4,3);
  lcd.print("%");
  
  lcd.setCursor(0,2);
  lcd.print("     ");
  
 lcd.setCursor(0,3);
 lcd.print("\1");
  
 
  
  // Вывод единиц в сегменте единиц дней*********************************************************
  if (RTC.get(DS1307_DATE,false)<=9)//если едициц дней меньше-равно 9, то выводим на 1 шаг правее
  { lcd.setCursor(0, 0);
    lcd.print(" ");
    lcd.setCursor(1, 0);
    lcd.print (RTC.get(DS1307_DATE,false));}
  else // иначе (т.е. если единиц дней больше 9, то выводим на 1 шаг левее
  { lcd.setCursor(0, 0);
    lcd.print (RTC.get(DS1307_DATE,false));}
    
  //Отображение текущего месяца
  lcd.setCursor(2, 0); //указываем место печати названия месяца
  switch (RTC.get(DS1307_MTH,false)) // в зависимости от значения месяца печатаем название
  {
    case 1:    lcd.print("-01-");    break;
    case 2:    lcd.print("-02-");    break;
    case 3:    lcd.print("-03-");    break;
    case 4:    lcd.print("-04-");    break;
    case 5:    lcd.print("-05-");    break;
    case 6:    lcd.print("-06-");    break;
    case 7:    lcd.print("-07-");    break;
    case 8:    lcd.print("-08-");    break;
    case 9:    lcd.print("-09-");    break;
    case 10:   lcd.print("-10-");    break;
    case 11:   lcd.print("-11-");    break;
    case 12:   lcd.print("-12-");    break;
  }
  
  //Отображение текущего года гггг
  lcd.setCursor(6, 0); // указываем место печати значения года
  lcd.print(RTC.get(DS1307_YR,false)); // печатаем год

  // Отображение текущего дня недели 
  lcd.setCursor(11,0); //указываем место печати дня недели
  switch (RTC.get(DS1307_DOW,false))// в зависимости от номера дня недели выводим на экран
  {
    case 1:    lcd.print("/MON/");    break;
    case 2:    lcd.print("/TUE/");    break;
    case 3:    lcd.print("/WED/");    break;
    case 4:    lcd.print("/THU/");    break;
    case 5:    lcd.print("/FRI/");    break;
    case 6:    lcd.print("/SAT/");    break;
    case 7:    lcd.print("/SUN/");    break;
  }
  
  // Отображение времени чч:мм:сс
  if (RTC.get(DS1307_HR,false)<=9)//если едициц часов меньше-равно 9, то выводим на 1 шаг правее
  { lcd.setCursor(0, 1);
    lcd.print("0");
    lcd.setCursor(1, 1);
    lcd.print (RTC.get(DS1307_HR,false));}
  else // иначе (т.е. если единиц часов больше 9, то выводим на 1 шаг левее
  { lcd.setCursor(0, 1);
    lcd.print (RTC.get(DS1307_HR,false));}
 
 lcd.setCursor(2,1);
  lcd.print(":"); // печатаем разделитель
 
 if (RTC.get(DS1307_MIN,false)<=9)//если едициц минут меньше-равно 9, то выводим на 1 шаг правее
  { lcd.setCursor(3, 1);
    lcd.print("0");
    lcd.setCursor(4, 1);
    lcd.print (RTC.get(DS1307_MIN,false));}
  else // иначе (т.е. если единиц минут больше 9, то выводим на 1 шаг левее
  { lcd.setCursor(3, 1);
    lcd.print (RTC.get(DS1307_MIN,false));}
 
  lcd.setCursor(5,1);
  lcd.print(":"); // печатаем разделитель
  
  if (RTC.get(DS1307_SEC,false)<=9)//если едициц секунд меньше-равно 9, то выводим на 1 шаг правее
  { lcd.setCursor(6, 1);
    lcd.print("0");
    lcd.setCursor(7, 1);
    lcd.print (RTC.get(DS1307_SEC,false));}
  else // иначе (т.е. если единиц секунд больше 9, то выводим на 1 шаг левее
  { lcd.setCursor(6, 1);
    lcd.print (RTC.get(DS1307_SEC,false));}
  
 
 
  
  Serial.print(RTC.get(DS1307_HR,true)); //часы
  Serial.print(":");
  Serial.print(RTC.get(DS1307_MIN,false));//минуты
  Serial.print(":");
  Serial.print(RTC.get(DS1307_SEC,false));//секунды
  Serial.print("      ");                
  Serial.print(RTC.get(DS1307_DATE,false));//дата
  Serial.print("/");
  Serial.print(RTC.get(DS1307_MTH,false));//месяц
  Serial.print("/");
  Serial.print(RTC.get(DS1307_YR,false)); //год
  Serial.println();
  
  Serial.print (SensorValue/8);
  Serial.print ("  ");
  
  delay(100);
}}

 

 

bwn
Offline
Зарегистрирован: 25.08.2014

Честно говоря, не вижу ни одной строки для включения реле, может кроме 38.

Marchenko
Marchenko аватар
Offline
Зарегистрирован: 15.12.2014

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

 

bwn
Offline
Зарегистрирован: 25.08.2014

1. Получаем значения времени в переменные.

2. Получаем значение датчика строка .73.

3. при помощи http://arduino.ru/Reference/If прописываем условия.

4. При помощи http://arduino.ru/Reference/DigitalWrite управляем реле.

По п.1, со структурами не работал, возможно кто то подскажет решение более элегантное.

Да и с часами попроще бы, уж очень много наворочено.

Marchenko
Marchenko аватар
Offline
Зарегистрирован: 15.12.2014

а если так 

1. если (if) время допустим (18,00,00 )

и датчик  >20%

2. то запускаем pin6

3. иначе незапускаем pin6

 

грубо на как то так наверно , но ещё нужно указать время работы этой операции

bwn
Offline
Зарегистрирован: 25.08.2014

Marchenko пишет:

а если так 

1. если (if) время допустим (18,00,00 )

и датчик  >20%

2. то запускаем pin6

3. иначе незапускаем pin6

 

грубо на как то так наверно , но ещё нужно указать время работы этой операции

Направление в целом верное, только время лучше период или периоды - от до.

Датчик  - <, тогда он сам по достижении влажности выключится.

Только время потребуется в более удобочитаемом формате.

Marchenko
Marchenko аватар
Offline
Зарегистрирован: 15.12.2014
вот для затравки сделал , только немогу добавить часы, не хотят вставляться почемуто , а так по этой схеме работает ))
 
 
{ if (RTC.get(DS1307_MIN,false)==38
  && (SensorValue/8)<20)
 
  { digitalWrite(6, HIGH);}
  
  else // иначе 
  { digitalWrite(6, LOW);; }
 
  }
bwn
Offline
Зарегистрирован: 25.08.2014

Marchenko пишет:

вот для затравки сделал , только немогу добавить часы, не хотят вставляться почемуто , а так по этой схеме работает ))
 
 
{ if (RTC.get(DS1307_MIN,false)==38
  && (SensorValue/8)<20)
 
  { digitalWrite(6, HIGH);}
  
  else // иначе 
  { digitalWrite(6, LOW);; }
 
  }

попробуйте конструкцию min=(RTC.get(DS1307_MIN,false) и дальше работать с min. Я по другому не смог, знаний не хватает.