#include "DHT.h"
#include "RTClib.h"
#include <LiquidCrystal_I2C.h>
// время
RTC_DS1307 rtc;
// датчик влажности/температуры
#define DHTPIN 2
#define DHTTYPE DHT22
// дисплей
#define I2C_ADDR 0x27
#define LCD_COLUMNS 20
#define LCD_LINES 4
// фоторезистор
#define LDR_PIN A0
const float GAMMA = 0.7;
const float RL10 = 50;
// дни недели для счетчика реального времени
char daysOfTheWeek[7][12] = {"Sunday", "Monday", "Tuesday", "Wednsday", "Thursday", "Friday", "Saturday"};
LiquidCrystal_I2C lcd(I2C_ADDR, LCD_COLUMNS, LCD_LINES);
DHT dht(DHTPIN, DHTTYPE);
void showStartScreen(){ // функция для вывода начального текста
lcd.setCursor(6, 1);
String message_1 = "Weather"; // создание переменной с текстом для первой строки
for (byte i=0; i<message_1.length(); i++) // вывод текста по одному символу
{
lcd.print(message_1[i]);
delay(50);
}
delay(500);
lcd.setCursor(6, 2);
String message_2 = "station"; // создание переменной с текстом для второй строки
for (byte i=0; i<message_2.length(); i++) // вывод текста по одному символу
{
lcd.print(message_2[i]);
delay(50);
}
delay(500);
}
int page = 1;
int right(int r)
{
if(r == 0)
return(page += 1);
if(page == 6)
return(page = 1);
}
int left(int l)
{
if(l == 0)
return(page += 1);
if(page == 6)
return(page = 1);
}
void setup() {
pinMode(LDR_PIN, INPUT); // подключение фоторезистора
pinMode(13, INPUT_PULLUP);
pinMode(12, INPUT_PULLUP);
dht.begin(); // вызов датчика
rtc.begin(); // вызов счетчика
lcd.init();
lcd.backlight();
lcd.begin(20,4);
/*showStartScreen(); // запуск начального текста
lcd.clear();
lcd.cursor();
lcd.setCursor(1,0);*/
}
void loop() {
DateTime now = rtc.now(); // считывание времени
float temperature = dht.readTemperature(); // считывание температуры
float humidity = dht.readHumidity(); // считывание влажности
int analogValue = analogRead(A0); // считывание сигнала с фоторезистора
float voltage = analogValue / 1024. * 5; //
float resistance = 2000 * voltage / (1 - voltage / 5); // перевод напряжения в lux
float lux = pow(RL10 * 1e3 * pow(10, GAMMA) / resistance, (1 / GAMMA)); //
right(digitalRead(12));
left(digitalRead(13));
switch (page)
{
case 1:
{
lcd.clear();
showStartScreen();
break;
}
case 2:
{
lcd.clear();
lcd.setCursor(6,0);
lcd.print("D A T E");
lcd.setCursor(1,2);
lcd.print(now.year(), DEC);
lcd.print('/');
lcd.print(now.month(), DEC);
lcd.print('/');
lcd.print(now.day(), DEC);
lcd.setCursor(1,3);
lcd.print(daysOfTheWeek[now.dayOfTheWeek()]);
break;
}
case 3:
{
lcd.clear();
lcd.setCursor(6,0);
lcd.print("T I M E");
lcd.setCursor(1,2);
lcd.print(now.hour(), DEC);
lcd.print(':');
lcd.print(now.minute(), DEC);
lcd.print(':');
lcd.print(now.second(), DEC);
break;
}
case 4:
{
lcd.clear();
lcd.setCursor(2,0);
lcd.print("WEATHER STATION");
lcd.setCursor(1,2);
lcd.print(F("Humidity: "));
lcd.print(humidity);
lcd.print(F("%"));
lcd.setCursor(1,3);
lcd.print(F("Temp: "));
lcd.print(temperature);
lcd.print(F("C "));
break;
}
case 5:
{
lcd.clear();
lcd.setCursor(4,0);
lcd.print("ILLUMINATION");
lcd.setCursor(1,2);
lcd.print("Now: ");
if (lux > 50) {
lcd.print("DAY");
} else {
lcd.print("NIGHT");
}
lcd.setCursor(1,3);
lcd.print("Lux: ");
lcd.print(lux);
break;
}
}
// вывод данных с датчика влажности/температуры и фоторезистора
/*lcd.setCursor(1,0);
lcd.print("Weather station:");
lcd.setCursor(1,1);
lcd.print(F("Humidity: "));
lcd.print(humidity);
lcd.print(F("%"));
lcd.setCursor(1,2);
lcd.print(F("Temp: "));
lcd.print(temperature);
lcd.print(F("C "));
lcd.setCursor(1,3);
lcd.print("Now: ");
if (lux > 50) {
lcd.print("DAY");
} else {
lcd.print("NIGHT");
}
delay(5000);
lcd.clear();
// вывод данных со счётчика реального времени
for(int i=1; i<=5; i++)
{
DateTime now = rtc.now();
lcd.setCursor(1,0);
if (! rtc.begin()) {
lcd.println("Couldn't find RTC");
//abort();
}
lcd.print("Time: ");
lcd.setCursor(1,1);
lcd.print(now.year(), DEC);
lcd.print('/');
lcd.print(now.month(), DEC);
lcd.print('/');
lcd.print(now.day(), DEC);
lcd.setCursor(1,2);
lcd.print(daysOfTheWeek[now.dayOfTheWeek()]);
lcd.setCursor(1,3);
lcd.print(now.hour(), DEC);
lcd.print(':');
lcd.print(now.minute(), DEC);
lcd.print(':');
lcd.print(now.second(), DEC);
lcd.println();
delay(1000);
lcd.clear();*/
}