请选择 进入手机版 | 继续访问电脑版

 找回密码
 立即注册
查看: 243|回复: 1

[经验分享] 自制天然气报警器esphome esp32 mq4传感器

[复制链接]

1

主题

25

回帖

610

积分

高级会员

积分
610
金钱
584
HASS币
0
发表于 2025-5-9 18:35:01 | 显示全部楼层 |阅读模式
新家装修好厨房有一个自带的燃气报警器(接口24v电压),然而并没有什么用,和物业应该没有通信联系。想了想还是改造一下接入ha配合小米机械手实现燃气自动关阀。

硬件:esp32、mq4传感器、电压转换模块
esphome代码如下:
esphome:
  name: mq5sensor

esp32:
  board: esp32dev

logger:
  level: DEBUG

ota:
  platform: esphome

web_server:
  port: 80

api:
  password: "********"

wifi:
  ssid: "******"
  password: "*********"

switch:
  - platform: restart
    name: "ESP Restart Switch"
    id: esp_restart_switch

number:
  - platform: template
    name: "报警阈值"
    id: alarm_threshold
    initial_value: 150
    min_value: 100
    max_value: 10000
    step: 100
    icon: "mdi:alert-circle"
    optimistic: true

binary_sensor:
  - platform: template
    name: "天然气报警 状态"
    id: gas_alarm_status
    lambda: |-
      // Use LPG concentration sensor ID
      float ppm = id(LPG_Concentration).state;
      float threshold = id(alarm_threshold).state;
      return ppm >= threshold;

sensor:
  # Raw voltage sensor (ADC reading)
  - platform: adc
    pin: GPIO33
    id: mq5_raw_voltage
    name: "MQ5_Raw_Voltage"
    update_interval: 1s
    unit_of_measurement: "V"
    attenuation: 12db  # Fix deprecated warning
    filters:
      - lambda: |-
          // Convert ADC raw value to voltage
          float voltage = (float)x / 0.694;  // Assume ADC resolution is 12-bit
          return roundf(voltage * 1000) / 1000;  // Round to 3 decimal places

  # LPG concentration calculation template sensor
  - platform: template
    name: "LPG_Concentration"
    id: LPG_Concentration  # Add ID definition
    lambda: |-
      static float last_ppm = 0;  // Cache the last valid PPM value
      float voltage = id(mq5_raw_voltage).state;

      if (voltage == 0 || voltage >= 5.0) {
        return last_ppm;  // If voltage is invalid, return the last PPM value
      }

      float ppm = 39.2332667161086 * exp(1.46671939878595 * voltage);
      last_ppm = roundf(ppm * 10) / 10;  // Round to 1 decimal place and update cache
      return last_ppm;
    unit_of_measurement: "ppm"
    accuracy_decimals: 1
    update_interval: 1s  # Increase update frequency to 200ms

text_sensor:
  - platform: template
    name: "ESP 设备 IP 地址"
    lambda: |-
      return std::string(WiFi.localIP().toString().c_str());
注意:1.最好不要用打火机测试燃气数值,容易损坏传感器。
            2.电压和浓度ppm值我折腾了好几天差了很多资料很多视频都没有好的解决办法。现在的计算函数是官方文档中电压ppm值函数图取点拟合函数后的计算公式。
            3.我的电路使用了分压电路,两个10千欧并联后与一个2.2千欧电阻串联。分压比为0.694。具体原理请自行了解。

Screenshot_20250509_183421_io.homeassistant.companion.android.jpg
回复

使用道具 举报

17

主题

190

回帖

2094

积分

金牌会员

积分
2094
金钱
1887
HASS币
0
发表于 2025-5-9 19:34:13 | 显示全部楼层
我用mq135做的,就是空气湿度升高传感器的值也会升高,但是用打火机气体测试很灵敏
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|Hassbian ( 晋ICP备17001384号-1 )

GMT+8, 2025-5-19 01:10 , Processed in 0.097926 second(s), 25 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表