野火电子论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 1733|回复: 0

【鲁班猫创意大赛】检测环境甲醛浓度通过MQTT上传到网页z...

[复制链接]
发表于 2023-5-18 19:00:45 | 显示全部楼层 |阅读模式
项目材料:
鲁班猫卡片电脑

检测甲醛传感器,ZE08-CH2O
鲁班猫ubuntu20.04固件


连接甲醛传感器:
选择5V的电源供电并选用UART4作为通讯口
野火论坛202305181853309955..png
在/boot/uEnv/uEnvLubanCatZN.txt取消dtoverlay=/dtb/overlay/rk356x-lubancat-uart4-m1-overlay.dtbo,dtoverlay=/dtb/overlay/rk356x-lubancat-uart8-m0-overlay.dtbo,dtoverlay=/dtb/overlay/rk356x-lubancat-uart9-m1-overlay.dtbo注释。重启鲁班猫电脑卡片,可以在/dev/目录下找到ttyS4、ttyS8、ttyS9。
野火论坛202305181854162793..png
硬件连接如下:
wKgaomRBCziAZEhDAAUjJEa7pyc087.jpg
安装软件环境

1. 增加emqx的apt源
cat@lubancat:~/serial$ curl -s https://assets.emqx.com/scripts/install-emqx-deb.sh | sudo bash


2. 安装emqx
cat@lubancat:~/serial$ sudo apt install emqx
3. 启动emqx
cat@lubancat:~/serial$ sudo systemctl start emqx.service
4. 安装pyserial
sudo pip3 install pyserial
5. 安装crc
pip3 install crc==0.9.5
  1. class MyMqtt(object):
  2.         def __init__(self, ip, username):
  3.                 self.client = mqtt.Client()
  4.                 self.client.on_connect = self.on_connect
  5.                 self.client.on_message = self.on_message
  6.                 self.client.on_disconnect = self.on_disconnect
  7.                 self.client.connect(ip, 1883, 60)
  8.                 self.client.username_pw_set(username)
  9.                 self.client.loop_start()
  10.                 self.onConnect = False

  11.         def on_connect(self, client, userdata, flags, rc):
  12.                 print("Connected with result code "+str(rc))
  13.                 if rc == 0:
  14.                         self.onConnect = True

  15.         def on_disconnect(self, client, userdata, rc):
  16.                 if rc != 0:
  17.                         self.onConnect = False

  18.         def on_message(self, client, userdata, msg):
  19.                 print(msg.topic+" "+str(msg.payload))

  20.         def publish(self, value):
  21.                 if self.onConnect:
  22.                         msg = '{"formaldehyde": ' +str(value) + ' }'
  23.                         self.client.publish(topic="v1/devices/me/telemetry", payload=msg)

  24. class MySerial(object):
  25.   def __init__(self):
  26.       self.ser = None

  27.   def get_port_list(self):
  28.       port_list = list(serial.tools.list_ports.comports())
  29.       return port_list

  30.   def open_serial_port(self, port, baud):
  31.       try:
  32.           self.ser = serial.Serial(port, baud, timeout=0.3, interCharTimeout=0.05)
  33.       except Exception as e:
  34.           self.ser = None
  35.           raise Exception(e)

  36.   def close_serial_port(self):
  37.       if self.ser == None:
  38.           raise Exception("no selected serial")
  39.       try:
  40.           self.ser.close()
  41.           self.ser = None
  42.       except Exception as e:
  43.           raise Exception(e)

  44.   def read(self):
  45.       if self.ser == None:
  46.           raise Exception("no selected serial")
  47.       try:
  48.           time.sleep(0.001)
  49.           return self.ser.read(self.ser.in_waiting)
  50.       except Exception as e:
  51.           raise Exception(e)

  52. class ze08_ch20(object):
  53.     def __init__(self) -> None:
  54.         self.tools = MyTools()
  55.         self.serial = MySerial()
  56.         self.interface = MyMqtt(MQTT_IP, MQTT_USERNAME)
  57.         self.serial.open_serial_port('/dev/ttyS4', 9600)
  58.         self.recv_thread_ = threading.Thread(target=self.recv_thread)
  59.         self.recv_thread_.start()

  60.     def calc_checksum(self, bytes_value):
  61.         checksum = 0
  62.         for byte_ in bytes_value:
  63.             checksum += byte_
  64.         checksum = checksum % (0xff + 1)
  65.         if checksum == 0xff:
  66.             return True
  67.         return False

  68.     def recv_thread(self):
  69.         recv_buffer = bytes()
  70.         while True:
  71.             try:
  72.                 recv_buffer += self.serial.read()
  73.             except Exception as e:
  74.                 print(str(e))
  75.             if len(recv_buffer) < 9:
  76.                 time.sleep(0.01)
  77.                 continue
  78.             else:
  79.                 if recv_buffer[0] != 0xff:
  80.                     recv_buffer = recv_buffer[1:]
  81.                 else:
  82.                     if len(recv_buffer) >= 9:
  83.                         phase_buffer = recv_buffer[:9]
  84.                         recv_buffer = recv_buffer[9:]
  85.                         if self.calc_checksum(phase_buffer) == True:
  86.                             int_formaldehyde = int.from_bytes(phase_buffer[4:6], byteorder='big')
  87.                             float_formaldehyde = int_formaldehyde /1000.0 *1.25
  88.                             self.interface.publish(float_formaldehyde)
  89.                             #print(float_formaldehyde)
  90.                         time.sleep(0.001)
复制代码
野火论坛202305181900275747..png
回复

使用道具 举报

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

本版积分规则

联系站长|手机版|野火电子官网|野火淘宝店铺|野火电子论坛 ( 粤ICP备14069197号 ) 大学生ARM嵌入式2群

GMT+8, 2024-4-27 07:03 , Processed in 0.068713 second(s), 28 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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