// From https://randomnerdtutorials.com/esp32-mqtt-publish-subscribe-arduino-ide
#include <WiFi.h>
#include "PubSubClient.h"
const char* ssid = "Wokwi-GUEST";
const char* password = "";
const char* mqttServer = "broker.hivemq.com";
const char *mqtt_username = "";
const char *mqtt_password = "";
int port = 1883;
String stMac;
char mac[50];
char clientId[50];
WiFiClient espClient;
PubSubClient client(espClient);
#define LED_FAROL 15
#define BUZZER 4
#define LED_FREIO 2
#define SENS_D 5
#define SENS_E 18
#define MOTOR_D 21
#define MOTOR_E 19
int buzzerState = 0;
int aceleradorState = 0;
void setup() {
Serial.begin(115200);
randomSeed(analogRead(0));
delay(10);
Serial.println();
Serial.print("Connecting to ");
Serial.println(ssid);
wifiConnect();
Serial.println("");
Serial.println("WiFi connected");
Serial.println("IP address: ");
Serial.println(WiFi.localIP());
Serial.println(WiFi.macAddress());
stMac = WiFi.macAddress();
stMac.replace(":", "_");
Serial.println(stMac);
client.setServer(mqttServer, port);
client.setCallback(callback);
pinMode(LED_FAROL, OUTPUT);
pinMode(BUZZER, OUTPUT);
pinMode(LED_FREIO, OUTPUT);
pinMode(SENS_D, INPUT);
pinMode(SENS_E, INPUT);
pinMode(MOTOR_D, OUTPUT);
pinMode(MOTOR_E, OUTPUT);
}
void wifiConnect() {
WiFi.mode(WIFI_STA);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
}
void mqttReconnect() {
while (!client.connected()) {
Serial.print("Attempting MQTT connection...");
long r = random(1000);
sprintf(clientId, "clientId-%ld", r);
if (client.connect(clientId, mqtt_username, mqtt_password)) {
Serial.print(clientId);
Serial.println(" connected");
client.subscribe("8f81cd1b9ef1462786129206d7c63ad90000100s0010s0d0hj/controle");
} else {
Serial.print("failed, rc=");
Serial.print(client.state());
Serial.println(" try again in 5 seconds");
delay(5000);
}
}
}
void callback(char* topic, byte* message, unsigned int length) {
Serial.print("Message arrived on topic: ");
Serial.print(topic);
Serial.print(". Message: ");
String stMessage;
for (int i = 0; i < length; i++) {
Serial.print((char)message[i]);
stMessage += (char)message[i];
}
Serial.println();
Serial.println(stMessage);
if (String(topic) == "8f81cd1b9ef1462786129206d7c63ad90000100s0010s0d0hj/controle") {
if(stMessage == "farol_on"){
digitalWrite(LED_FAROL, HIGH);
}
if(stMessage == "farol_off") {
digitalWrite(LED_FAROL, LOW);
}
if(stMessage == "buzina_on"){
buzzerState = 1;
}
if(stMessage == "buzina_off") {
buzzerState = 0;
}
if(stMessage == "acelerador_on"){
aceleradorState = 1;
}
if(stMessage == "acelerador_off") {
aceleradorState = 0;
}
}
}
void loop() {
delay(10);
if (!client.connected()) {
mqttReconnect();
}
if (buzzerState == 1) {
digitalWrite(BUZZER, HIGH);
} else {
digitalWrite(BUZZER, LOW);
}
if (aceleradorState == 1) {
digitalWrite(LED_FREIO, LOW);
if (digitalRead(SENS_D) == HIGH && digitalRead(SENS_E) == LOW) {
digitalWrite(MOTOR_D, LOW);
digitalWrite(MOTOR_E, HIGH);
delay(50);
}
if (digitalRead(SENS_E) == HIGH && digitalRead(SENS_D) == LOW) {
digitalWrite(MOTOR_D, HIGH);
digitalWrite(MOTOR_E, LOW);
delay(50);
}
if (digitalRead(SENS_D) == HIGH && digitalRead(SENS_E) == HIGH) {
digitalWrite(MOTOR_D, LOW);
digitalWrite(MOTOR_E, LOW);
delay(50);
}
if (digitalRead(SENS_D) == LOW && digitalRead(SENS_E) == LOW) {
digitalWrite(MOTOR_D, HIGH);
// Contorna problema no sensor
// digitalWrite(MOTOR_E, LOW);
digitalWrite(MOTOR_E, HIGH);
delay(50);
}
digitalWrite(MOTOR_D, LOW);
digitalWrite(MOTOR_E, LOW);
delay(500);
} else {
digitalWrite(LED_FREIO, HIGH);
digitalWrite(MOTOR_D, LOW);
digitalWrite(MOTOR_E, LOW);
}
client.loop();
}