#include <WiFi.h>
#include <MQTTPubSubClient.h>
#include <Adafruit_Sensor.h>
#include <DHT_U.h>
extern "C" {
#include "freertos/FreeRTOS.h"
#include "freertos/timers.h"
}
#define Relay4 15 //D15 LED-Orangs = Water-1
#define Relay3 2 //D2 LED-Blue = Water-2
#define Relay2 19 //D19 LED-Blue = Motor
#define Relay1 23 //D23 LED-RED = Fan
#define WIFI_SSID "Wokwi-GUEST"
#define WIFI_PASSWORD ""
//#define MQTT_HOST "test.mosquitto.org"
#define MQTT_HOST "broker.mqttgo.io"
#define MQTT_PORT 1883
#define DHTPIN 12
// DHT parameters
#define DHTTYPE DHT22 // DHT 12
DHT_Unified dht(DHTPIN, DHTTYPE);
WiFiClient client;
MQTTPubSubClient mqtt;
int count;
float temp, hum;
bool Send= false;
String json="";
//=============================================================================
void connect() {
connect_to_wifi:
Serial.print("connecting to wifi...");
while (WiFi.status() != WL_CONNECTED) {
Serial.print(".");
delay(1000);
}
Serial.println(" connected!");
connect_to_host:
Serial.print("connecting to host...");
client.stop();
while (!client.connect(MQTT_HOST, 1883)) {
Serial.print(".");
delay(1000);
if (WiFi.status() != WL_CONNECTED) {
Serial.println("WiFi disconnected");
goto connect_to_wifi;
}
}
Serial.println(" connected!");
Serial.print("connecting to mqtt broker...");
mqtt.disconnect();
while (!mqtt.connect("arduino", "", "")) {
Serial.print(".");
delay(1000);
if (WiFi.status() != WL_CONNECTED) {
Serial.println("WiFi disconnected");
goto connect_to_wifi;
}
if (client.connected() != 1) {
Serial.println("WiFiClient disconnected");
goto connect_to_host;
}
}
Serial.println(" connected!");
}
//=============================================================================
void Publish_message() {
if (Send){
mqtt.publish("alex9ufo/esp32/led/status", json);
Serial.println();
Serial.print("publish message to MQTT ---");
Serial.println(json);
Send= false;
json="";
}
}
//=============================================================================
void setup() {
pinMode(Relay1, OUTPUT);
pinMode(Relay2, OUTPUT);
pinMode(Relay3, OUTPUT);
pinMode(Relay4, OUTPUT);
Serial.begin(115200);
dht.begin();
// Get temperature sensor details.
sensor_t sensor;
dht.temperature().getSensor(&sensor);
dht.humidity().getSensor(&sensor);
WiFi.begin(WIFI_SSID, WIFI_PASSWORD, 6);
mqtt.begin(client);
connect();
mqtt.subscribe([](const String& topic, const String& payload, const size_t size) {
Serial.println("mqtt received: " + topic + " - " + payload);
});
mqtt.subscribe("alex9ufo/esp32/led/control", [] (const String& payload, const size_t size) {
Serial.print("alex9ufo/esp32/led/control");
Serial.println(payload);
String message=payload;
message.trim();
Serial.print(message);
if ( message == "1on" ) {
digitalWrite(Relay1, HIGH); // Turn on the LED
Send = true;
json="Relay1on";
}
if ( message == "1off" ) {
digitalWrite(Relay1, LOW); // Turn off the LED
Send = true;
json="Relay1off";
}
if ( message == "2on" ) {
digitalWrite(Relay2, HIGH); // Turn on the LED
Send = true;
json="Relay2on";
}
if ( message == "2off" ) {
digitalWrite(Relay2, LOW); // Turn off the LED
Send = true;
json="Relay2off";
}
if ( message == "3on" ) {
digitalWrite(Relay3, HIGH); // Turn on the LED
Send = true;
json="Relay3on";
}
if ( message == "3off" ) {
digitalWrite(Relay3, LOW); // Turn off the LED
Send = true;
json="Relay3off";
}
if ( message == "4on" ) {
digitalWrite(Relay4, HIGH); // Turn on the LED
Send = true;
json="Relay4on";
}
if ( message == "4off" ) {
digitalWrite(Relay4, LOW); // Turn off the LED
Send = true;
json="Relay4off";
}
});
}
//=============================================================================
void loop() {
mqtt.update();
Publish_message();
if (!mqtt.isConnected()) {
connect();
}
// publish message
static uint32_t prev_ms = millis();
if (millis() > prev_ms + 2500) {
prev_ms = millis();
sensors_event_t event;
dht.temperature().getEvent(&event);
if (isnan(event.temperature)) {
Serial.println(F("Error reading temperature!"));
}
else {
Serial.print(F("Temperature: "));
temp = event.temperature;
Serial.print(temp);
Serial.println(F("°C"));
}
// Get humidity event and print its value
dht.humidity().getEvent(&event);
if (isnan(event.relative_humidity)) {
Serial.println(F("Error reading humidity!"));
}
else {
Serial.print(F("Humidity: "));
hum = event.relative_humidity;
Serial.print(hum);
Serial.println(F("%"));
}
String msgStr = String(temp) + "," + String(hum) ;
//mqtt.publish("alex9ufo/esp32/dht/temp", String(temp));
//delay(100);
//mqtt.publish("alex9ufo/esp32/dht/humi", String(hum));
delay(100);
mqtt.publish("alex9ufo/esp32/dht/temphumi", msgStr);
}
}
沒有留言:
張貼留言