// Proyek 099 - Penunjuk Jarum Servo (Meteran Analog) // Board: ESP32 DOIT DevKit V1 | Dashboard: klenik.ichibot.id #include #include #include // ===== ISI DULU ===== const char* WIFI_NAMA = "nama-wifi-kamu"; const char* WIFI_PASS = "password-wifi-kamu"; // topic MQTT: ganti budi1234 dengan KODE-mu (sama dengan di dashboard Klenik) const char* TOPIK_NILAI = "ichibot/budi1234/p099/nilai"; const char* SUMBER = "ichibot/budi1234/p021/suhu"; // topic yang ditunjuk jarum const float NILAI_MIN = 20, NILAI_MAKS = 40; // ujung kiri dan kanan skala const char* BROKER = "mqtt.ichibot.id"; WiFiClient wifi; PubSubClient mqtt(wifi); Servo jarum; const int PIN_SERVO = 13; float sudutSekarang = 90, sudutTujuan = 90; unsigned long gerakTerakhir = 0; void pesanMasuk(char* t, byte* isi, unsigned int panjang) { String p; for (unsigned int i = 0; i < panjang; i++) p += (char)isi[i]; float nilai = constrain(p.toFloat(), NILAI_MIN, NILAI_MAKS); // servo 180° = kiri (nilai kecil), 0° = kanan (nilai besar), seperti meteran jarum sudutTujuan = 180 - (nilai - NILAI_MIN) / (NILAI_MAKS - NILAI_MIN) * 180; } void langganan() { mqtt.subscribe(SUMBER); mqtt.subscribe(TOPIK_NILAI); // bisa juga digerakkan dari slider } void sambungWiFi() { WiFi.begin(WIFI_NAMA, WIFI_PASS); Serial.print("WiFi"); while (WiFi.status() != WL_CONNECTED) { delay(500); Serial.print("."); } Serial.println(" OK, IP " + WiFi.localIP().toString()); } void sambungMQTT() { while (!mqtt.connected()) { if (mqtt.connect(WiFi.macAddress().c_str())) { Serial.println("Terhubung ke Klenik"); langganan(); } else { Serial.println("Broker gagal, coba lagi 3 detik"); delay(3000); } } } void setup() { Serial.begin(115200); jarum.setPeriodHertz(50); jarum.attach(PIN_SERVO, 500, 2400); jarum.write(sudutSekarang); sambungWiFi(); mqtt.setServer(BROKER, 1883); mqtt.setCallback(pesanMasuk); } void loop() { if (!mqtt.connected()) sambungMQTT(); mqtt.loop(); // jarum bergerak pelan seperti meteran sungguhan: 1° setiap 15 ms if (abs(sudutTujuan - sudutSekarang) >= 1 && millis() - gerakTerakhir >= 15) { gerakTerakhir = millis(); sudutSekarang += (sudutTujuan > sudutSekarang) ? 1 : -1; jarum.write((int)sudutSekarang); } }