#if defined(ESP8266) //deklarasi library WiFi karena programnya dibuat universal untuk board ESP8266
//dan board ESP32 maka menggunakan if untuk dicek terlebih dahulu jenis board yang digunakan
#include <ESP8266WiFi.h> //apabila menggunakan board ESP8266 menggunakan library ESP8266WiFi.h
#elif defined(ESP32)
#include <WiFi.h> //apabila menggunakan board ESP32 maka menggunakan library WiFi.h
#endif
#include "ThingsBoard.h"
#define WIFI_SSID "Wokwi-GUEST" //deklarasi ssid wifi yang digunakan, disesuiakan dengan wifi yang digunakan
#define WIFI_PASSWORD "" //deklarasi password wifi yang digunakan
// See https://thingsboard.io/docs/getting-started-guides/helloworld/
// to understand how to obtain an access token
#define TOKEN "ADiSsM0xzHhColE7uoJ5" //deklarasi token device yang digunakan untuk menguhubungkan esp32 dengan device pada thingsboard, tokennya disesuaikan dengan device yang digunakan bisa di cek langsung ketika membuka device pada thingsboard
#define THINGSBOARD_SERVER "thingsboard.cloud" //alamat server dari thingsboard, jika menggunakan server pribadi alamatnya bisa disesuaikan, apabila menggunakan server yang disediakan thingsboard alamatnya adalah thingsboar.cloud
const int DHT_PIN = 15; //deklarasi nomor pin dht
// Deklarasi Thingsboard client dan mengubah perintah WiFiClient menjadi espClient
WiFiClient espClient;
// Deklarasi untuk mengubah perintah Thingsboard menjadi tb dan memasukkan perintah WiFiClient yang sudah diubah menjadi espClient ke dalam library Thingsboard
ThingsBoard tb(espClient);
int status = WL_IDLE_STATUS;
#include <ESP32Servo.h>
int count = 0;
// defines pins numbers
const int trigPin1 = 12;
const int echoPin1 = 13;
int distance1;
boolean sensor1 = false;
const int trigPin2 = 25;
const int echoPin2 = 26;
int distance2;
boolean sensor2 = false;
const int trigPin3 = 4;
const int echoPin3 = 5;
int distance3;
boolean sensor3 = false;
const int trigPin4 = 22;
const int echoPin4 = 23;
int distance4;
boolean sensor4 = false;
// defines variables
long duration;
const int servoPin = 18;
Servo servo;
boolean kereta = false;
int pos = 0;
void connect() //void mengoneksikan esp dengan wifi pertama kali
{ Serial.println("Connecting to AP ...");
// attempt to connect to WiFi network
WiFi.begin(WIFI_SSID, WIFI_PASSWORD);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("Connected to AP");
}
void reconnect() { //peintah recconect wifi apabila esp terputus dengan jaringan wifinya
// Loop until we're reconnected
status = WiFi.status();
if ( status != WL_CONNECTED) {
WiFi.begin(WIFI_SSID, WIFI_PASSWORD);
while (WiFi.status() != WL_CONNECTED) {
delay(500); Serial.print(".");
}
Serial.println("Connected to AP");
}
}
void setup() {
servo.attach(servoPin, 500, 2400);
pinMode(trigPin1, OUTPUT); // Sets the trigPin as an Output
pinMode(echoPin1, INPUT); // Sets the echoPin as an Input
pinMode(trigPin2, OUTPUT);
pinMode(echoPin2, INPUT);
pinMode(trigPin3, OUTPUT);
pinMode(echoPin3, INPUT);
pinMode(trigPin4, OUTPUT);
pinMode(echoPin4, INPUT);
Serial.begin(9600); // Starts the serial communication
connect();
}
void loop() {
delay(1000);
if (WiFi.status() != WL_CONNECTED) { //perintah untuk reconnect apabila esp32 disconnect dengan wifi
reconnect();
}
if (!tb.connected()) { //perintah untuk koneksi ke server thingsboard/device thingsboard
// Connect to the ThingsBoard
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;
}
}
Serial.println("Sending data...");
if(kereta == false){
servo.write(pos);
}
// Clears the trigPin
digitalWrite(trigPin1, LOW);
delayMicroseconds(2);
// Sets the trigPin on HIGH state for 10 micro seconds
digitalWrite(trigPin1, HIGH);
delayMicroseconds(10);
digitalWrite(trigPin1, LOW);
// Reads the echoPin, returns the sound wave travel time in microseconds
duration = pulseIn(echoPin1, HIGH);
// Calculating the distance
distance1 = duration * 0.034 / 2;
// Prints the distance on the Serial Monitor
if(distance1 < 150){
sensor1 = true;
tb.sendTelemetryFloat("sensor 1", true);
}else{
sensor1 = false;
tb.sendTelemetryFloat("sensor 1", false);
}
digitalWrite(trigPin2, LOW);
delayMicroseconds(2);
// Sets the trigPin on HIGH state for 10 micro seconds
digitalWrite(trigPin2, HIGH);
delayMicroseconds(10);
digitalWrite(trigPin2, LOW);
// Reads the echoPin, returns the sound wave travel time in microseconds
duration = pulseIn(echoPin2, HIGH);
// Calculating the distance
distance2 = duration * 0.034 / 2;
// Prints the distance on the Serial Monitor
if(distance2 < 150){
sensor2 = true;
tb.sendTelemetryFloat("sensor 2", true);
}else{
sensor2 = false;
tb.sendTelemetryFloat("sensor 2", false);
}
digitalWrite(trigPin3, LOW);
delayMicroseconds(2);
// Sets the trigPin on HIGH state for 10 micro seconds
digitalWrite(trigPin3, HIGH);
delayMicroseconds(10);
digitalWrite(trigPin3, LOW);
// Reads the echoPin, returns the sound wave travel time in microseconds
duration = pulseIn(echoPin3, HIGH);
// Calculating the distance
distance3 = duration * 0.034 / 2;
// Prints the distance on the Serial Monitor
if(distance3 < 150){
sensor3 = true;
tb.sendTelemetryFloat("sensor 3", true);
}else{
sensor3 = false;
tb.sendTelemetryFloat("sensor 3", false);
}
digitalWrite(trigPin4, LOW);
delayMicroseconds(2);
// Sets the trigPin on HIGH state for 10 micro seconds
digitalWrite(trigPin4, HIGH);
delayMicroseconds(10);
digitalWrite(trigPin4, LOW);
// Reads the echoPin, returns the sound wave travel time in microseconds
duration = pulseIn(echoPin4, HIGH);
// Calculating the distance
distance4 = duration * 0.034 / 2;
// Prints the distance on the Serial Monitor
if(distance4 < 150){
sensor4 = true;
tb.sendTelemetryFloat("sensor 4", true);
}else{
sensor4 = false;
tb.sendTelemetryFloat("sensor 4", false);
}
if(sensor1 && sensor2 || sensor2 && sensor3 || sensor3 && sensor4){
tb.sendTelemetryFloat("ada kereta lewat", true);
if(pos <=0){
while(pos <= 90){
pos++;
servo.write(pos);
delay(15);
}
}
Serial.println("Ada kereta lewat");
kereta = true;
}else{
tb.sendTelemetryFloat("ada kereta lewat", false);
if(pos >= 90){
while(pos >= 0){
pos--;
servo.write(pos);
delay(15);
}
}
Serial.println("");
kereta = false;
}
count++;
}