#include <SPI.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include <ESP32Servo.h>
#include <DHT.h>
#define TRIG_PIN 25
#define ECHO_PIN 26
#define LED_1 19
#define BUZZER 12
#define SERVO_PIN 14 // Ubah pin servo menjadi pin 14
#define DHTPIN 13
#define DHTTYPE DHT22
DHT dht(DHTPIN, DHTTYPE);
Servo servo;
#define SCREEN_WIDTH 128 // OLED display width, in pixels
#define SCREEN_HEIGHT 64 // OLED display height, in pixels
// Declaration for an SSD1306 display connected to I2C (SDA, SCL pins)
#define OLED_RESET -1 // Reset pin # (or -1 if sharing Arduino reset pin)
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
void setup() {
Serial.begin(115200);
pinMode(TRIG_PIN, OUTPUT);
pinMode(ECHO_PIN, INPUT);
pinMode(LED_1, OUTPUT);
pinMode(BUZZER, OUTPUT);
pinMode(SERVO_PIN, OUTPUT); // Atur pin servo sebagai output
if (!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {
Serial.println(F("SSD1306 allocation failed"));
for (;;); // Don't proceed, loop forever
}
// Inisialisasi servo dengan pin yang benar
servo.attach(SERVO_PIN);
// Tampilkan isi buffer display awal ke layar
display.display();
delay(200); // Tunggu 2 detik
// Bersihkan buffer display
display.clearDisplay();
// Gambar satu pixel dalam warna putih
display.drawPixel(10, 10, WHITE);
// Tampilkan isi buffer display ke layar
display.display();
delay(2000);
// Gambarkan lingkaran (outlines)
testdrawcircle();
// Bersihkan display
display.clearDisplay();
// Atur ukuran tulisan
display.setTextSize(1);
display.setTextColor(WHITE);
display.setCursor(5, 0);
display.print("Start The Program....");
display.display();
delay(500);
display.setCursor(3, 15);
display.setTextSize(1);
display.print("Cleaning River System");
display.display();
delay(500);
display.setCursor(28, 43);
display.setTextSize(1);
display.print("Universitas");
display.display();
delay(500);
display.setCursor(18, 55);
display.setTextSize(1);
display.print("Islam Majapahit");
display.display();
delay(500);
display.clearDisplay(); // Reset layar
display.display();
}
void loop() {
float suhu = dht.readTemperature(); //Baca Suhu
float RH = dht.readHumidity(); //Baca RH
if (isnan(suhu) || isnan(RH)){
}
long duration, distance;
// Mengirimkan sinyal ultrasonik
digitalWrite(TRIG_PIN, LOW);
delayMicroseconds(2);
digitalWrite(TRIG_PIN, HIGH);
delayMicroseconds(10);
digitalWrite(TRIG_PIN, LOW);
// Menerima waktu pantulan ultrasonik
duration = pulseIn(ECHO_PIN, HIGH);
// Menghitung jarak
distance = duration * 0.034 / 2;
// Menampilkan jarak sampah di LCD
display.clearDisplay();
display.setTextSize(1);
display.setTextColor(WHITE);
display.setCursor(0, 10);
display.print("Jarak Sampah: ");
display.print(distance); // Menampilkan jarak yang diukur
display.print(" cm");
// Menampilkan Data Suhu Dan Kelembaban
display.setTextSize(1); //Ukuran Text Judul
display.setCursor(30, 0); //Letak Judul
display.print("Data Suhu & RH");
//Menampilkan Suhu
display.setTextSize(1); //Ukuran Text Suhu
display.setCursor(0,30); //Letak Suhu
display.print("Suhu");
display.print(suhu);
display.print (" C");
//Menampilkan RH
display.setTextSize(1); //Ukuran Text RH
display.setCursor(0,40); //Letak RH
display.print("Kelembaban");
display.print(RH);
display.print (" %");
display.display();
// Mengendalikan lampu, buzzer, dan servo berdasarkan jarak
if (distance < 100) {
digitalWrite(LED_1, HIGH);
servo.write(180); // Gerakkan servo ke posisi 90 derajat
digitalWrite(BUZZER, HIGH);
tone(BUZZER,1000);
delay(800);
noTone(BUZZER);
display.setCursor(0, 20);
display.print("Cleaning Start...");
//delay(500);
display.display();
} else {
digitalWrite(LED_1, LOW);
digitalWrite(BUZZER, LOW);
noTone(BUZZER);
servo.write(0); // Gerakkan servo ke posisi 0 derajat
}
}
void testdrawcircle(void) {
display.clearDisplay();
for(int16_t i=0; i<max(display.width(),display.height())/2; i+=2) {
display.drawCircle(display.width()/2, display.height()/2, i, WHITE);
display.display();
delay(1);
}
delay(100);
}