//Modul ESP32 DEVKITV1
/*
Note :
ESP32 hanya punya SAR ADC1 (GPIOs 32-39).
*/
//LIBRARY
#include <WiFi.h>
#include "PubSubClient.h"
#include "WebSocketStreamClient.h"
#include "DHTesp.h"
#include <LiquidCrystal_I2C.h>
//Konstanta Connection
const char* ssid = "Wokwi-GUEST";
const char* password = "";
const char* wsMqttServer = "taufiq.loca.lt";//Localtunnel <--Harus url internet
//const char* wsMqttServer = "http://192.168.0.148:1883";//Raspberry TPLink
//const char* wsMqttServer = "http://192.168.1.118:1880";//ubuntu
const int wsMqttPort = 80;
const char* wsMqttPath = "/taufiq/mqtt";
const char* mqttTopic = "project1/iot";
char clientId[50];
//Sumber : https://community.appinventor.mit.edu/t/esp32-wifi-webserver-led-on-off-static-ip-soft-access-point/9323/10
// Setting Static IP.
/*
IPAddress local_IP(192, 168, 1, 115);
IPAddress gateway(192, 168, 1, 1);
IPAddress subnet(255, 255, 255, 0);
IPAddress primaryDNS(8, 8, 8, 8); //optional
IPAddress secondaryDNS(8, 8, 4, 4); //optional
*/
//Konstanta LCD I2C:
LiquidCrystal_I2C lcd (0x27, 16,2);
//Konstanta HC SR04
int echopin = 5;
int trigpin =18;
int Time;
int Distance;
//Indikator Temperature Tinggi DHT22_2=>LED GREEN
const int LED_PIN = 2;
//PIN RELAY UNTUK SINYAL DARI HP
const int RELAY_13 = 13;
const int RELAY_12 = 12;
const int RELAY_14 = 14;
const int RELAY_27 = 27;
const int RELAY_26 = 26;
#define sub1 "device2/relay1" //topic dari node-red
#define sub2 "device2/relay2"
#define sub3 "device2/relay3"
#define sub4 "device2/relay4"
//Konstanta Type char Dht22-2
char Humidity2[10];
char Temp2[10];
DHTesp dhtSensor2;
//PIR1 array variabel bernilai tetap dengan type char mulai dari 0
static char strDetection1[10] = {0};
int pir1 = 19;
//PIR2
static char strDetection2[10] = {0};
int pir2 = 4;
WiFiClient espClient;
WebSocketClient wsClient(espClient, wsMqttServer, wsMqttPort);
WebSocketStreamClient wsStreamClient(wsClient, wsMqttPath);
PubSubClient client(wsStreamClient);
//=======================================SETUP dan Inisialisasi Pin-Pin=============================================
void setup() {
//Pin HC-SR04
pinMode(trigpin, OUTPUT);
pinMode(echopin, INPUT);
//LCD
lcd.init();
lcd.backlight();
//Pin PIR
pinMode(pir1, INPUT);
pinMode(pir2, INPUT);
//DHT22_2
dhtSensor2.setup(15, DHTesp::DHT22);
//Inisialisasi LED GREEN(Indikator High Temp) dan Pin Relay
pinMode(LED_PIN,OUTPUT);
pinMode(RELAY_13,OUTPUT);
pinMode(RELAY_12,OUTPUT);
pinMode(RELAY_14,OUTPUT);
pinMode(RELAY_27,OUTPUT);
pinMode(RELAY_26,OUTPUT);
//Connection
Serial.begin(115200);
randomSeed(analogRead(0));
Serial.print("\nConnecting to ");
Serial.println(ssid);
wifiConnect();
Serial.println("\nWiFi connected");
Serial.print("IP address: ");
Serial.println(WiFi.localIP());
mqttReconnect();
}
//======================================================L O O P=====================================================
void loop() {
delay(10);
if (!client.connected()) {
mqttReconnect();
}
else {
//HC SR04 : Deteksi ketinggian air di dalam Tangki
digitalWrite(trigpin, LOW);
digitalWrite(trigpin, HIGH);
digitalWrite(trigpin, LOW);
Time =pulseIn(echopin,HIGH);
Distance= Time * 0.034/2;//formula Distance type Float
//Baca Sensor DHT22_2
TempAndHumidity data2 = dhtSensor2.getTempAndHumidity();
sprintf( Humidity2, "%.2f", data2.humidity);
sprintf( Temp2, "%.2f", data2.temperature); // "%.2fC"
//Rubah tipe data dari string ==> float agar bisa menjalankan
//perbandingan pada syntax if dibawah ini (Row 106):
float HumidityFloat2 = atof(Humidity2); //String to Float
float TempFloat2 = atof(Temp2);
//LED GREEN=Indikator , Jika temperature2 > 60
if ((int)TempFloat2 > 60) {
digitalWrite(LED_PIN, HIGH);
} else {
digitalWrite(LED_PIN, LOW);
}
//Baca Pin-pin PIR1-2
int value_of_pir1 = digitalRead(pir1); //Pin 19
int value_of_pir2 = digitalRead(pir2); //Pin 4
//Rubah value_of_pir (INTEGER) ==> strDetection (STRING)
sprintf(strDetection1, "%d", value_of_pir1);
sprintf(strDetection2, "%d", value_of_pir2);
//String dataHp = client.readStringUntil ('\r');
//SERIAL MONITOR DISPLAY
//Sermon HC-SR04
Serial.print("Tinggi Air:");
Serial.print(Distance);
Serial.println(" Cm");
//Sermon DHT 22_2
Serial.print("Humidity 2:");
Serial.print(Humidity2);
Serial.print(" % --");
Serial.print("Temperature 2:");
Serial.print(Temp2);
Serial.println(" Deg.C");
//Sermon PIR
Serial.print("PIR-1:");
Serial.print(value_of_pir1);
Serial.print("--");
Serial.print("PIR-2:");
Serial.println(value_of_pir2);
//DHT22 LCD DISPLAY
lcd.clear();
lcd.setCursor (0, 0);
lcd.print("Humidity 2:");
lcd.setCursor (0, 1);
lcd.print(Humidity2);
delay(1000);
lcd.clear();
lcd.setCursor (0, 0);
lcd.print("Temperature 2:");
lcd.setCursor (0, 1);
lcd.print(Temp2);
delay(1000);
//PIR STATUS & LCD DISPLAY
if (value_of_pir1 == HIGH) {
lcd.clear();
lcd.setCursor (0, 0);
lcd.print("Awas Garase Kiri");
}
else{
lcd.clear();
lcd.setCursor (0, 0);
lcd.print("Garase Kiri Aman");
}
if (value_of_pir2 == HIGH) {
lcd.clear();
lcd.setCursor (0, 0);
lcd.print("Awas Garase Kanan");
}
else{
lcd.clear();
lcd.setCursor (0, 0);
lcd.print("Garase Kanan Aman");
}
//Buat Variabel Yang Berisi Data Untuk Dikirim dan Rubah type data STRING ==> FLOAT
String dataString = String(TempFloat2) + "," + String(HumidityFloat2) + "," + String(Distance);
//String dataString = String(TempFloat2) + "," + String(HumidityFloat2);
//KIRIM DATA KE SERVER
client.publish(mqttTopic, dataString.c_str());
client.loop();
// callback (char* topic,byte* payload,unsigned int length);
//client.callback (topic,payload,length);
//client.callback (char* topic,byte* payload,unsigned int length);
}
delay(500);
}
//=============================TERIMA DATA DARI HP===========
void callback (char* topic,byte* payload,unsigned int length) {
Serial.print("Message arrived [");
Serial.print(topic);
Serial.print("]");
if (strstr(topic,sub1))
{
for (int i=0; i < length; i++){
Serial.print((char)payload[i]);
}
Serial.println();
//Switch on the LED if on 1 was received as first character
if ((char)payload[0]=='1'){
digitalWrite(RELAY_13,HIGH); //Turn the led
} else {
digitalWrite(RELAY_13, LOW);
}
}
if (strstr(topic,sub2))
{
for (int i=0; i < length; i++){
Serial.print((char)payload[i]);
}
Serial.println();
//Switch on the LED if on 1 was received as first character
if ((char)payload[0]=='1'){
digitalWrite(RELAY_12,HIGH); //Turn the led
} else {
digitalWrite(RELAY_12, LOW);
}
}
if (strstr(topic,sub3))
{
for (int i=0; i < length; i++){
Serial.print((char)payload[i]);
}
Serial.println();
//Switch on the LED if on 1 was received as first character
if ((char)payload[0]=='1'){
digitalWrite(RELAY_14,HIGH); //Turn the led
} else {
digitalWrite(RELAY_14, LOW);
}
}
if (strstr(topic,sub4))
{
for (int i=0; i < length; i++){
Serial.print((char)payload[i]);
}
Serial.println();
//Switch on the LED if on 1 was received as first character
if ((char)payload[0]=='1'){
digitalWrite(RELAY_27,HIGH); //Turn the led
} else {
digitalWrite(RELAY_27, LOW);
}
}
else
{
Serial.println ("ünsubscribed topic");
}
}
//================
/*
void callback(char* topic, byte* payload, unsigned int length) {
String dataHp;
//String dataHp=(strstr(topic,sub1);
for (int i = 0; i < length; i++) {
// Serial.print((char)payload[i]);
dataHp += (char)payload[i];
}
// check if the data is "1"
if (dataHp.equals ("1")) {
digitalWrite (RELAY_13,HIGH);
}
else if (dataHp.equals ("0"))
digitalWrite (RELAY_13,LOW);
else if (dataHp.equals ("12")) {
digitalWrite (RELAY_12,HIGH);
}
else if (dataHp.equals ("14")) {
digitalWrite (RELAY_14,HIGH);
}
else if (dataHp.equals ("27")) {
digitalWrite (RELAY_27,HIGH);
}
else if (dataHp.equals ("26")) {
digitalWrite (RELAY_26,HIGH);
}
}
*/
//====================================WIFI CONNECTION===============================================
void wifiConnect() {
WiFi.mode(WIFI_STA);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
}
//=====================================MQTT RECONNECT==============================================
void mqttReconnect() {
while (!client.connected()) {
Serial.println("Attempting MQTT connection...");
long r = random(1000);
sprintf(clientId, "clientId-%ld", r);
if (client.connect(clientId)) {
Serial.print(clientId);
Serial.println(" connected");
} else {
Serial.print("failed, rc=");
Serial.print(client.state());
Serial.println(" try again in 5 seconds");
delay(2000);
}
}
}