INI LINK KODE NYA https://g.co/gemini/share/1a3b24304260
INI KODENYA
#include <Wire.h> // Diperlukan untuk komunikasi I2C
#include <Adafruit_GFX.h> // Library grafis dasar dari Adafruit
#include <Adafruit_SSD1306.h> // Library khusus untuk driver SSD1306 OLED
#include <ESP32Servo.h> // Library untuk kontrol Servo pada ESP32
// --- Konfigurasi OLED ---
#define SCREEN_WIDTH 128 // Lebar layar OLED dalam piksel
#define SCREEN_HEIGHT 64 // Tinggi layar OLED dalam piksel
// Deklarasi objek display OLED dengan alamat I2C 0x3C atau 0x3D
// Alamat umum adalah 0x3C untuk layar 128x64, beberapa bisa 0x3D
// Jika layar Anda tidak menyala, coba ganti 0x3C dengan 0x3D
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, -1);
// --- Konfigurasi Sensor LM35 ---
const int lm35Pin = 34; // Pin ADC pada ESP32 untuk LM35. Umumnya GPIO32-39.
// --- Konfigurasi LED ---
const int ledPin = 2; // Pin GPIO ESP32 untuk LED. Anda bisa menggunakan pin digital lain yang tersedia.
// Contoh: GPIO2 adalah pin LED internal pada beberapa board ESP32, atau pin lain seperti GPIO18, GPIO19, dll.
// Variabel untuk kontrol kedipan LED (non-blocking)
unsigned long previousMillis = 0; // Menyimpan waktu terakhir LED diperbarui
int currentLedState = LOW; // Menyimpan status LED saat ini (HIGH/LOW)
unsigned long blinkInterval = 0; // Interval kedipan saat ini (milidetik)
// Interval kedipan yang ditentukan
const unsigned long SLOW_BLINK_INTERVAL = 1000; // 1 detik (500ms ON, 500ms OFF)
const unsigned long FAST_BLINK_INTERVAL = 200; // 0.2 detik (100ms ON, 100ms OFF)
// --- Konfigurasi Scrolling Text ---
String scrollingText = "SELAMAT DATANG DI DARAH@HOME dari Kana "; // Teks yang akan digulir
int scrollX = SCREEN_WIDTH; // Posisi X awal teks (mulai dari kanan layar)
int scrollY = SCREEN_HEIGHT - 8; // Posisi Y untuk teks (di bagian bawah layar, disesuaikan dengan ukuran teks 1)
int scrollSpeed = 1; // Kecepatan gulir (jumlah piksel per langkah)
unsigned long lastScrollTime = 0; // Waktu terakhir teks digulir
const unsigned long SCROLL_UPDATE_INTERVAL = 50; // Interval update gulir (milidetik)
// --- Konfigurasi Servo ---
Servo myServo; // Membuat objek Servo
const int servoPin = 13; // Pin GPIO ESP32 untuk kontrol servo.
// Pin PWM yang umum pada ESP32: GPIO13, 14, 27, 26, 25, 33, 32.
int currentServoPosition = -1; // Menyimpan posisi servo saat ini. -1 menandakan belum diinisialisasi.
void setup() {
Serial.begin(115200); // Inisialisasi Serial Monitor
// Inisialisasi komunikasi I2C untuk OLED
Wire.begin();
// Inisialisasi display OLED
if(!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) { // Ganti 0x3C dengan 0x3D jika perlu
Serial.println(F("Alokasi SSD1306 Gagal"));
for(;;); // Jangan lanjutkan jika inisialisasi gagal
}
// Atur pin LED sebagai OUTPUT
pinMode(ledPin, OUTPUT);
// Pastikan LED mati saat startup
digitalWrite(ledPin, LOW);
// Atur pin Servo
myServo.attach(servoPin); // Mengaitkan objek servo ke pin GPIO
// Tampilkan logo awal atau pesan singkat
display.clearDisplay(); // Bersihkan buffer display
display.setTextSize(2); // Ukuran teks 2 (16 piksel tinggi)
display.setTextColor(SSD1306_WHITE); // Warna teks putih
display.setCursor(0,0); // Atur kursor di pojok kiri atas
display.println("Suhu LM35");
display.setTextSize(1);
display.println("by ESP32");
display.display(); // Tampilkan buffer ke layar
delay(2000); // Jeda 2 detik
}
void loop() {
// Membaca nilai analog dari sensor LM35
int rawValue = analogRead(lm35Pin);
// Konversi nilai analog ke tegangan (dalam volt)
// ESP32 memiliki rentang ADC 0-4095 untuk input 0-3.3V (standar).
// Beberapa board ESP32 mungkin memiliki V_ref yang berbeda atau perlu kalibrasi.
float voltage = rawValue * (3.3 / 4095.0);
// Konversi tegangan ke suhu dalam Celcius
// LM35 menghasilkan 10mV per derajat Celcius.
// Jadi, Suhu (C) = Tegangan (mV) / 10
float temperatureC = voltage * 100.0; // Tegangan dalam Volt * 1000 (untuk mV) / 10 (mV/C) = Tegangan * 100
// Konversi suhu ke Fahrenheit
float temperatureF = (temperatureC * 9/5) + 32;
// --- Kontrol LED dan Servo berdasarkan suhu ---
unsigned long currentMillis = millis(); // Ambil waktu saat ini
if (temperatureC <= 20.0) {
// Suhu rendah (<= 20C), LED kedip lambat, Servo 180 derajat
blinkInterval = SLOW_BLINK_INTERVAL / 2; // ON/OFF setiap setengah interval
if (currentMillis - previousMillis >= blinkInterval) {
previousMillis = currentMillis; // Simpan waktu terakhir kedipan
currentLedState = (currentLedState == LOW) ? HIGH : LOW; // Toggle status LED
digitalWrite(ledPin, currentLedState); // Update LED
}
if (currentServoPosition != 180) { // Hanya gerakkan servo jika posisi berbeda
myServo.write(180);
currentServoPosition = 180;
}
Serial.println("LED: Kedip Lambat (Suhu <= 20C), Servo: 180 deg");
} else if (temperatureC > 21.0) {
// Suhu tinggi (> 21C), LED kedip cepat, Servo 45 derajat
blinkInterval = FAST_BLINK_INTERVAL / 2; // ON/OFF setiap setengah interval
if (currentMillis - previousMillis >= blinkInterval) {
previousMillis = currentMillis; // Simpan waktu terakhir kedipan
currentLedState = (currentLedState == LOW) ? HIGH : LOW; // Toggle status LED
digitalWrite(ledPin, currentLedState); // Update LED
}
if (currentServoPosition != 45) { // Hanya gerakkan servo jika posisi berbeda
myServo.write(45);
currentServoPosition = 45;
}
Serial.println("LED: Kedip Cepat (Suhu > 21C), Servo: 45 deg");
} else { // Suhu di antara 20C dan 21C (20 < Suhu <= 21)
// LED mati, Servo mempertahankan posisi terakhir
digitalWrite(ledPin, LOW); // Pastikan LED mati
currentLedState = LOW; // Reset status LED
blinkInterval = 0; // Hentikan interval kedipan
Serial.println("LED: OFF (20C < Suhu <= 21C), Servo: No Change");
}
// --- Menampilkan di Serial Monitor ---
Serial.print("Nilai ADC: ");
Serial.println(rawValue);
Serial.print("Tegangan: ");
Serial.print(voltage);
Serial.println(" V");
Serial.print("Suhu: ");
Serial.print(temperatureC);
Serial.print(" °C");
Serial.print(" / ");
Serial.print(temperatureF);
Serial.println(" °F");
Serial.println("--------------------");
// --- Menampilkan di OLED ---
display.clearDisplay(); // Bersihkan buffer display
// Tampilkan label "Suhu:"
display.setTextSize(1);
display.setTextColor(SSD1306_WHITE);
display.setCursor(0,0);
display.println("Suhu:");
// Tampilkan suhu dalam Celcius
display.setTextSize(3); // Ukuran teks lebih besar untuk suhu
display.setCursor(0, 16); // Posisikan di baris kedua
display.print(temperatureC, 1); // Tampilkan 1 angka di belakang koma
display.print((char)248); // Karakter derajat (°)
display.println("C");
// Tampilkan status LED
display.setTextSize(1);
display.setCursor(0, 40); // Posisikan di baris bawah teks suhu
if (temperatureC <= 20.0) {
display.println("LED: Slow Blink");
} else if (temperatureC > 21.0) {
display.println("LED: Fast Blink");
} else { // 20 < Suhu <= 21
display.println("LED: OFF");
}
// Tampilkan posisi servo
display.setTextSize(1);
display.setCursor(0, 56); // Baris paling bawah, di atas scrolling text
display.print("Servo: ");
display.print(currentServoPosition);
display.println(" deg");
// --- Kontrol dan Tampilkan Scrolling Text ---
if (currentMillis - lastScrollTime >= SCROLL_UPDATE_INTERVAL) {
lastScrollTime = currentMillis;
scrollX -= scrollSpeed; // Geser teks ke kiri
// Dapatkan lebar teks yang akan digulir
display.setTextSize(1); // Ukuran teks untuk scrolling
int16_t x1, y1;
uint16_t w, h;
display.getTextBounds(scrollingText, 0, 0, &x1, &y1, &w, &h);
// Jika teks sudah melewati batas kiri layar, kembalikan ke kanan
if (scrollX < -w) {
scrollX = SCREEN_WIDTH;
}
}
display.setTextSize(1); // Pastikan ukuran teks untuk scrolling
display.setCursor(scrollX, scrollY); // Atur posisi kursor untuk teks gulir
display.println(scrollingText); // Tampilkan teks gulir
display.display(); // Kirim buffer ke layar OLED
delay(250); // Jeda 250ms untuk memperlambat pembacaan dan pembaruan 5 kali (dari 50ms)
}
No comments:
Post a Comment