// 64.konek wifi + broker dg led biru
// 67. mengendalikan led menggunakan mqtt
// 68. mengendalikan servo
// 69. publish (nusabotsimpletimer)
// 70. melakukan publish data
// 71. publish data analog (potensio)
// 72. publis hanya saat terjadi perubahan data potensio
// 73. publis suhu dan kelembapan dengan retain
// 74. set will notif saat esp online/offline
// 79. konek ke private broker
// 172. Serial number pada topic untuk data json
#include <WiFi.h>
#include <MQTT.h>
#include <ESP32Servo.h> // 68
#include <NusabotSimpleTimer.h> //69
#include "DHTesp.h" // 73
// 64. buat obj baru
WiFiClient net;
MQTTClient client;
Servo servo; // 68. tambah objek servo dengan nama servo
NusabotSimpleTimer timer; //69
DHTesp dhtSensor; // 73
const char ssid[] = "Wokwi-GUEST";
const char pass[] = "";
const int pinRed = 2;
const int pinGreen = 4;
const int pinBlue = 16;
const int pinLed = 13; //67
const int pinServo = 18; //68
const int pinPot = 33; //71
const int pinDHT = 25; // 73
int potValue, potValue_old = 0;// 72
String serial_number = "28889"; // 172
String suhu, suhu_old; // 73
String kelembapan, kelembapan_old; // 73
void setup(){
pinMode(pinRed, OUTPUT);
pinMode(pinGreen, OUTPUT);
pinMode(pinBlue, OUTPUT);
pinMode(pinLed, OUTPUT); // 67
pinMode(pinPot, INPUT); //71
servo.attach(pinServo, 500, 2000); // 68
dhtSensor.setup(pinDHT, DHTesp::DHT22); // 73
Serial.begin(9600);
WiFi.begin(ssid,pass);
// client.begin("broker.emqx.io", net); // //64 almt broker, koneks
client.begin("amaze.cloud.shiftr.io", net); // 79 konek ke private broker
//66
client.onMessage(subscribe);
timer.setInterval(1000, publishPot); // 69 publis > 73 publishPot
timer.setInterval(2000, publishDHT); // 73
connect();
}
void loop(){
//66
client.loop();
timer.run(); // 69
if(!client.connected()){
connect();
}
delay(10);
}
// void publish(){ // 73
void publishPot(){ // 73. ganti karena tambah publish dht
// Serial.print("Halow");
//client.publish("datadanu/data", "halooow", false, 1); //70. kirim string halow dengan QoS 1
potValue = analogRead(pinPot);// 71
if (potValue != potValue_old){ // 72
client.publish("datadanu/"+serial_number+"/potensio", String(potValue), true, 1); //71 // 172
potValue_old = potValue; // 72 . jadikan nilai skarang sbg nilai lama untuk pembanding iterasi berikutnya
}
}
void publishDHT(){ //73
TempAndHumidity data = dhtSensor.getTempAndHumidity();
suhu = String(data.temperature,2);
kelembapan = String(data.humidity,1);
Serial.println("Suhu2 "+ suhu + "C");
Serial.println("Kelembapan: "+ kelembapan + "%");
Serial.println("-----end-------");
if (suhu != suhu_old){
client.publish("datadanu/"+ serial_number +"/suhu", String(suhu), true, 1); // 172
Serial.println("Publish Suhu: "+ String(suhu) + "C");
suhu_old = suhu;
}
if (kelembapan != kelembapan_old){
client.publish("datadanu/"+serial_number+"/kelembapan", String(kelembapan), true, 1); // 172
Serial.println("Publish Kelembapan: "+ String(kelembapan) + "%");
kelembapan_old = kelembapan;
}
}
//66
void subscribe (String &topic, String &data){
Serial.print("Topic: ");
Serial.println(topic);
Serial.print("data: ");
Serial.println(data);
if(topic == "datadanu/"+ serial_number +"/led"){ //67 // 172
if(data == "on"){
digitalWrite(pinLed, HIGH);
} else if (data == "off") {
digitalWrite(pinLed, LOW);
}
}
// 68
if(topic == "datadanu/"+serial_number+"/servo"){ // 172
int posServo = data.toInt();
servo.write(posServo);
}
}
void rgb (bool red, bool green, bool blue){
digitalWrite(pinRed, red );
digitalWrite(pinGreen, green );
digitalWrite(pinBlue, blue );
}
// 65. rekonek
void connect(){
rgb(1,0,0); // merah
while(WiFi.status() != WL_CONNECTED){
delay(500);
rgb(1,1,0); // kuning = r+b
}
rgb(0,1,0); // hijau = konek wifi
client.setWill("datadanu/status/28889", "offline", true, 1); // 74. kirim status offline 169. ganti urutasn setwill agar mempermudah
// while(!client.connect("danre435454")){ //64. klienidunik, usrnm, pass
while(!client.connect("danre435454", "amaze", "wGCLv6rdkkuHgQdg")){ // 79. sesuaikan dengan broker baru
delay(500);
}
rgb(0,0,1); // 64. konek sbg klien warna biru
client.publish("datadanu/status/28889", "online", true, 1); // 74. kirim status online
client.subscribe("datadanu/#", 1); // 66 subscribe Menggunakan QoS 1
}