// nano "thermo" project v1.42
// sensors: dht22
// display: lcd1604
// buttons: 4 pcs
// library: LiquidCrystal_I2C.h (johnrickman (init))
// Backlight is always on. Press button 4 to switch backlight off.
// negative and single digit numbers alignment fixed
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <DHT.h>
#include <DHT_U.h>
#define DHT_A_PIN 2
#define DHT_B_PIN 3
#define DHT_C_PIN 4
#define DHT_A_TYPE DHT22
#define DHT_B_TYPE DHT22
#define DHT_C_TYPE DHT22
LiquidCrystal_I2C lcd(0x27, 16, 2);
DHT_Unified dht_A(DHT_A_PIN, DHT_A_TYPE);
DHT_Unified dht_B(DHT_B_PIN, DHT_B_TYPE);
DHT_Unified dht_C(DHT_C_PIN, DHT_C_TYPE);
// constants won't change. They're used here to set pin numbers:
const int button_1_Pin = 8;
const int button_2_Pin = 7;
const int button_3_Pin = 6;
const int button_4_Pin = 5;
// variables for reading the pushbutton status:
int button_1_State = 0;
int button_2_State = 0;
int button_3_State = 0;
int button_4_State = 0;
void setup() {
  // initialize the pushbutton pin as an input:
  pinMode(button_1_Pin, INPUT);
  pinMode(button_2_Pin, INPUT);
  pinMode(button_3_Pin, INPUT);
  pinMode(button_4_Pin, INPUT);
  lcd.init();
  lcd.backlight();
  delay(1000);
  lcd.setCursor(0, 0);
  lcd.print("Lilyhammer Meteo");
  delay(1000);
  lcd.setCursor(0, 1);
  lcd.print("by Andrey Sobina");
  
  Serial.begin(9600);
  Serial.println(F("nano thermo project v1.42"));
  dht_A.begin();
  dht_B.begin();
  dht_C.begin();
  delay(3000);
  lcd.noBacklight();
}
void loop() {
  button_1_State = digitalRead(button_1_Pin);
  if (button_1_State == HIGH) {
    dht_sauna();
  }
  button_2_State = digitalRead(button_2_Pin);
  if (button_2_State == HIGH) {
    dht_room();
  }
  button_3_State = digitalRead(button_3_Pin);
  if (button_3_State == HIGH) {
    dht_outside();
  }
  button_4_State = digitalRead(button_4_Pin);
  if (button_4_State == HIGH) {
    backlight();
  }
}
void dht_sauna() {
  lcd.clear();
  lcd.home();
  lcd.backlight();
  sensors_event_t event;
  dht_A.temperature().getEvent(&event);
  if (isnan(event.temperature)) {
    Serial.println(F("Sauna sensor: Error reading temperature"));
    lcd.setCursor(0, 0);
    lcd.print("Error sensor A");
  }
  else {
    lcd.print("Sauna:");
    if (event.temperature >= 0.00 && event.temperature <= 9.99) {
      lcd.setCursor(9, 0);
    }
    if (event.temperature >= -9.99 && event.temperature <= -0.01 || event.temperature >= 10 && event.temperature <= 99.99) {
      lcd.setCursor(8, 0);
    }
    if (event.temperature <= -10 && event.temperature >= -99.99 || event.temperature >= 100 && event.temperature <= 999.99) {
      lcd.setCursor(7, 0);
    }
    lcd.print(event.temperature);
    lcd.print(" ");
    lcd.print(char(223));
    lcd.print("C");
  }
  dht_A.humidity().getEvent(&event);
  if (isnan(event.relative_humidity)) {
    Serial.println(F("Sauna sensor: Error reading humidity"));
    lcd.setCursor(0, 1);
    lcd.print("Error sensor A");
  }
  else {
    if (event.relative_humidity >= 0.00 && event.relative_humidity <= 9.99) {
      lcd.setCursor(9, 1);
    }
    if (event.relative_humidity >= 10 && event.relative_humidity <= 99.99) {
      lcd.setCursor(8, 1);
    }
    if (event.relative_humidity >= 100) {
      lcd.setCursor(7, 1);
    }
    lcd.print(event.relative_humidity);
    lcd.print(" %");
  }
  delay(500);
}
void dht_room() {
  lcd.clear();
  lcd.home();
  lcd.backlight();
  sensors_event_t event;
  dht_B.temperature().getEvent(&event);
  if (isnan(event.temperature)) {
    Serial.println(F("Room sensor: Error reading temperature"));
    lcd.setCursor(0, 0);
    lcd.print("Error sensor B");
  }
  else {
    lcd.print("Room:");
    if (event.temperature >= 0.00 && event.temperature <= 9.99) {
      lcd.setCursor(9, 0);
    }
    if (event.temperature >= -9.99 && event.temperature <= -0.01 || event.temperature >= 10 && event.temperature <= 99.99) {
      lcd.setCursor(8, 0);
    }
    if (event.temperature <= -10 && event.temperature >= -99.99 || event.temperature >= 100 && event.temperature <= 999.99) {
      lcd.setCursor(7, 0);
    }
    lcd.print(event.temperature);
    lcd.print(" ");
    lcd.print(char(223));
    lcd.print("C");
  }
  dht_B.humidity().getEvent(&event);
  if (isnan(event.relative_humidity)) {
    Serial.println(F("Room sensor: Error reading humidity"));
    lcd.setCursor(0, 1);
    lcd.print("Error sensor B");
  }
  else {
    if (event.relative_humidity >= 0.00 && event.relative_humidity <= 9.99) {
      lcd.setCursor(9, 1);
    }
    if (event.relative_humidity >= 10 && event.relative_humidity <= 99.99) {
      lcd.setCursor(8, 1);
    }
    if (event.relative_humidity >= 100) {
      lcd.setCursor(7, 1);
    }
    lcd.print(event.relative_humidity);
    lcd.print(" %");
  }
  delay(500);
}
void dht_outside() {
  lcd.clear();
  lcd.home();
  lcd.backlight();
  
  sensors_event_t event;
  dht_C.temperature().getEvent(&event);
  if (isnan(event.temperature)) {
    Serial.println(F("Outside sensor: Error reading temperature"));
    lcd.setCursor(0, 0);
    lcd.print("Error sensor C");
  }
  else {
    lcd.print("Outs.:");
    if (event.temperature >= 0.00 && event.temperature <= 9.99) {
      lcd.setCursor(9, 0);
    }
    if (event.temperature >= -9.99 && event.temperature <= -0.01 || event.temperature >= 10 && event.temperature <= 99.99) {
      lcd.setCursor(8, 0);
    }
    if (event.temperature <= -10 && event.temperature >= -99.99 || event.temperature >= 100 && event.temperature <= 999.99) {
      lcd.setCursor(7, 0);
    }
    lcd.print(event.temperature);
    lcd.print(" ");
    lcd.print(char(223));
    lcd.print("C");
  }
  dht_C.humidity().getEvent(&event);
  if (isnan(event.relative_humidity)) {
    Serial.println(F("Outside sensor: Error reading humidity"));
    lcd.setCursor(0, 1);
    lcd.print("Error sensor C");
  }
  else {
    if (event.relative_humidity >= 0.00 && event.relative_humidity <= 9.99) {
      lcd.setCursor(9, 1);
    }
    if (event.relative_humidity >= 10 && event.relative_humidity <= 99.99) {
      lcd.setCursor(8, 1);
    }
    if (event.relative_humidity >= 100) {
      lcd.setCursor(7, 1);
    }
    lcd.print(event.relative_humidity);
    lcd.print(" %");
  }
  
  delay(500);
}
void backlight() {
  lcd.noBacklight();
}