//include adalah perintah preprocessor untuk mengimpor pustaka-pustaka yang diperlukan dalam program
//Pustaka-pustaka ini digunakan untuk mengatur komunikasi dengan berbagai perangkat seperti sensor, layar OLED, servo motor, dan lainnya.
#include <SPI.h>
#include <DHT.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include <Servo.h>
#include <Fonts/FreeSerif9pt7b.h>
#define trigPin 9 //digunakan untuk mengirimkan sinyal ultrasonik dari pin 9 pada arduino.
#define echoPin 8 // digunakan untuk menerima pantulan kembali yang dihubungkan pin 8 pada arduino.
#define OLED_RESET 4 //efinisi praprosesor yang menyimpan nomor pin yang digunakan untuk mereset layar OLED.
//Adafruit_SSD1306 display(OLED_RESET);
#define dht_pin 2 //definisi praprosesor yang menyimpan nomor pin 2 yang digunakan untuk menghubungkan sensor DHT22.
#define led_merah 11 //definisi praprosesor yang menyimpan nomor pin 11 yang digunakan untuk menghubungkan LED merah.
#define led_biru 13 //definisi praprosesor yang menyimpan nomor pin 13 yang digunakan untuk menghubungkan LED Biru.
#define buzzer 7 //definisi praprosesor yang menyimpan nomor pin 7 yang digunakan untuk menghubungkan buzzer.
#define SCREEN_WIDTH 128 //definisi praprosesor yang menyimpan lebar layar OLED yang digunakan.
#define SCREEN_HEIGHT 64 //definisi praprosesor yang menyimpan tinggi layar OLED yang digunakan.
#define DHTTYPE DHT22 //definisi praprosesor yang menyimpan tipe sensor DHT yang digunakan (DHT22).
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, -1); //deklarasi objek display dari kelas Adafruit_SSD1306. Objek ini digunakan untuk mengendalikan layar OLED dengan konfigurasi yang sesuai.
DHT dht(dht_pin, DHTTYPE); //deklarasi objek dht dari kelas DHT. Objek ini digunakan untuk berkomunikasi dengan sensor DHT22 yang terhubung ke pin dht_pin.
Servo myservo; // create servo object to control a servo
// twelve servo objects can be created on most boards
//deklarasi objek myservo dari kelas Servo. Objek ini digunakan untuk mengendalikan servo motor.
int pos = 0; //deklarasi variabel pos yang akan digunakan untuk menyimpan posisi servo motor.
void setup() { //fungsi setup() yang akan dijalankan sekali saat perangkat pertama kali dihidupkan. Dalam fungsi ini, Anda menginisialisasi komunikasi dengan berbagai perangkat, termasuk sensor jarak ultrasonik, sensor DHT22, layar OLED, LED, dan buzzer.
myservo.attach(10); //Baris ini menghubungkan sebuah motor servo ke pin 10 pada Arduino, yang memungkinkan Anda untuk mengendalikan motor servo menggunakan Arduino.
pinMode(trigPin, OUTPUT); //Mengonfigurasi trigPin sebagai output. Ini menunjukkan bahwa trigPin mungkin terhubung ke sensor atau modul yang memerlukan sinyal pemicu.
pinMode(echoPin, INPUT); // Mengonfigurasi echoPin sebagai input. Ini menunjukkan bahwa echoPin mungkin terhubung ke sensor yang membaca data atau sinyal masukan.
//display.begin(SSD1306_SWITCHCAPVCC, 0x3C); //initialize with the I2C addr 0x3C (128x64)
//display.clearDisplay();
Serial.begin(115200); //nisialisasi komunikasi serial dengan kecepatan baud 115200 bit per detik. Ini memungkinkan Anda berkomunikasi dengan Arduino melalui koneksi serial.
dht.begin(); //Memulai sensor DHT (Digital Humidity and Temperature), menunjukkan bahwa Anda menggunakan sensor ini untuk mengukur suhu dan kelembapan.
display.begin(SSD1306_SWITCHCAPVCC, 0x3C); //Baris ini menginisialisasi layar OLED dengan driver SSD1306 dan alamat I2C tertentu (0x3C).
display.clearDisplay(); //Menghapus konten yang ditampilkan di layar OLED.
pinMode(buzzer, OUTPUT); //Mengonfigurasi pin (mungkin terhubung ke buzzer) sebagai output, memungkinkan Anda mengendalikan buzzer.
pinMode(led_merah, OUTPUT); //Mengonfigurasi pin (mungkin terhubung ke LED merah) sebagai output, memungkinkan Anda mengendalikan LED tersebut.
pinMode(led_biru, OUTPUT); //Mengonfigurasi pin (mungkin terhubung ke LED biru) sebagai output, memungkinkan Anda mengendalikan LED tersebut.
}
void loop() { //fungsi loop() yang akan dijalankan secara berulang. Dalam fungsi ini, Anda melakukan pengukuran jarak dengan sensor ultrasonik, pembacaan suhu dan kelembapan dengan sensor DHT22, dan menampilkan hasilnya pada layar OLED. Selain itu, Anda juga mengendalikan servo motor berdasarkan jarak yang terukur dan memberikan sinyal suara (buzzer) serta mengontrol LED merah dan biru berdasarkan suhu yang terukur.
//bagian dari program Arduino yang digunakan untuk mengukur jarak dengan sensor ultrasonik dan suhu serta kelembaban dengan sensor DHT.
//Tiga variabel bertipe float (bilangan desimal) dideklarasikan untuk menyimpan durasi, jarak dalam sentimeter, dan jarak dalam inci.
float duration;
float distance_cm;
float distance_in;
//
digitalWrite(trigPin, LOW); //Baris ini mengatur output pin yang disebut trigPin ke status LOW (atau 0 volt). Ini adalah langkah awal dalam mengirimkan pulsa ke sensor.
delayMicroseconds(2); //memberi jeda (delay) selama 2 mikrodetik (2/1.000.000 detik). Ini adalah jeda sangat singkat yang digunakan sebelum mengirim sinyal HIGH ke trigPin. Jeda ini biasanya digunakan dalam pengaturan sensor ultrasonik untuk memastikan kesiapan sensor.
digitalWrite(trigPin, HIGH); //mengatur trigPin ke status HIGH (atau 5 volt). Ini adalah langkah untuk mengirimkan sinyal pulsa yang akan diterima oleh sensor.
delayMicroseconds(10);//memberi jeda selama 10 mikrodetik. Ini adalah jeda yang diperlukan untuk mengirimkan pulsa dengan durasi yang cukup untuk mengaktifkan sensor ultrasonik.
digitalWrite(trigPin, LOW); //mengatur trigPin kembali ke status LOW. Ini mengakhiri sinyal pulsa yang telah dikirimkan ke sensor, dan sensor ultrasonik akan mulai mengukur jarak berdasarkan waktu yang diperlukan oleh pulsa ini untuk kembali ke sensor setelah memantul dari objek.
duration = pulseIn(echoPin, HIGH); //Baris ini mengukur durasi (waktu) yang diperlukan oleh pulsa ultrasonik yang dikirimkan sebelumnya (dijelaskan dalam kode sebelumnya) untuk kembali dan mencapai pin echoPin. Durasi ini diukur ketika sinyal di echoPin menjadi HIGH (tinggi). Durasi ini akan digunakan untuk menghitung jarak antara sensor ultrasonik dan objek.
distance_cm = (duration / 2) / 29.1; //faktor konversi yang digunakan untuk mengubah durasi menjadi jarak dalam sentimeter. Ini adalah nilai yang umumnya digunakan untuk sensor ultrasonik yang bekerja pada kecepatan suara standar.
distance_in = (duration / 2) / 73.914; //menghitung jarak dalam inci menggunakan faktor konversi yang berbeda (73.914). Ini menghasilkan jarak dalam unit inci.
float h = dht.readHumidity(); //membaca nilai kelembaban dari sensor DHT dan menyimpannya dalam variabel h.
float suhu = dht.readTemperature(); //membaca nilai suhu dalam Celsius dari sensor DHT dan menyimpannya dalam variabel suhu.
float f = dht.readTemperature(true); //membaca nilai suhu dalam Fahrenheit dari sensor DHT dan menyimpannya dalam variabel f.
if (isnan (h) || isnan (suhu) || isnan (f)) { //memeriksa apakah salah satu dari nilai kelembaban (h), suhu dalam Celsius (suhu), atau suhu dalam Fahrenheit (f) mengandung NaN (Not-a-Number), yang menunjukkan bahwa pembacaan sensor tidak valid atau ada masalah dengan sensor. Jika salah satu dari nilai ini adalah NaN, maka blok kode di dalam if dapat dijalankan untuk menangani situasi tersebut. Dalam contoh ini, blok kode dalam if dihilangkan (di-comment).
// return;
}
display.clearDisplay(); //menghapus semua konten yang ada pada layar OLED, mempersiapkan layar untuk menampilkan teks baru atau data yang diperbarui.
display.setCursor(25, 0); //Mengatur posisi kursor teks pada layar OLED ke koordinat (25, 0). Ini adalah koordinat yang akan digunakan sebagai awal untuk menampilkan teks berikutnya.
display.setTextSize(1); //mengatur ukuran teks menjadi 1, yang berarti teks akan ditampilkan dalam ukuran standar.
display.setTextColor(WHITE); //mengatur warna teks menjadi putih (WHITE). Artinya, teks yang ditampilkan akan berwarna putih pada latar belakang yang mungkin berwarna hitam (tergantung pada layar OLED).
display.println("Distance Meter"); //mencetak teks "Distance Meter" pada posisi yang telah ditentukan sebelumnya (25, 0). Ini adalah judul atau label yang menunjukkan bahwa data yang ditampilkan adalah pengukuran jarak.
display.setCursor(10, 15); //mengatur posisi kursor teks ke koordinat (10, 15), yang akan digunakan untuk menampilkan nilai jarak yang diukur.
display.setTextSize(1); //mengatur ukuran teks menjadi 1, yang berarti teks akan ditampilkan dalam ukuran standar.
display.setTextColor(WHITE); //mengatur warna teks menjadi putih (WHITE). Artinya, teks yang ditampilkan akan berwarna putih pada latar belakang yang mungkin berwarna hitam (tergantung pada layar OLED).
display.println(distance_cm); //mencetak nilai jarak dalam sentimeter (distance_cm) pada posisi yang telah ditentukan. Nilai ini akan muncul di bawah judul "Distance Meter".
display.setCursor(90, 15); //mengatur posisi kursor teks ke koordinat (90, 15), yang akan digunakan untuk menampilkan unit (cm) yang menyertai nilai jarak.
display.setTextSize(1); // mengatur ukuran teks menjadi 1, yang berarti teks akan ditampilkan dalam ukuran standar.
display.println("cm"); //mencetak teks "cm" di sebelah nilai jarak yang telah diukur. Ini memberikan konteks bahwa nilai tersebut adalah dalam satuan sentimeter.
//display.setCursor(10, 35); //mengatur posisi kursor teks ke koordinat (10, 35), yang akan digunakan untuk menampilkan nilai jarak yang diukur.
// display.setTextSize(1); //mengatur ukuran teks menjadi 1, yang berarti teks akan ditampilkan dalam ukuran standar.
//display.setTextColor(WHITE); //mengatur warna teks menjadi putih (WHITE). Artinya, teks yang ditampilkan akan berwarna putih pada latar belakang yang mungkin berwarna hitam (tergantung pada layar OLED).
//display.println(distance_in); //mencetak nilai jarak dalam inch (distance_in) pada posisi yang telah ditentukan. Nilai ini akan muncul di bawah variable cm.
//display.setCursor(90, 35); //mengatur posisi kursor teks ke koordinat (90, 35), yang akan digunakan untuk menampilkan unit (in) yang menyertai nilai jarak.
//display.setTextSize(1); // mengatur ukuran teks menjadi 1, yang berarti teks akan ditampilkan dalam ukuran standar.
//display.println("in"); //mencetak teks "in" di sebelah nilai jarak yang telah diukur. Ini memberikan konteks bahwa nilai tersebut adalah dalam satuan inch.
//display.display();
//delay(500);
Serial.println(distance_cm); //mencetak nilai distance_cm (jarak dalam sentimeter) ke Serial Monitor. Ini akan menampilkan jarak yang diukur oleh sensor ultrasonik pada monitor serial.
Serial.println(distance_in); //mencetak nilai distance_in (jarak dalam inci) ke Serial Monitor. Ini akan menampilkan jarak dalam unit inci pada monitor serial.
Serial.println(suhu); // mencetak nilai suhu (suhu dalam Celsius) ke Serial Monitor. Ini akan menampilkan suhu dalam derajat Celsius pada monitor serial.
if (distance_cm > 100) // kondisi if pertama. Kode dalam blok if akan dijalankan jika nilai distance_cm lebih besar dari 100.
{
myservo.write(0); // kondisi if pertama terpenuhi (nilai distance_cm lebih besar dari 100), maka kode dalam kurung kurawal akan dijalankan. Kode ini menggerakkan motor servo ke posisi sudut 0 derajat. Ini mungkin merupakan tindakan yang diambil jika objek terlalu jauh dari sensor ultrasonik (lebih dari 100 sentimeter).
}
if (distance_cm <= 100) //ondisi if kedua. Kode dalam blok if akan dijalankan jika nilai distance_cm kurang dari atau sama dengan 100.
{
myservo.write(180); //ondisi if kedua terpenuhi (nilai distance_cm kurang dari atau sama dengan 100), maka kode dalam kurung kurawal akan dijalankan. Kode ini menggerakkan motor servo ke posisi sudut 180 derajat. Ini mungkin merupakan tindakan yang diambil jika objek berada dalam jarak yang lebih dekat dengan sensor ultrasonik (100 sentimeter atau kurang).
}
float hif = dht.computeHeatIndex(f, h); // menghitung indeks panas (heat index) dalam Fahrenheit (hif) menggunakan nilai suhu dalam Fahrenheit (f) dan nilai kelembaban (h) yang telah dibaca sebelumnya dari sensor DHT. Indeks panas mengukur seberapa panas terasa berdasarkan suhu udara dan kelembaban. Ini berguna untuk mengukur sensasi panas yang dirasakan oleh manusia.
float hic = dht.computeHeatIndex(suhu, h, false); // menghitung indeks panas (heat index) dalam Celsius (hic). Ini menggunakan nilai suhu dalam Celsius (suhu) dan nilai kelembaban (h) dari sensor DHT. Parameter ketiga (false) menunjukkan bahwa perhitungan indeks panas dilakukan dalam unit Celsius. Indeks panas adalah parameter penting dalam memahami seberapa nyaman atau panasnya kondisi cuaca.
display.setCursor(30, 53); //mengatur posisi kursor teks pada layar OLED ke koordinat (30, 53). Ini adalah koordinat yang akan digunakan sebagai awal untuk menampilkan teks berikutnya pada layar OLED.
display.setTextSize(1); //mengatur ukuran teks menjadi 1, yang berarti teks akan ditampilkan dalam ukuran standar.
display.setTextColor(WHITE); //mengatur warna teks menjadi putih (WHITE). Artinya, teks yang ditampilkan akan berwarna putih pada latar belakang yang mungkin berwarna hitam (tergantung pada layar OLED).
if (suhu < 22) { //kondisi if yang memeriksa apakah nilai suhu (suhu) kurang dari 22 derajat Celsius. Kondisi ini akan terpenuhi jika suhu lebih rendah dari 22 derajat Celsius.
display.setCursor(30, 35); //mengatur posisi kursor teks ke koordinat (30, 35), yang akan digunakan untuk menampilkan nilai jarak yang diukur.
display.setTextSize(1);//mengatur ukuran teks menjadi 1, yang berarti teks akan ditampilkan dalam ukuran standar.
display.setTextColor(WHITE);//mengatur warna teks menjadi putih (WHITE). Artinya, teks yang ditampilkan akan berwarna putih pada latar belakang yang mungkin berwarna hitam (tergantung pada layar OLED).
display.println("SUHU RENDAH");//mencetak teks "Suhu Rendah " pada posisi yang telah ditentukan sebelumnya (30,35). Ini adalah judul atau label yang menunjukkan bahwa data yang ditampilkan adalah pengukuran suhu.
//display.println(suhu);
display.setCursor(10, 53); //mengatur posisi kursor teks ke koordinat (10, 53), yang akan digunakan untuk menampilkan nilai jarak yang diukur.
display.setTextSize(1);//mengatur ukuran teks menjadi 1, yang berarti teks akan ditampilkan dalam ukuran standar.
display.setTextColor(WHITE);//mengatur warna teks menjadi putih (WHITE). Artinya, teks yang ditampilkan akan berwarna putih pada latar belakang yang mungkin berwarna hitam (tergantung pada layar OLED).
//display.println("SUHU RENDAH");
display.println(suhu); //menampilkan suhu yang diukur oleh sensor saat sistem bekerja pada Lcd oled
display.setCursor(60, 53);//mengatur posisi kursor teks ke koordinat (60, 53), yang akan digunakan untuk menampilkan nilai jarak yang diukur.
display.setTextSize(1);//mengatur ukuran teks menjadi 1, yang berarti teks akan ditampilkan dalam ukuran standar.
display.println("Derajat");//mencetak teks "Derajat " pada posisi yang telah ditentukan sebelumnya (60,53). Ini adalah judul atau label yang menunjukkan bahwa data yang ditampilkan adalah pengukuran suhu.
digitalWrite(led_merah, LOW); //Jika kondisi if terpenuhi (suhu kurang dari 22 derajat Celsius), maka baris ini akan mengatur pin yang terhubung ke LED merah (led_merah) ke status LOW (mati). Ini berarti LED merah akan dimatikan.
digitalWrite(led_biru, HIGH); //Kode ini mengatur pin yang terhubung ke LED biru (led_biru) ke status HIGH (hidup). Ini berarti LED biru akan dinyalakan.
digitalWrite(buzzer, LOW); //Baris ini mengatur pin yang terhubung ke buzzer ke status LOW (mati). Ini memastikan bahwa buzzer akan dimatikan.
//display.println("SUHU RENDAH"); //mencetak teks "SUHU RENDAH" pada layar OLED. Ini adalah pesan yang akan ditampilkan pada layar OLED ketika suhu kurang dari 22 derajat Celsius.
noTone(buzzer); //Kode ini memastikan bahwa tidak ada nada atau bunyi yang dihasilkan oleh buzzer. Dengan mengarahkan noTone pada buzzer, ini memastikan bahwa buzzer tetap mati dan tidak mengeluarkan suara apa pun.
}
else if (suhu <= 30 && suhu >= 29) { //kondisi else if yang memeriksa apakah nilai suhu (suhu) berada dalam rentang antara 29 hingga 30 derajat Celsius. Kondisi ini akan terpenuhi jika suhu berada dalam rentang tersebut.
display.setCursor(30, 35); //oled display
display.setTextSize(1);
display.setTextColor(WHITE);
display.println("SUHU CUKUP");
//display.println(suhu);
display.setCursor(10, 53); //oled display
display.setTextSize(1);
display.setTextColor(WHITE);
//display.println("SUHU RENDAH");
display.println(suhu);
display.setCursor(60, 53);
display.setTextSize(1);
digitalWrite(led_merah, LOW); // ika kondisi else if terpenuhi (suhu berada dalam rentang 29-30 derajat Celsius), maka baris ini akan mengatur pin yang terhubung ke LED merah (led_merah) ke status LOW (mati). Ini berarti LED merah akan dimatikan.
digitalWrite(led_biru, LOW); //Kode ini mengatur pin yang terhubung ke LED biru (led_biru) ke status LOW (mati). Ini berarti LED biru juga dimatikan.
digitalWrite(buzzer, LOW); // Baris ini mengatur pin yang terhubung ke buzzer ke status LOW (mati). Ini memastikan bahwa buzzer tetap mati tanpa mengeluarkan suara.
display.println("SUHU CUKUP"); // Kode ini akan mencetak teks "SUHU CUKUP" pada layar OLED. Ini adalah pesan yang akan ditampilkan pada layar OLED ketika suhu berada dalam rentang 29-30 derajat Celsius.
noTone(buzzer); //Kode ini memastikan bahwa buzzer tidak menghasilkan nada atau bunyi
}
else if (suhu > 30) { //kondisi else if yang memeriksa apakah nilai suhu (suhu) lebih dari 30 derajat Celsius. Kondisi ini akan terpenuhi jika suhu lebih tinggi dari 30 derajat Celsius.
display.setCursor(30, 35); //oled display
display.setTextSize(1);
display.setTextColor(WHITE);
display.println("SUHU PANAS");
//display.println(suhu);
display.setCursor(10, 53); //oled display
display.setTextSize(1);
display.setTextColor(WHITE);
//display.println("SUHU RENDAH");
display.println(suhu);
display.setCursor(60, 53);
display.setTextSize(1);
display.println("Derajat");
digitalWrite(led_merah, HIGH); //ika kondisi else if terpenuhi (suhu lebih dari 30 derajat Celsius), maka baris ini akan mengatur pin yang terhubung ke LED merah (led_merah) ke status HIGH (nyala). Ini berarti LED merah akan dinyalakan.
digitalWrite(led_biru, LOW); //Kode ini mengatur pin yang terhubung ke LED biru (led_biru) ke status LOW (mati). Ini berarti LED biru dimatikan.
digitalWrite(buzzer, HIGH); //Baris ini mengatur pin yang terhubung ke buzzer ke status HIGH (nyala). Ini akan mengaktifkan buzzer.
display.println("SUHU PANAS"); //Kode ini akan mencetak teks "SUHU PANAS" pada layar OLED. Ini adalah pesan yang akan ditampilkan pada layar OLED ketika suhu lebih dari 30 derajat Celsius.
tone(buzzer, 777, 1000); //menghasilkan nada pada buzzer. Fungsi tone() digunakan untuk menghasilkan suara dengan frekuensi 777 Hz selama 1000 milidetik (1 detik) pada buzzer. Ini akan menghasilkan suara sebagai indikasi bahwa suhu telah mencapai tingkat panas yang tinggi.
}
delay(500); // jeda (delay) selama 500 milidetik (0.5 detik). Ini memberikan waktu untuk pesan dan bunyi dari buzzer ditampilkan sebelum program melanjutkan.
display.display(); //mengaktifkan tampilan pada layar OLED. Ini memastikan bahwa semua pesan dan perubahan tampilan yang telah diatur sebelumnya akan ditampilkan pada layar OLED.
}