#include <LiquidCrystal_I2C.h>
#include <WiFi.h>
#include <WiFiClient.h>
#include "ThingsBoard.h"
#include "DHTesp.h"
#define WIFI_SSID "Wokwi-GUEST"
#define WIFI_PASSWORD ""
#define TOKEN "irKbpb38kUTpLZDoBjWr"
#define THINGSBOARD_SERVER "thingsboard.cloud"
WiFiClient espClient;
ThingsBoard tb(espClient);
int status = WL_IDLE_STATUS;
#define pumpIn 13 // PUMP IN
#define pumpOut 12 // PUMP OUT
#define hotPump 5 // HOT PUMP IN
#define hIn 33
#define hOut 25
#define i 32
#define o 35
#define h 19
#define ADC 34
const int DHT_PIN = 18;
DHTesp dhtSensor;
int ledM = 26; // LED merah
int ledH = 27; // LED hijau
#define PIN_TRIG 2 // Ultrasonic
#define PIN_ECHO 4 // Ultrasonic
#define buzzer 15 // Buzzer
LiquidCrystal_I2C lcd(0x27,20,4); // LCD 20x4
int ADC_VALUE = 0;
int voltage_value = 0;
void InitWiFi()
{
Serial.println("Connecting to AP ...");
WiFi.begin(WIFI_SSID, WIFI_PASSWORD);
while (WiFi.status() != WL_CONNECTED) {
digitalWrite(ledH,HIGH);
delay(500);
digitalWrite(ledH,LOW);
delay(500);
Serial.print(".");
}
Serial.println("Connected to AP");
digitalWrite(ledH,HIGH);
}
void reconnect() {
status = WiFi.status();
if ( status != WL_CONNECTED) {
WiFi.begin(WIFI_SSID, WIFI_PASSWORD);
while (WiFi.status() != WL_CONNECTED) {
digitalWrite(ledH,HIGH);
delay(500);
digitalWrite(ledH,LOW);
delay(500);
Serial.print(".");
}
Serial.println("Connected to AP");
digitalWrite(ledH,HIGH);
}
}
void voltage(){
ADC_VALUE = analogRead(ADC);
voltage_value = (ADC_VALUE * 3.3 ) / 4095;
Serial.print("Tegangan = ");
Serial.print(voltage_value);
Serial.print(" volt ");
tb.sendTelemetryInt("Tegangan (volt)", voltage_value);
}
void setup() {
digitalWrite(ledM,HIGH);
Serial.begin(115200);
Serial.println();
pinMode(ledM, OUTPUT);
pinMode(ledH, OUTPUT);
pinMode(hIn, OUTPUT);
pinMode(hOut, OUTPUT);
pinMode(pumpIn, OUTPUT);
pinMode(pumpOut, OUTPUT);
pinMode(hotPump, OUTPUT);
dhtSensor.setup(DHT_PIN, DHTesp::DHT22);
pinMode(buzzer, OUTPUT);
pinMode(PIN_TRIG, OUTPUT);
pinMode(PIN_ECHO, INPUT);
pinMode(ADC, INPUT);
pinMode(h, INPUT);
pinMode(i, INPUT);
pinMode(o, INPUT);
InitWiFi();
lcd.init();
lcd.backlight();
lcd.setCursor(0,0); lcd.print("===VANAME GROUND===");
lcd.setCursor(6,1); lcd.print("STATION");
lcd.setCursor(7,3); lcd.print("<ON>");
tone(buzzer, 2000, 500);
delay(2000);
lcd.clear();
}
void loop() {
if (WiFi.status() != WL_CONNECTED) {
reconnect();
}
if (!tb.connected()) {
Serial.print("Connecting to: ");
Serial.print(THINGSBOARD_SERVER);
Serial.print(" with token ");
Serial.println(TOKEN);
if (!tb.connect(THINGSBOARD_SERVER, TOKEN)) {
Serial.println("Failed to connect");
return;
}
}
tb.sendTelemetryFloat("lat", -6.898156878673054);
tb.sendTelemetryFloat("long", 110.2082724534785);
air();
panas();
voltage();
Serial.println("Sending data to Thingsboard");
tb.loop();
}
void air(){
digitalWrite(PIN_TRIG, HIGH);
delayMicroseconds(10);
digitalWrite(PIN_TRIG, LOW);
int duration = pulseIn(PIN_ECHO, HIGH);
float water = duration * 0.034 / 2;
Serial.print("Tinggi Air: ");
Serial.print(water);
Serial.print(" Cm");
Serial.println();
lcd.setCursor(0,0);
lcd.print("T. Air : ");
lcd.print(water);
lcd.print(" Cm");
tb.sendTelemetryInt("Tinggi Air", water);
tb.sendTelemetryInt("Tinggi Air Min", 110);
tb.sendTelemetryInt("Tinggi Air Max", 130);
digitalWrite(pumpIn, 0);
digitalWrite(pumpOut, 0);
if (water <= 110) {
digitalWrite( pumpIn, 1);
}
else if (water >= 130) {
digitalWrite(pumpOut, 1);
}
}
void panas(){
TempAndHumidity data = dhtSensor.getTempAndHumidity();
Serial.print(data.temperature);
Serial.print("Suhu : ");
Serial.print(data.temperature);
Serial.print("C");
Serial.println();
lcd.setCursor(3,1);
lcd.print("Suhu : ");
lcd.print(data.temperature);
lcd.print(" C");
tb.sendTelemetryInt("Suhu Air", data.temperature);
if (data.temperature <= 26) {
digitalWrite( hotPump, 1);
}
else{
digitalWrite( hotPump, 0);
}
if (data.temperature >= 34) {
digitalWrite(hOut, 1);
digitalWrite(hIn, 1);
}else{
digitalWrite(hOut, 0);
digitalWrite(hIn, 0);
}
if (digitalRead(i)==1){
Serial.println("PUMP IN : AKTIF");
tone(buzzer, 2000, 50);
tone(buzzer,0,200);;
lcd.setCursor(3,2);
lcd.print("PUMP IN = ");
lcd.print("ON ");
tb.sendTelemetryString("PUMP IN", "AKTIF");
tb.sendTelemetryInt("PUMP IN", 1);
}else if (digitalRead(o)==1){
Serial.println("PUMP OUT : AKTIF");
tone(buzzer, 2000, 50);
tone(buzzer,0,200);
lcd.setCursor(2,2);
lcd.print(" PUMP OUT = ");
lcd.print(" ON");
tb.sendTelemetryString("PUMP OUT", "AKTIF");
tb.sendTelemetryInt("PUMP OUT", 1);
}else{
Serial.println("PUMP OUT NON AKTIF");
Serial.println("PUMP IN NON AKTIF");
lcd.setCursor(3,2);
lcd.print("ALL PUMP = OFF");
tb.sendTelemetryString("ALL PUMP", "NONAKTIF");
tb.sendTelemetryInt("ALLPUMP", 0);
}
if (digitalRead(h)==1){
Serial.println("HOT PUMP : AKTIF");
lcd.setCursor(3,3);
lcd.print("HOT PUMP = ");
lcd.print("ON ");
tb.sendTelemetryString("HOT PUMP", "AKTIF");
tb.sendTelemetryInt("HOT PUMP", 1);
tone(buzzer, 2000, 50);
tone(buzzer,0,200);
}else{
Serial.println("HOT PUMP NON AKTIF");
lcd.setCursor(3,3);
lcd.print("ALL PUMP = OFF");
tb.sendTelemetryString("HOT PUMP", "NONAKTIF");
tb.sendTelemetryInt("HOT PUMP", 0);
}
}