Помогите с кодом для полива
- Войдите на сайт для отправки комментариев
Сб, 27/12/2014 - 20:05
Помогите с кодом, не могу сообразить с исполнением функции
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); }}
Честно говоря, не вижу ни одной строки для включения реле, может кроме 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. Я по другому не смог, знаний не хватает.