Mengukur kekuatan sinar ultraviolet matahari dalam skala indeks UV 0-11+, plus saran perlindungan dari WHO. Indonesia sering berada di indeks 8-11 di siang hari.
S12SD adalah fotodioda yang hanya peka sinar UV (240-370 nm), dengan penguat di modulnya. Tegangan keluarannya kira-kira 0,1 V untuk setiap 1 indeks UV. ESP32 membaca tegangan itu dalam milivolt dengan analogReadMilliVolts(), yang sudah dikalibrasi pabrik, lalu membaginya dengan 100. Sensor harus menghadap langit terbuka. Kaca jendela memblokir sebagian besar UV.
Komponen
| Komponen | Qty | Harga |
|---|---|---|
| ESP32 DOIT DevKit V1 30 pin | 1 | Rp75.000 |
| Sensor UV S12SD | 1 | Rp40.000 |
| Kabel jumper female-female 10 cm (isi 10)isi 10, terpakai 3 | 1 | Rp3.500 |
| Kabel micro USB data 30 cmopsional, kalau belum punya kabel micro USB data | 1 | Rp11.700 |
| Total (tanpa opsional) | Rp118.500 |
Langkah 1: Rangkai komponen
Sambungkan kabel sesuai gambar di atas. Kalau gambar dan tabel terlihat berbeda, ikuti tabel.
| Dari | Ke | Kabel | |
|---|---|---|---|
| Sensor UV S12SD GND | → | GND | hitam |
| Sensor UV S12SD VCC | → | 3V3 | merah |
| Sensor UV S12SD OUT | → | D34 GPIO34 | ungu |
Langkah 2: Siapkan dashboard Klenik
Cara cepat: unduh p035.json, ganti budi1234 dengan KODE-mu, lalu import di Klenik (menu titik tiga → Export / Import → Import → Ganti total). Langkah lengkapnya ada di Panduan Klenik.
| Widget | Topic | Setting |
|---|---|---|
| Gauge Indeks UV | ichibot/KODE/p035/uv | 0–12 |
| Text Log Saran | ichibot/KODE/p035/kategori | menampilkan teks masuk |
Langkah 3: Upload kode
Library: PubSubClient (Nick O'Leary). Board di Arduino IDE: ESP32 Dev Module.
Isi dulu nama WiFi dan password di bagian ISI DULU, lalu ganti budi1234 di baris topic dengan KODE-mu, lalu upload dan buka Serial Monitor (115200).
// Proyek 035 - Indeks UV Matahari
// Board: ESP32 DOIT DevKit V1 | Dashboard: klenik.ichibot.id
#include <WiFi.h>
#include <PubSubClient.h>
// ===== ISI DULU =====
const char* WIFI_NAMA = "nama-wifi-kamu";
const char* WIFI_PASS = "password-wifi-kamu";
// topic MQTT: ganti budi1234 dengan KODE-mu (sama dengan di dashboard Klenik)
const char* TOPIK_UV = "ichibot/budi1234/p035/uv";
const char* TOPIK_KATEGORI = "ichibot/budi1234/p035/kategori";
const char* BROKER = "mqtt.ichibot.id";
WiFiClient wifi;
PubSubClient mqtt(wifi);
const int PIN_UV = 34; // OUT modul S12SD (GUVA-S12SD)
unsigned long terakhir = 0;
String kategori(float uvi) { // skala WHO
if (uvi < 3) return "Rendah";
if (uvi < 6) return "Sedang: pakai topi/tabir surya";
if (uvi < 8) return "Tinggi: kurangi di luar jam 10-14";
if (uvi < 11) return "Sangat tinggi: hindari matahari langsung";
return "Ekstrem";
}
void langganan() {}
sambungWiFi() dan sambungMQTT(): sama di semua proyek (klik untuk lihat)
void sambungWiFi() {
WiFi.begin(WIFI_NAMA, WIFI_PASS);
Serial.print("WiFi");
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println(" OK, IP " + WiFi.localIP().toString());
}
void sambungMQTT() {
while (!mqtt.connected()) {
if (mqtt.connect(WiFi.macAddress().c_str())) {
Serial.println("Terhubung ke Klenik");
langganan();
} else {
Serial.println("Broker gagal, coba lagi 3 detik");
delay(3000);
}
}
}
void setup() {
Serial.begin(115200);
analogSetPinAttenuation(PIN_UV, ADC_11db); // rentang baca 0-3,3 V
sambungWiFi();
mqtt.setServer(BROKER, 1883);
}
void loop() {
if (!mqtt.connected()) sambungMQTT();
mqtt.loop();
if (millis() - terakhir < 5000) return;
terakhir = millis();
float mv = 0;
for (int i = 0; i < 16; i++) mv += analogReadMilliVolts(PIN_UV);
mv /= 16;
float uvi = mv / 100.0; // S12SD: ±0,1 V per 1 indeks UV
mqtt.publish(TOPIK_UV, String(uvi, 1).c_str());
mqtt.publish(TOPIK_KATEGORI, kategori(uvi).c_str());
}Langkah 4: Pahami kodenya
- Atenuasi 11 dB membuat ADC ESP32 bisa membaca sampai ±3,1 V, cukup untuk indeks UV ekstrem.
- Rata-rata 16 bacaan dalam milivolt. ESP32 menyimpan data kalibrasi pabrik, jadi ini lebih tepat daripada
analogRead()biasa. - Pendekatan dari lembar data: 100 mV ≈ 1 indeks UV. Bandingkan dengan aplikasi cuaca BMKG untuk koreksi.