// Menghubungkan wifi
// Menghubungkan ke server MQTT: broker.emqx.io
// Mengirim data suhu ke mqtt dengan topik: mentoring-12/temperature
// {'temp': 20, 'humi': 30}
// Mengambil data lampu dari mqtt dengan topik: mentoring-12/lamp
// {'status': 1, 'red':1, 'green':1, 'blue':1} => nyala {'status': 0 ,'red':1, 'green':1, 'blue':1} => mati
// Init Library
#include <WiFi.h>
#include <WiFiClientSecure.h>
#include "DHTesp.h"
#include <PubSubClient.h>
#include <Arduino_JSON.h>
// Define Pin
#define LED_RED 13
#define LED_GREEN 12
#define LED_BLUE 14
#define DHT_PIN 18
// Setup Wifi
const char ssid[] = "Wokwi-GUEST";
const char pass[] = "";
// Setup MQTT
WiFiClientSecure espClient;
PubSubClient client(espClient);
unsigned long lastMsg = 0;
const char *mqttServer = "hf33e3e1.ala.us-east-1.emqxsl.com";
const char *mqttUsername = "test";
const char *mqttPassword = "test";
int mqttPort = 8883;
const char *topic_temperature = "/temp";
const char *topic_lamp = "/lamp";
const char *certificate = "-----BEGIN CERTIFICATE-----\r\n"
"MIIDrzCCApegAwIBAgIQCDvgVpBCRrGhdWrJWZHHSjANBgkqhkiG9w0BAQUFADBh\r\n"
"MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3\r\n"
"d3cuZGlnaWNlcnQuY29tMSAwHgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBD\r\n"
"QTAeFw0wNjExMTAwMDAwMDBaFw0zMTExMTAwMDAwMDBaMGExCzAJBgNVBAYTAlVT\r\n"
"MRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5j\r\n"
"b20xIDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IENBMIIBIjANBgkqhkiG\r\n"
"9w0BAQEFAAOCAQ8AMIIBCgKCAQEA4jvhEXLeqKTTo1eqUKKPC3eQyaKl7hLOllsB\r\n"
"CSDMAZOnTjC3U/dDxGkAV53ijSLdhwZAAIEJzs4bg7/fzTtxRuLWZscFs3YnFo97\r\n"
"nh6Vfe63SKMI2tavegw5BmV/Sl0fvBf4q77uKNd0f3p4mVmFaG5cIzJLv07A6Fpt\r\n"
"43C/dxC//AH2hdmoRBBYMql1GNXRor5H4idq9Joz+EkIYIvUX7Q6hL+hqkpMfT7P\r\n"
"T19sdl6gSzeRntwi5m3OFBqOasv+zbMUZBfHWymeMr/y7vrTC0LUq7dBMtoM1O/4\r\n"
"gdW7jVg/tRvoSSiicNoxBN33shbyTApOB6jtSj1etX+jkMOvJwIDAQABo2MwYTAO\r\n"
"BgNVHQ8BAf8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUA95QNVbR\r\n"
"TLtm8KPiGxvDl7I90VUwHwYDVR0jBBgwFoAUA95QNVbRTLtm8KPiGxvDl7I90VUw\r\n"
"DQYJKoZIhvcNAQEFBQADggEBAMucN6pIExIK+t1EnE9SsPTfrgT1eXkIoyQY/Esr\r\n"
"hMAtudXH/vTBH1jLuG2cenTnmCmrEbXjcKChzUyImZOMkXDiqw8cvpOp/2PV5Adg\r\n"
"06O/nVsJ8dWO41P0jmP6P6fbtGbfYmbW0W5BjfIttep3Sp+dWOIrWcBAI+0tKIJF\r\n"
"PnlUkiaY4IBIqDfv8NZ5YBberOgOzW6sRBc4L0na4UU+Krk2U886UAb3LujEV0ls\r\n"
"YSEY1QSteDwsOoBrp+uvFRTp2InBuThs4pFsiv9kuXclVzDAGySj4dzp30d8tbQk\r\n"
"CAUw7C29C79Fv1C5qfPrmAESrciIxpg0X40KPMbp1ZWVbd4=\r\n"
"-----END CERTIFICATE-----";
// Init DHT
DHTesp dht;
void setup() {
// Connect Wifi
pinMode(LED_RED, OUTPUT);
pinMode(LED_GREEN, OUTPUT);
pinMode(LED_BLUE, OUTPUT);
Serial.begin(115200);
Serial.print("Connecting to WiFi");
espClient.setCACert(certificate);
WiFi.begin(ssid, pass, 6);
while (WiFi.status() != WL_CONNECTED) {
delay(100);
Serial.print(".");
}
Serial.println(" Connected!");
// Connect MQTT SERVER
client.setServer(mqttServer, mqttPort); //perintah connecting / koneksi awal ke broker
client.setCallback(callback); //perintah menghubungkan ke mqtt broker untuk subscribe data
// Setup DHT22
dht.setup(DHT_PIN, DHTesp::DHT22);
}
void loop() {
if (!client.connected()) {
reconnect();
}
client.loop();
unsigned long now = millis();
if (now - lastMsg > 2000) { //perintah publish data
lastMsg = now;
TempAndHumidity data = dht.getTempAndHumidity();
String temp = String(data.temperature); //membuat variabel temp untuk di publish ke broker mqtt
String hum = String(data.humidity);
// {'temp': 20, 'humi': 30}
// objTemp = {"temp": temp, "humi"}
JSONVar objTemp;
objTemp["temp"] = temp;
objTemp["humi"] = hum;
String json = JSON.stringify(objTemp);
//membuat variabel hum untuk di publish ke broker mqtt
client.publish(topic_temperature, json.c_str()); //publish data dari varibel temp ke broker mqtt
Serial.print("Temperature: ");
Serial.println(temp);
Serial.print("Humidity: ");
Serial.println(hum);
}
}
// Helper Function
void callback(char* topic, byte* payload, unsigned int length) { //perintah untuk menampilkan data ketika esp32 di setting sebagai subscriber
String sMsg;
Serial.print("Message arrived in topic: ");
Serial.println(topic);
// Serial.print("Message:");
for (int i = 0; i < length; i++) {
// Serial.print((char) payload[i]);
sMsg += (char) payload[i];
}
JSONVar objMsg = JSON.parse(sMsg);
process_data(objMsg);
Serial.println();
Serial.println("-----------------------");
}
void process_data(JSONVar jsonObject){
if (JSON.typeof(jsonObject) == "undefine") {
Serial.println("Gagal mendapatkan data karena type undefine");
return;
}
if (jsonObject.hasOwnProperty("status") && jsonObject.hasOwnProperty("red") && jsonObject.hasOwnProperty("green") && jsonObject.hasOwnProperty("blue")) {
Serial.print("message :");
Serial.println(jsonObject);
int status = jsonObject["status"];
int red = jsonObject["red"];
int green = jsonObject["green"];
int blue = jsonObject["blue"];
if (status == 1){
Serial.print("Status : ON");
if (red == 1){
digitalWrite(LED_RED, LOW);
} else {
digitalWrite(LED_RED, HIGH);
}
if (green == 1){
digitalWrite(LED_GREEN, LOW);
} else {
digitalWrite(LED_GREEN, HIGH);
}
if (blue == 1){
digitalWrite(LED_BLUE, LOW);
} else {
digitalWrite(LED_BLUE, HIGH);
}
} else {
Serial.print("Status : OFF");
digitalWrite(LED_RED, HIGH);
digitalWrite(LED_GREEN, HIGH);
digitalWrite(LED_BLUE, HIGH);
}
}
}
void reconnect() { //perintah koneksi esp32 ke mqtt broker baik itu sebagai publusher atau subscriber
// Loop until we're reconnected
while (!client.connected()) {
Serial.print("Attempting MQTT connection...");
// perintah membuat client id agar mqtt broker mengenali board yang kita gunakan
String clientId = "mentoring14-";
clientId += String(random(0xffff), HEX);
// Attempt to connect
if (client.connect(clientId.c_str(), mqttUsername, mqttPassword)) {
Serial.println("Connected");
client.subscribe(topic_lamp);
} else {
Serial.print("failed, rc=");
Serial.print(client.state());
Serial.println(" try again in 5 seconds");
// Wait 5 seconds before retrying
delay(5000);
}
}
}