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