Kalau sensor SGP30 kamu terus menampilkan eCO2 400 ppm dan TVOC 0 ppb, kemungkinan besar sensornya nggak rusak. Angka itu adalah nilai bawaan SGP30 selama sekitar 15 detik pertama setelah inisialisasi. Kalau angkanya tetap aneh setelah itu, penyebabnya biasanya ada di cara membaca: I2C yang belum terdeteksi, jeda baca yang salah, atau baseline yang belum dipasang. Di artikel ini kita cek satu per satu, urut dari yang paling sering terjadi.
Kenapa bacaan SGP30 terlihat nggak masuk akal
SGP30 adalah sensor gas berbasis metal oxide (MOX). Ada dua hal yang sering bikin pemula bingung:
- Dia butuh waktu untuk mulai menghitung. Setelah perintah inisialisasi, sensor mengeluarkan nilai tetap 400 ppm eCO2 dan 0 ppb TVOC selama sekitar 15 detik. Itu bukan error.
- eCO2 bukan hasil ukur CO2 asli. SGP30 nggak mengukur CO2 secara langsung. Nilai eCO2 dihitung dari sinyal gas lain, terutama hidrogen (H2). Makanya angkanya bisa beda jauh dari sensor CO2 jenis NDIR.
Jadi sebelum curiga sensornya rusak, pastikan dulu kamu nggak terjebak dua hal di atas.
4 hal yang perlu dicek, urut dari yang paling sering
1. Kasih waktu warm-up
Setelah begin() atau init, tunggu minimal 15 detik sebelum percaya pada angkanya. Selama jendela itu, 400 ppm dan 0 ppb adalah perilaku normal.
Kebiasaan buruk yang sering terjadi: sensor di-reset lewat tombol atau kode, lalu langsung dibaca dan dianggap error. Setiap restart, hitungan warm-up mulai lagi dari awal.
2. Pahami bahwa eCO2 itu estimasi
Kalau kamu membandingkan SGP30 dengan sensor CO2 NDIR lalu angkanya beda jauh, itu wajar. SGP30 cocok untuk melihat tren kualitas udara: ruangan jadi lebih pengap, ada aroma masakan, atau ada uap alkohol. Jangan dipakai sebagai alat ukur CO2 yang presisi.
Untuk project yang butuh angka CO2 sungguhan, pilih sensor yang memang mengukur CO2 langsung.
3. Cek I2C: apakah 0x58 muncul?
Alamat I2C SGP30 adalah 0x58. Jalankan sketch I2C scanner. Kalau 0x58 nggak muncul, cek berurutan:
- Kabel SDA dan SCL nggak tertukar.
- VCC dan GND tersambung kuat. Kabel jumper longgar dan breadboard yang sudah aus itu pelaku klasik 😅
- Pin SDA/SCL sesuai board. Di ESP32 DevKit umumnya SDA = GPIO 21 dan SCL = GPIO 22, di Arduino Uno SDA = A4 dan SCL = A5.
- Ada pull-up di jalur I2C. Banyak modul sudah membawa pull-up di PCB-nya, tapi kalau jalur kamu panjang atau banyak perangkat, bacaan bisa tidak stabil.
- Tidak ada perangkat lain dengan alamat yang bentrok di jalur yang sama.
4. Baca tiap 1 detik, lalu simpan baseline
Algoritma kompensasi SGP30 dirancang untuk dipanggil tepat tiap 1 detik. Kalau kamu membaca tiap 5 detik atau tiap 100 ms, kompensasi baseline-nya jadi ngaco dan hasilnya terlihat nggak masuk akal.
Selain itu, baseline butuh sekitar 12 jam operasi untuk stabil. Kalau sensor sering dimatikan, dia mulai dari nol lagi setiap kali. Solusinya: simpan nilai baseline secara berkala, lalu pasang kembali saat restart. Menurut datasheet, baseline yang tersimpan hanya layak dipakai selama sekitar 7 hari. Lebih lama dari itu, biarkan sensor belajar ulang.
Contoh sketch: baca 1 detik dan simpan baseline di ESP32
Sketch ini memakai library Adafruit SGP30 dan Preferences bawaan ESP32. Sensor dibaca tiap 1 detik, dan baseline disimpan tiap 1 jam.
#include <Wire.h>
#include <Adafruit_SGP30.h>
#include <Preferences.h>
Adafruit_SGP30 sgp;
Preferences prefs;
unsigned long lastRead = 0;
unsigned long lastSave = 0;
void setup() {
Serial.begin(115200);
Wire.begin();
if (!sgp.begin()) {
Serial.println("SGP30 tidak ditemukan, cek wiring dan alamat 0x58");
while (true) delay(1000);
}
prefs.begin("sgp30", false);
if (prefs.isKey("eco2") && prefs.isKey("tvoc")) {
sgp.setIAQBaseline(prefs.getUShort("eco2"), prefs.getUShort("tvoc"));
Serial.println("Baseline lama dipasang");
}
}
void loop() {
unsigned long now = millis();
if (now - lastRead >= 1000) {
lastRead = now;
if (!sgp.IAQmeasure()) {
Serial.println("Gagal membaca sensor");
return;
}
Serial.print("eCO2: ");
Serial.print(sgp.eCO2);
Serial.print(" ppm, TVOC: ");
Serial.print(sgp.TVOC);
Serial.println(" ppb");
}
if (now - lastSave >= 3600000UL) {
lastSave = now;
uint16_t e, t;
if (sgp.getIAQBaseline(&e, &t)) {
prefs.putUShort("eco2", e);
prefs.putUShort("tvoc", t);
Serial.println("Baseline disimpan");
}
}
}
Perhatikan bahwa pembacaan memakai millis(), bukan delay(1000) di dalam loop. Dengan begitu jeda 1 detik tetap konsisten walaupun ada pekerjaan lain di loop. Catatan: baseline yang disimpan di jam-jam awal belum tentu bagus. Biarkan sensor menyala sekitar 12 jam di udara bersih pada pemakaian pertama.
Kesalahan yang sering terjadi
| Gejala | Kemungkinan penyebab |
|---|---|
| Selalu 400 ppm / 0 ppb tepat setelah dinyalakan | Masih warm-up ±15 detik |
| Angka beda jauh dari sensor CO2 NDIR | eCO2 hanya estimasi dari gas lain |
begin() gagal |
0x58 tidak terdeteksi: wiring, VCC/GND, atau SDA/SCL |
| Angka loncat-loncat tidak wajar | Jeda baca bukan 1 detik, atau baseline belum stabil |
| Tiap restart angka mulai dari awal lagi | Baseline tidak disimpan dan dipasang kembali |
Kesalahan lain yang sering muncul adalah menaruh sensor dekat sumber panas atau sumber uap (solder, kompor, adaptor yang hangat), lalu mengira sensornya bermasalah. Sensor MOX memang sensitif terhadap lingkungan sekitarnya.
Komponen yang dibutuhkan
- Gy-Sgp30 Sensor Gas Kualitas Udara Tvoc Eco2 Karbon Dioksida CO2 Iic I2c 3.3V 5V: modul sensornya, dengan antarmuka I2C.
- Board mikrokontroler seperti ESP32 atau Arduino, kabel jumper, dan breadboard.
Semua komponen di atas bisa kamu cari di Ichibot Store.
Kesimpulan
Kalau SGP30 kamu nyangkut di 400 ppm, jangan buru-buru beli yang baru. Seringnya bukan sensornya yang rusak, tapi cara kita membacanya. Urutan cek cepatnya: tunggu warm-up, ingat bahwa eCO2 itu estimasi, pastikan 0x58 terdeteksi, lalu baca tiap 1 detik dan simpan baseline. Coba sketch di atas, biarkan menyala beberapa jam, dan lihat apakah angkanya mulai terasa masuk akal.
Pertanyaan yang Sering Diajukan
Kenapa SGP30 selalu menampilkan 400 ppm eCO2 dan 0 ppb TVOC?
Itu nilai bawaan selama sekitar 15 detik pertama setelah inisialisasi. Tunggu dulu sebelum menilai bacaannya. Kalau terus begitu lebih lama, cek wiring I2C dan pastikan fungsi baca dipanggil tiap 1 detik.
Berapa alamat I2C SGP30?
Alamat I2C SGP30 adalah 0x58. Jalankan I2C scanner untuk memastikan alamat ini muncul. Kalau tidak muncul, periksa SDA, SCL, VCC, GND, dan kabel jumper.
Apakah eCO2 dari SGP30 sama dengan CO2 asli?
Bukan. SGP30 tidak mengukur CO2 secara langsung, nilainya dihitung dari gas lain seperti H2. Jadi cocok untuk melihat tren kualitas udara, bukan untuk pengukuran CO2 yang presisi.
Kenapa SGP30 harus dibaca tiap 1 detik?
Algoritma kompensasi baseline pada SGP30 dirancang untuk dipanggil dengan interval 1 detik. Kalau jedanya jauh berbeda, hasil kompensasinya jadi tidak akurat.
Komponen di Ichibot Store
Cek harga dan stok terbaru langsung di halaman produknya. Butuh bantuan milih komponen? Tanya kami lewat chat di toko.
