// Importações
#include <PubSubClient.h>
#include <WiFi.h> //Trocar por #include <ESP8266WiFi.h>
#include <ArduinoJson.h>
#include <ESP32Servo.h> // Trocar por #include <Servo.h>
#include <NTPClient.h>
#include <WiFiUdp.h>
// Definição dos pinos
#define ULTRA_TRIG 33
#define ULTRA_ECHO 32
#define RAIN_ANALOG 34
#define LED_VERDE 16
#define LED_VERMELHO 17
#define SERVO_PIN 18
// Informações importantes
const char *nome_wifi = "Wokwi-GUEST"; // Trocar por nome do Wifi certo
const char *senha_wifi = ""; // Trocar por senha do Wifi certa
const char *mqtt_broker = "broker.hivemq.com";
const char *topic = "smartpark/status";
const char *mqtt_username = "emqx";
const char *mqtt_password = "public";
const int mqtt_port = 1883;
// Servo
Servo servo;
// WiFi e MQTT
WiFiClient espClient;
PubSubClient client(espClient);
// Conexão para obter data/hora
WiFiUDP ntpUDP;
NTPClient timeClient(ntpUDP, "pool.ntp.org");
// Função setup dos pinos
void pin_setup() {
pinMode(ULTRA_TRIG, OUTPUT);
pinMode(ULTRA_ECHO, INPUT);
pinMode(RAIN_ANALOG, INPUT);
pinMode(LED_VERDE, OUTPUT);
pinMode(LED_VERMELHO, OUTPUT);
servo.attach(SERVO_PIN);
}
void setup() {
Serial.begin(115200);
pin_setup();
servo.write(90);
WiFi.begin(nome_wifi, senha_wifi);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.println("Conectando ao WiFi..");
}
Serial.println("Conectado ao WiFi!");
client.setServer(mqtt_broker, mqtt_port);
client.setCallback(callback);
while (!client.connected()) {
String client_id = "esp8266-client-";
client_id += String(WiFi.macAddress());
Serial.printf("O cliente %s conectou ao MQTT Broker\n", client_id.c_str());
if (client.connect(client_id.c_str(), mqtt_username, mqtt_password)) {
Serial.println("Hivemq MQTT broker conectado");
} else {
Serial.print("Falhou com o estado ");
Serial.print(client.state());
delay(2000);
}
}
//client.publish(topic, "Confirmando conexão MQTT!"); // Comentado para não publicar essa mensagem
//client.subscribe(topic); // Comentado para não ficar recebendo as mensagens
timeClient.begin();
timeClient.setTimeOffset(-14400);
}
// Função para receber mensagens, no momento inutilizada
void callback(char *topic, byte *payload, unsigned int length) {
Serial.print("Message arrived in topic: ");
Serial.println(topic);
Serial.print("Message:");
for (int i = 0; i < length; i++) {
Serial.print((char) payload[i]);
}
Serial.println();
Serial.println("-----------------------");
}
// Função para obter a data e hora
String getDateTimeFormatted() {
timeClient.update();
time_t epochTime = timeClient.getEpochTime();
String currentTime = timeClient.getFormattedTime();
struct tm *ptm = gmtime ((time_t *)&epochTime);
int monthDay = ptm->tm_mday;
int currentMonth = ptm->tm_mon+1;
int currentYear = ptm->tm_year+1900;
String currentDate = String(currentYear) + "-" + String(currentMonth) + "-" + String(monthDay);
String formattedDateTime = "";
formattedDateTime = currentDate + "T" + currentTime;
return formattedDateTime;
}
void loop() {
client.loop();
digitalWrite(ULTRA_TRIG, HIGH);
delayMicroseconds(10);
digitalWrite(ULTRA_TRIG, LOW);
int duration = pulseIn(ULTRA_ECHO, HIGH);
int cm = duration / 58;
int rain = analogRead(RAIN_ANALOG);
String jsonString;
String dateTime = getDateTimeFormatted();
String message = "";
if(cm < 5) {
digitalWrite(LED_VERMELHO,HIGH);
digitalWrite(LED_VERDE,LOW);
if(rain<600){
message = "Vaga ocupada e coberta!";
Serial.println(message);
servo.write(0);
}else{
message = "Vaga ocupada e descoberta!";
Serial.println(message);
servo.write(90);
}
}else{
digitalWrite(LED_VERMELHO,LOW);
digitalWrite(LED_VERDE,HIGH);
servo.write(90);
if(rain<600){
message = "Vaga livre e com chuva!";
Serial.println(message);
}else{
message = "Vaga livre e sem chuva!";
Serial.println(message);
}
}
JsonDocument doc;
doc["ultrasonic"] = cm;
doc["rain"] = rain;
doc["datetime"] = dateTime;
doc["message"] = message;
serializeJson(doc, jsonString);
client.publish(topic, jsonString.c_str());
delay(5000);
}