● ESPHome에서 MQ135 공기 품질 센서를 사용하기 위한 YAML 소스 코드 예제
♨ 카랜더 일정 :
2025년03월10일
본문
● ESPHome에서 MQ135 공기 품질 센서를 사용하기 위한 YAML 소스 코드 예제
제품> https://ko.aliexpress.com/item/4000587261511.html
특징:
고품질 듀얼 패널 설계, 전원 표시기 및 TTL 신호 출력 지침 사용
DO (TTL) 출력과 아날로그 출력 AO를 갖는 스위칭 신호.
TTL 출력 유효 신호가 낮습니다. (출력 표시등을 마이크로 컨트롤러 또는 릴레이 모듈에 직접 연결할 수있는 경우 저레벨 신호)
고농도의 아날로그 출력 전압
쉬운 위치를위한 4 개의 나사 구멍이 있습니다.
긴 수명과 안정적인 안정성
신속한 대응 및 복구 특성
입력 전압: DC5V 전력 소비 (전류): 150mA
DO 출력: TTL 디지털 0 및 1 ( 0.1 및 5V)
AO 출력: 0.1-0 .3 V (오염에 비해), 약 4V 의 최대 전압 농도
특별 참고 사항: 센서에 전원이 공급 된 후 약 20S 를 예열해야하며 측정 된 데이터가 안정적이었습니다. 열 센서는 정상적인 현상입니다. 뜨겁다면 정상이 아닙니다.
배선:
VCC: 양의 전원 공급 장치 (5V)
GND: 전원 공급 장치가 음수입니다.
DO: TTL 스위칭 신호 출력
AO: 아날로그 신호 출력
참고:
센서에 전원이 공급 된 후 약 20S 를 따뜻하게해야하며 측정 된 데이터가 안정되고 열 센서가 정상입니다.
크기:
센서종류
연결보드
https://ko.aliexpress.com/item/1005007546914400.html
입니다. MQ135는 다양한 가스(CO2, CO, NH3, 알코올 등)를 감지할 수 있는 아날로그 센서로, ESPHome에서는 이를 ADC 플랫폼과 템플릿 센서를 통해 설정할 수 있습니다. 이 예제는 CO2 농도를 PPM 단위로 계산하며, 온도와 습도 보정을 포함합니다(온도/습도 센서가 있다고 가정).
esphome:
name: mq135_air_quality
platform: ESP32 # 또는 ESP8266 사용 시 수정
board: esp32dev # 보드에 맞게 수정 (예: nodemcu-32s, esp01_1m 등)
# Wi-Fi 설정
wifi:
ssid: "YOUR_WIFI_SSID"
password: "YOUR_WIFI_PASSWORD"
# OTA 및 API 설정
ota:
password: "YOUR_OTA_PASSWORD"
api:
# 글로벌 변수 설정
globals:
- id: RLOAD
type: float
restore_value: no
initial_value: '1.0' # 부하 저항 값 (kOhm), MQ135 모듈에 따라 다름
- id: RZERO
type: float
restore_value: no
initial_value: '76.63' # 신선한 공기에서의 R0 값 (캘리브레이션 필요)
- id: ATMOCO2
type: float
restore_value: no
initial_value: '400' # 대기 중 CO2 기본값 (PPM)
- id: PARA
type: float
restore_value: no
initial_value: '110.47' # CO2에 대한 회귀 상수 a
- id: PARB
type: float
restore_value: no
initial_value: '-2.862' # CO2에 대한 회귀 상수 b
- id: volt_resolution
type: float
restore_value: no
initial_value: '5.0' # MQ135 전원 전압 (5V 또는 3.3V)
# 센서 설정
sensor:
# MQ135 아날로그 입력
- platform: adc
pin: GPIO36 # ESP32의 ADC 핀 (예: VP/GPIO36), ESP8266의 경우 A0
name: "MQ135 Voltage"
update_interval: 1s
filters:
- multiply: 3.3 # ESP32의 경우 3.3V 기준, 5V 사용 시 5.0으로 수정
unit_of_measurement: "V"
id: sensor_volt
accuracy_decimals: 4
# 저항 계산 (RS)
- platform: template
name: "MQ135 Resistance"
lambda: |-
return ((id(volt_resolution) * id(RLOAD) / id(sensor_volt).state) - id(RLOAD));
update_interval: 5s
unit_of_measurement: "kOhm"
id: resistance
accuracy_decimals: 3
# CO2 PPM 계산
- platform: template
name: "CO2 PPM"
lambda: |-
float rs_r0_ratio = id(resistance).state / id(RZERO);
return id(PARA) * pow(rs_r0_ratio, id(PARB));
update_interval: 5s
unit_of_measurement: "ppm"
id: ppm_co2
accuracy_decimals: 1
# 선택적: 온도 및 습도 센서 (HTU21D 예시)
- platform: htu21d
temperature:
name: "Temperature"
id: htu21d_temperature
humidity:
name: "Humidity"
id: htu21d_humidity
update_interval: 30s
# 선택적: 온도/습도 보정된 저항
- platform: template
name: "Corrected Resistance"
lambda: |-
float temp = id(htu21d_temperature).state;
float hum = id(htu21d_humidity).state;
float correction = 1.0;
if (temp < 20) {
correction = 0.00035 * temp * temp - 0.02718 * temp + 1.39538 - (hum - 33.0) * 0.0018;
} else {
correction = -0.00333 * temp - 0.00192 * hum + 1.13013;
}
return id(resistance).state / correction;
update_interval: 5s
unit_of_measurement: "kOhm"
id: corrected_resistance
accuracy_decimals: 3
# 보정된 CO2 PPM
- platform: template
name: "Corrected CO2 PPM"
lambda: |-
float rs_r0_ratio = id(corrected_resistance).state / id(RZERO);
return id(PARA) * pow(rs_r0_ratio, id(PARB));
update_interval: 5s
unit_of_measurement: "ppm"
id: corrected_ppm_co2
accuracy_decimals: 1
normal 상태
=====================
동영상 정보
https://github.com/AlexBelfegor/esphome-mq135/blob/main/isl_climatestatio.yaml
의 yaml 파일 정보
=============
web_server:
port: 80
auth:
username: admin
password: !secret web_server_password
i2c:
sda: 5
scl: 4
scan: False
id: bus_a
globals:
#The load resistance on the board. Value in KiloOhms
- id: RLOAD
type: float
restore_value: no
initial_value: '1.025'
#Calibration resistance at atmospheric CO2 level. Outdoor calibration data
- id: RZERO
type: float
restore_value: no
initial_value: '35.429'
#Atmospheric CO2 level for calibration purposes. Outdoor CO2 level during calibration. Usually 450, but it's better to clarify.
- id: ATMOCO2
type: float
restore_value: no
initial_value: '450'
#Parameters for calculating ppm of CO2 from sensor resistance
# Exponential regression:
# GAS | a | b
# CO | 605.18 | -3.937
# Alcohol | 77.255 | -3.18
# CO2 | 110.47 | -2.862
# Tolueno | 44.947 | -3.445
# NH4 | 102.2 | -2.473
# Acetona | 34.668 | -3.369
- id: PARA
type: float
restore_value: no
initial_value: '110.47'
- id: PARB
type: float
restore_value: no
initial_value: '-2.862'
#Parameters to model temperature and humidity dependence
- id: CORA
type: float
restore_value: no
initial_value: '0.00035'
- id: CORB
type: float
restore_value: no
initial_value: '0.02718'
- id: CORC
type: float
restore_value: no
initial_value: '1.39538'
- id: CORD
type: float
restore_value: no
initial_value: '0.0018'
- id: CORE
type: float
restore_value: no
initial_value: '-0.003333333'
- id: CORF
type: float
restore_value: no
initial_value: '-0.001923077'
- id: CORG
type: float
restore_value: no
initial_value: '1.130128205'
# Here you need to indicate the supply voltage of the MQ135 sensor. It can be measured with a voltmeter. Please note that the rated power will not always be accurate.
- id: volt_resolution
type: float
restore_value: no
initial_value: '5.14'
# 1 for Exponential, 2 for Linear
- id: regression_method
type: int
restore_value: no
initial_value: '1'
sensor:
- platform: htu21d
temperature:
name: "Temperature htu21d"
id: htu21d_temperature
humidity:
name: "Humidity"
id: htu21d_humidity
filters:
- lambda: if ((id(htu21d_temperature).state)>=0) {return (id(htu21d_humidity).raw_state + (25.0 - id(htu21d_temperature).state) * (-0.15));} else {return id(htu21d_humidity).raw_state;}
update_interval: 30s
- platform: adc
pin: A0
name: "Gas ADC"
update_interval: 1s
filters:
- multiply: 3.3 # for NodeMcu ESP8266 v3 Lua
accuracy_decimals: 4
unit_of_measurement: V
id: sensor_volt
- platform: template
#Linearization of the temperature dependency curve under and above 20 degree C
#below 20degC: fact = a * t * t - b * t - (h - 33) * d
#above 20degC: fact = a * t + b * h + c
#this assumes a linear dependency on humidity
#getCorrectionFactor
name: "Correction Factor"
lambda: |-
if (id(htu21d_temperature).state<20) {
return (id(CORA) * id(htu21d_temperature).state * id(htu21d_temperature).state - id(CORB) *
id(htu21d_temperature).state + id(CORC) - (id(htu21d_humidity).state - 33.) * id(CORD));
} else {
return (id(CORE) * id(htu21d_temperature).state + id(CORF) * id(htu21d_humidity).state + id(CORG));
}
update_interval: 10s
accuracy_decimals: 6
id: correction_factor
- platform: template
#Get the resistance of the sensor, ie. the measurement value @return The sensor resistance in kOhm
# RS = [(VC x RL) / VRL] - RL
# RS_air = ((5.14*1.0)/sensor_volt)-1.0 Calculate RS in fresh air
#getResistance
name: "Resistance"
lambda: |-
return ((id(volt_resolution)*id(RLOAD)/id(sensor_volt).state) - id(RLOAD));
update_interval: 5s
accuracy_decimals: 3
unit_of_measurement: kOm
id: resistance
- platform: template
# Get the resistance of the sensor, ie. the measurement value correctedfor temp/hum @return The corrected sensor resistance kOhm
#getCorrectedResistance
name: "Corrected Resistance"
lambda: |-
return (id(resistance).state / id(correction_factor).state);
update_interval: 5s
accuracy_decimals: 3
unit_of_measurement: kOm
id: corrected_resistance
- platform: template
# Get the ppm of CO2 sensed (assuming only CO2 in the air). The ppm of CO2 in the air
#getPPM
name: "PPM CO2"
lambda: |-
if (id(regression_method)==1) {
return (id(PARA) * pow((id(resistance).state / id(RZERO)), id(PARB)));
} else {
return (pow(10, (log10(id(resistance).state / id(RZERO)) - id(PARB)) / id(PARA)));
}
update_interval: 5s
unit_of_measurement: ppm
id: ppm_co2
- platform: template
# Get the ppm of CO2 sensed (assuming only CO2 in the air), corrected for temp. The ppm of CO2 in the air
#getCorrectedPPM
name: "Corrected PPM CO2"
lambda: |-
if (id(regression_method)==1) {
return (id(PARA) * pow((id(corrected_resistance).state / id(RZERO)), id(PARB)));
} else {
return (pow(10, (log10(id(corrected_resistance).state / id(RZERO)) - id(PARB)) / id(PARA)));
}
update_interval: 5s
unit_of_measurement: ppm
id: corrected_ppm_co2
- platform: template
# Get the resistance RZero of the sensor for calibration purposes. The sensor resistance RZero in kOhm
#getRZero
name: "RZero"
lambda: |-
return (id(resistance).state / pow((id(ATMOCO2) / id(PARA)), (1./id(PARB))));
filters:
- sliding_window_moving_average:
window_size: 15
send_every: 1
update_interval: 5s
accuracy_decimals: 3
unit_of_measurement: kOm
id: r_zero
- platform: template
# Get the corrected resistance RZero of the sensor for calibration purposes. The corrected sensor resistance RZERO in kOhm for ATMOCO2 level
#getCorrectedRZero
name: "CorrectedRZero"
lambda: |-
return (id(corrected_resistance).state / pow((id(ATMOCO2) / id(PARA)), (1./id(PARB))));
filters:
- sliding_window_moving_average:
window_size: 15
send_every: 1
update_interval: 5s
accuracy_decimals: 3
unit_of_measurement: kOm
id: corrected_r_zero
☞ https://11q.kr 에 등록된 자료 입니다. ♠ 정보찾아 공유 드리며 출처는 링크 참조 바랍니다♠
뷰PDF 1,2
office view
관련자료
-
링크
-
이전
-
다음
댓글목록
등록된 댓글이 없습니다.