t#include #include #include #include // WiFi const char *ssid = "TuanAnh"; const char *password = "tuananh123"; // MQTT Broker const char *mqtt_broker = "broker.hivemq.com"; const char *topic = "smarthome"; const char *mqtt_username = ""; const char *mqtt_password = ""; const int mqtt_port = 1883; WiFiClient espClient; PubSubClient client(espClient); StaticJsonDocument<200> doc; void setup() { Serial.begin(9600); Wire.begin(D1, D2); /* join i2c bus with SDA=D1 and SCL=D2 of NodeMCU */ // connecting to a WiFi network WiFi.begin(ssid, password); while (WiFi.status() != WL_CONNECTED) { delay(500); Serial.println("Connecting to WiFi.."); } Serial.println("Connected to the WiFi network"); //connecting to a mqtt broker client.setServer(mqtt_broker, mqtt_port); client.setCallback(callback); while (!client.connected()) { String client_id = "esp8266-client-"; client_id += String(WiFi.macAddress()); Serial.printf("The client %s connects to the public mqtt broker\n", client_id.c_str()); //in ra id cua client if (client.connect(client_id.c_str(), mqtt_username, mqtt_password)) { Serial.println("Connected!!! Okay done!"); } else { Serial.print("failed with state "); Serial.print(client.state()); delay(2000); } } // publish and subscribe client.publish(topic, "Arduino connected MQTT broker!"); client.subscribe(topic); } char json[75]; 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]); json[i] = (char) payload[i]; } Serial.println(); DeserializationError error = deserializeJson(doc, json); // Test if parsing succeeds. if (error) { Serial.print(F("deserializeJson() failed: ")); Serial.println(error.f_str()); return; } // Fetch values int sensor = doc["digitalIo"]; long status = doc["status"]; bool isAuto = doc["isAuto"]; // Print values. Serial.println(sensor); Serial.println(status); Serial.println(isAuto); Wire.beginTransmission(8); /* begin with device address 8 */ Wire.write(json); /* sends to arduino*/ Wire.endTransmission(); /* stop transmitting */ } long lastMsg = 0; void loop() { client.loop(); unsigned long now = millis(); if (now - lastMsg > 2000) { lastMsg = now; // DynamicJsonDocument doc2(1024); // JsonObject root = doc2.to(); // publish(root, 1, digitalRead(motor), priority_motor, t, h); // publish(root, 2, digitalRead(led), priority_led, t, h); // publish(root, 3, digitalRead(speaker), priority_speaker, t, h); // publish(root, 4, digitalRead(fan), priority_fan, t, h); } } void publish(JsonObject root, int id, int status, bool priority, float t, float h) { char msg[75]; root["digitalIo"] = id; root["status"] = status; if (priority) { root["isAuto"] = true; } else root["isAuto"] = false; root["data"][0] = t; root["data"][1] = h; char json_string[50]; Serial.print("Publish data: "); serializeJson(root, json_string); Serial.println(json_string); snprintf (msg, 100, "%s", json_string); client.publish(topic, msg); }