// =================================================================================================
//BIBLIOTECAS
#include <Arduino.h>
#include <DHT.h> //Biblioteca do sensor de umidade e temperatura
#include <Wire.h> //Biblioteca de comunicacao i2c
#include <Adafruit_GFX.h> //Biblioteca para aplicacoes graficas (formas geometricas, fontes, etc.)
#include <Adafruit_SSD1306.h> //Biblioteca para compatibilidade com o controlador SSD1306 do display
// =================================================================================================
//PINOS DE I/O
#define dht_pino 27
#define anterior_pino 4
#define proximo_pino 15
#define enter_pino 2
#define ldr_pino 25
// =================================================================================================
//SINTAXE
#define dht_tipo DHT22
#define largura_tela 128 // Largura do display, em pixels
#define altura_tela 64 // Altura do display, em pixels
#define OLED_RESET -1 // Define o tipo de reset (compartilhado com o reset do microcontrolador)
#define SCREEN_ADDRESS 0x3C ///Endereço para display 128x64px
// ================================================================================================
//DECLARAÇÃO DE OBJETOS
DHT dht(dht_pino, dht_tipo);
Adafruit_SSD1306 display(largura_tela, altura_tela, &Wire, OLED_RESET);
// ================================================================================================
//DECLARAÇÕES DE FUNÇÕES
void selecao_menu();
void temperatura_menu();
void umidade_menu();
void luminosidade_menu();
// ================================================================================================
//VARIÁVEIS GLOBAIS
int temperatura = 0,
umidade = 0,
luminosidade = 0;
bool botao_esq = 0,
botao_enter = 0,
botao_dir = 0,
botao_esq_anterior = 0,
botao_dir_anterior = 0,
botao_enter_anterior = 0;
int contador = 1;
int posicao = 1;
unsigned long tempo_anterior = 0;
const unsigned long intervalo = 5000;
const unsigned long intervalo_luminosidade = 1000;
// ===============================================================================================
//CONFIGURAÇÕES INICAIS
void setup() {
Serial.begin(115200);
dht.begin();
if (!display.begin(SSD1306_SWITCHCAPVCC, SCREEN_ADDRESS)) {
Serial.println(F("SSD1306 allocation failed"));
for (;;)
; // Fica em loop se houver erro para iniciar o display
}
display.display(); // Mostra o conteúdo do buffer na tela
delay(1000);
display.setTextColor(SSD1306_WHITE); // Define a cor do texto a ser exibido
display.clearDisplay(); // Limpa o buffer
pinMode(anterior_pino, INPUT_PULLDOWN); // Definindo o botoes de navegação como entrada pulldown
pinMode(proximo_pino, INPUT_PULLDOWN);
pinMode(enter_pino, INPUT_PULLDOWN);
}
// ================================================================================================
//INÍCIO DO LOOP
void loop() {
temperatura = dht.readTemperature(); // Lê temperatura
umidade = dht.readHumidity(); // Lê umidade
// Se o sensor não retornar um número como leitura da temperatura ou umidade,
//aparecerá uma mensagem de erro
if (isnan(temperatura) || isnan(umidade)) {
display.setTextSize(1);
display.setCursor(0, 0);
display.print(F("Checar o sensor DHT!"));
display.display();
delay(2000);
return;
}
selecao_menu(); // Entra no Menu Principal
// De acordo com a posição da seleção no menu principal, entra um um menu para leitura dos
// valores aferidos pelos sensores
switch (posicao) {
case 1: temperatura_menu(); break;
case 2: umidade_menu(); break;
case 3: luminosidade_menu(); break;
}
}
// ================================================================================================
// DESENVOLVIMENTO DE FUNÇÕES
void selecao_menu() {
int y_retangulo = 18; // Altura do ponto de inicio da borda de seleção
posicao = 1; // Posição em que a seleção irá começar
display.clearDisplay();
// Quando o contador for ímpar, entra no menu principal
while (contador % 2 == 1) {
// Desenha o menu no display
display.setTextSize(2); // Escala do texto a ser exibido
display.setCursor(40, 0); // Coordenadas do cursor
display.print("MENU");
display.setTextSize(1);
display.setCursor(2, 20);
display.print("Temperatura"); //7px de altura maiusculas e 5px minusculas
display.setCursor(2, 30);
display.print("Umidade");
display.setCursor(2, 40);
display.print("Luminosidade");
display.display();
display.drawRect(0, y_retangulo, display.width(), 11, SSD1306_WHITE); // Desenha a borda de seleção
display.display();
botao_enter = digitalRead(enter_pino); // Estado atual do botão enter
botao_dir = digitalRead(proximo_pino); // Lê o estado do botão de avanço
botao_esq = digitalRead(anterior_pino); // Lê o estado do botão de regresso
// Se o botão de avanço for pressionado, entra no if
if (botao_dir == true) {
while(botao_dir == true) botao_dir = digitalRead(proximo_pino);
if (posicao < 3) posicao++; // Se a posição for menor que três, seleciona o próximo da lista
else posicao = 1; // Senão retorna para o começo da lista
// Define a altura da borda de seleção de acordo com a posição atual da seleção
switch (posicao) {
case 1:
y_retangulo = 18;
display.clearDisplay();
break;
case 2:
y_retangulo = 28;
display.clearDisplay();
break;
case 3:
y_retangulo = 38;
display.clearDisplay();
break;
}
}
// Mesmo processo do botão de avanço, porém decrementa a posição
if (botao_esq == true) {
while(botao_esq == true) botao_esq = digitalRead(anterior_pino);
if (posicao > 1) posicao--;
else posicao = 3;
switch (posicao) {
case 1:
y_retangulo = 18;
display.clearDisplay();
break;
case 2:
y_retangulo = 28;
display.clearDisplay();
break;
case 3:
y_retangulo = 38;
display.clearDisplay();
break;
}
}
// Se o botão enter for pressionado, incrementa um contador para sair do laço
if (botao_enter == true) contador++;
while(botao_enter == true) botao_enter = digitalRead(enter_pino);
delay(10);
}
}
void temperatura_menu() {
while (contador % 2 == 0) { // Se o contador for par, mostra a temperatura no display
botao_enter = digitalRead(enter_pino);
unsigned long tempo_atual = millis();
if ((tempo_atual - tempo_anterior >= intervalo) || tempo_anterior == 0) {
temperatura = dht.readTemperature();
tempo_anterior = tempo_atual;
}
display.clearDisplay();
display.setTextSize(2);
display.setCursor(40, 0);
display.print("Temp");
display.setCursor(50, 20);
display.print(temperatura);
display.print(" C");
display.display();
if (botao_enter == true) contador++;
while(botao_enter == true) botao_enter = digitalRead(enter_pino);
delay(10);
}
}
void umidade_menu() {
while (contador % 2 == 0) {
botao_enter = digitalRead(enter_pino);
unsigned long tempo_atual = millis();
if ((tempo_atual - tempo_anterior >= intervalo) || tempo_anterior == 0) {
umidade = dht.readHumidity();
tempo_anterior = tempo_atual;
}
display.clearDisplay();
display.setTextSize(2);
display.setCursor(20, 0);
display.print("Umidade");
display.setCursor(50, 20);
display.print(umidade);
display.print(" %");
display.display();
if (botao_enter == true) contador++;
while(botao_enter == true) botao_enter = digitalRead(enter_pino);
delay(10);
}
}
void luminosidade_menu() {
while (contador % 2 == 0) {
botao_enter = digitalRead(enter_pino);
unsigned long tempo_atual = millis();
if ((tempo_atual - tempo_anterior >= intervalo_luminosidade) || tempo_anterior == 0) {
luminosidade = map(analogRead(ldr_pino), 0, 4095, 0, 100);
tempo_anterior = tempo_atual;
}
display.clearDisplay();
display.setTextSize(2);
display.setCursor(10, 0);
display.print("Claridade");
display.setCursor(50, 20);
display.print(luminosidade);
display.print(" %");
display.display();
if (botao_enter == true) contador++;
while(botao_enter == true) botao_enter = digitalRead(enter_pino);
delay(10);
}
}