#include <WiFi.h>
#include <HTTPClient.h>
#include <ESP32Servo.h>
#include <PubSubClient.h>
const char* ssid = "Wokwi-GUEST";
const char* password = "";
String token = "BBUS-SLh7Ee4Kr65S9F5FZWsLCxxvDaYaL8";
char mqttBroker[] = "stem.ubidots.com";
String DEVICE_LABEL = "esp32_ijal"; // Device Label
String temperatureVarLabel = "suhu"; // Label variabel Potensio di Ubidots
String servoVarLabel = "servo"; // Label variabel servo di Ubidots
WiFiClient ubidots;
PubSubClient client(ubidots);
const int potentiometerPin = 34; // Pin potensiometer
Servo myservo;
static const int servoPin = 18; // Pin servo
int potValue;
String humidity, temperature;
long lastMsg = 0;
bool controlFromUbidots = false; // Flag untuk cek kontrol dari Ubidots
int servoPosition = 0;
int data,deg;
void wifiInit();
void sendData();
void callback(char* topic, byte* payload, unsigned int length);
void reconnect();
void setup() {
Serial.begin(115200);
wifiInit();
client.setServer(mqttBroker, 1883);
client.setCallback(callback);
myservo.setPeriodHertz(50);
myservo.attach(servoPin, 500, 2500);
reconnect();
delay(1000);
Serial.println("System ready.");
}
void loop() {
if (!client.connected()) { // untuk koneksi ke ubidots nya
reconnect();
}
client.loop();
long now = millis();
if (now - lastMsg > 1000) {
lastMsg = now;
getAirValue();
sendData();
client.subscribe((String("/v1.6/devices/") + DEVICE_LABEL + "/" + servoVarLabel + "/lv").c_str());
}
if (!controlFromUbidots) {
// Tidak ada kontrol dari Ubidots, servo tetap pada posisi terakhir
myservo.write(servoPosition);
}
}
void getAirValue() {
potValue = analogRead(potentiometerPin);
deg=map(potValue,4096,0,0,180);//konveri dari skala 1023 ke 180
temperature = String((float)deg); // Konversi nilai ke suhu
Serial.print("Putaran Potensio : " + temperature + " Derajat");
servoPosition = deg;
myservo.write(servoPosition);
Serial.println("\tSending data...");
}
void wifiInit() {
Serial.print("Connecting to ");
Serial.println(ssid);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.println("Waiting for WiFi connection...");
}
Serial.println("WiFi connected");
Serial.print("IP: ");
Serial.println(WiFi.localIP());
}
void sendData() {
Serial.println("Sending data to Ubidots...");
if (client.connect("ESP32", token.c_str(), "")) { // untuk mengirimkan data yang sudah dikumpulkan ke ubidots
String payload = "{\"" + temperatureVarLabel + "\": " + temperature + ",\"" + servoVarLabel + "\": "+ deg +"}";
client.publish((String("/v1.6/devices/") + DEVICE_LABEL).c_str(), payload.c_str());
Serial.println("Data sent!");
} else { // jika koneksi nya gagal, maka ...
Serial.println("Connection to server failed");
}
}
void callback(char* topic, byte* payload, unsigned int length) {
Serial.print("Message arrived on topic: ");
Serial.println(topic);
Serial.print("Message from Ubidots: ");
String message = "";
for (int i = 0; i < length; i++) {
message += (char)payload[i];
}
Serial.println(message);
int angle = message.toInt(); // Mengonversi data ke integer untuk kontrol servo
if (angle >= 0 && angle <= 180) { // untuk mengira ngira inputan nya tidak lebih dari 180 derajat
controlFromUbidots = true; // Set kontrol dari Ubidots
servoPosition = angle; // Update posisi servo
myservo.write(servoPosition);
Serial.print("Servo moved to: ");
Serial.println(servoPosition+" Derajat");
}
}
void reconnect() {
while (!client.connected()) {
Serial.println("Attempting MQTT connection...");
if (client.connect("ESP32", token.c_str(), "")) {
Serial.println("Connected to MQTT broker");
} else {
Serial.print("Failed to connect, rc=");
Serial.print(client.state());
Serial.println(" try again in 2 seconds");
delay(2000);
}
}
}