Search This Blog

Sunday, 15 June 2025

sensor suhu sengan led servo lcd ole 128x64 lm35

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

CARGER AKI CONTROLER INA226-LIBARY WE ROTARI SW+OLED 0.96 SUKSES TAMPILAN LEBIH BAIK

 #include <Wire.h>  #include <Adafruit_GFX.h>    // Library grafis Adafruit #include <Adafruit_SSD1306.h> // Library untuk...