//#include <ESP8266WiFi.h> // Untuk ESP8266
#include <WiFi.h> // Untuk ESP32
#include <LiquidCrystal_I2C.h>
#include "DHTesp.h"
#include <ESP32Servo.h>
// SSID dan password WiFi
const char* ssid = "Wokwi-GUEST";
const char* password = "";
// Port TCP server
const uint16_t port = 12345;
LiquidCrystal_I2C LCD = LiquidCrystal_I2C(0x27, 16, 2);
WiFiServer server(port);
DHTesp dhtSensor;
Servo servo;
//double Waktu; // protokol, 'W123456.123\r'
float Kecepatan; // protokol, 'K2000.00\r'
float Suhu; // protokol, 'S20.00\r'
float Kelembaban; // protokol, 'H80.00\r'
float PosisiX; // protokol, 'X1234.00\r'
float PosisiY; // protokol, 'Y1234.00\r'
float Tegangan; // protokol, 'V12.50\r'
float SettingPoint; // protokol, 'R2000.00\r'
// protokol, 'LNS\r', N=nomor[1-3], S=[0=OFF,1=ON]
#define NTP_SERVER "pool.ntp.org"
#define UTC_OFFSET 7*3600
#define UTC_OFFSET_DST 0
#define LED_BIRU 33
#define LED_MERAH 32
#define DHT_PIN 13
#define SERVO_PIN 23
void spinner() {
static int8_t counter = 0;
const char* glyphs = "\xa1\xa5\xdb";
LCD.setCursor(15, 1);
LCD.print(glyphs[counter++]);
if (counter == strlen(glyphs)) {
counter = 0;
}
}
void printLocalTime() {
struct tm timeinfo;
if (!getLocalTime(&timeinfo)) {
LCD.setCursor(0, 1);
LCD.println("Connection Err");
return;
}
LCD.setCursor(8, 0);
LCD.println(&timeinfo, "%H:%M:%S");
LCD.setCursor(0, 1);
LCD.println(&timeinfo, "%d/%m/%Y %Z");
}
void setup() {
Serial.begin(115200);
pinMode(LED_MERAH, OUTPUT);
pinMode(LED_BIRU, OUTPUT);
LCD.init();
LCD.backlight();
dhtSensor.setup(DHT_PIN, DHTesp::DHT22);
servo.attach(SERVO_PIN);
// Menghubungkan ke WiFi
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(1000);
Serial.println("Connecting to WiFi...");
}
// Menampilkan alamat IP ESP Arduino setelah terhubung ke WiFi
Serial.println("");
Serial.println("WiFi connected");
Serial.print("IP address: ");
Serial.println(WiFi.localIP());
LCD.clear();
LCD.setCursor(0, 0);
LCD.println("Online");
LCD.setCursor(0, 1);
LCD.println("Updating time...");
configTime(UTC_OFFSET, UTC_OFFSET_DST, NTP_SERVER);
// Memulai server TCP
server.begin();
Serial.println("Server started");
}
String Format(int Data)
{
String s="00"+String(Data);
return s.substring(s.length()-2);
}
String Waktu() {
struct tm w;
if (!getLocalTime(&w))
return "Connection Err";
return Format(w.tm_hour)+":"+Format(w.tm_min)+":"+Format(w.tm_sec)+" "+
String(w.tm_mday)+"-"+String(w.tm_mon+1)+"-"+String(w.tm_year+1900);
}
String Jam() {
struct tm w;
if (!getLocalTime(&w))
return "Connection Err";
return Format(w.tm_hour)+":"+Format(w.tm_min)+":"+Format(w.tm_sec);
}
String Tanggal() {
struct tm w;
if (!getLocalTime(&w))
return "Connection Err";
return String(w.tm_mday)+"-"+String(w.tm_mon+1)+"-"+String(w.tm_year+1900);
}
String request;
String Respon(float *Data)
{
String d=request.substring(1);
if(d=="")
return String(*Data);
else
{
*Data=d.toFloat();
return "Data="+String(*Data);
}
}
String LoadOnOff(char L, char s)
{
//Serial.println("LoadOnOff "+String(L)+" "+s);
if(s==0)
{
return String(L=='1'?"LED MERAH":L=='2'?"LED BIRU":"SERVO")+": "+String(digitalRead(L=='1'?LED_MERAH:L=='2'?LED_BIRU:SERVO_PIN));
}
else
{
switch(L)
{
case '1':
digitalWrite(LED_MERAH,s-48);
return String("LED_MERAH: ")+ s;
break;
case '2':
digitalWrite(LED_BIRU,s-48);
return String("LED_BIRU: ")+ s;
break;
case '3':
servo.write((s-48)*180);
return String("SERVO: ")+ s;
break;
}
}
}
String Load()
{
char L=request.charAt(1);
char s=request.charAt(2);
//Serial.println("Load");
if(L==0)
{
return LoadOnOff('1',0)+'\n'+
LoadOnOff('2',0)+'\n'+
LoadOnOff('3',0);
}
else
return LoadOnOff(L,s);
}
void loop()
{
printLocalTime();
TempAndHumidity data = dhtSensor.getTempAndHumidity();
Suhu=data.temperature;
Kelembaban=data.humidity;
String msg="Waktu : "+String(Waktu())+"\nSuhu : "+String(Suhu)+"°C\nKelembaban : "+String(Kelembaban)+"%";
//Serial.println(msg);
//servo.write(180);
// Menunggu koneksi dari client
WiFiClient client = server.available();
if (Serial.available()||client) {
if(client) Serial.println("New client connected");
while (Serial.available()||(client&&client.connected())) {
// Membaca data yang dikirim oleh client
if (Serial.available()||(client&&client.available())) {
String respon;
if(client&&client.available())
request = client.readStringUntil('\r');
else if(Serial.available())
request = Serial.readStringUntil('\n');
Serial.println("Client request: " + request);
String d;
switch(request.charAt(0))
{
case 'W':
d=request.substring(1);
if(d=="")
respon=Waktu();
else
{
float w=d.toFloat();
respon="Waktu="+String(w);
}
//Serial.println("Waktu");
break;
case 'K':
respon=Respon(&Kecepatan);
break;
case 'S':
respon=Respon(&Suhu);
break;
case 'H':
respon=Respon(&Kelembaban);
break;
case 'V':
respon=Respon(&Tegangan);
break;
case 'X':
respon=Respon(&PosisiX);
break;
case 'Y':
respon=Respon(&PosisiY);
break;
case 'R':
respon=Respon(&SettingPoint);
break;
case 'L':
//String L=request.charAt(1);
respon=Load();
break;
default:
respon="ERROR";
}
// Mengirimkan balasan ke client
if(client)
{
client.print(respon);
client.flush();
}
else Serial.println(respon);
}
}
if(client)
{
client.stop();
Serial.println("Client disconnected");
}
}
}