#include <ESP32Servo.h>
#include <ThingSpeak.h>
int PotPIN = 34;
int SerPIN = 2;
int yellow = 19;
int green = 18;
int red = 17;
int buzz = 22;
int slideSwitch = 23;
int currentPos = 0;
int targetPos = 0;
int increment = 1;
Servo serMOVE;
void setup() {
Serial.begin(115200);
pinMode(PotPIN, INPUT);
serMOVE.attach(SerPIN);
pinMode(red, OUTPUT);
pinMode(green, OUTPUT);
pinMode(yellow, OUTPUT);
pinMode(buzz, OUTPUT);
pinMode(slideSwitch, INPUT_PULLUP); // Mengatur pin switch slide sebagai input dengan pull-up resistor
}
void loop() {
int potMap = analogRead(PotPIN);
int SerMap = map(potMap, 0, 4095, 0, 180);
if (digitalRead(slideSwitch) == HIGH) { // Cek status switch slide
// Jika switch slide aktif, jalankan kode servo
Serial.println(String(potMap) + "-->" + String(SerMap)); // Print nilai potensiometer dan sudut servo
targetPos = SerMap;
if (currentPos != targetPos) {
if (currentPos < targetPos) {
currentPos += increment;
} else {
currentPos -= increment;
}
serMOVE.write(currentPos);
delay(15);
}
// Kontrol lampu berdasarkan nilai potensiometer
switch (getLight(SerMap)) {
case 0:
control(HIGH, LOW, LOW);
ThingSpeak.setField(1, 1);
ThingSpeak.setField(2, 0);
ThingSpeak.setField(3, 0);
tone(buzz, 500);
break;
case 1:
control(LOW, HIGH, LOW);
ThingSpeak.setField(1, 0);
ThingSpeak.setField(2, 1);
ThingSpeak.setField(3, 0);
noTone(buzz);
break;
case 2:
control(LOW, LOW, HIGH);
ThingSpeak.setField(1, 0);
ThingSpeak.setField(2, 0);
ThingSpeak.setField(3, 1);
tone(buzz, 2000);
break;
}
} else {
// Jika switch slide non-aktif, matikan semua komponen
serMOVE.write(0); // Set sudut servo ke 0
control(LOW, LOW, LOW); // Matikan semua lampu
noTone(buzz); // Matikan buzzer
// Reset nilai potensiometer
currentPos = 0;
targetPos = 0;
// Menonaktifkan output ke serial monitor
Serial.end();
}
// Menyalakan kembali output ke serial monitor jika switch slide aktif
if (digitalRead(slideSwitch) == HIGH) {
Serial.begin(115200);
}
delay(200);
}
void control(int redState, int greenState, int yellowState) {
digitalWrite(red, redState);
digitalWrite(green, greenState);
digitalWrite(yellow, yellowState);
}
int getLight(int value) {
if (value < 60) {
return 0; // Yellow
} else if (value >= 60 && value < 120) {
return 1; // Green
} else {
return 2; // Red
}
}