Search This Blog

Monday, 9 June 2025

sensor suhu lora lm35

 


Konsep dan Pembagian Tugas

  1. ESP32 "Sender" (Pemancar Suhu + LCD Lokal + Web Interface):

    • Terhubung ke Sensor LM35.
    • Memiliki LCD 16x2 I2C untuk menampilkan suhu lokal.
    • Terhubung ke Wi-Fi dengan IP Statik.
    • Menyediakan Web Interface untuk pemantauan suhu.
    • Mengirimkan data suhu melalui LoRa.
    • Ini adalah "pusat data" yang bisa diakses web.
  2. ESP32 "Receiver" (Penerima LoRa + LCD Lokal):

    • Hanya memiliki Modul LoRa.
    • Menerima data suhu yang dikirim oleh "Sender" melalui LoRa.
    • Memiliki LCD 16x2 I2C untuk menampilkan suhu yang diterima secara lokal.
    • TIDAK ADA koneksi Wi-Fi atau Web Interface di sini.

Komponen yang Dibutuhkan

  • 2x ESP32 Development Board
  • 2x Modul LoRa (misal: SX1278 433MHz/868MHz/915MHz) - Pastikan frekuensi LoRa modul sama untuk kedua sisi.
  • 1x Sensor Suhu LM35 (untuk sisi Sender)
  • 2x LCD 16x2 dengan Modul I2C (satu untuk Sender, satu untuk Receiver)
  • Kabel Jumper
  • Antena LoRa (untuk kedua modul)

Skema Pengkabelan (Wiring Diagram)

A. Wiring Sensor LM35 (Hanya untuk ESP32 Sender):

  • LM35 Pin 1 (VCC) 3V3 (ESP32 Sender)
  • LM35 Pin 2 (Vout) GPIO34 (ESP32 Sender)
  • LM35 Pin 3 (GND) GND (ESP32 Sender)

B. Wiring LCD 16x2 dengan Modul I2C (Untuk KEDUA ESP32 Sender & Receiver):

  • SCL pada modul I2C GPIO22 (ESP32)
  • SDA pada modul I2C GPIO21 (ESP32)
  • VCC pada modul I2C 5V (ESP32)
  • GND pada modul I2C GND (ESP32)

C. Wiring Modul LoRa SX127x (Untuk KEDUA ESP32 Sender & Receiver):

Modul LoRa PinESP32 Pin (Umum)Catatan
VCC3V3Beberapa modul LoRa juga bisa 5V, tapi 3.3V lebih aman.
GNDGND
SCKGPIO5SPI Clock
MISOGPIO19Master In Slave Out
MOSIGPIO27Master Out Slave In
NSS / CSGPIO18Slave Select / Chip Select
DIO0GPIO26LoRa interrupt pin (penting untuk mengetahui kapan paket diterima)
RSTGPIO14Reset pin (dapat dihubungkan ke pin GPIO apa saja, atau 3.3V jika tidak ingin menggunakan reset)

Penting: Selalu sambungkan antena ke modul LoRa sebelum menyalakan daya untuk mencegah kerusakan pada modul.


Instalasi Library (Arduino IDE)

Pastikan Anda telah menginstal library berikut di Arduino IDE Anda:

  1. ESP32 Board Package
  2. LiquidCrystal I2C Library (oleh Frank de Brabander)
  3. LoRa Library (oleh Sandeep Mistry)

Kode Program untuk ESP32 "Sender" (Pemancar Suhu + LCD + Web Interface)

C++
#include <Wire.h> 
#include <LiquidCrystal_I2C.h>
#include <WiFi.h>
#include <WebServer.h>
#include <SPI.h>
#include <LoRa.h>

// --- Konfigurasi WiFi ---
const char* ssid = "NAMA_WIFI_ANDA";     // Ganti dengan nama WiFi Anda
const char* password = "PASSWORD_WIFI_ANDA"; // Ganti dengan password WiFi Anda

// --- Konfigurasi IP Statik ---
IPAddress staticIP(192, 168, 88, 2);     // IP Address statik yang diinginkan untuk Sender
IPAddress gateway(192, 168, 88, 1);    // Gateway jaringan Anda (biasanya IP router)
IPAddress subnet(255, 255, 255, 0);   // Subnet mask
IPAddress primaryDNS(8, 8, 8, 8);      // DNS Server (misal: Google DNS)
IPAddress secondaryDNS(8, 8, 4, 4);    // DNS Server cadangan (misal: Google DNS)

// --- Konfigurasi LCD I2C ---
LiquidCrystal_I2C lcd(0x27, 16, 2); // Alamat I2C, Kolom, Baris (sesuaikan jika perlu)

// --- Konfigurasi LoRa ---
#define LORA_FREQ 433E6 // Ganti dengan frekuensi modul LoRa Anda (misal: 433E6, 868E6, 915E6)
#define SS_PIN    18 // ESP32 GPIO18
#define RST_PIN   14 // ESP32 GPIO14
#define DIO0_PIN  26 // ESP32 GPIO26

// --- Konfigurasi Sensor LM35 ---
const int LM35_PIN = 34; // Pin GPIO34 untuk sensor LM35
const float VREF = 3.3;  // Tegangan referensi ADC ESP32 (biasanya 3.3V)
const int ADC_RESOLUTION = 4095; // Resolusi ADC 12-bit (0-4095)

// --- Konfigurasi Web Server ---
WebServer server(80); // Port HTTP standar

// Variabel untuk menyimpan nilai suhu
float currentTemperatureC = 0.0;
float currentTemperatureF = 0.0;

// --- Fungsi untuk membaca suhu dari LM35 ---
float readLM35Temperature() {
  int analogValue = analogRead(LM35_PIN);
  float voltage = analogValue * (VREF / ADC_RESOLUTION); 
  float tempC = voltage * 100.0; 
  return tempC;
}

// --- Fungsi untuk menampilkan suhu di LCD ---
void updateLCDSender() {
  lcd.clear();
  lcd.setCursor(0, 0);
  lcd.print("Suhu Lokal:");
  lcd.setCursor(0, 1);
  lcd.print(currentTemperatureC, 1);
  lcd.print((char)223); // Karakter derajat (°)
  lcd.print("C ");
  lcd.print(currentTemperatureF, 0);
  lcd.print((char)223);
  lcd.print("F");
}

// --- Fungsi untuk menangani permintaan halaman web utama ---
void handleRoot() {
  String html = "<!DOCTYPE html><html><head><meta name='viewport' content='width=device-width, initial-scale=1'>";
  html += "<title>Monitor Suhu Pemancar</title>";
  html += "<style>body{font-family: Arial, Helvetica, sans-serif; text-align: center; background-color: #f0f0f0; margin-top: 50px;}";
  html += ".container{background-color: #fff; padding: 30px; border-radius: 8px; box-shadow: 0 2px 4px rgba(0,0,0,0.1); display: inline-block;}";
  html += "h1{color: #333;} p{font-size: 24px; color: #555;}</style>";
  html += "<meta http-equiv='refresh' content='5'>"; // Auto-refresh setiap 5 detik
  html += "</head><body><div class='container'>";
  html += "<h1>Suhu Lokasi Pemancar</h1>";
  html += "<p>Suhu: " + String(currentTemperatureC, 2) + "&deg;C</p>";
  html += "<p>Suhu: " + String(currentTemperatureF, 2) + "&deg;F</p>";
  html += "<p style='font-size: 16px; color: #888;'>IP Lokal: " + WiFi.localIP().toString() + "</p>";
  html += "</div></body></html>";
  server.send(200, "text/html", html);
}

// --- Setup ---
void setup() {
  Serial.begin(115200);
  while(!Serial);

  // Inisialisasi LCD
  lcd.init();
  lcd.backlight();
  lcd.clear();
  lcd.setCursor(0, 0);
  lcd.print("ESP32 Sender");
  lcd.setCursor(0, 1);
  lcd.print("Inisialisasi...");
  Serial.println("LCD Inisialisasi");

  // Inisialisasi LoRa
  LoRa.setPins(SS_PIN, RST_PIN, DIO0_PIN);
  if (!LoRa.begin(LORA_FREQ)) {
    Serial.println("Memulai LoRa gagal!");
    lcd.clear();
    lcd.setCursor(0, 0);
    lcd.print("LoRa Gagal!");
    while (true);
  }
  Serial.println("LoRa Inisialisasi OK!");
  Serial.print("LoRa Freq: ");
  Serial.print(LORA_FREQ / 1000000);
  Serial.println(" MHz");

  // Konfigurasi IP Statik
  WiFi.config(staticIP, gateway, subnet, primaryDNS, secondaryDNS);
  Serial.println("Mengkonfigurasi IP Statik...");
  
  // Koneksi WiFi
  Serial.print("Menghubungkan ke WiFi: ");
  Serial.println(ssid);
  lcd.setCursor(0, 0);
  lcd.print("Menghubungkan...");
  lcd.setCursor(0, 1);
  lcd.print(ssid);
  
  WiFi.begin(ssid, password);

  int attempt = 0;
  while (WiFi.status() != WL_CONNECTED && attempt < 20) {
    delay(500);
    Serial.print(".");
    attempt++;
  }

  if (WiFi.status() == WL_CONNECTED) {
    Serial.println("\nTerhubung ke WiFi!");
    Serial.print("IP Address: ");
    Serial.println(WiFi.localIP());
    lcd.clear();
    lcd.setCursor(0, 0);
    lcd.print("Terhubung!");
    lcd.setCursor(0, 1);
    lcd.print(WiFi.localIP());
    delay(2000);
  } else {
    Serial.println("\nGagal terhubung ke WiFi.");
    lcd.clear();
    lcd.setCursor(0, 0);
    lcd.print("Gagal Koneksi!");
    lcd.setCursor(0, 1);
    lcd.print("Cek SSID/Pass");
    while(true);
  }

  // Konfigurasi Web Server
  server.on("/", handleRoot);
  server.begin();
  Serial.println("Web Server dimulai.");
}

// --- Loop ---
void loop() {
  // Baca suhu setiap 2 detik dan kirim via LoRa
  unsigned long currentMillis = millis();
  static unsigned long previousMillisRead = 0;
  const long intervalRead = 2000; // Baca dan kirim suhu setiap 2 detik

  if (currentMillis - previousMillisRead >= intervalRead) {
    previousMillisRead = currentMillis;
    
    currentTemperatureC = readLM35Temperature();
    currentTemperatureF = (currentTemperatureC * 9 / 5) + 32;
    
    // Kirim data suhu melalui LoRa
    String dataToSend = String(currentTemperatureC, 2); // Menggunakan 2 desimal
    LoRa.beginPacket();
    LoRa.print(dataToSend);
    LoRa.endPacket();
    
    Serial.print("Suhu Lokal: ");
    Serial.print(currentTemperatureC, 2);
    Serial.print(" °C | Mengirim LoRa: ");
    Serial.println(dataToSend);
    updateLCDSender(); // Update tampilan di LCD
  }

  server.handleClient(); // Tangani permintaan klien web
  delay(10); 
}

Kode Program untuk ESP32 "Receiver" (Penerima LoRa + LCD Lokal)

C++
#include <Wire.h> 
#include <LiquidCrystal_I2C.h>
#include <SPI.h>
#include <LoRa.h>

// --- Konfigurasi LCD I2C ---
LiquidCrystal_I2C lcd(0x27, 16, 2); // Alamat I2C, Kolom, Baris (sesuaikan jika perlu)

// --- Konfigurasi LoRa ---
#define LORA_FREQ 433E6 // Harus sama dengan frekuensi Sender
#define SS_PIN    18 // ESP32 GPIO18
#define RST_PIN   14 // ESP32 GPIO14
#define DIO0_PIN  26 // ESP32 GPIO26

// Variabel untuk menyimpan nilai suhu yang diterima
float receivedTemperatureC = 0.0;
float receivedTemperatureF = 0.0;
unsigned long lastLoRaReceiveTime = 0; // Waktu terakhir menerima data LoRa

// --- Fungsi untuk menampilkan suhu di LCD Receiver ---
void updateLCDReceiver() {
  lcd.clear();
  lcd.setCursor(0, 0);
  lcd.print("Suhu Diterima:");
  
  if (millis() - lastLoRaReceiveTime < 15000) { // Tampilkan jika data diterima dalam 15 detik terakhir
    lcd.setCursor(0, 1);
    lcd.print(receivedTemperatureC, 1); // Tampilkan 1 angka di belakang koma
    lcd.print((char)223); // Karakter derajat (°)
    lcd.print("C ");
    lcd.print(receivedTemperatureF, 0); // Fahrenheit tanpa desimal
    lcd.print((char)223);
    lcd.print("F");
  } else {
    lcd.setCursor(0, 1);
    lcd.print("Menunggu Data...");
  }
}

// --- Fungsi untuk menangani paket LoRa yang masuk ---
void onReceive(int packetSize) {
  if (packetSize == 0) return;

  Serial.print("Menerima paket: ");
  String receivedData = "";
  while (LoRa.available()) {
    receivedData += (char)LoRa.read();
  }

  Serial.println(receivedData);

  // Coba konversi data ke float
  receivedTemperatureC = receivedData.toFloat();
  receivedTemperatureF = (receivedTemperatureC * 9 / 5) + 32;

  lastLoRaReceiveTime = millis(); // Update waktu terakhir terima
  updateLCDReceiver(); // Update tampilan LCD setelah menerima data baru
}

// --- Setup ---
void setup() {
  Serial.begin(115200);
  while (!Serial);

  Serial.println("LoRa Receiver (LCD Lokal)");

  // Inisialisasi LCD
  lcd.init();
  lcd.backlight();
  lcd.clear();
  lcd.setCursor(0, 0);
  lcd.print("ESP32 Receiver");
  lcd.setCursor(0, 1);
  lcd.print("Inisialisasi...");
  Serial.println("LCD Inisialisasi");

  // Inisialisasi LoRa
  LoRa.setPins(SS_PIN, RST_PIN, DIO0_PIN);
  if (!LoRa.begin(LORA_FREQ)) {
    Serial.println("Memulai LoRa gagal!");
    lcd.clear();
    lcd.setCursor(0, 0);
    lcd.print("LoRa Gagal!");
    while (true);
  }
  Serial.println("LoRa Inisialisasi OK!");
  LoRa.onReceive(onReceive); // Mendaftarkan fungsi callback untuk penerimaan
  LoRa.receive(); // Masuk ke mode penerimaan
  Serial.print("LoRa Freq: ");
  Serial.print(LORA_FREQ / 1000000);
  Serial.println(" MHz");
  updateLCDReceiver(); // Tampilkan status awal di LCD
}

// --- Loop ---
void loop() {
  LoRa.parsePacket(); // Memeriksa apakah ada paket yang masuk
  
  // Perbarui LCD jika sudah lama tidak ada data masuk, untuk menampilkan "Menunggu Data..."
  static unsigned long previousLCDUpdate = 0;
  const long lcdUpdateInterval = 5000; // Perbarui LCD setiap 5 detik (kecuali ada data baru)
  if (millis() - previousLCDUpdate >= lcdUpdateInterval) {
    previousLCDUpdate = millis();
    updateLCDReceiver();
  }
  
  delay(10); // Memberikan waktu untuk tugas lain
}

Penjelasan Tambahan dan Cara Penggunaan:

1. Untuk ESP32 "Sender" (Pemancar Suhu + LCD + Web Interface)

  • Tampilan LCD: Fungsi updateLCDSender() kini menampilkan label "Suhu Lokal:" dan nilai suhu dalam Celcius dan Fahrenheit di baris pertama dan kedua.
  • Web Interface: Masih terhubung ke Wi-Fi dengan IP Statik 192.168.88.2 dan menyediakan halaman web untuk pemantauan. Di halaman web, juga ditambahkan tampilan IP lokal.
  • LoRa: Mengirimkan data suhu lokal secara periodik melalui LoRa.

2. Untuk ESP32 "Receiver" (Penerima LoRa + LCD Lokal)

  • Tidak Ada Wi-Fi: Kode ini tidak memiliki konfigurasi Wi-Fi (WiFi.h, WebServer.h, ssid, password, staticIP dihapus dari kode Receiver). Ini memastikan Receiver hanya fokus pada LoRa dan LCD.
  • Tampilan LCD: Fungsi updateLCDReceiver() akan menampilkan "Suhu Diterima:" dan nilai suhu LoRa yang diterima. Jika tidak ada data yang diterima dalam 15 detik, akan menampilkan "Menunggu Data...".
  • LoRa: Modul akan terus dalam mode penerimaan, dan setiap paket yang diterima akan memicu fungsi onReceive() untuk mengurai data dan memperbarui LCD lokal.

Langkah-langkah Penggunaan:

  1. Siapkan Kedua ESP32:
    • Hubungkan Sensor LM35 dan LCD I2C pertama ke ESP32 "Sender".
    • Hubungkan LCD I2C kedua ke ESP32 "Receiver".
    • Hubungkan kedua modul LoRa ke masing-masing ESP32 sesuai skema. Pastikan antena terpasang pada kedua modul LoRa!
  2. Unggah Kode Sender:
    • Buka kode "ESP32 Sender" di Arduino IDE.
    • Ganti ssid dan password WiFi Anda.
    • Pastikan staticIP, gateway, subnet cocok dengan jaringan Anda (192.168.88.x).
    • Sesuaikan LORA_FREQ dengan modul LoRa Anda.
    • Verifikasi alamat I2C LCD (0x27 atau 0x3F).
    • Pilih board ESP32 dan port serial yang benar.
    • Unggah kode ke ESP32 Sender.
  3. Unggah Kode Receiver:
    • Buka kode "ESP32 Receiver" di Arduino IDE.
    • Sesuaikan LORA_FREQ agar sama persis dengan yang diatur di Sender.
    • Verifikasi alamat I2C LCD (0x27 atau 0x3F).
    • Pilih board ESP32 dan port serial yang benar.
    • Unggah kode ke ESP32 Receiver.
  4. Uji Sistem:
    • Nyalakan kedua ESP32.
    • Pada ESP32 Sender:
      • Cek Serial Monitor untuk status koneksi Wi-Fi dan pengiriman LoRa.
      • LCD akan menampilkan suhu lokal dan status IP.
      • Akses IP 192.168.88.2 dari browser Anda untuk melihat suhu dari lokasi pemancar.
    • Pada ESP32 Receiver:
      • Cek Serial Monitor untuk melihat data LoRa yang diterima.
      • LCD akan menampilkan "Suhu Diterima:" dan nilai suhu yang dikirim oleh Sender. Jika tidak ada data dalam beberapa waktu, LCD akan menampilkan "Menunggu Data...".

Dengan konfigurasi ini, Anda memiliki sistem pemantauan suhu jarak jauh yang lengkap: lokasi sensor (Sender) memiliki tampilan lokal dan dapat diakses via web, sementara lokasi penerima LoRa (Receiver) juga memiliki tampilan suhu lokal tanpa perlu koneksi Wi-Fi sendiri.

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...