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

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

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

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

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

вот код 

001#include <Time.h>
002#include <Wire.h>
003#include <LiquidCrystal.h> // Подключение библиотеки для LCD с кириллицей
004#include <DS1307.h> //Подключение библиотеки для DS1307
005#include <TimeAlarms.h>
006//картинка
007byte man_with_hat[8] =
008{
009  B00100,
010  B00100,
011  B01010,
012  B01010,
013  B10001,
014  B11111,
015  B11111,
016  B01110,
017};
018// Указываем пины подключения LCD 20х4 к Arduino
019#define pinRS  12 // RS  к аналоговому пину 0
020#define pinE   11 // E   к аналоговому пину 1
021#define pinDB4  10 // DB4 к цифровому пину 9
022#define pinDB5  9 // DB5 к цифровому пину 6
023#define pinDB6  8 // DB6 к цифровому пину 8
024#define pinDB7  7 // DB7 к цифровому пину 7
025LiquidCrystal lcd(pinRS, pinE, pinDB4, pinDB5, pinDB6, pinDB7); //Подключаем дисплей
026//******************************************************************************
027int SensorPin = A1;
028int SensorValue;
029 
030void setup()
031  
032{
033  Serial.begin(9600);
034  {
035  
036}
037   
038 pinMode(6, OUTPUT);
039   
040/* Регистрируем собственный символы с кодом 1 */
041  lcd.createChar(1, man_with_hat);
042//**************************************************************************
043 
044  pinMode(SensorPin, INPUT);
045    
046  
047//*************************************************************************
048  lcd.begin(20, 4);
049   
050  //ustanovkaChasov(); //функция настройки часов, если в этом есть необходимость
051 
052//RTC.stop();
053//RTC.set(DS1307_SEC,0);        //set the seconds
054//RTC.set(DS1307_MIN,03);     //set the minutes
055//RTC.set(DS1307_HR,23);       //set the hours
056//RTC.set(DS1307_DOW,5);       //set the day of the week
057//RTC.set(DS1307_DATE,26);       //set the date
058//RTC.set(DS1307_MTH,12);        //set the month
059//RTC.set(DS1307_YR,14);         //set the year
060//RTC.start();
061 
062 
063}
064 
065 
066 
067void loop()
068{
069  {}
070 
071//*********************************************************************************************
072{
073SensorValue = analogRead(SensorPin);
074 
075lcd.setCursor(2,3);
076lcd.print(SensorValue/8);
077delay(1000);
078 
079  lcd.setCursor(0,2);
080  lcd.clear();
081   
082  lcd.setCursor(4,3);
083  lcd.print("%");
084   
085  lcd.setCursor(0,2);
086  lcd.print("     ");
087   
088 lcd.setCursor(0,3);
089 lcd.print("\1");
090   
091  
092   
093  // Вывод единиц в сегменте единиц дней*********************************************************
094  if (RTC.get(DS1307_DATE,false)<=9)//если едициц дней меньше-равно 9, то выводим на 1 шаг правее
095  { lcd.setCursor(0, 0);
096    lcd.print(" ");
097    lcd.setCursor(1, 0);
098    lcd.print (RTC.get(DS1307_DATE,false));}
099  else // иначе (т.е. если единиц дней больше 9, то выводим на 1 шаг левее
100  { lcd.setCursor(0, 0);
101    lcd.print (RTC.get(DS1307_DATE,false));}
102     
103  //Отображение текущего месяца
104  lcd.setCursor(2, 0); //указываем место печати названия месяца
105  switch (RTC.get(DS1307_MTH,false)) // в зависимости от значения месяца печатаем название
106  {
107    case 1:    lcd.print("-01-");    break;
108    case 2:    lcd.print("-02-");    break;
109    case 3:    lcd.print("-03-");    break;
110    case 4:    lcd.print("-04-");    break;
111    case 5:    lcd.print("-05-");    break;
112    case 6:    lcd.print("-06-");    break;
113    case 7:    lcd.print("-07-");    break;
114    case 8:    lcd.print("-08-");    break;
115    case 9:    lcd.print("-09-");    break;
116    case 10:   lcd.print("-10-");    break;
117    case 11:   lcd.print("-11-");    break;
118    case 12:   lcd.print("-12-");    break;
119  }
120   
121  //Отображение текущего года гггг
122  lcd.setCursor(6, 0); // указываем место печати значения года
123  lcd.print(RTC.get(DS1307_YR,false)); // печатаем год
124 
125  // Отображение текущего дня недели
126  lcd.setCursor(11,0); //указываем место печати дня недели
127  switch (RTC.get(DS1307_DOW,false))// в зависимости от номера дня недели выводим на экран
128  {
129    case 1:    lcd.print("/MON/");    break;
130    case 2:    lcd.print("/TUE/");    break;
131    case 3:    lcd.print("/WED/");    break;
132    case 4:    lcd.print("/THU/");    break;
133    case 5:    lcd.print("/FRI/");    break;
134    case 6:    lcd.print("/SAT/");    break;
135    case 7:    lcd.print("/SUN/");    break;
136  }
137   
138  // Отображение времени чч:мм:сс
139  if (RTC.get(DS1307_HR,false)<=9)//если едициц часов меньше-равно 9, то выводим на 1 шаг правее
140  { lcd.setCursor(0, 1);
141    lcd.print("0");
142    lcd.setCursor(1, 1);
143    lcd.print (RTC.get(DS1307_HR,false));}
144  else // иначе (т.е. если единиц часов больше 9, то выводим на 1 шаг левее
145  { lcd.setCursor(0, 1);
146    lcd.print (RTC.get(DS1307_HR,false));}
147  
148 lcd.setCursor(2,1);
149  lcd.print(":"); // печатаем разделитель
150  
151 if (RTC.get(DS1307_MIN,false)<=9)//если едициц минут меньше-равно 9, то выводим на 1 шаг правее
152  { lcd.setCursor(3, 1);
153    lcd.print("0");
154    lcd.setCursor(4, 1);
155    lcd.print (RTC.get(DS1307_MIN,false));}
156  else // иначе (т.е. если единиц минут больше 9, то выводим на 1 шаг левее
157  { lcd.setCursor(3, 1);
158    lcd.print (RTC.get(DS1307_MIN,false));}
159  
160  lcd.setCursor(5,1);
161  lcd.print(":"); // печатаем разделитель
162   
163  if (RTC.get(DS1307_SEC,false)<=9)//если едициц секунд меньше-равно 9, то выводим на 1 шаг правее
164  { lcd.setCursor(6, 1);
165    lcd.print("0");
166    lcd.setCursor(7, 1);
167    lcd.print (RTC.get(DS1307_SEC,false));}
168  else // иначе (т.е. если единиц секунд больше 9, то выводим на 1 шаг левее
169  { lcd.setCursor(6, 1);
170    lcd.print (RTC.get(DS1307_SEC,false));}
171   
172  
173  
174   
175  Serial.print(RTC.get(DS1307_HR,true)); //часы
176  Serial.print(":");
177  Serial.print(RTC.get(DS1307_MIN,false));//минуты
178  Serial.print(":");
179  Serial.print(RTC.get(DS1307_SEC,false));//секунды
180  Serial.print("      ");               
181  Serial.print(RTC.get(DS1307_DATE,false));//дата
182  Serial.print("/");
183  Serial.print(RTC.get(DS1307_MTH,false));//месяц
184  Serial.print("/");
185  Serial.print(RTC.get(DS1307_YR,false)); //год
186  Serial.println();
187   
188  Serial.print (SensorValue/8);
189  Serial.print ("  ");
190   
191  delay(100);
192}}

 

 

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. Я по другому не смог, знаний не хватает.