// Bibliotecas necessárias
#include <ESP32Servo.h>
#include <WiFi.h>
#include "PubSubClient.h"
// Pino do sensor de luminosidade
const int sensorLuminosidadePin = 34;
// Pino do servomotor
const int servomotorPin = 2;
// Pino do botão
const int botaoPin = 15;
// Objeto do servomotor
Servo servo;
// Conexão com o wifi fake do wokwi
const char* ssid = "Wokwi-GUEST";
const char* password = "";
// Conexão com o MQTT
const char* mqttServer = "mqtt-dashboard.com";
int port = 1883;
char* idCliente = "projeto_isa_342";
// Cliente wifi, permitindo a conexão ESP32 com a internet
WiFiClient espClient;
// Cliente MQTT
PubSubClient client(espClient);
void setup() {
// Define o pino do servomotor e os seus limites de pulso
servo.attach(servomotorPin, 500, 2400);
// Define o pino do botão como entrada (input)
pinMode(botaoPin, INPUT);
// Comunicação serial
Serial.begin(115200);
randomSeed(analogRead(0));
// Demonstra início de conexão
delay(10);
Serial.println();
Serial.print("Conectando ao ");
Serial.println(ssid);
// Conecta com o wifi
conexaoWifi();
Serial.println("");
Serial.println("WiFi conectado com sucesso");
// Cliente MQTT se conecta ao servidor MQTT
client.setServer(mqttServer, port);
// Função que "escuta" as mensagens do MQTT
client.setCallback(callback);
}
// Função responsável por conectar o wifi
void conexaoWifi() {
// Define o modo de operação do wifi
WiFi.mode(WIFI_STA);
// Define SSID e Password do wifi
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
}
// Função responsável pela reconexão do MQTT
void mqttReconexao() {
// Enquanto o cliente MQTT não estiver conectado
while (!client.connected()) {
Serial.print("Conectando ao MQTT");
// Tenta reconectar ao MQTT
if (client.connect(idCliente)) {
Serial.print(idCliente);
Serial.println("Conectado!!!!!!!!!!!!!!!");
// Inscreve um tópico MQTT após a conexão
client.subscribe("RMXPTO/dino");
client.subscribe("isa_teste_342");
} else {
Serial.print(client.state());
delay(3000);
}
}
}
// Função responsável pelo Mmovimento do servomotor
void movimentoServomotor()
{
// Servo gira para 0 graus
servo.write(0);
delay(15);
delay(1000);
// Servo gira para 180 graus
servo.write(180);
delay(1000);
// Servo gira para 0 graus
servo.write(0);
}
// Escuta as mensagens do MQTT
void callback(char* topico, byte* mensagem, unsigned int tamanho) {
Serial.print("Mensagem chegou no tópico: ");
Serial.print(topico);
Serial.print("A mensagem é: ");
String novaMensagem;
// Laço que define a nova mensagem
for (int i = 0; i < tamanho; i++) {
Serial.print((char)mensagem[i]);
novaMensagem += (char)mensagem[i];
}
Serial.println();
// Verifica o nome do tópico e a mensagem
if (String(topico) == "RMXPTO/dino") {
if(novaMensagem == "pulo"){
// Chamada da função
movimentoServomotor();
}
}
if (String(topico) == "isa_teste") {
if(novaMensagem == "teste"){
Serial.print("isaisaisa");
}
}
}
void loop() {
// Estado do botão
int estadoBotao = digitalRead(botaoPin);
// Com o botão pressionado, envia uma mensagem MQTT
if (estadoBotao == HIGH) {
client.publish("RMXPTO/button", "pressed");
movimentoServomotor();
delay(1000);
}
delay(10);
// Caso o cliente não esteja conectado ao MQTT, tenta novamente conectar
if (!client.connected()) {
mqttReconexao();
}
client.loop();
// Armazena o valor analógico do sensor de luminosidade
int valorAnalogico = analogRead(sensorLuminosidadePin);
Serial.print("Valor analógico = ");
Serial.print(valorAnalogico);
// Verifica os valores do sensor de luminosidadde
if (valorAnalogico < 40) {
Serial.println(" Escuro");
servo.write(120);
} else if (valorAnalogico < 800) {
Serial.println(" Escurecendo");
servo.write(120);
} else if (valorAnalogico < 2000) {
Serial.println(" Claro");
servo.write(0);
delay(15);
} else if (valorAnalogico < 3200) {
Serial.println(" Brilhante");
servo.write(0);
} else {
Serial.println(" Muito brilhante");
servo.write(0);
}
delay(500);
}
// https://www.hivemq.com/demos/websocket-client/