Chương trình đọc dữ liệu tử cảm biến - Hiệu chỉnh giá trị điện áp
void pwm_adjust() {
float previous_v = 5.0; //giá trị khởi tạo điện áp ban đầu float raw2v = 5.0 / 1024.0;//Hệ số chuyển đổi ADC
//Đọc giá trị điện áp với các giá trị độ rộng tương ứng for(int w = 0; w < 250; w++)
{
setTimer2PWM(0, w); float avg_v = 0;
for(int x = 0; x < 100; x ++) //Đọc giá trị phản hồi trong khoảng 100ms {
avg_v += analogRead(A1); delay(time_scale); }
avg_v *= raw2v;
if(avg_v < 3.6 && previous_v > 3.6) //Khoảng điều chỉnh tối ưu {
float dnew = 3.6 - avg_v; // tính độ lệch điện áp hiện tại float dprev = previous_v - 3.6;// tính độ lệch điện áp trước if(dnew < dprev) // Đưa ra kết quả độ rộng xung
{
opt_voltage = avg_v; opt_width = w; return;
}
else //đưa ra giá trí trước đó { opt_voltage = previous_v; opt_width = w-1; return; } } previous_v = avg_v; } } - Cấu hình cảm biến
//Định nghĩa chân Analog được sử dụng kết nối với cảm biến
#define MQ_PIN (0)
//Định nghĩa giá trị điện trở tải trên modul cảm biến
#define RL_VALUE (1000) //Giá trị trở tải RLtheo Ω
//Định nghĩa giá trị RO_CLEAR_AIR_FACTOR=(Sensor resistance in clean air)/RO, giá trị này được lấy từ bảng thông số
#define RO_CLEAN_AIR_FACTOR (25.823)
- Hiệu chỉnh cảm biến
/*
Lưu ý: Hàm này giả định rằng cảm biến ở trong không khí sạch. Nó sử dụng hàm MQResistanceCalculation để tính toán điện trở cảm biến trong không khí sạch và sau đó chia nó với RO_CLEAN_AIR_FACTOR. Với MQ7 giá trị
RO_CLEAN_AIR_FACTOR là 25.823
void MQCalibration()
{
tft.fillScreen(ILI9341_BLACK);
tft.setTextSize(3);
tft.setTextColor(ILI9341_GREEN, ILI9341_BLACK);
tft.setCursor(20, 30); tft.print("Calibration MQ7"); tft.setCursor(20, 60); tft.print("R0: "); float val; val = read_RS_mq7(); R0=val/RO_CLEAN_AIR_FACTOR;
tft.setTextColor(ILI9341_RED, ILI9341_BLACK);
tft.setCursor(120, 60);
tft.print(R0);
delay(500); }
/*
Đầu ra: giá trị Rs của cảm biến
Chú ý: hàm này sử dụng hàm MQResistanceCalculation để tính giá trị Rs của cảm
biến. Giá trị Rs thay đổi tương ứng với sự thay đổi nồng đô khí, thời gian lấy mẫu và khoảng thời gian giữa các lần lấy mẫu có thể thay đổi được. */
float read_RS_mq7(){ float raw=0; float RS=0;
for(int i=0; i<100;i++){ raw += analogRead(MQ7); delay(8); } raw*=0.01; RS=RL*(1023 - raw)/(raw); return RS; } Tính toán giá trị ppm /*
Đầu vào: Giá trị RS
đầu ra: giá trị ppm của khí mục tiêu
Chú ý: Bằng cách sử dụng một điểm trên đồ thị và độ dốc. Ta có thể tính được giá trị x (giá trị Log(ppm)) thông qua tỉ số Rs/Ro.
*/
void calculatorPPM(float RS){
COppm = 98.43*pow((RS/R0), -1.523); }
3.2.2 Đọc và tính toán nồng độ NO2 từ cảm biến điện hóa