Помогите с кодом для полива
- Войдите на сайт для отправки комментариев
Сб, 27/12/2014 - 20:05
Помогите с кодом, не могу сообразить с исполнением функции
1) в определённое время по таймеру должен включаться дачик влажности
и если показания ниже (определённого значения ) запустить реле на канале
вот код
001 | #include <Time.h> |
002 | #include <Wire.h> |
003 | #include <LiquidCrystal.h> // Подключение библиотеки для LCD с кириллицей |
004 | #include <DS1307.h> //Подключение библиотеки для DS1307 |
005 | #include <TimeAlarms.h> |
006 | //картинка |
007 | byte 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 |
025 | LiquidCrystal lcd(pinRS, pinE, pinDB4, pinDB5, pinDB6, pinDB7); //Подключаем дисплей |
026 | //****************************************************************************** |
027 | int SensorPin = A1; |
028 | int SensorValue; |
029 |
030 | void 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 |
067 | void loop () |
068 | { |
069 | {} |
070 |
071 | //********************************************************************************************* |
072 | { |
073 | SensorValue = analogRead(SensorPin); |
074 |
075 | lcd.setCursor(2,3); |
076 | lcd.print(SensorValue/8); |
077 | delay(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 | }} |
Честно говоря, не вижу ни одной строки для включения реле, может кроме 38.
да она самая, дальше извините мозгов не хватило , как её привязать к конкретному времени и показаниям датчика
1. Получаем значения времени в переменные.
2. Получаем значение датчика строка .73.
3. при помощи http://arduino.ru/Reference/If прописываем условия.
4. При помощи http://arduino.ru/Reference/DigitalWrite управляем реле.
По п.1, со структурами не работал, возможно кто то подскажет решение более элегантное.
Да и с часами попроще бы, уж очень много наворочено.
а если так
1. если (if) время допустим (18,00,00 )
и датчик >20%
2. то запускаем pin6
3. иначе незапускаем pin6
грубо на как то так наверно , но ещё нужно указать время работы этой операции
а если так
1. если (if) время допустим (18,00,00 )
и датчик >20%
2. то запускаем pin6
3. иначе незапускаем pin6
грубо на как то так наверно , но ещё нужно указать время работы этой операции
Направление в целом верное, только время лучше период или периоды - от до.
Датчик - <, тогда он сам по достижении влажности выключится.
Только время потребуется в более удобочитаемом формате.
попробуйте конструкцию min=(RTC.get(DS1307_MIN,false) и дальше работать с min. Я по другому не смог, знаний не хватает.