from machine import Pin, ADC, PWM
import time
# Constants
Voltage_Resolution = 5
led_pin1 = 2
led_pin2 = 4
led_pin3 = 15 # Bóng đèn thứ 3
pin_mq7 = 34 # Chân analog (GPIO34 cho ESP32) kết nối với MQ-7
pin_mq135 = 35 # Chân analog (GPIO35 cho ESP32) kết nối với MQ-135
pin_gp2y = 26 # Chân analog (GPIO36 cho ESP32) kết nối với GP2Y1010AU0F
type_mq7 = "MQ-7" # Cảm biến MQ-7
type_mq135 = "MQ-135" # Cảm biến MQ-135
type_gp2y = "GP2Y1010AU0F" # Cảm biến GP2Y1010AU0F
ADC_Bit_Resolution = 12 # Độ phân giải ADC cho ESP32
RatioMQ7CleanAir = 27.5 # Giá trị RS / R0 = 27.5 ppm (MQ-7)
RatioMQ135CleanAir = 9.6 # Giá trị RS / R0 = 9.6 ppm (MQ-135)
Dust_Threshold = 1000 # Ngưỡng bụi (tính bằng giá trị đọc từ cảm biến GP2Y1010AU0F)
# Định nghĩa các chân
pwmpin = 5 # Pin PWM kết nối với MOSFET (GPIO5 cho ESP32)
analog_pin_mq7 = ADC(Pin(pin_mq7)) # ADC chân cảm biến MQ-7
analog_pin_mq135 = ADC(Pin(pin_mq135)) # ADC chân cảm biến MQ-135
analog_pin_gp2y = ADC(Pin(pin_gp2y)) # ADC chân cảm biến GP2Y1010AU0F
# Chế độ điện áp tối đa 1V cho các chân cảm biến
analog_pin_mq7.atten(ADC.ATTN_0DB)
analog_pin_mq135.atten(ADC.ATTN_0DB)
analog_pin_gp2y.atten(ADC.ATTN_0DB)
# Khởi tạo PWM cho chân PWM
pwm = PWM(Pin(pwmpin))
pwm.freq(1000) # Tần số PWM 1kHz
# Khởi tạo Pin cho đèn LED
led1 = Pin(led_pin1, Pin.OUT)
led2 = Pin(led_pin2, Pin.OUT)
led3 = Pin(led_pin3, Pin.OUT) # LED thứ 3 để hiển thị mức bụi
# Hàm đọc giá trị từ cảm biến MQ-7
def read_mq7():
analog_value = analog_pin_mq7.read() # Đọc giá trị từ chân analog
co_ppm = analog_value * (5000 / 4095) # Quy đổi giá trị thành ppm giả lập
return co_ppm
# Hàm đọc giá trị từ cảm biến MQ-135
def read_mq135():
analog_value = analog_pin_mq135.read() # Đọc giá trị từ chân analog
nox_ppm = analog_value * (5000 / 4095) # Quy đổi giá trị thành ppm giả lập
return nox_ppm
# Hàm đọc giá trị từ cảm biến GP2Y1010AU0F
def read_gp2y():
analog_value = analog_pin_gp2y.read() # Đọc giá trị từ chân analog
dust_value = analog_value * (5000 / 4095) # Quy đổi giá trị thành ppm giả lập
return dust_value
# Hàm hiệu chuẩn cảm biến MQ-7 (cảm biến CO)
def calibrate_mq7():
print("Calibrating MQ-7, please wait...")
calcR0 = 0
for i in range(10):
analog_value = analog_pin_mq7.read()
calcR0 += analog_value * RatioMQ7CleanAir
time.sleep(1)
R0 = calcR0 / 10
print(f"Calibration done! R0 = {R0}")
# Hàm hiệu chuẩn cảm biến MQ-135 (cảm biến NOx)
def calibrate_mq135():
print("Calibrating MQ-135, please wait...")
calcR0 = 0
for i in range(10):
analog_value = analog_pin_mq135.read()
calcR0 += analog_value * RatioMQ135CleanAir
time.sleep(1)
R0 = calcR0 / 10
print(f"Calibration done! R0 = {R0}")
# Hàm đọc và in giá trị cảm biến nếu có thay đổi
def read_and_print(last_value_mq7, last_value_mq135):
co_ppm = read_mq7()
nox_ppm = read_mq135()
dust_value = read_gp2y() # Đọc giá trị từ cảm biến GP2Y1010AU0F
if abs(co_ppm - last_value_mq7) > 1:
print(f"CO Concentration (MQ-7): {co_ppm} ppm")
if abs(nox_ppm - last_value_mq135) > 1:
print(f"NOx, CO2, NH3 Concentration (MQ-135): {nox_ppm} ppm")
print(f"Dust Concentration (GP2Y1010AU0F): {dust_value} µg/m³")
return co_ppm, nox_ppm, dust_value
# Hàm kiểm tra và điều khiển đèn LED
def monitoring():
value_mq7 = read_mq7()
value_mq135 = read_mq135()
value_gp2y = read_gp2y() # Đọc giá trị bụi từ GP2Y1010AU0F
if(value_mq7 >= 100):
led1.value(1)
else:
led1.value(0)
if(value_mq135 >= 100):
led2.value(1)
else:
led2.value(0)
# Kiểm tra giá trị bụi từ GP2Y1010AU0F và bật tắt bóng đèn thứ 3
if(value_gp2y >= Dust_Threshold):
led3.value(1) # Bật đèn LED thứ 3 khi mức bụi vượt ngưỡng
else:
led3.value(0) # Tắt đèn LED thứ 3 khi mức bụi dưới ngưỡng
# Main loop
def loop():
last_value_mq7 = 0
last_value_mq135 = 0
calibrate_mq7()
calibrate_mq135()
while True:
pwm.duty(255) # PWM ở mức 100% (5V)
last_value_mq7, last_value_mq135, last_value_gp2y = read_and_print(last_value_mq7, last_value_mq135)
monitoring() # Kiểm tra và điều khiển đèn LED
time.sleep(0.5)
pwm.duty(20) # PWM ở mức 8% (1.4V)
last_value_mq7, last_value_mq135, last_value_gp2y = read_and_print(last_value_mq7, last_value_mq135)
monitoring() # Kiểm tra và điều khiển đèn LED
time.sleep(0.5)
# Chạy chương trình chính
if __name__ == "__main__":
loop()