/*Interfaceamento entre Wokwi e Blynk: botões digitais
Autor: Prof. Diego Bianchi
Execução: Lukas e Marcello
Placa: ESP32 DevKitC V4
Plataforma IoT: Blynk*/
//Código gerado no template da plataforma Blynk
//Após configuração de template no BLynk, copiar o código dado e colar abaixo
#define BLYNK_TEMPLATE_ID "TMPL2Ll6yW0DI"
#define BLYNK_TEMPLATE_NAME "Relé"
#define BLYNK_AUTH_TOKEN "jhy04NVEwNECKtEhASV8pQCj7GDbSJMd"
//Print da comunicação da plataforma Blynk
//Após teste, transformar em comentário para economia de memória
#define BLYNK_PRINT Serial
//Libera conexão via WiFi. Permite a definição de usuário específico. Biblioteca Blynk para ESP32
#include <WiFi.h>
#include <WiFiClient.h>
#include <BlynkSimpleEsp32.h>
//Autentica conexão com códigofornecido pelo Blynk
char auth[] = BLYNK_AUTH_TOKEN;
//Credenciais de conexão para rede WiFi.
//SSID = nome da rede, Pass = senha da rede
//Senha nomeada como "" para redes abertas.
char ssid[] = "Wokwi-GUEST";
char pass[] = "";
//Permite o envio de dados peridocamente, em intervalos definidos, sem interferir com a conexão com o Blynk
//NÃO UTILIZAR A FUNÇÃO DELAY NO LOOP, pois é onde está a rotina de comunicação.
BlynkTimer timer;
//Definição dos pinos ligados aos botões físicos
#define botao1_pin 19
#define botao2_pin 18
//Definição dos pinos ligados aos relés
#define rele1_pin 23
#define rele2_pin 22
//Definição dos pinos virtuais para comunicação ESP32 -> Blynk
#define botao1_vpin V0
#define botao2_vpin V1
//Definição dos Widgets LED - representam estado dos relés
WidgetLED rele1v(V2);
WidgetLED rele2v(V3);
//Variáveis que marcam o estado do relé, incializada em 0
int rele1_estado = 0;
int rele2_estado = 0;
//Esta função é chamada cada vez que o dispositivo é conectado ao Blynk.Cloud
//Atualiza com o último estado armazenado no servidor caso haja desconexão
BLYNK_CONNECTED() {
Blynk.syncVirtual(botao1_vpin);
Blynk.syncVirtual(botao2_vpin);
}
//Essa função é chamada toda vez que os pinos virtuais mudam
//Ou seja, ao apertar no app o botão, atualiza o circuito
BLYNK_WRITE(botao1_vpin) { //Se houver alteração no botão virtual V1:
rele1_estado = param.asInt(); //Estado do relé 1 será igualado ao valor do parâmetro lido
digitalWrite(rele1_pin, rele1_estado);//Atualiza o pino do relé 1 com ewsse estado
}
BLYNK_WRITE(botao2_vpin) {
rele2_estado = param.asInt();
digitalWrite(rele2_pin, rele2_estado);
}
//Configuração do sistema
void setup()
{
Serial.begin(115200);//Serial inicializada
//Botões de entrada configurado como PULL UP
pinMode(botao1_pin, INPUT_PULLUP);
pinMode(botao2_pin, INPUT_PULLUP);
//Configurando os relés como saída
pinMode(rele1_pin, OUTPUT);
pinMode(rele2_pin, OUTPUT);
Blynk.begin(auth, ssid, pass); //Inicializa e loga no blynk
}
//Programa Principal
void loop()
{
//Blynk.run é a principal rotina, responsável por manter a conexão e atualizar os dados
//Atenção: NÃO USAR DELAY com o Blynk.run() - desconexão
Blynk.run();
timer.run(); //Utiliza o temporizador definido pelo Blynk
//Subrotina.
ler_botoes();
atualiza_led();
}
//Rotina que lê os botões físicos
void ler_botoes(){
if(digitalRead(botao1_pin) == LOW){//botão muda estado em nível baixo
delay(200);//200ms de delay para leitura do botão
controle_rele(1);//envia para a rotina de relé qual deve ser acionado
Blynk.virtualWrite(botao1_vpin, rele1_estado); //update do botão virtual 1
}
if (digitalRead(botao2_pin) == LOW){
delay(200);
controle_rele(2);
Blynk.virtualWrite(botao2_vpin, rele2_estado);
}
}
//Rotina de acionamento dos relés
void controle_rele(int rele){
if(rele == 1){//se o relé acionado for o 1
rele1_estado = !rele1_estado; //inverte estado do relé
digitalWrite(rele1_pin, rele1_estado); //atualiza a saída com o estado do relé
Serial.print("Estado Relé 1 = "); //prints na serial para teste
Serial.println(rele1_estado);
delay(50);
}
if(rele == 2){//se o relé acionado for o 2
rele2_estado = !rele2_estado; //inverte estado do relé
digitalWrite(rele2_pin, rele2_estado); //atualiza a saída com o estado do relé
Serial.print("Estado Relé 2 = ");
Serial.println(rele2_estado);
delay(50);
}
}
//Rotina para atualização dos Widgets LED
void atualiza_led(){
if(rele1_estado==1) rele1v.on(); //Se o relé estiver ligado, liga LED virtual 1
else rele1v.off(); //Senão LED virtual 1 mantém-se desligado
if(rele2_estado==1) rele2v.on();
else rele2v.off();
}