#include <WiFi.h>
#include <WiFiClient.h>
#include <HTTPClient.h>
#include <DHTesp.h>
#include <WiFiClientSecure.h>
#include <PubSubClient.h>
#include <Arduino_JSON.h>
#define DHT_PIN 18
String baseUrl = "https://blectric.web.id/api/v1";
String temperatureEndpoint = baseUrl + "/temperatures";
const char *mqttServer = "ze3c7493.ala.asia-southeast1.emqxsl.com"; // host
const char *topic = "temperatures"; // Rest API: endpoint
const char *mqtt_username = "mentoring19";
const char *mqtt_password = "mentoring19";
int port = 8883;
static const char *root_ca PROGMEM = R"EOF(
-----BEGIN CERTIFICATE-----
MIIDrzCCApegAwIBAgIQCDvgVpBCRrGhdWrJWZHHSjANBgkqhkiG9w0BAQUFADBh
MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3
d3cuZGlnaWNlcnQuY29tMSAwHgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBD
QTAeFw0wNjExMTAwMDAwMDBaFw0zMTExMTAwMDAwMDBaMGExCzAJBgNVBAYTAlVT
MRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5j
b20xIDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IENBMIIBIjANBgkqhkiG
9w0BAQEFAAOCAQ8AMIIBCgKCAQEA4jvhEXLeqKTTo1eqUKKPC3eQyaKl7hLOllsB
CSDMAZOnTjC3U/dDxGkAV53ijSLdhwZAAIEJzs4bg7/fzTtxRuLWZscFs3YnFo97
nh6Vfe63SKMI2tavegw5BmV/Sl0fvBf4q77uKNd0f3p4mVmFaG5cIzJLv07A6Fpt
43C/dxC//AH2hdmoRBBYMql1GNXRor5H4idq9Joz+EkIYIvUX7Q6hL+hqkpMfT7P
T19sdl6gSzeRntwi5m3OFBqOasv+zbMUZBfHWymeMr/y7vrTC0LUq7dBMtoM1O/4
gdW7jVg/tRvoSSiicNoxBN33shbyTApOB6jtSj1etX+jkMOvJwIDAQABo2MwYTAO
BgNVHQ8BAf8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUA95QNVbR
TLtm8KPiGxvDl7I90VUwHwYDVR0jBBgwFoAUA95QNVbRTLtm8KPiGxvDl7I90VUw
DQYJKoZIhvcNAQEFBQADggEBAMucN6pIExIK+t1EnE9SsPTfrgT1eXkIoyQY/Esr
hMAtudXH/vTBH1jLuG2cenTnmCmrEbXjcKChzUyImZOMkXDiqw8cvpOp/2PV5Adg
06O/nVsJ8dWO41P0jmP6P6fbtGbfYmbW0W5BjfIttep3Sp+dWOIrWcBAI+0tKIJF
PnlUkiaY4IBIqDfv8NZ5YBberOgOzW6sRBc4L0na4UU+Krk2U886UAb3LujEV0ls
YSEY1QSteDwsOoBrp+uvFRTp2InBuThs4pFsiv9kuXclVzDAGySj4dzp30d8tbQk
CAUw7C29C79Fv1C5qfPrmAESrciIxpg0X40KPMbp1ZWVbd4=
-----END CERTIFICATE-----
)EOF";
WiFiClientSecure espClient;
PubSubClient client(espClient);
DHTesp dht;
float temperature, humadity, celcius, fahrenheit, kelvin;
unsigned long lastTime = 0;
unsigned long intervalTime = 1000;
void setup() {
Serial.begin(115200);
dht.setup(DHT_PIN, DHTesp::DHT22);
Serial.println("Mulai menghubungkan ke WiFi...");
WiFi.begin("Wokwi-GUEST", "", 6);
while (WiFi.status() != WL_CONNECTED) {
Serial.println("Connecting....");
delay(250);
}
Serial.println("Terhubung ke WiFi.");
Serial.println("Mulai menghubungkan ke MQTT....");
espClient.setCACert(root_ca);
client.setServer(mqttServer, port);
client.setCallback(callback);
while (!client.connected()) {
mqttInit();
}
}
void loop() {
client.loop();
if (!client.connected()) {
mqttInit();
}
sendData();
}
void insertTemperature(float value) {
HTTPClient http;
// menghubungkan ke API
Serial.println("Menghubungkan ke API");
Serial.println(temperatureEndpoint);
http.begin(temperatureEndpoint);
http.addHeader("Content-Type", "Application/json");
// DynamicJsonDocument doc(1024);
// doc["value"] = value;
// String body = "";
// serializeJson(doc, body);
JSONVar dataObject;
dataObject["value"] = value;
String sData = JSON.stringify(dataObject);
// melakukan POST request
int statusCode = http.POST(sData);
if (statusCode > 0) {
Serial.println("Berhasil dengan status: " + statusCode);
String payload = http.getString();
client.publish(topic, payload.c_str());
} else {
Serial.println("Terjadi kesalahan " + statusCode);
}
http.end();
}
void getTemperature() {
HTTPClient http;
// menghubungkan ke API
Serial.println("Menghubungkan ke API");
Serial.println(temperatureEndpoint);
http.begin(temperatureEndpoint);
http.addHeader("Content-Type", "Application/json");
// melakukan GET request
int statusCode = http.GET();
Serial.print(statusCode);
if (statusCode > 0) {
Serial.println("Berhasil dengan status: " + statusCode);
String payload = http.getString();
Serial.println(payload);
} else {
Serial.println("Terjadi kesalahan " + statusCode);
}
http.end();
delay(5000);
}
void dhtRead() {
TempAndHumidity data = dht.getTempAndHumidity();
temperature = data.temperature;
humadity = data.humidity;
Serial.print("temperature: ");
Serial.println(temperature);
}
void mqttInit() {
espClient.setCACert(root_ca);
client.setServer(mqttServer, port);
client.setCallback(callback);
while (!client.connected()) {
String client_id = "blectric-iot-1";
client_id += String(WiFi.macAddress());
Serial.printf("The client %s connects to the public MQTT broker\n", client_id.c_str());
if (client.connect(client_id.c_str(), mqtt_username, mqtt_password)) {
Serial.println("Public EMQX MQTT broker connected");
} else {
Serial.print("failed with state ");
Serial.print(client.state());
delay(2000);
}
}
}
void sendData() {
if ((millis() - lastTime) > intervalTime) {
if (!client.connected()) {
mqttInit();
}
dhtRead();
insertTemperature(temperature);
lastTime = millis();
}
}
void callback(char *topic, byte *payload, unsigned int length) {
String sMsg;
Serial.print("Message arrived in topic: ");
Serial.println(topic);
Serial.print("Message:");
// perulanag/ looping
for (int i = 0; i < length; i++) {
Serial.print((char) payload[i]);
sMsg += (char) payload[i];
}
Serial.println(sMsg);
JSONVar objMsg = JSON.parse(sMsg);
processData(objMsg);
Serial.println();
Serial.println("-----------------------");
}
void processData(JSONVar jsonObject){
if (JSON.typeof(jsonObject) == "undefine") {
Serial.println("Gagal mendapatkan data karena type undefine");
return;
}
Serial.println("jsonObject :");
Serial.println(jsonObject);
}