//-------------------------------------------------------------------------
#include <WiFi.h>
#include <PubSubClient.h>
#include <WiFiClient.h>
#include <DHTesp.h>
WiFiClient espClient;
PubSubClient client(espClient);
//------------------------variaveis
char ssid[] = "Wokwi-GUEST"; // Substitua pela sua rede wifi SSID (name).
char pass[] = ""; // Substitua pel sua senha de wifi
//------ Servidor - MQTT broker
const char* mqtt_server = "mqtt3.thingspeak.com";
//-- Config publisher
const char* publishTopic ="channels/2485335/publish"; //Substitua o numero 2173921 pelo seu channel ID
//-- Config subscribed settings command 1
const char* subscribeTopicFor_Command_1="channels/2485335/subscribe/fields/field1"; //Substitua o numero 2173921 pelo seu channel ID
//const char* subscribeTopicFor_Command_2="channels/2173921/subscribe/fields/field2"; //Substitua o numero 2173921 pelo seu channel ID
const unsigned long postingInterval = 20L * 1000L; // publicar a cada 20 segundos
unsigned long lastUploadedTime = 0;
//Config DHT
DHTesp dhtSensor;
const int DHT_PIN = 15;
//==========================================
void reconnect() {
// Loop até estarmos reconectados
while (!client.connected()) {
Serial.print("Tentando conexão MQTT...");
//client.connect("cliend ID", "username","password") Substitua pela sua senha Thingspeak MQTT
if (client.connect("IR4rJxgvDzw2DC8vAQ44Ci0", "IR4rJxgvDzw2DC8vAQ44Ci0","WM0HBTtWdHKS8QfeL3SkAjn9")) {
Serial.println("Connectado!");
client.subscribe(subscribeTopicFor_Command_1); // tópico subscribe
} else {
Serial.print("Falhou, rc=");
Serial.print(client.state());
Serial.println(" Tentando novamente em 5 segundos");
delay(5000);
}
}
}
//========================================= messagem recebida
void messageReceived(String &topic, String &payload) {
Serial.println("incoming: " + topic + " - " + payload);
if (topic==subscribeTopicFor_Command_1){
Serial.println("Command 1 = "+payload);
int v = payload.toInt();
if (v>0) digitalWrite(15,HIGH);
else digitalWrite(15,LOW);
}
}
//========================================= setup
//=========================================
void setup() {
pinMode(14,OUTPUT);
Serial.begin(115200);
Serial.print("\nConectando-se a ");
Serial.println(ssid);
WiFi.mode(WIFI_STA);
WiFi.begin(ssid, pass);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
randomSeed(micros());
Serial.println("\nWiFi connectado\nEndereço IP: ");
Serial.println(WiFi.localIP());
client.setServer(mqtt_server, 1883);
client.setCallback(callback);
dhtSensor.setup(DHT_PIN, DHTesp::DHT22);
}
//========================================= loop
//=========================================
void loop() {
TempAndHumidity data = dhtSensor.getTempAndHumidity();
if (!client.connected()) reconnect();
client.loop();
if (millis() - lastUploadedTime > postingInterval) { // O intervalo de envio precisa ser de 15 segundos
String sensorValue_1 = String(data.temperature);
String sensorValue_2 = String(data.humidity);
String dataText = String("field1=" + String(sensorValue_1)+ "&field2=" + String(sensorValue_2)+"&status=MQTTPUBLISH");
publishMessage(publishTopic,dataText,true);
lastUploadedTime = millis();
}
}
//=======================================
// Esta função é chamada cada vez que se recebe uma nova mensagem do broker
void callback(char* topic, byte* payload, unsigned int length) {
String incommingMessage = "";
for (int i = 0; i < length; i++) incommingMessage+=(char)payload[i];
Serial.println("Mensagem recebida ["+String(topic)+"]"+incommingMessage);
//--- check the incomming message
if( strcmp(topic,subscribeTopicFor_Command_1) == 0){
if (incommingMessage.equals("1")) digitalWrite(14, HIGH); // liga LED
else digitalWrite(14, LOW); // Desliga LED
}
}
//======================================= publising como string
void publishMessage(const char* topic, String payload , boolean retained){
if (client.publish(topic, payload.c_str()))
Serial.println("Mensagem publicada ["+String(topic)+"]: "+payload);
}