#include <WiFi.h>
#include "PubSubClient.h"
#include <DHT.h>
#include <RTClib.h>
#include <LiquidCrystal_I2C.h>
#include <ArduinoJson.h>
#define pinDHT 13 //deklarasi pin (GPIO 4) data sensor DHT22
#define DHTType DHT22 // deklarasi tipe sensor suhu dan kelembaban yaitu DHT22
#define pinPIR 19 // deklarasi pin (GPIO 19) data sensor PIR
#define warning 2 // deklarasi pin (GPIO 2) LED
DHT SensorDHT(pinDHT, DHTType);
RTC_DS3231 rtc;
LiquidCrystal_I2C lcd(0x27, 20, 4);
//inisilisasi untuk PIR
int gerakan;
// int kondisiPIR;
//setting awal MQTT
char* mqttServer = "broker.emqx.io"; //sesuai dengan aplikasi yang dipakai
int mqttPort = 1883;
String myClientID = "Rila";
String Topic_1 = "alat/data/temperature";
String Topic_2 = "alat/data/humidity";
//Membuat object MQTT client dan jenis koneksi
WiFiClient wifi;
PubSubClient mqttClient(wifi);
char* ssid = "Wokwi-GUEST";
char* pass = "";
void setup() {
// put your setup code here, to run once:
Serial.begin(115200);
WiFi.mode(WIFI_STA); //agar ESP jadi mode station
WiFi.begin(ssid,pass); //untuk meminta ESP connect
while(WiFi.status()!= WL_CONNECTED){
delay(100);
Serial.println("wait a minute...");
}
Serial.println("ESP 32 already connected");
//memerintahkan ESP untuk mengetahui alamat broker
init_to_broker(mqttServer, mqttPort);
//memerintahkan untuk connect broker
connect_to_broker(myClientID);
pinMode(pinPIR, INPUT);
pinMode(warning, OUTPUT);
SensorDHT.begin();
rtc.begin();
rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
// Inisialisasi LCD
lcd.init();
lcd.backlight();
lcd.setCursor(0,0);
lcd.print("Restu Amrilani F.S");
lcd.setCursor(0,1);
lcd.print("IOT Micro Base");
lcd.setCursor(0,2);
lcd.print("BLK Surabaya 2024");
delay(2000);
lcd.clear();
}
void loop() {
//Untuk baca sensor DHT22
float humidity = SensorDHT.readHumidity();
float temperature = SensorDHT.readTemperature();
if(isnan(humidity)||isnan(temperature)){
Serial.println("Sensor DHT error");
}
else{
//Menampilkan di serial monitor
Serial.print("Humidity :");
Serial.println(humidity);
Serial.print("Temperature :");
Serial.println(temperature);
Serial.println("---------------------------");
//Menampilkan di LCD
lcd.setCursor(0, 2);
lcd.print("Temperature: "); lcd.print(temperature); lcd.print(char(223)); lcd.print("C");
lcd.setCursor(0, 3);
lcd.print("Humidity: "); lcd.print(humidity); lcd.print("%");
}
// Baca waktu dari RTC dan tampilkan di Serial Monitor
DateTime now = rtc.now();
Serial.print(now.year(), DEC); Serial.print("/");
Serial.print(now.month(), DEC); Serial.print("/");
Serial.print(now.day(), DEC); Serial.println(".");
Serial.print(now.hour(), DEC); Serial.print(':');
Serial.print(now.minute(), DEC); Serial.print(':');
Serial.print(now.second(), DEC); Serial.println(".");
// Tampilkan waktu di LCD
lcd.setCursor(0, 0);
lcd.print(now.year(), DEC); lcd.print("/");
lcd.print(now.month(), DEC); lcd.print("/");
lcd.print(now.day(), DEC);
lcd.setCursor(0, 1);
lcd.print(now.hour(), DEC); lcd.print(":");
lcd.print(now.minute(), DEC); lcd.print(":");
lcd.print(now.second(), DEC);
// TempAndHumidity data = SensorDHT.getTempAndHumidity();
sendDataSensor(Topic_1, temperature);
sendDataSensor(Topic_2, humidity);
delay(2000);
gerakan = digitalRead(pinPIR);
if(gerakan==HIGH){
digitalWrite(warning, HIGH);
delay(50);
digitalWrite(warning, LOW);
delay(50);
// if(kondisiPIR==LOW){
Serial.println("Waspada!");
lcd.setCursor(12,0);
lcd.print("Waspada!");
// lcd.clear();
// delay(50);
// kondisiPIR==HIGH;
}
else{
digitalWrite(warning, LOW);
Serial.println("Amannnnn");
lcd.setCursor(12,0);
lcd.print("Aman aja");
// if(kondisiPIR==HIGH){
// Serial.println("Aman");
// lcd.setCursor(12,0);
// lcd.print("Aman");
// kondisiPIR==LOW;
}
}
//Fungsi untuk tahu alamat server dan port Broker
void init_to_broker(char* myMqttServer, int myMqttPort) {
mqttClient.setServer(myMqttServer, myMqttPort); // Mengatur detail broker target yang digunakan
// jika kita ingin menerima pesan untuk langganan yang dibuat oleh klien sebagai subscriber
// mqttClient.setCallback(callback);
}
//Fungsi untuk connect ke Broker
void connect_to_broker(String clientName) {
Serial.println("Connecting to MQTT Broker...");
String clientId = "ESP32Client-" + clientName;
mqttClient.connect(clientId.c_str()); // Connecting to Broker
while (!mqttClient.connected()) {
Serial.print("failed, rc=");
Serial.println(mqttClient.state());
Serial.println("Reconnecting to MQTT Broker..");
delay(1000);
}
Serial.print(clientId);
Serial.println(" Device to Broker Connected.");
}
void sendDataSensor(String topic, float data) {
char payload[8];
dtostrf(data, 1, 2, payload);
mqttClient.publish(topic.c_str(), payload);
Serial.print(topic);
Serial.print(" ==> ");
Serial.println(data);
}
//Membuat Json Banyak Data untuk di Publish
// void sendDataSensor(String Topic_1, float humidity, float temperature) {
// StaticJsonDocument<150> doc; // Menggunakan ukuran yang lebih besar untuk memperhitungkan tambahan karakter satuan
// char humBuf[10], tempBuf[10];
// // Format nilai kelembaban dan suhu dengan satuan
// snprintf(humBuf, sizeof(humBuf), "%.2f%%", humidity);
// snprintf(tempBuf, sizeof(tempBuf), "%.2f°C", temperature);
// doc["Humidity"] = humBuf;
// doc["Temperature"] = tempBuf;
// char jsonBuffer[150];
// serializeJson(doc, jsonBuffer);
// mqttClient.publish(Topic_1.c_str(), jsonBuffer);
// }
Loading
esp32-devkit-v1
esp32-devkit-v1