#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <DHT.h>
#include <RTClib.h>
/* ---------- DEFINIÇÕES ---------- */
#define BTN_UP 6
#define BTN_DOWN 7
#define BTN_SELECT 8
#define cardSelect 2
#define DHTPIN 4
#define DHTPIN2 12
#define DHTTYPE DHT22
#define CLOCK_H
LiquidCrystal_I2C lcd(0x27, 20, 4);
DHT dht(DHTPIN, DHTTYPE);
DHT dht2(DHTPIN2, DHTTYPE);
RTC_DS1307 rtc;
/* ---------- VARIÁVEIS ---------- */
int menu = 1;
int estado = 0;
float temperatura = 0.0;
float humidade = 0.0;
float temperatura2 = 0.0;
float humidade2 = 0.0;
int valorA = 0;
int valorB = 0;
float tensaoA = 0.0;
float tensaoB = 0.0;
float velocidade = 0.0;
float vento = 0.0;
float bussola = 0.0;
char dayOfTheWeek [7][4] = {"Domingo","Segunda-Feira","Terca-Feira","Quarta-Feira","Quinta-Feira","Sexta-Feira","Sabado"};
/* ---------- SETUP ---------- */
void setup() {
pinMode(BTN_UP, INPUT_PULLUP);
pinMode(BTN_DOWN, INPUT_PULLUP);
pinMode(BTN_SELECT, INPUT_PULLUP);
pinMode(cardSelect, OUTPUT);
Wire.begin();
lcd.init();
lcd.backlight();
dht.begin();
dht2.begin();
rtc.begin();
// USAR SÓ UMA VEZ para acertar a hora
// rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
}
/* ---------- LOOP ---------- */
void loop() {
// Leitura do DHT22 Interior
temperatura = dht.readTemperature(); // ºC
humidade = dht.readHumidity(); // %
// Leitura do DHT22 Exterior
temperatura2 = dht2.readTemperature(); // ºC
humidade2 = dht2.readHumidity(); // %
if (estado == 0) {
mostrarMenu();
navegarMenu();
}
else if (estado == 1) {
mostrarTemperatura();
}
else if (estado == 2) {
mostrarHumidade();
}
else if (estado == 3) {
mostrarHora();
}
else if (estado == 4) {
mostrarVento();
}
else if (estado == 5) {
mostrarTudo();
}
}
/* ---------- TEMPERATURA ---------- */
void mostrarTemperatura() {
float temp = temperatura + 0.0 ;
lcd.setCursor(0, 0);
lcd.print("Temperatura: ");
lcd.setCursor(0, 1);
lcd.print(temp);
lcd.print(" C ");
if (digitalRead(BTN_SELECT) == LOW) {
estado = 0;
lcd.clear();
delay(300);
}
}
/* ---------- HUMIDADE ---------- */
void mostrarHumidade() {
float hum = humidade - 0.0;
lcd.setCursor(6, 0);
lcd.print("Humidade");
lcd.setCursor(7, 1);
lcd.print(hum);
lcd.print("% ");
if (humidade > 60)
{
lcd.setCursor(0, 3);
lcd.print("Humido ");
}
if (humidade >= 40 && humidade <= 60)
{
lcd.setCursor(6, 3);
lcd.print("Conforto ");
}
if (humidade < 40)
{
lcd.setCursor(11, 3);
lcd.print(" Seco");
}
delay(300);
if (digitalRead(BTN_SELECT) == LOW)
{
estado = 0;
lcd.clear();
delay(300);
}
}
/* ---------------Hora-----------------------*/
void mostrarHora() {
DateTime now = rtc.now();
lcd.setCursor(0, 0);
lcd.print("Hora:");
lcd.print(now.hour(), DEC);
lcd.print(":");
lcd.print(now.minute(), DEC );
lcd.print(":");
lcd.print(now.second(), DEC);
if (now.hour() < 12)
{
lcd.print(" AM");
}
else {
lcd.print(" PM");
}
lcd.setCursor(0,1);
lcd.print("Data:");
lcd.print(now.day(), DEC);
lcd.print("/");
lcd.print(now.month(), DEC);
lcd.print("/");
lcd.print(now.year(), DEC);
lcd.setCursor(5,3);
lcd.print(dayOfTheWeek[now.dayOfTheWeek()]);
delay(1000);
if (digitalRead(BTN_SELECT) == LOW) {
estado = 0;
lcd.clear();
delay(300);
}
}
/* ---------- MENU ---------- */
void navegarMenu() {
if (digitalRead(BTN_UP) == LOW) {
menu++;
if (menu > 5) menu = 1;
//lcd.clear();
delay(300);
}
if (digitalRead(BTN_DOWN) == LOW) {
menu--;
if (menu < 1) menu = 5;
//lcd.clear();
delay(300);
}
if (digitalRead(BTN_SELECT) == LOW) {
estado = menu;
lcd.clear();
delay(300);
}
}
void mostrarVento() {
valorA = analogRead(A0);
valorB = analogRead(A1);
tensaoA = valorA * (5.0 / 1023.0);
velocidade = 6 * tensaoA;
vento = velocidade * 3600 / 1000;
tensaoB = valorB * (5.0 / 1023.0);
bussola = valorB;
lcd.setCursor(0, 0);
lcd.print("Velocidade ");
lcd.setCursor(0, 1);
lcd.print(vento);
lcd.print("km/h ");
lcd.setCursor(0, 2);
lcd.print("Direcao Vento:");
Serial.print(bussola);
// lcd.print(bussola);
if (bussola == 0) {
lcd.print("Norte ");
}
if (bussola > 0 && bussola < 45) {
lcd.print("NNE ");
}
if (bussola == 45) {
lcd.print("NE ");
}
if (bussola > 45 && bussola < 90) {
lcd.print("ENE ");
}
if (bussola == 90) {
lcd.print("Este ");
}
if (bussola > 90 && bussola < 135) {
lcd.print("ESE ");
}
if (bussola == 135) {
lcd.print("SE ");
}
if (bussola > 135 && bussola < 180) {
lcd.print("SSE ");
}
if (bussola == 180 ) {
lcd.print("Sul ");
}
if (bussola > 180 && bussola < 225) {
lcd.print("SSO ");
}
if (bussola == 225) {
lcd.print("SO ");
}
if (bussola > 225 && bussola < 270) {
lcd.print("OSO ");
}
if (bussola == 270) {
lcd.print("Oeste ");
}
if (bussola > 270 && bussola < 315) {
lcd.print("ONO ");
}
if (bussola == 315) {
lcd.print("NO ");
}
if (bussola > 315 && bussola < 360) {
lcd.print("NNO ");
}
if (digitalRead(BTN_SELECT) == LOW) {
estado = 0;
lcd.clear();
delay(300);
}
}
void mostrarMenu() {
switch (menu) {
case 1:
lcd.setCursor(0, 0);
lcd.print("> Temperatura ");
lcd.setCursor(0, 1);
lcd.print(" Humidade ");
lcd.setCursor(0, 2);
lcd.print(" Hora ");
lcd.setCursor(0, 3);
lcd.print(" Anemometro ");
break;
case 2:
lcd.setCursor(0, 0);
lcd.print(" Temperatura ");
lcd.setCursor(0, 1);
lcd.print("> Humidade ");
lcd.setCursor(0, 2);
lcd.print(" Hora ");
lcd.setCursor(0, 3);
lcd.print(" Anemometro ");
break;
case 3:
lcd.setCursor(0, 0);
lcd.print(" Temperatura ");
lcd.setCursor(0, 1);
lcd.print(" Humidade ");
lcd.setCursor(0, 2);
lcd.print("> Hora ");
lcd.setCursor(0, 3);
lcd.print(" Anemometro ");
break;
case 4:
lcd.setCursor(0, 0);
lcd.print(" Temperatura ");
lcd.setCursor(0, 1);
lcd.print(" Humidade ");
lcd.setCursor(0, 2);
lcd.print(" Hora ");
lcd.setCursor(0, 3);
lcd.print("> Anemometro ");
break;
case 5:
lcd.setCursor(0, 0);
lcd.print(" Humidade ");
lcd.setCursor(0, 1);
lcd.print(" Hora ");
lcd.setCursor(0, 2);
lcd.print(" Anemometro ");
lcd.setCursor(0, 3);
lcd.print("> Estacao completa ");
break;
}
}
void mostrarTudo() {
valorA = analogRead(A0);
valorB = analogRead(A1);
tensaoA = valorA * (5.0 / 1023.0);
velocidade = 6 * tensaoA;
vento = velocidade * 3600 / 1000;
tensaoB = valorB * (5.0 / 1023.0);
bussola = valorB;
lcd.setCursor(2,0);
lcd.print("WheatherStation");
//Temperatura e humidade
lcd.setCursor(0, 1);
lcd.print("Indoor");
lcd.print("|");
lcd.setCursor(0, 2);
lcd.print(temperatura);
lcd.print("C");
lcd.print("|");
lcd.setCursor(0, 3);
lcd.print(humidade);
lcd.print("%");
lcd.print("|");
lcd.setCursor(6, 3);
lcd.print("|");
//Anemometro e direção do vento
lcd.setCursor(7, 1);
lcd.print(vento);
lcd.setCursor(8, 2);
lcd.print("km/h ");
lcd.setCursor(8, 3);
Serial.print(bussola);
if (bussola == 0) {
lcd.print("Norte ");
}
if (bussola > 0 && bussola < 45) {
lcd.print("NNE ");
}
if (bussola == 45) {
lcd.print("NE ");
}
if (bussola > 45 && bussola < 90) {
lcd.print("ENE ");
}
if (bussola == 90) {
lcd.print("Este ");
}
if (bussola > 90 && bussola < 135) {
lcd.print("ESE ");
}
if (bussola == 135) {
lcd.print("SE ");
}
if (bussola > 135 && bussola < 180) {
lcd.print("SSE ");
}
if (bussola == 180 ) {
lcd.print("Sul ");
}
if (bussola > 180 && bussola < 225) {
lcd.print("SSO ");
}
if (bussola == 225) {
lcd.print("SO ");
}
if (bussola > 225 && bussola < 270) {
lcd.print("OSO ");
}
if (bussola == 270) {
lcd.print("Oeste ");
}
if (bussola > 270 && bussola < 315) {
lcd.print("ONO ");
}
if (bussola == 315) {
lcd.print("NO ");
}
if (bussola > 315 && bussola < 360) {
lcd.print("NNO ");
}
lcd.setCursor(13, 1);
lcd.print("|");
lcd.print("Out");
lcd.setCursor(13, 2);
lcd.print("|");
lcd.print(temperatura2);
lcd.print("C");
lcd.setCursor(13, 3);
lcd.print("|");
lcd.print(humidade2);
lcd.print("%");
delay(1000);
if (digitalRead(BTN_SELECT) == LOW) {
estado = 0;
lcd.clear();
delay(300);
}
}