Этот вариант работает на моем терре
пришлось воспользоваться другой библиотекой для ds1307
и еще у меня время устанавливается кнопками, вход в режим установки времени - долгим нажатием на кнопку 3
#include <DHT.h> // Подключаем библиотеку для работы с датчиком
#include <DS1307.h> // Подключаем библиотеку управления модулем реального времени
//#include <Time.h> // Подключаем библиотеку работы с часами
//#include <DS1307new.h>
#include <LiquidCrystalExt.h> // Подключаем библиотеку управления экраном
#include <LineDriver.h> // Далее вспомогательные библиотеки для реализации интерфейса SPI
#include <SPI.h>
#include <SPI_Bus.h>
#include <Wire.h>
//#include <LiquidCrystal.h> // Подключаем стандартную библиотеку управления экраном
#include <EEPROM.h> // Подключаем библиотеку для работы с энергонезависимой памятью
// 13 пин к 11 ножке
// 11 пин к 14 ножке
// 5 пин к 12 ножке
// 2, 3 и 4 пины на кнопки
// 12 пин на светодиод режима редактирования
static unsigned long lastTimeDHT = 0; // Декларируем переменную Датчика DHT и устанавливаем ее начальное значение в 0
// static unsigned long lastTimeLCD = 0; // Декларируем переменную для LCD и устанавливаем ее начальное значение в 0
static unsigned long lastTimeSerial = 0; // Декларируем переменную длявывода на монитор и устанавливаем ее начальное значение в 0
unsigned long lastTimeButton = 0; // Декларируем переменную для кнопок управления и устанавливаем ее начальное значение в 0
int setHour;
int setMinute;
int Hour ; // Получаем значение текущего часа
int Minute; // Получаем значение минут
int Second ; // Получаем значение секунд
#define switchPIN_1 2 // Кнопка №1 на 3-ем контакте
#define switchPIN_2 3 // Кнопка №2 на 2-ом контакте
#define switchPIN_3 4 // Кнопка №2 на 2-ом контакте
#define DHTPIN 5 // Считывающий пин с датчика
#define hPIN 6 // Пин управления влажностью
DS1307 rtc (7,8);
#define ledPIN 9 // Пин управления светодиодной лентой
#define tPIN 12 // Пин управления температурой
#define DHTTYPE DHT22 // Модель датчика
Time clock;
int tStatus = HIGH; // определяем переменную, отвечающую за состоянеие нагревателя HIGH=выкл, LOW=вкл
int tempDay ; // Желаемая дневная температура в градусах Цельсия
int tempNight ; // Желаемая ночная температура в градусах Цельсия
int hStatus = HIGH; // определяем переменную, отвечающую за состоянеие увлажнителя HIGH=выкл, LOW=вкл
int humDay ; // Желаемая дневная влажность
int humNight; // Желаемая ночная влажность
int Bright ; //Переменная яркости ленты
int lightOn ; //Начало дня
int lightOff ; //Конец дня
int edit = 0;
long timeSetMicros = 0;
long last_micros = 0; // Вспомогательная переменная, используется для определения сколько микросекунд прошло после предыдущей операции
int lastButton1 = LOW; // Предыдущее состояние кнопки №1
int currentButton1 = LOW; // Текущее состояние кнопки №1
int lastButton2 = LOW; // Предыдущее состояние кнопки №2
int currentButton2 = LOW; // Текущее состояние кнопки №2
int lastButton3 = LOW; // Предыдущее состояние кнопки №3
int currentButton3 = LOW; // Текущее состояние кнопки №3
SPI_Bus shreg(_8bit, 10); // Подключаем сдвиговый регистр
LiquidCrystal lcd(1, 2, 3, 4, 5, 6, &shreg, 7); // Инициализируем дисплей
DHT dht(DHTPIN, DHTTYPE); // Создаем объект dht
//unsigned long lastTimeDHT = 0; // Декларируем переменную и устанавливаем ее начальное значение в 0
float h = 50;
float t = 50;
void setup() // инициализация основных данных
{
Serial.begin(9600); // Инициализируем COM-порт
dht.begin(); // Инициализируем датчик
pinMode(tPIN, OUTPUT); // Определяем пин для управления температурой как Вывод
pinMode(hPIN, OUTPUT);
pinMode(ledPIN, OUTPUT);
pinMode(DHTPIN, INPUT);
digitalWrite(DHTPIN, HIGH);
pinMode(switchPIN_1, INPUT); // Устанавливаем тип контакта Кнопки №1 как Вход
pinMode(switchPIN_2, INPUT); // Устанавливаем тип контакта Кнопки №2 как Вход
pinMode(switchPIN_3, INPUT); // Устанавливаем тип контакта Кнопки №3 как Вход
pinMode(0, OUTPUT);
lcd.begin(16,2); // устанавливаем размеры экрана
tempDay = EEPROM.read(1); // Получаем параметр из первой ячейки
if (tempDay == 255) tempDay = 28; // Если ячейка пуста, т.е. ее значение = 255, то устанавливаем параметр температуры в значение по умолчанию, в данном случае 28С.
tempNight = EEPROM.read(3); // Получаем параметр из второй ячейки
if (tempNight == 255) tempNight = 24; // Если ячейка пуста, т.е. ее значение = 255, то устанавливаем параметр температуры в значение по умолчанию, в данном случае 28С.
lightOn = EEPROM.read(4); // Получаем параметр из первой ячейки
if (lightOn == 255) lightOn = 8; // Если ячейка пуста, т.е. ее значение = 255, то устанавливаем параметр температуры в значение по умолчанию, в данном случае 28С.
lightOff = EEPROM.read(5); // Получаем параметр из первой ячейки
if (lightOff == 255) lightOff = 21; // Если ячейка пуста, т.е. ее значение = 255, то устанавливаем параметр температуры в значение по умолчанию, в данном случае 28С.
// rtc.setTime(21,15,0);
humNight = EEPROM.read(6); // Получаем параметр из шестой ячейки
if (humNight == 255) humNight = 60; // Если ячейка пуста, то установим параметр в 60%
humDay = EEPROM.read(7); // Получаем параметр из второй ячейки
if (humDay == 255) humDay = 60; // Если ячейка пуста, то установим параметр в 60%
rtc.setTime(21,31,0);
}
void loop() // зацикливание (код управляющей программы)
{
clock = rtc.getTime();
if (Serial.available() > 0) SetTime(); // Если на COM-порт поступила информация, то изменим системное время
static unsigned long lastTimeLCD = 0; // Декларируем переменную для LCD и устанавливаем ее начальное значение в 0
//Считываем влажность и температуру каждые 5 сек
if (millis() - lastTimeDHT > 5000) {
h = dht.readHumidity(); // Считываем влажность
t = dht.readTemperature(); // Считываем температуру
lastTimeDHT = millis();
}
int Hour = (clock.hour); // Получаем значение текущего часа
int Minute = (clock.min); // Получаем значение минут
int Second = (clock.sec); // Получаем значение секунд
boolean Day = (Hour >= lightOn & Hour <lightOff); // Если текущий час находится в промежутке от 8 до 20, то действуют дневные параметры
tStatus = (t < ((Day) ? tempDay : tempNight)) ? HIGH:LOW; // Если температура меньше желаемой, то статус обогревателя=Вкл, в противном случае Выкл
digitalWrite(tPIN, tStatus);
hStatus = (h < ((Day) ? humDay : humNight)) ? LOW:HIGH; // Если влажность меньше желаемой, то статус увлажнителя=Вкл, в противном случае Выкл
digitalWrite(hPIN, hStatus);
//digitalWrite(lPIN, (Day) ? LOW:HIGH); // Если дневное время, то включим подсветку
//Закат/Рассвет
if (Hour==lightOn-1) Bright=1+sq(Minute)/15;
else if (Hour==lightOff) Bright=1+sq(60-Minute)/15;
else Bright = (Day) ? 255:0;
analogWrite(ledPIN, Bright);
////
if (millis() - lastTimeSerial >2000) {
{
Serial.print("t=");
Serial.print(t,1);
Serial.print(" h=");
Serial.println(h,1); // Отправляем информацю о климате на COM-порт
Serial.print(Hour);
Serial.print(":");
Serial.print(Minute);
Serial.print(":");
Serial.println(Second);
Serial.println(Bright);
Serial.print("Edit=");
Serial.println(edit);
lastTimeSerial=millis();
};
}
if ( (millis() - lastTimeLCD >150)) // Не используем в данном случае задержку Delay, т.к. это приведет к запаздыванию нажатий кнопок
{
lcd.setCursor(0,0); // устанавливаем позицию курсора на экране (на один символ правее левого верхнего угла)
lcd.print(t, 1);
lcd.print("C");
// lcd.setCursor(6,0);lcd.print("*"); lcd.print(Bright/255, 0); lcd.print("%");
lcd.setCursor(13,0);
lcd.print(h, 0);
lcd.print("%"); // Выводим информацию о климате
if (edit==0){
lcd.setCursor(1,1);
lcd.print((tStatus == HIGH) ? "+ ":" "); // Выводим индикатор работы подогрева
lcd.setCursor(4,1); // устанавливаем курсор для вывода времени
lcd.print(addZero(Hour));
lcd.print(":");
lcd.print(addZero(Minute));
lcd.print(":");
lcd.println(addZero(Second)+" "); // Выводим время
lcd.setCursor(14,1);
lcd.print((hStatus == HIGH) ? "+ ":" "); // Выводим индикатор работы увлажнения
}
lastTimeLCD = millis();
}
// ******************* Опрос для режима редактирования *********************************
Switch();
// ***************************************************
}
/*
ReadDHT ***************************************************************************** /
void ReadDHT()
{ h = dht.readHumidity(); // Считываем влажность
t = dht.readTemperature(); // Считываем температуру
lastTimeDHT = millis();}
//********************ReadDHT**************************************************** */
/* PrintSerial *************************************************************************
void PrintSerial()
{
Serial.print("t=");
Serial.print(t,1);
Serial.print(" h=");
Serial.println(h,1); // Отправляем информацю о климате на COM-порт
Serial.print(Hour);
Serial.print(":");
Serial.print(Minute);
Serial.print(":");
Serial.println(Second);
Serial.println(Bright);
Serial.print("Edit=");
Serial.println(edit);
lastTimeSerial=millis();
}// Отправляем информацию о времени на COM
/* PrintSerial *************************************************************************/
/* SetTime *************************************************************************/
void SetTime() // установка времени из шаблона tчч:мм
{
if (Serial.read() == 't'
// Если первый символ t, то установим указанное время
{
byte h = (Serial.read() - '0'
* 10 + (Serial.read() - '0'
;
Serial.read();
byte m = (Serial.read() - '0'
* 10 + (Serial.read() - '0'
;
rtc.setTime(h,m,0);
}
Serial.flush();
}
/* SetTime *************************************************************************/
String addZero(int val)
{
if (val<10) return "0" + String(val);
else return String(val);
}
//*********************Режим редактпрования******************************************************************************************
void Switch() {
if (millis() - last_micros >= 200) // Производим опрос кнопок каждую треть секунды, это необходимо, чтобы избежать повторных выполнений кода в следствие дребезга контатов
{
last_micros = millis();
currentButton1 = digitalRead(switchPIN_1); // Считываем текущее состояние кнопки №1
currentButton2 = digitalRead(switchPIN_2); // Считываем текущее состояние кнопки №1
currentButton3 = digitalRead(switchPIN_3); // Считываем текущее состояние кнопки №3
if (lastButton1 == LOW && currentButton1 == HIGH) // Если Кнопка №1 изменила состояние на Нажатие
{
long t_millis = millis(); // Фиксируем начальное время нажатие кнопки, чтобы определить, не была ли она зажата
while (digitalRead(switchPIN_1) == HIGH && millis() - t_millis <= 2000 && edit==0 ) {
lcd.clear();
} // Пока кнопка зажата не даем программе двигаться дальше
if (millis() - t_millis > 2000) // Если кнопка была нажата дольше 2-х секунд, то переведем состояние в режим программирования
{
edit = 1;
// digitalWrite(0, HIGH); // Зажгем сигнальный светодиод, чтобы понять что "чудо" произошло
lcd.clear(); lcd.setCursor(1, 1); lcd.print("TempD: ");lcd.print(tempDay); lcd.println("C");lcd.print(" *");
}
// Иначе отрабатываем короткое нажатие при различных условиях
else if (edit==1) { edit = 3;lcd.clear();lcd.setCursor(0, 1);lcd.print("TempN: ");lcd.print(tempNight);lcd.println("C");lcd.print(" *");} // Если программа была в режиме изменения первого параметра, переведем ее на изменение 3 параметра
else if (edit==3) { edit = 4; lcd.clear();lcd.setCursor(0, 1); lcd.print("DaySt: ");lcd.println(lightOn); lcd.print(" *");} //Если программа была в режиме изменения 8 параметра, переведем ее на изменение 9 параметра
else if (edit==4) { edit = 5;lcd.clear();lcd.setCursor(0, 1); lcd.print("DayFin: ");lcd.println(lightOff); lcd.print(" *");}//Если программа была в режиме изменения 9 параметра, переведем ее на изменение 5 параметра
else if (edit==5) { edit = 6;lcd.clear();lcd.setCursor(0, 1); lcd.print("NumDay: ");lcd.println(humDay); lcd.print(" *");}//Если программа была в режиме изменения 9 параметра, переведем ее на изменение 5 параметра
else if (edit==6) { edit = 10;lcd.clear();lcd.setCursor(0, 1); lcd.print("HumNght: ");lcd.println(humNight); lcd.print(" *");}//Если программа была в режиме изменения 9 параметра, переведем ее на изменение 5 параметра
// else if (edit==5) { edit = 98;lcd.clear();lcd.setCursor(0, 1); lcd.print("Set Hour: ");lcd.println(Hour); lcd.print(" *");}//Если программа была в режиме изменения 9 параметра, переведем ее на изменение 5 параметра
else if (edit==98) { edit = 99;lcd.clear();lcd.setCursor(0, 1); lcd.print("Set Minute: ");lcd.println(Minute); lcd.print(" *");}//Если программа была в режиме изменения 9 параметра, переведем ее на изменение 5 параметра
else if (edit==10){ edit = 0;
lcd.clear();
digitalWrite(0, LOW); // Зажгем сигнальный светодиод, чтобы понять что "чудо" произошло
EEPROM.write(1, tempDay); // Запимываем параметр температуры в 1-ю ячейку памямти
EEPROM.write(3, tempNight);
EEPROM.write(4, lightOn);
EEPROM.write(5, lightOff);
EEPROM.write(6, humNight);
EEPROM.write(7, humDay);
}
else if (edit==99){ edit = 0;
lcd.clear();
rtc.setTime(setHour,setMinute,0); }
else {
}; // Если программа не была в режиме редактирования, то можно выполнить тоже какое-то действие, для этого в фигурных скобках необходи описать его функционал
}
if (currentButton2 == HIGH && edit != 0) // Если нажата Кнопка №2, при состоянии редактирования параметров то...
{
if (edit == 1) // ...если режим изменения температуры
{
tempDay = (tempDay == 35) ? 20
tempDay+1);
lcd.setCursor(0, 1); lcd.print("TempD: "); lcd.print(tempDay); lcd.print("C +");
}
else if (edit == 3) // ...если режим изменения влажности
{
tempNight = (tempNight == 30) ? 15
tempNight+1);
lcd.setCursor(0, 1); lcd.print("TempN: "); lcd.print(tempNight); lcd.print("C +");
}
else if (edit == 4) // ...если режим изменения EC
{
lightOn = (lightOn == 23) ? 0
lightOn+1);
lcd.setCursor(0, 1); lcd.print("DaySt: "); lcd.print(lightOn); lcd.print(" + ");
}
else if (edit == 5) // ...если режим изменения DayFin
{
lightOff = (lightOff == 23) ? 0
lightOff+1);
lcd.setCursor(0, 1); lcd.print("DayFin: "); lcd.print(lightOff); lcd.print(" + ");
}
else if (edit == 6) // ...если режим изменения DayFin
{
humDay = (humDay == 80) ? 20
humDay+5);
lcd.setCursor(0, 1); lcd.print("humDay: "); lcd.print(humDay); lcd.print(" + ");
}
else if (edit == 10) // ...если режим изменения DayFin
{
humNight = (humNight == 80) ? 20
humNight+5);
lcd.setCursor(0, 1); lcd.print("humNght: "); lcd.print(humNight); lcd.print(" + ");
}
else if (edit == 98) // ...если режим изменения DayFin
{
setHour = (setHour == 23) ? 0
setHour+1);
lcd.setCursor(0, 1); lcd.print("Set Hour: "); lcd.print(setHour); lcd.print(" + ");
}
else if (edit == 99) // ...если режим изменения DayFin
{
setMinute = (setMinute == 59) ? 0
setMinute+1);
lcd.setCursor(0, 1); lcd.print("Set Minute: "); lcd.print(setMinute); lcd.print(" + ");
}
}
else if (lastButton2 == LOW && currentButton2 == HIGH) // Если было короткое нажатие на Кнопку №2 не в режиме редактирования, то можно выполнить какое либо действие, если описать его в фирных скобках ниже
{
lcd.clear(); lcd.setCursor(0,0);lcd.print("Led Bright");lcd.setCursor(5,1); lcd.print(Bright/255); lcd.print("%");
delay (2000);
lcd.clear();
}
if (currentButton3 == HIGH && edit != 0) // Если нажата Кнопка №3, при состоянии редактирования параметров то...
{
if (edit == 1) // ...если режим изменения температуры
{
tempDay = (tempDay == 20) ? 35
tempDay-1);
lcd.setCursor(0, 1); lcd.print("TempD: "); lcd.print(tempDay); lcd.print("C -");
}
else if (edit == 3) // ...если режим изменения влажности
{
tempNight = (tempNight == 15) ? 30
tempNight-1);
lcd.setCursor(0, 1); lcd.print("TempN: "); lcd.print(tempNight); lcd.print("C -");
}
else if (edit == 4) // ...если режим изменения LightOn
{
lightOn = (lightOn == 0) ? 23
lightOn-1);
lcd.setCursor(0, 1); lcd.print("DaySt: "); lcd.print(lightOn); lcd.print(" - ");
}
else if (edit == 5) // ...если режим изменения LightOff
{
lightOff = (lightOff == 0) ? 23
lightOff-1);
lcd.setCursor(0, 1); lcd.print("DayFin: "); lcd.print(lightOff); lcd.print(" - ");
}
else if (edit == 6) // ...если режим изменения DayFin
{
humDay = (humDay == 20) ? 80
humDay-5);
lcd.setCursor(0, 1); lcd.print("humDay: "); lcd.print(humDay); lcd.print(" - ");
}
else if (edit == 10) // ...если режим изменения DayFin
{
humNight = (humNight == 20) ? 80
humNight-5);
lcd.setCursor(0, 1); lcd.print("humNght: "); lcd.print(humNight); lcd.print(" - ");
}
else if (edit == 98) // ...если режим изменения DayFin
{
setHour = (setHour == 0) ? 23
setHour-1);
lcd.setCursor(0, 1); lcd.print("Set Hour: "); lcd.print(setHour); lcd.print(" - ");
}
else if (edit == 99) // ...если режим изменения DayFin
{
setMinute = (setMinute == 0) ? 59
setMinute-1);
lcd.setCursor(0, 1); lcd.print("Set Minute: "); lcd.print(setMinute); lcd.print(" - ");
}
}
else if (lastButton3 == LOW && currentButton3 == HIGH) // Если было короткое нажатие на Кнопку №3 не в режиме редактирования, то можно выполнить какое либо действие, если описать его в фирных скобках ниже
{long t_millis = millis(); // Фиксируем начальное время нажатие кнопки, чтобы определить, не была ли она зажата
while (digitalRead(switchPIN_3) == HIGH && millis() - t_millis <= 2000 && edit==0 ) {lcd.clear();} // Пока кнопка зажата не даем программе двигаться дальше
if (millis() - t_millis > 2000) // Если кнопка была нажата дольше 2-х секунд, то переведем состояние в режим программирования
{ edit = 98;}
}
lastButton1 = currentButton1; // Запоминаем предыдущее значение Кнопки №1
lastButton2 = currentButton2; // Запоминаем предыдущее значение Кнопки №2
lastButton3 = currentButton3; // Запоминаем предыдущее значение Кнопки №23
}
}
Изменено 19-2-2013 автор Zygomant