ARSAFAMILY.COM – Kali ini kita akan membuat contoh sistem kecil yang secara tidak sadar sering kita jumpai di kehidupan sehari-hari, yaitu sistem pendingin otomatis. Contoh dari sistem seperti pada mode otomatis pada AC, sistem pendingin CPU Komputer (PC/Laptop), dll.
Bahan-bahan yang kita butuhkan kali ini antara lain
- ESP32
- BMP280 untuk sensor suhu
- LCD 16×2 + I2C
- Baterai
- L298N Motor Driver
- dan Dinamo / Motor PWM
Langsung saja kita eksekusi, rangkailah bahan-bahan seperti gambar di bawah
Note : PIN SDA dan SCL pada sensor BMP280 dan I2C Lcd 16×2 sama-sama dipasang pada pin yang sama di ESP32, yaitu SDA ke pin D21, dan SCL ke pin D22 karena sama-sama menggunakan jalur komunikasi I2C, yang membedakannya address yang dipakai, seperti gambar di bawah.
Untuk kode program bisa dilihat pada skema di bawah ini
#include <Wire.h>
#include <SPI.h>
#include <Adafruit_BMP280.h>
#include <LiquidCrystal_I2C.h>
#define BMP_SCK (13)
#define BMP_MISO (12)
#define BMP_MOSI (11)
#define BMP_CS (10)
Adafruit_BMP280 bmp;
int motor1Pin1 = 27;
int motor1Pin2 = 26;
int enable1Pin = 14;
const int freq = 30000;
const int pwmChannel = 0;
const int resolution = 8;
int kecepatan = 140;
int max_s = 255;
int min_s = kecepatan;
int naik;
float t,t_n,nilai;
float suhu_normal = 33;
int kolom = 16;
int baris = 2;
LiquidCrystal_I2C lcd(0x27, kolom, baris);
void setup()
{
Serial.begin(9600);
pinMode(motor1Pin1, OUTPUT);
pinMode(motor1Pin2, OUTPUT);
pinMode(enable1Pin, OUTPUT);
while ( !Serial ) delay(100);
unsigned status;
status = bmp.begin(0x76);
if (!status)
{
while (1) delay(10);
}
bmp.setSampling(Adafruit_BMP280::MODE_NORMAL, Adafruit_BMP280::SAMPLING_X2, Adafruit_BMP280::SAMPLING_X16, Adafruit_BMP280::FILTER_X16, Adafruit_BMP280::STANDBY_MS_500);
ledcSetup(pwmChannel, freq, resolution);
ledcAttachPin(enable1Pin, pwmChannel);
lcd.init();
lcd.backlight();
lcd.setCursor(0, 0);
lcd.print("Status : ");
motor_init();
}
void loop() {
t = bmp.readTemperature();
t = bulat(t, 1);
if(t > suhu_normal)
{
naik = 1;
while (naik == 1)
{
t_n = bmp.readTemperature();
t_n = bulat(t_n, 1);
nilai = (t_n - suhu_normal) * 10;
nilai = bulat(nilai, 1);
nilai = int(nilai);
kecepatan = min_s + nilai;
if(kecepatan >= max_s)
{ kecepatan = max_s; }
else if(kecepatan <= min_s)
{ kecepatan = min_s; }
else {}
tampil(t_n, kecepatan);
ledcWrite(pwmChannel, kecepatan);
if (t_n <= suhu_normal)
{ naik = 0; }
clearRow(9, 0);
lcd.setCursor(9, 0);
lcd.print("Ov.Heat");
}
}
clearRow(9, 0);
lcd.setCursor(9, 0);
lcd.print("Normal");
Serial.println("Normal");
ledcWrite(pwmChannel, min_s);
tampil(t, kecepatan);
}
void tampil(float t, int k)
{
Serial.print(F("Temperature = "));
Serial.print(t);
Serial.println(" *C");
lcd.setCursor(0, 1);
lcd.print("T:");
lcd.setCursor(2, 1);
lcd.print(t);
Serial.print("Kecepatan Kipas = ");
Serial.print(k);
Serial.println("");
lcd.setCursor(9, 1);
lcd.print("V:");
lcd.setCursor(11, 1);
lcd.print(k);
delay(500);
}
void motor_init()
{
digitalWrite(motor1Pin1, HIGH);
digitalWrite(motor1Pin2, LOW);
while (kecepatan <= 220){
ledcWrite(pwmChannel, kecepatan);
Serial.print("Kecepatan motor: ");
Serial.println(kecepatan);
kecepatan = kecepatan + 5;
delay(100);
}
kecepatan = min_s;
}
float bulat(float val, byte dec)
{
float x = val * pow(10, dec);
float y = round(x);
float z = x - y;
if ((int)z == 5){
y++;
} else {}
x = y / pow(10, dec);
return x;
}
void clearRow(byte baris, byte rowToClear)
{
lcd.setCursor(baris, rowToClear);
lcd.print(" ");
}
Beberapa penjelasan kode di atas
// variabel kecepatan motor
...
int kecepatan = 140;
int max_s = 255;
int min_s = kecepatan;
...
Variabel kecepatan adalah kondisi kecepatan normal motor, beda motor beda nilainya, motor DC yang dipakai pada eksperimen ini jika diberi nilai < 140 maka putaran motor akan lemah dan cenderung tidak berputar, sehingga disimpulkan bahwa kecepatan normal pada motor ini adalah 140, dan juga dijadikan sebagai kecepatan minimal (min_s). Sedangkan untuk kecepatan maksimal (max_s) diberi angka 255 (nilai maksimal dari PWM mengikuti aturan bit 0-255).
// alamat i2c
...
LiquidCrystal_I2C lcd(0x27, kolom, baris);
...
status = bmp.begin(0x76);
...
Alamat komunikasi i2c pada lcd 16×2 adalah 0x27 dan alamat komunikasi i2c pada sensor BMP280 adalah 0x76.
// inisiasi motor
...
void setup(){
...
motor_init();
}
void loop(){
...
}
void motor_init() {
digitalWrite(motor1Pin1, HIGH);
digitalWrite(motor1Pin2, LOW);
while (kecepatan <= 220){
ledcWrite(pwmChannel, kecepatan);
Serial.print("Kecepatan motor: ");
Serial.println(kecepatan);
kecepatan = kecepatan + 5;
delay(100);
}
kecepatan = min_s;
}
Pemanggilan funsi motor_init() pada void setup() adalah untuk mentriger motor pada kecepatan maksimal sesaat, meniru sistem CPU ketika pertama kali dihidupkan, kipas akan berkecepatan kencang sesaat lalu akan berputar normal.
Ada kasus motor ketika diberi kecepatan < 150, memerlukan perlakukan fisik, yaitu diputar manual menggunakan tangan baru kipas akan berputar, maka dari itu untuk mengantisipasi hal tersebut, maka dibuatkan fungsi triger untuk memicu motor dengan memberikan kecepatan maksimal sesaat.
// Fungsi utama
void loop() {
t = bmp.readTemperature();
t = bulat(t, 1);
if(t > suhu_normal)
{
naik = 1;
while (naik == 1)
{
t_n = bmp.readTemperature();
t_n = bulat(t_n, 1);
nilai = (t_n - suhu_normal) * 10;
nilai = bulat(nilai, 1);
nilai = int(nilai);
kecepatan = min_s + nilai;
if(kecepatan >= max_s)
{ kecepatan = max_s; }
else if(kecepatan <= min_s)
{ kecepatan = min_s; }
else {}
tampil(t_n, kecepatan);
ledcWrite(pwmChannel, kecepatan);
if (t_n <= suhu_normal)
{ naik = 0; }
clearRow(9, 0);
lcd.setCursor(9, 0);
lcd.print("Ov.Heat");
}
}
clearRow(9, 0);
lcd.setCursor(9, 0);
lcd.print("Normal");
Serial.println("Normal");
ledcWrite(pwmChannel, min_s);
tampil(t, kecepatan);
}
Algoritma dari fungsi utama dari program ini adalah
- Sistem akan membaca suhu perangkat (anggap saja sensor menempel pada suatu perangkat)
- Suhu akan di validasi, jika lebih dari suhu normal (33 derajat C) maka sistem akan mengeluarkan status naik / over heat
- Saat status over heat, sistem akan terus mengukur suhu realtime
- Sistem akan membandingkan suhu terakhir dengan suhu sekarang
- Suhu sekarang akan dikurangi suhu terakhir
- Kecepatan kipas akan mengikuti kenaikan suhu (selsih perbandingan suhu sekarang dan suhu terakhir), jika suhu naik 0.1 derajat, maka kipas akan naik sebesar 1 bit (rumus : selisih_suhu * 10), jika suhu turun kecepatan kipas juga ikut turun
- Dengan algoritma demikian, sistem akan menjadi efisien, karena power yang akan dibutuhkan untuk menggerakkan motor(kipas) tidak selalu memakai power yang maksimal.
Berikut video amatir untuk sistem pendingin otomatis yang telah dibuat
Note : Sound Up untuk mendengarkan kecepatan motor (kipas) nya
LCD akan menampilkan status, suhu (T), dan kecepatan kipas (V).
Pengujian dilakukan dengan mendekatkan api (korek) pada sensor BMP280, pada LCD jelas nampak kenaikan suhu, ketika suhu sudah di atas 33 derajat celcius, maka kecepatan kipas (T) akan mengikuti kenaikan suhu. Bukti perubahan kecepatan kipas dapat dilihat dari api dari lilin yang bergerak semakin kencang dan pada akhirnya mati ketika kecepatan kipas naik. Lalu ketika suhu turun maka kecepatan kipas akan ikut menurun sampai batas minimal kecepatan motor yang telah ditentukan di atas.
Jika anda ingin menerapkan fungsi terpisah untuk Running Text pada LCD seperti contoh pada ekperimen ini, sistem ini tetap bisa berjalan, namun hasil pembacaan suhu akan tidak teratur. Misal pada normalnya diharapkan kenaikan suhu 1 per 1 sehingga kecepatan motor (kipas) akan smooth, namun jika dipadupadankan dengan sistem Running Text pada LCD, maka pembacaan sensor akan meloncat, misal dari suhu terakhir 33,40 maka pembacaan selanjutnya bisa jadi 33.60 sehingga akan langsung menambah 2 bit kecepatan motor. Inilah kelemahan dari penggunaan esp32 maupun arduino, terlalu banyak task maka akan berpengaruh kepada kinerja dari part-part yang lain dalam satu board. Solusinya ya 1 esp32/arduino/IC ya untuk 1 task saja, jika memerlukan banyak sensor dengan sistem yang kompleks, maka dibuat terpisah sesuai dengan task-nya masing-masing dan dapat dihubungkan ke IC induk. Ini juga untuk mencegah kerusakan total dari sebuah sistem, jikapun salah satu IC ada yang rusak maka tidak terlalu fatal untuk IC lainnya.
Tapi salah satu alternatif permasalahan di atas adalah melakukan penggabungan 2 task (running text dan ukur suhu dengan sensor) dalam satu kode fungsi, contohnya adalah pada link berikut. Namun tetap solusi yang paling efektif untuk sistem yang kompleks adalah pemisahan task dengan beberapa IC.
Sekian eksperimen kali ini, terima kasih.
Seorang PNS Kementerian Dalam Negeri yang menjadi penerima Beasiswa Kominfo pada Magister Informatika ITB Program Smart-X, yaitu program kerjasama antara Kominfo dan ITB dalam pemenuhan sumber daya manusia di bidang Smart System
Leave a Reply
View Comments