Главная » Без рубрики » Автополив на Arduino

Автополив на Arduino

схема

Скетч:

// выходы на реле 2,3,11,12
#include <EEPROM.h>
#include <Wire.h>
#include <LiquidCrystal.h>

#define DS1307_I2C_ADDRESS 0x68

LiquidCrystal lcd(8, 9, 4, 5, 6, 7);

int aPin=A1; // вход с датчика влажности
int avalue=0; // переменная для сохранения значения датчика

const byte outPin = 2; // выход на реле включения клапана
const byte out2Pin = 3; // выход на реле включения питания датчика влажности
//int outPin = 2; // выход на реле

byte setMinClockOn; // Таймер 1
byte setHorClockOn;
byte setMinClockOff; //
byte setHorClockOff;

byte set2MinClockOn; // Таймер 2
byte set2HorClockOn;
byte set2MinClockOff; //
byte set2HorClockOff;

byte setMinClockTs; // Время теста 1
byte setHorClockTs;
byte setMinClockTs2; // Время теста 2
byte setHorClockTs2;

byte setValueTs; // Порог влажности теста 1
byte setValueTs2; // Порог влажности теста 2

byte key(){ //// для кнопок ЛСДшилда
int val = analogRead(0);
if (val < 50) return 5;
else if (val < 150) return 3;
else if (val < 350) return 4;
else if (val < 500) return 2;
else if (val < 800) return 1;
else return 0;
}

/////////// часы ..
byte decToBcd(byte val){
return ( (val/10*16) + (val%10) );
}

byte bcdToDec(byte val){
return ( (val/16*10) + (val%16) );
}

void setDateDs1307(byte second, // 0-59
byte minute, // 0-59
byte hour, // 1-23
byte dayOfWeek, // 1-7
byte dayOfMonth, // 1-28/29/30/31
byte month, // 1-12
byte year) // 0-99
{
Wire.beginTransmission(DS1307_I2C_ADDRESS);
Wire.write(0);
Wire.write(decToBcd(second));
Wire.write(decToBcd(minute));
Wire.write(decToBcd(hour));
Wire.write(decToBcd(dayOfWeek));
Wire.write(decToBcd(dayOfMonth));
Wire.write(decToBcd(month));
Wire.write(decToBcd(year));
Wire.endTransmission();
}

void getDateDs1307(byte *second,
byte *minute,
byte *hour,
byte *dayOfWeek,
byte *dayOfMonth,
byte *month,
byte *year)
{

Wire.beginTransmission(DS1307_I2C_ADDRESS);
Wire.write(0);
Wire.endTransmission();

Wire.requestFrom(DS1307_I2C_ADDRESS, 7);

*second = bcdToDec(Wire.read() & 0x7f);
*minute = bcdToDec(Wire.read());
*hour = bcdToDec(Wire.read() & 0x3f);
*dayOfWeek = bcdToDec(Wire.read());
*dayOfMonth = bcdToDec(Wire.read());
*month = bcdToDec(Wire.read());
*year = bcdToDec(Wire.read());
}
////
void setClock(){ // установка часов
byte pos = 1;
byte second, minute, hour, dayOfWeek, dayOfMonth, month, year;
getDateDs1307(&second, &minute, &hour, &dayOfWeek, &dayOfMonth, &month, &year);

lcd.clear();
lcd.blink();

while(key() != 1){ // крутим цикл
byte KEY = key(); // читаем состояние кнопок
delay(200);
lcd.setCursor(1, 1);
lcd.print(«set to save»);
lcd.setCursor(0, 0); // выводим инфу
if (hour < 10) lcd.print(«0»);
lcd.print(hour);
lcd.print(«:»);
if (minute < 10) lcd.print(«0″);
lcd.print(minute);
lcd.print(» «);
if (dayOfMonth < 10) lcd.print(«0»);
lcd.print(dayOfMonth);
lcd.print(«/»);
if (month < 10) lcd.print(«0»);
lcd.print(month);
lcd.print(«/»);
if (year < 10) lcd.print(«0″);
lcd.print(year);

lcd.setCursor(pos, 0); // устанавливаем курсор согласно позиции

if (KEY == 5 && pos < 13) pos += 3; // крутим позицию
else if (KEY == 2 && pos > 1) pos -= 3;

else if (pos == 1 && KEY == 3) hour++; // крутим значения
else if (pos == 1 && KEY == 4) hour—;
else if (pos == 4 && KEY == 3) minute++;
else if (pos == 4 && KEY == 4) minute—;
else if (pos == 7 && KEY == 3) dayOfMonth++;
else if (pos == 7 && KEY == 4) dayOfMonth—;
else if (pos == 10 && KEY == 3) month++;
else if (pos == 10 && KEY == 4) month—;
else if (pos == 13 && KEY == 3) year++;
else if (pos == 13 && KEY == 4) year—;

if (hour > 23) hour = 0;
else if (minute > 59) minute = 0;
else if (dayOfMonth > 31) dayOfMonth = 0;
else if (month > 12) month = 1;
else if (year > 99) year = 0;
}// конец цикла

setDateDs1307(second, minute, hour, dayOfWeek, dayOfMonth, month, year);
lcd.noBlink();
lcd.clear();
lcd.print(» Saved»);
delay(1500);
}///

void setOnOff(){
byte pos = 0;
lcd.clear();
lcd.blink();

while(key() != 1){ // крутим цикл
byte KEY = key(); // читаем состояние кнопок
delay(200);
lcd.setCursor(1, 1);
lcd.print(«set to save»);
lcd.setCursor(0, 0); // первая строка
if (setHorClockOn < 10) lcd.print(«0»);
lcd.print(setHorClockOn);
lcd.print(«:»);
if (setMinClockOn < 10) lcd.print(«0″);
lcd.print(setMinClockOn);
lcd.print(» «);
if (setHorClockOff < 10) lcd.print(«0»);
lcd.print(setHorClockOff);
lcd.print(«:»);
if (setMinClockOff < 10) lcd.print(«0″);
lcd.print(setMinClockOff);

lcd.setCursor(pos, 0); // устанавливаем курсор согласно позиции

if (KEY == 5 && pos < 9) pos += 3; // крутим позицию
else if (KEY == 2 && pos > 1) pos -= 3;

else if (pos == 0 && KEY == 3) setHorClockOn++; // крутим значения
else if (pos == 0 && KEY == 4) setHorClockOn—;
else if (pos == 3 && KEY == 3) setMinClockOn++;
else if (pos == 3 && KEY == 4) setMinClockOn—;
else if (pos == 6 && KEY == 3) setHorClockOff++;
else if (pos == 6 && KEY == 4) setHorClockOff—;
else if (pos == 9 && KEY == 3) setMinClockOff++;
else if (pos == 9 && KEY == 4) setMinClockOff—;

if (setHorClockOn > 23) setHorClockOn = 0;
else if (setMinClockOn > 59) setMinClockOn = 0;
else if (setHorClockOff > 23) setHorClockOff = 0;
else if (setMinClockOff > 59) setMinClockOff = 0;

}// конец цикла
lcd.noBlink();
lcd.clear();

EEPROM.write(0, setMinClockOn);
EEPROM.write(1, setHorClockOn);
EEPROM.write(3, setMinClockOff);
EEPROM.write(4, setHorClockOff);

lcd.print(» Saved»);
delay(1500);
}///

void set2OnOff(){
byte pos = 0;
lcd.clear();
lcd.blink();

while(key() != 1){ // крутим цикл
byte KEY = key(); // читаем состояние кнопок
delay(200);
lcd.setCursor(1, 1);
lcd.print(«set to save»);
lcd.setCursor(0, 0); // выводим инфу
if (set2HorClockOn < 10) lcd.print(«0»);
lcd.print(set2HorClockOn);
lcd.print(«:»);
if (set2MinClockOn < 10) lcd.print(«0″);
lcd.print(set2MinClockOn);
lcd.print(» «);
if (set2HorClockOff < 10) lcd.print(«0»);
lcd.print(set2HorClockOff);
lcd.print(«:»);
if (set2MinClockOff < 10) lcd.print(«0″);
lcd.print(set2MinClockOff);

lcd.setCursor(pos, 0); // устанавливаем курсор согласно позиции

if (KEY == 5 && pos < 9) pos += 3; // крутим позицию
else if (KEY == 2 && pos > 1) pos -= 3;

else if (pos == 0 && KEY == 3) set2HorClockOn++; // крутим значения
else if (pos == 0 && KEY == 4) set2HorClockOn—;
else if (pos == 3 && KEY == 3) set2MinClockOn++;
else if (pos == 3 && KEY == 4) set2MinClockOn—;
else if (pos == 6 && KEY == 3) set2HorClockOff++;
else if (pos == 6 && KEY == 4) set2HorClockOff—;
else if (pos == 9 && KEY == 3) set2MinClockOff++;
else if (pos == 9 && KEY == 4) set2MinClockOff—;

if (set2HorClockOn > 23) set2HorClockOn = 0;
else if (set2MinClockOn > 59) set2MinClockOn = 0;
else if (set2HorClockOff > 23) set2HorClockOff = 0;
else if (set2MinClockOff > 59) set2MinClockOff = 0;

}// конец цикла
lcd.noBlink();
lcd.clear();

EEPROM.write(8, set2MinClockOn);
EEPROM.write(9, set2HorClockOn);
EEPROM.write(10, set2MinClockOff);
EEPROM.write(11, set2HorClockOff);

lcd.print(» Saved»);
delay(1500);
}

void setTest(){
byte pos = 0;
lcd.clear();
lcd.blink();
digitalWrite(out2Pin, LOW);
delay(500);
avalue=analogRead(aPin);
delay(500);
digitalWrite(out2Pin, HIGH);
lcd.setCursor(0, 1);
lcd.print(«Moisture = «);lcd.print(avalue);

while(key() != 1){ // крутим цикл
byte KEY = key(); // читаем состояние кнопок
delay(200);
// lcd.setCursor(1, 1);
// lcd.print(«set to save»);
lcd.setCursor(0, 0); // первая строка
// if (setHorClockTs < 10) lcd.print(«0″);
lcd.print(setHorClockTs);
lcd.print(» «);
// if (setMinClockTs < 10) lcd.print(«0″);
// lcd.print(setMinClockTs);
// lcd.print(» «);
if (setValueTs < 10) lcd.print(«0»);
lcd.print(setValueTs);
lcd.print(«x10″);
lcd.setCursor(pos, 0); // устанавливаем курсор согласно позиции

if (KEY == 5 && pos < 3) pos += 3; // крутим позицию
else if (KEY == 2 && pos > 1) pos -= 3;

else if (pos == 0 && KEY == 3) setHorClockTs++;
else if (pos == 0 && KEY == 4) setHorClockTs—;
// else if (pos == 3 && KEY == 3) setMinClockTs++;
// else if (pos == 3 && KEY == 4) setMinClockTs—;
else if (pos == 3 && KEY == 3) setValueTs++;
else if (pos == 3 && KEY == 4) setValueTs—;

if (setHorClockTs > 1) setHorClockTs = 0;
// else if (setMinClockTs > 59) setMinClockTs = 0;
else if (setValueTs > 99) setValueTs = 0;

}// конец цикла
lcd.noBlink();
lcd.clear();

// EEPROM.write(5, setMinClockTs);
EEPROM.write(6, setHorClockTs);
EEPROM.write(7, setValueTs);

lcd.print(» Saved»);
delay(1500);
}///

void setTest2(){
byte pos = 0;
lcd.clear();
lcd.blink();
digitalWrite(out2Pin, LOW);
delay(500);
avalue=analogRead(aPin);
delay(500);
digitalWrite(out2Pin, HIGH);
lcd.setCursor(0, 1);
lcd.print(«Moisture = «);lcd.print(avalue);

while(key() != 1){ // крутим цикл
byte KEY = key(); // читаем состояние кнопок
delay(200);
// lcd.setCursor(1, 1);
// lcd.print(«set to save»);
lcd.setCursor(0, 0); // первая строка
// if (setHorClockTs < 10) lcd.print(«0″);
lcd.print(setHorClockTs2);
lcd.print(» «);
// if (setMinClockTs < 10) lcd.print(«0″);
// lcd.print(setMinClockTs);
// lcd.print(» «);
if (setValueTs2 < 10) lcd.print(«0»);
lcd.print(setValueTs2);
lcd.print(«x10″);
lcd.setCursor(pos, 0); // устанавливаем курсор согласно позиции

if (KEY == 5 && pos < 3) pos += 3; // крутим позицию
else if (KEY == 2 && pos > 1) pos -= 3;

else if (pos == 0 && KEY == 3) setHorClockTs2++;
else if (pos == 0 && KEY == 4) setHorClockTs2—;
// else if (pos == 3 && KEY == 3) setMinClockTs++;
// else if (pos == 3 && KEY == 4) setMinClockTs—;
else if (pos == 3 && KEY == 3) setValueTs2++;
else if (pos == 3 && KEY == 4) setValueTs2—;

if (setHorClockTs2 > 1) setHorClockTs2 = 0;
// else if (setMinClockTs > 59) setMinClockTs = 0;
else if (setValueTs2 > 99) setValueTs2 = 0;

}// конец цикла
lcd.noBlink();
lcd.clear();

// EEPROM.write(12, setMinClockTs2);
EEPROM.write(13, setHorClockTs2);
EEPROM.write(14, setValueTs2);

lcd.print(» Saved»);
delay(1500);
}///

void setTestDat(){
byte pos = 0;
lcd.clear();
lcd.blink();
digitalWrite(out2Pin, LOW);
while(key() != 1){ // крутим цикл
byte KEY = key(); // читаем состояние кнопок
delay(200);
avalue=analogRead(aPin);
lcd.setCursor(0, 0);
lcd.print(«Moisture = «);lcd.print(avalue);
lcd.setCursor(1, 1);
lcd.print(«set to exit»);

lcd.setCursor(pos, 0); // устанавливаем курсор согласно позиции

if (KEY == 5 && pos < 3) pos += 3; // крутим позицию
else if (KEY == 2 && pos > 1) pos -= 3;

}// конец цикла
digitalWrite(out2Pin, HIGH);
lcd.noBlink();
lcd.clear();
}///
void menu(){
lcd.clear();
char menuTxt[6][14] = {«Timer 1 >», «Timer 2 >», «Timer 1 test>», «Timer 2 test>», «Test datchik>», «Set Clock >»};
byte pos = 0;

while(1){
delay(200);
byte KEY = key();

lcd.setCursor(0, 0);
lcd.print(pos+1);
lcd.print(«.»);
lcd.print(menuTxt[pos]);

if (KEY == 3 && pos != 0) pos—;
else if (KEY == 4 && pos < 5) pos++;

if (KEY == 5 && pos == 0) setOnOff();
else if (KEY == 5 && pos == 1) set2OnOff();
else if (KEY == 5 && pos == 2) setTest();
else if (KEY == 5 && pos == 3) setTest2();
else if (KEY == 5 && pos == 4) setTestDat();
else if (KEY == 5 && pos == 5) setClock();
}
}

void setup(){
Wire.begin();
lcd.begin(16, 2);
lcd.clear();

pinMode(outPin, OUTPUT);
digitalWrite(outPin, HIGH);
pinMode(out2Pin, OUTPUT);
digitalWrite(out2Pin, HIGH);

setMinClockOn = EEPROM.read(0);
setHorClockOn = EEPROM.read(1);
setMinClockOff = EEPROM.read(3);
setHorClockOff = EEPROM.read(4);
setMinClockTs = EEPROM.read(5);
setHorClockTs = EEPROM.read(6);
setValueTs = EEPROM.read(7);

set2MinClockOn = EEPROM.read(8);
set2HorClockOn = EEPROM.read(9);
set2MinClockOff = EEPROM.read(10);
set2HorClockOff = EEPROM.read(11);
setMinClockTs2 = EEPROM.read(12);
setHorClockTs2 = EEPROM.read(13);
setValueTs2 = EEPROM.read(14);
}
void loop()
{
byte second, minute, hour, dayOfWeek, dayOfMonth, month, year;
getDateDs1307(&second, &minute, &hour, &dayOfWeek, &dayOfMonth, &month, &year);

// обработка кнопок
if (key() == 1) menu(); // если нажата селект
else if (key() == 3) digitalWrite(outPin, LOW);
else if (key() == 4) digitalWrite(outPin, HIGH);
/*
// сравниваем время и управляем выходом 1 таймер//
if (setMinClockOff == minute && setHorClockOff == hour
&& second == 0) digitalWrite(outPin, HIGH);
if (setMinClockOn == minute && setHorClockOn == hour
&& second == 0) digitalWrite(outPin, LOW);
*/
// сравниваем время и управляем выходом 1 таймер//
if (setMinClockOff == minute && setHorClockOff == hour
&& second == 0) digitalWrite(outPin, HIGH);
if (setMinClockOn == minute && setHorClockOn == hour
&& second == 0)
{
digitalWrite(out2Pin, LOW);
delay(500);
avalue=analogRead(aPin);
delay(500);
digitalWrite(out2Pin, HIGH);
if (setHorClockTs == 1 && avalue >= setValueTs*10) digitalWrite(outPin, LOW);
if (setHorClockTs == 0) digitalWrite(outPin, LOW);
}

// сравниваем время и управляем выходом 2 таймер //
if (set2MinClockOff == minute && set2HorClockOff == hour
&& second == 0) digitalWrite(outPin, HIGH);
if (set2MinClockOn == minute && set2HorClockOn == hour
&& second == 0)
{
digitalWrite(out2Pin, LOW);
delay(500);
avalue=analogRead(aPin);
delay(500);
digitalWrite(out2Pin, HIGH);
if (setHorClockTs2 == 1 && avalue >= setValueTs2*10) digitalWrite(outPin, LOW);
if (setHorClockTs2 == 0) digitalWrite(outPin, LOW);
}
/*
// сравниваем время и управляем выходом 1 таймер//
if (setMinClockOff == minute && setHorClockOff == hour
&& second == 0) digitalWrite(outPin, HIGH);
if (setMinClockOn == minute && setHorClockOn == hour
&& second == 0) timerOn();
*/

// lcd.clear();
lcd.setCursor(0, 0);
if (hour < 10) lcd.print(«0»);
lcd.print(hour);
lcd.print(«:»);
if (minute < 10) lcd.print(«0»);
lcd.print(minute);

lcd.setCursor(0, 1);
if (dayOfMonth < 10) lcd.print(«0»);
lcd.print(dayOfMonth);
lcd.print(«/»);
if (month < 10) lcd.print(«0»);
lcd.print(month);
lcd.print(«/»);
if (year < 10) lcd.print(«0»);
lcd.print(year);
//
lcd.setCursor(11, 0);
if (setHorClockOn < 10) lcd.print(«0»);
lcd.print(setHorClockOn);
lcd.print(«:»);
if (setMinClockOn < 10) lcd.print(«0»);
lcd.print(setMinClockOn);

lcd.setCursor(11, 1);
if (set2HorClockOn < 10) lcd.print(«0»);
lcd.print(set2HorClockOn);
lcd.print(«:»);
if (set2MinClockOn < 10) lcd.print(«0»);
lcd.print(set2MinClockOn);

lcd.setCursor(7, 0);
if (digitalRead(outPin)) lcd.print(«Off «);
else lcd.print(«On «);

delay(200); // нужно для нармальной работы кнопок
}

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *