//biblioteca wifi
#include <WiFi.h>
//biblioteca WebSocketsServer
#include <WebSocketsServer.h>
//biblioteca DHT ESP32
#include "DHTesp.h"
//biblioteca do servo
#include <ESP32Servo.h>
//variáveis do sensor dht
#define DHTYPE DHT22
#define DHTPIN 32
DHTesp DHT;
//inicialização websocketsserver
WebSocketsServer webSocket = WebSocketsServer(81);
//pinos utilizados no ESP32
int pinPotenciometro = 33;
// o valor do potenciometro irá definir a temperatura máxima
int valorPotenciometro = 0;
long temperaturaDesejada = 0;
int temperaturaMinima = 10;
int temperaturaMaxima = 30;
//servomotor
Servo servo;
int pinServo = 17;
int anguloServo = 0;
//leds
int pinVermelho = 12;
int pinVerde = 13;
int pinAmarelo = 14;
int ledAceso = 0; //0 - nenhum, 1 - vermelho, 2 - amarelo; 3 - verde
unsigned long ultimoTempoEnvio = 0;
const unsigned long intervaloEnvio = 2000;
char comando;
void setup() {
// inicializando porta serial
Serial.begin(115200);
//inicializando wifi
WiFi.mode(WIFI_STA);
//inicializando dht
DHT.setup(DHTPIN, DHTesp::DHT22);
// indicando pino potenciometro
pinMode(pinPotenciometro, INPUT);
//inicializando o servo
pinMode(pinServo, OUTPUT);
// indica pino e valores mínimos e máximos
servo.attach(pinServo, 800, 3000);
//posicionando o servo no início
servo.write(anguloServo);
//pinos leds
pinMode(pinVermelho, OUTPUT);
pinMode(pinAmarelo, OUTPUT);
pinMode(pinVerde, OUTPUT);
//desligando leds
apagaLeds();
Serial.println("Setup done!");
}
void loop() {
if(WiFi.status() == WL_CONNECTED){
webSocket.loop();
}
//recebe comandos via serial
if(Serial.available()){
comando = Serial.read();
switch(comando){
case 'w': //localiza redes wifi
listaRedesWiFi();
break;
case 'r': //configura wifi e conecta
configuraEConecta();
break;
case 'i': //pega endereço ip
Serial.print("IP do ESP32 na Rede Conectada: "); // Imprime mensagem de conexão bem sucedida ao WiFi // Exibe o endereço IP do ESP32
if(WiFi.status() == WL_CONNECTED){
Serial.println(WiFi.localIP()); // Imprime o endereço IP local do ESP32
Serial.println(":");
} else{
Serial.println("Não conectado...:");
}
break;
}
}
Serial.println("");
Serial.print("Valor angulo servo: ");
Serial.println(anguloServo);
valorPotenciometro = analogRead(pinPotenciometro);
Serial.print("Valor Potenciometro: ");
Serial.println(valorPotenciometro);
//temperatura ajustada entre 10 e 30 ºC
temperaturaDesejada = map (valorPotenciometro, 0, 4095, temperaturaMinima, temperaturaMaxima);
Serial.printf("Valor desejado: %d", temperaturaDesejada);
Serial.println("");
Serial.printf("Temperatura Minima: %d", temperaturaMinima);
Serial.println("");
Serial.printf("Temperatura Maxima: %d", temperaturaMaxima);
Serial.println("");
TempAndHumidity data = DHT.getTempAndHumidity();
Serial.print("Valor Temperatura: ");
Serial.println(String(data.temperature));
Serial.print("Valor Umidade: ");
Serial.println(String(data.humidity));
Serial.println(String(data.humidity));
float tempLida = data.temperature;
//parte automática do esp32
//se temperatura for maior que temperatura desejada, abrir aletas ar condicionado - Led luz temperatura vermelha
//se temperatura for igual temperatura desejada, manter aletas ar condicionado - Led luz temperatura verde
//se temperatura for menor temperatura desejada, fechar aletas ar condicionado - led luz temperatura amarela
if((float)temperaturaDesejada > (tempLida + 2)){
servo.write(++anguloServo);
apagaLeds();
digitalWrite(pinVermelho, HIGH);
ledAceso = 1;
Serial.printf("Led Vermelho aceso\n");
if(anguloServo > 179){
anguloServo = 179; //impedindo servo de ultrapassar máximo
}
} else if((float)temperaturaDesejada < (tempLida - 2)){
servo.write(--anguloServo);
apagaLeds();
digitalWrite(pinAmarelo, HIGH);
ledAceso = 2;
Serial.printf("Led Amarelo aceso\n");
if(anguloServo < 1){
anguloServo = 1; //impedindo servo de ultrapassar mínimo
}
} else {
apagaLeds();
digitalWrite(pinVerde, HIGH);
Serial.printf("Led Verde aceso\n");
ledAceso = 3;
}
//enviando dados via websocket
//dados a enviar via websocket
//temperaturaDesejada;temperatura;umidade;anguloServo;ledAceso
if(WiFi.status() == WL_CONNECTED){
webSocket.broadcastTXT("inicio;" + String(temperaturaDesejada) + ";" + String(data.temperature) + ";" +
String(data.humidity) + ";" + String(anguloServo) + ";" + String(ledAceso));
}
delay(2000);
}
void inicializaWiFi(){
Serial.println("Initializing WiFi...");
}
void listaRedesWiFi(){
//verificando as redes
// WiFi.scanNetworks will return the number of networks found
int n = WiFi.scanNetworks();
//Serial.println("Scan done!");
if (n == 0) {
Serial.println("No networks found.");
} else {
//Serial.println(" networks found");
for (int i = 0; i < n; ++i) {
// Print SSID and RSSI for each network found
Serial.print("&");
Serial.print(WiFi.SSID(i));
Serial.print(" \t| ");
Serial.print((WiFi.encryptionType(i) == WIFI_AUTH_OPEN) ? "aberta" : "protegida");
}
}
return;
}
void configuraEConecta(){
char ssid[50];
char senha[50];
char caracter;
if(Serial.available()){
for(int i = 0; i < 50; i++){
caracter = Serial.read();
ssid[i] = caracter;
if(caracter == '\0'){
break;
}
}
for(int i = 0; i < 50; i++){
caracter = Serial.read();
senha[i] = caracter;
if(caracter == '\0'){
break;
}
}
Serial.print("Conectando na rede ");
Serial.println(ssid);
WiFi.begin(ssid, senha);
while (WiFi.status() != WL_CONNECTED) { // Loop até que a conexão WiFi seja estabelecida
delay(1000); // Espera 1 segundo
Serial.println("Conectando no WiFi..."); // Imprime mensagem de conexão ao WiFi
}
Serial.println("Conectou no WiFi"); // Imprime mensagem de conexão bem sucedida ao WiFi // Exibe o endereço IP do ESP32
Serial.print("IP do ESP32 na Rede Conectada: "); // Imprime rótulo para o endereço IP
Serial.print(WiFi.localIP()); // Imprime o endereço IP local do ESP32
Serial.println(":");
webSocket.begin(); // Inicia o servidor WebSocket
webSocket.onEvent(webSocketEvent); // Define a função de callback para eventos do WebSocket
}
return;
}
// Função de callback para eventos do WebSocket
void webSocketEvent(uint8_t numero_msg, WStype_t type, uint8_t * conteudo_recebido, size_t tamanho_conteudo) {
switch(type) { // Verifica o tipo de evento
case WStype_DISCONNECTED: // Caso a conexão seja desconectada
Serial.printf("[%u] Desconectou!\n", numero_msg); // Imprime no serial que o cliente numero_msg foi desconectado
break;
case WStype_CONNECTED: // Caso uma nova conexão seja estabelecida
Serial.printf("[%u] Conectou!\n", numero_msg); // Imprime no serial que o cliente numero_msg foi conectado
webSocket.sendTXT(numero_msg, "Conectou"); // Envia mensagem de confirmação de conexão ao cliente
break;
case WStype_TEXT: // Caso uma mensagem de texto seja recebida
Serial.printf("[%u] Recebeu pelo Socket o texto: %s\n", numero_msg, conteudo_recebido); // Imprime no serial a mensagem recebida do cliente numero_msg
char tem[10];
char tempMM;
if(conteudo_recebido[0] == 't'){
//recebeu nova temperatura desejada
if(conteudo_recebido[1] = '-'){
//recebeu temperatura mínima
tempMM = '-';
} else {
//recebeu temperatura máxima
tempMM = '+';
}
for(int i = 2; i < 5; i++){
if(conteudo_recebido[i] != '\0'){
tem[i - 2] = conteudo_recebido[i];
}
}
if(tempMM == '-'){
temperaturaMinima = atoi((char *)tem);
}
if(tempMM == '+'){
temperaturaMaxima = atoi((char *)tem);
}
}
Serial.printf("Temperatura lida: %d %d %s\n", temperaturaMinima, temperaturaMaxima, tem);
break;
//int valorServo = atoi((char *)conteudo_recebido); // Converte a mensagem recebida para um número inteiro
}
return;
}
void apagaLeds(){
digitalWrite(pinVermelho, LOW);
digitalWrite(pinAmarelo, LOW);
digitalWrite(pinVerde, LOW);
}