#include <WiFi.h>
#include <PubSubClient.h>
const int trigPin = 5;
const int echoPin = 18;
const float gama = 0.7;
const float rl10 = 50;
const int LED = 21;
//define sound speed in cm/uS
#define SOUND_SPEED 0.034
#define CM_TO_INCH 0.393701
#define ldrPin 33
// WiFi
const char *ssid = "Wokwi-GUEST"; // Enter your Wi-Fi name
const char *password = ""; // Enter Wi-Fi password
// MQTT Broker
const char *mqtt_broker = "thingsboard.cloud";
const char *topic = "v1/devices/me/telemetry";
const int mqtt_port = 1883;
const char *access_Token = "LzJXkHkdpdKLiwZ2BQwP";
WiFiClient espClient;
PubSubClient client(espClient);
long duration;
float distanceCm;
float distanceInch;
void setup() {
Serial.begin(115200);
pinMode(trigPin, OUTPUT);
pinMode(echoPin, INPUT);
pinMode(21, OUTPUT);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.println("Connecting to WiFi..");
}
Serial.println("Connected to the Wi-Fi network");
//connecting to a mqtt broker
client.setServer(mqtt_broker, mqtt_port);
client.setCallback(callback);
while (!client.connected()) {
String client_id = "esp32-client-";
client_id += String(WiFi.macAddress());
Serial.printf("The client %s connects to the public MQTT broker\n", client_id.c_str());
if (client.connect(client_id.c_str(), access_Token, NULL)) {
Serial.println("Public EMQX MQTT broker connected");
} else {
Serial.print("failed with state ");
Serial.print(client.state());
delay(2000);
}
}
}
void callback(char *topic, byte *payload, unsigned int length) {
Serial.print("Message arrived in topic: ");
Serial.println(topic);
Serial.print("Message:");
for (int i = 0; i < length; i++) {
Serial.print((char) payload[i]);
}
Serial.println();
Serial.println("-----------------------");
}
void loop() {
client.loop();
// Clears the trigPin
digitalWrite(trigPin, LOW);
delayMicroseconds(2);
// Sets the trigPin on HIGH state for 10 micro seconds
digitalWrite(trigPin, HIGH);
delayMicroseconds(10);
digitalWrite(trigPin, LOW);
// Reads the echoPin, returns the sound wave travel time in microseconds
duration = pulseIn(echoPin, HIGH);
// Calculate the distance
distanceCm = duration * SOUND_SPEED/2;
// Convert to inches
distanceInch = distanceCm * CM_TO_INCH;
// Prints the distance in the Serial Monitor
int nilaiLDR = analogRead(ldrPin);
nilaiLDR = map(nilaiLDR, 4095, 0, 1024, 0); //mengubah nilai pembacaan sensor LDR dari nilai ADC arduino menjadi nilai ADC ESP32
float voltase = nilaiLDR / 1024.*5;
float resistansi = 2000 * voltase / (1-voltase/5);
float kecerahan = pow(rl10*1e3*pow(10,gama)/resistansi,(1/gama));
kecerahan = map(kecerahan, 85168, 0, 500, 0);
Serial.print("Kecerahan = ");
Serial.println(kecerahan);
Serial.print("Distance (cm): ");
Serial.println(distanceCm);
Serial.print("Distance (inch): ");
Serial.println(distanceInch);
String payload = "{\"kecerahan\": " ;
payload += String(kecerahan);
payload += ", \"distance\": ";
payload += String(distanceCm);
payload += "}";
delay(1000);
if (kecerahan >= 300 && distanceCm <= 30)
{
digitalWrite(21, HIGH);
}
else
{
digitalWrite(21, LOW);
}
client.publish(topic, payload.c_str());
delay(50);
}