/*############################################################################
#Codigo criado por: MarioParente
# Data: __/__/2023
# Detalhes do projeto: v0.1 - Hitorico de temperatura das ultima 24h
# Não gera historico e não usa RTC
# 24h corrido com 0h o ligamento do projeto
\############################################################################*/
#include <Adafruit_SSD1306.h>
#include "DHTesp.h"
const int DHT_PIN = 23;
int T = 0;
int H = 0;
int Agora_T = 0;
int Max_T = 0;
int Min_T = 0;
int Agora_H = 0;
int Max_H = 0;
int Min_H = 0;
int Menu = 0;
int Segundo = 0;
int Minuto = 0;
int T_Ponto = -1;
int Ponto_A = 27;
int Ponto_B = 0;
DHTesp dhtSensor;
Adafruit_SSD1306 display(128, 64, &Wire);
static const unsigned char PROGMEM Bateria[] = {
B11111111, B11111110,B10000000, B00000010,
B10000000, B00000011,B10000000, B00000011,
B10000000, B00000011,B10000000, B00000010,
B11111111, B11111110,};
static const unsigned char PROGMEM Status_Bateria_Carregar[] = {
B00001000,B00011100,
B00111110,B01111111,
B00011100,B00011100,
B00011100,B00000000,
};
static const unsigned char PROGMEM Status_Bateria_Descarregar[] = {
B00001000,B00001000,
B00011100,B00001000,
};
static const unsigned char PROGMEM grau[] = {
B11000000,B11000000,
};
void setup() {
Serial.begin(9600);
display.begin(SSD1306_SWITCHCAPVCC, 0x3C);
dhtSensor.setup(DHT_PIN, DHTesp::DHT22);
display.clearDisplay();
display.display();
display.setTextColor(WHITE,BLACK);
display.setTextSize(1);
Texto_grafico();
Grafico();
Iniciando();
}
void loop() {
TempAndHumidity data = dhtSensor.getTempAndHumidity();
T = int(data.temperature);
H = int(data.humidity);
switch (Menu) {
case 0:
Normal(T,H);
break;
case 1:
Maximo(T,H);
break;
case 2:
Minino(T,H);
break;
default:
Normal(T,H);
break;
}
Tempo();
Alteracao();
delay(2000);
}
void Tempo() {
Segundo = (millis() / 1000.0);
Minuto = Segundo / 60;
//Serial.println("Temp: " + String(Temp));
Serial.println("Segundo: " + String(Segundo));
Serial.println("Minuto: " + String(Minuto));
Serial.println("Hora: "+ String(int(Minuto/60)));
Serial.println("T_Ponto: " + String(T_Ponto));
Serial.println("");
//Serial.println("Temp: "+Temp)
if (T_Ponto != Minuto/15){
T_Ponto = Minuto/15;
Ponto(T_Ponto,T);
}
}
void Alteracao(){
if (Menu == 0){
Menu = 1;
}
else if (Menu == 1){
Menu = 2;
}
else if (Menu == 2){
Menu = 0;
}
else{
Menu = 0;
}
}
void Iniciando(){
TempAndHumidity data = dhtSensor.getTempAndHumidity();
T = int(data.temperature);
H = int(data.humidity);
Agora_T = T;
Max_T = T;
Min_T = T;
Agora_H = H;
Max_H = H;
Min_H = H;
}
void Normal(int x,int n){
Serial.println("Temp: " + String(x) + "°C");
Serial.println("Humidity: " + String(n) + "%");
display.setCursor(35,0);
display.print("Agora:"+ String(x) + "C "+ String(n) + "% ");
display.display();
delay(1000);
}
void Maximo(int x,int n){
if (x > Max_T){
Max_T = x;
}
if (n > Max_H){
Max_H = n;
}
Serial.println("Temp: " + String(Max_T) + "°C");
Serial.println("Humidity: " + String(Max_H) + "%");
display.setCursor(35,0);
display.print("Max :"+ String(Max_T) + "C "+ String(Max_H) + "% ");
display.display();
}
void Minino(int x,int n){
if (x < Min_T){
Min_T = x;
}
if (n < Min_H){
Min_H = n;
}
Serial.println("Temp: " + String(Min_T) + "°C");
Serial.println("Humidity: " + String(Min_H) + "%");
display.setCursor(35,0);
display.print("Min :"+ String(Min_T) + "C "+ String(Min_H) + "% ");
display.display();
}
void Grafico(){
display.drawLine(27, 53, 126, 53, 1); //linha Horizontal
display.drawLine(27, 13, 27, 53, 1); //linha Vertical
//pintos linha horizontal
display.drawPixel(29, 54, 1); //ponto de 0h
display.drawPixel(29, 55, 1);
display.drawPixel(53, 54, 1); //ponto de 6h
display.drawPixel(53, 55, 1);
display.drawPixel(77, 54, 1); //ponto de 12h
display.drawPixel(77, 55, 1);
display.drawPixel(101, 54, 1); //ponto de 18h
display.drawPixel(101, 55, 1);
display.drawPixel(125, 54, 1); //ponto de 24h
display.drawPixel(125, 55, 1);
//pintos linha Vertical
display.drawPixel(25, 15, 1); //ponto de 60º
display.drawPixel(26, 15, 1);
display.drawPixel(25, 24, 1); //ponto de 45º
display.drawPixel(26, 24, 1);
display.drawPixel(25, 33, 1); //ponto de 30º
display.drawPixel(26, 33, 1);
display.drawPixel(25, 42, 1); //ponto de 15º
display.drawPixel(26, 42, 1);
display.drawPixel(25, 51, 1); //ponto de 0º
display.drawPixel(26, 51, 1);
display.display();
}
void Texto_grafico(){
//Texto horizontal hora
display.setCursor(27,57);
display.print("0"); //texto 0h
display.setCursor(51,57);
display.print("6"); //texto 6h
display.setCursor(73,57);
display.print("12"); //texto 12h
display.setCursor(97,57);
display.print("18"); //texto 18h
//texto Vertical temp º
display.setCursor(13,12);
display.print("60"); //texto temp 60
display.setCursor(13,21);
display.print("45"); //texto temp 45
display.setCursor(13,30);
display.print("30"); //texto temp 30
display.setCursor(13,39);
display.print("15"); //texto temp 15
display.setCursor(19,48);
display.print("0"); //texto temp 0
//Legenda
display.setCursor(0,0);
display.print("Temp");
display.setCursor(0,57);
display.print("Hora");
display.display();
}
void Ponto(int x, int y){
x += 28;
y = min(y,60);
y = max(y,0);
y = map(y, 60, 0, 15, 51);
if(Ponto_B == 0){
Ponto_B = y;
}
// x = tempo = largura
// y = Temperatura = altura
//display.drawPixel(x, y, 1); //Cada 15 minutos gera um ponto no grafico
//- melhor visualização para pouca variação
// de temperatura
display.drawLine(Ponto_A, Ponto_B, x, y, 1); //Cada 15 minutos gera uma linha do ponto
// anterior para o proximo ponto no grafico
// - melhor visualização para pouca variação
// de temperatura
Ponto_A = x;
Ponto_B = y;
display.display();
}
/*
a linha horizintal começa no 28 até 125
a linha vertical começa no 14 até 52
cada letra tem 5 pixel de largura e 7 de altura + 1 pixel largura depois da letra em preto
5pixel por hora
32pixel por 6h
64pixel por meio dia
11,25 miutos por pixel por hora
#################################
1 pixel por 15 minuto
4 pixel por 1 hora
96 pixel por dia
*/