#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 p = 0;
int right(int r)
{
if(r == 0){
p += 1;}
return p;
}
int left(int l)
{
p -= 1;
return p;
} */
void setup() {
pinMode(LDR_PIN, INPUT); // подключение фоторезистора
pinMode(13, INPUT_PULLUP);
pinMode(12, INPUT_PULLUP);
dht.begin(); // вызов датчика
rtc.begin(); // вызов счетчика
Serial.begin(9600);
lcd.init();
lcd.backlight();
lcd.begin(20,4);
/*showStartScreen(); // запуск начального текста
lcd.clear();
lcd.cursor();
lcd.setCursor(1,0);*/
}
int is_btn = 0;
// int was_btn = 0;
void loop() {
while (true) {
//is_btn = right(digitalRead(12));
if (!(digitalRead(12)))
{
is_btn += 1;
//was_btn = is_btn;
break;
}
if (!(digitalRead(13)))
{
is_btn += 4;
//was_btn = is_btn;
break;
}
}
Serial.print(is_btn);
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)); //
/*int page = 0;
page = right(digitalRead(12));
page = left(digitalRead(13));*/
switch (is_btn % 5)
{
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()]);
delay(700);
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);
delay(700);
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 "));
delay(700);
break;
}
case 0:
{
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);
delay(700);
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();*/
}