#include <Wire.h>
#include <SensirionI2CSgp41.h>
SensirionI2CSgp41 sgp41;
#define LED_NON 14
#define LED_SAP_CHIN 12
#define LED_CHIN 13
#define LED_POWER 26
#define LED_QUA_CHIN 27
#define MQ3_PIN 34 // Analog chân đọc MQ3
int vocTicks = 0;
int ethanolRaw = 0;
void setup() {
Serial.begin(115200);
Wire.begin(); // I2C init
sgp41.begin(Wire);
uint16_t err = sgp41.initBaseline(0); // Khởi tạo baseline, có thể bỏ qua nếu không dùng
pinMode(LED_NON, OUTPUT);
pinMode(LED_SAP_CHIN, OUTPUT);
pinMode(LED_CHIN, OUTPUT);
pinMode(LED_POWER, OUTPUT);
pinMode(LED_QUA_CHIN, OUTPUT);
Serial.println("Khoi dong phan loai sau rieng Ri6 (SGP41 + MQ3)");
}
void loop() {
delay(3000); // đọc mỗi 3 giây
// Đọc dữ liệu từ cảm biến SGP41 (raw VOC + ethanol)
uint16_t srawVoc = 0, srawEthanol = 0;
uint16_t error = sgp41.measureRawSignals(srawVoc, srawEthanol);
if (error == 0) {
vocTicks = srawVoc;
ethanolRaw = analogRead(MQ3_PIN); // MQ3 analog
Serial.print("VOC Ticks: "); Serial.print(vocTicks);
Serial.print(" | MQ3: "); Serial.print(ethanolRaw); Serial.print(" -> ");
// Tắt hết LED
digitalWrite(LED_NON, LOW);
digitalWrite(LED_SAP_CHIN, LOW);
digitalWrite(LED_CHIN, LOW);
digitalWrite(LED_QUA_CHIN, LOW);
// Logic phân loại: có thể tinh chỉnh theo cảm biến thực
if (vocTicks < 10000 && ethanolRaw < 1000) {
Serial.println("NON (chua chin)");
digitalWrite(LED_NON, HIGH);
} else if (vocTicks < 20000 && ethanolRaw < 2000) {
Serial.println("SAP CHIN");
digitalWrite(LED_SAP_CHIN, HIGH);
} else if (vocTicks < 30000 && ethanolRaw < 3000) {
Serial.println("CHIN");
digitalWrite(LED_CHIN, HIGH);
} else {
Serial.println("QUA CHIN");
digitalWrite(LED_QUA_CHIN, HIGH);
}
} else {
Serial.print("Loi doc SGP41: ");
Serial.println(error);
}
}