综合案例2.0-甲醛浓度检测系统

  • 简介
    • 电化学甲醛模组
  • 准备
  • 硬件连接图
  • 代码流程
    • 1、物联网平台开发
    • 2、设备端开发
      • 调试
    • 3、物联网应用开发
      • 3.1新建‘普通项目’
      • 3.2关联设备
      • 3.3创建web应用

简介

甲醛是一种有特殊刺激气味的气体,对人的眼睛有强烈的刺激作用。若空气中甲醛浓度过高,比如新装修的房子、新买的汽车等,可引起中毒反应,严重的可致癌。家去拿时空气中的杀手之一,需要时刻提防。本案例的核心在于准确测量家庭中的甲醛浓度。

电化学甲醛模组

产品型号 CJSH20-CH2O
检测气体 甲醛
干扰气体 酒精,一氧化碳等气体
输出数据 UART 输出(3.3V 电平)
工作电压 3.7V~5.5V
预热时间 ≤3 分钟
响应时间 ≤60 秒
恢复时间 ≤60 秒
量程 0~5ppm
分辨率 ≤0.010 mg/m3
工作温度 -20℃~50℃
工作湿度 15%RH-90%RH(无凝结)
存储温度 0~25℃
使用寿命 2 年(空气中 0℃~35℃)
模组尺寸 长17.7mm×宽17.8mm

1、管脚定义

2、通讯协议

波特率 9600
数据位 8 位
停止位 1 位
校验位

3、通讯命令
通信分为主动上传式和问答式,出厂默认主动上传,每间隔1S发送一次浓度值。 如果用户切换到问答模式下,需要重新切换为主动上传时,发送如下命令行格式即可:

数据显示格式如下:

气 体 浓 度 值 (PPB)=( 气 体 浓 度 高 位 *256+ 气 体 浓 度 低 位 ). 当转换为 PPM 时: PPM= PPB/1000,1PPM甲醛相当于1.34mg/m3. 1mg/m3甲醛相当于0.746PPM.

准备

本案例需要的硬件

器材 数量
HaaS506开发板 1
电化学甲醛模组 1
OLED显示屏 1
SIM卡 1
杜邦线 若干

硬件连接图

  • 使用TTL口下载完成后,用TTL口连接甲醛传感器进行数据读取。

代码流程

1、连接阿里云平台。
2、重复读取传感器数据,并上传云端。

1、物联网平台开发

第一次使用物联网平台的读者,需要开通实例后使用物联网平台功能。也可以使用免费的公共实例进行开发,在阿里云物联网平台中,左上角选择‘华东2-上海’,点击‘公共实例’,即可开通。

1、平台产品创建可参考haas506 2.0开发教程-aliyunIoT
2、创建产品属性(添加物模型)

  • 选择产品功能定义编辑草稿

  • 添加自定义功能

  • 添加标识符数据类型(标识符要与代码一致)

  • 点击发布上线

  • 点击确定

2、设备端开发

  • 第一次使用开发板的读者可以按照haas5062.0开发教程-导学篇搭建开发环境。

  • 搭建完后复制以下代码到Visual Studio Code,复制产品证书到代码相应位置。

  • 2.2版本获取IMEI号接口有更新,需要更改以下内容(Ctrl+F 查找modem)

# 获取设备的IMEI 作为deviceName 进行动态注册
deviceName = modem.info.getDevImei()
...
  • main.py
# coding=utf-8
import network
import ujson
import utime as time
import modem
from  aliyunIoT import Device
import kv
from driver import UART
from ssd1306 import SSD1306_128_64#当iot设备连接到物联网平台的时候触发'connect' 事件
def on_connect(data):global module_name,default_ver,productKey,deviceName,deviceSecret,on_trigger,on_download,on_verify,on_upgradeprint('***** connect lp succeed****')data_handle = {}data_handle['device_handle'] = device.getDeviceHandle()#当连接断开时,触发'disconnect'事件
def on_disconnect():print('linkkit is disconnected')#当iot云端下发属性设置时,触发'props'事件
def on_props(request):print('clound req data is {}'.format(request))#当iot云端调用设备service时,触发'service'事件
def on_service(id,request):print('clound req id  is {} , req is {}'.format(id,request))
#当设备跟iot平台通信过程中遇到错误时,触发'error'事件
def on_error(err):print('err msg is {} '.format(err))#网络连接的回调函数
def on_4g_cb(args):global g_connect_statuspdp = args[0]netwk_sta = args[1]if netwk_sta == 1:g_connect_status = Trueelse:g_connect_status = False#网络连接
def connect_network():global net,on_4g_cb,g_connect_status#NetWorkClient该类是一个单例类,实现网络管理相关的功能,包括初始化,联网,状态信息等.net = network.NetWorkClient()g_register_network = Falseif net._stagecode is not None and net._stagecode == 3 and net._subcode == 1:g_register_network = Trueelse:g_register_network = Falseif g_register_network:#注册网络连接的回调函数on(self,id,func);  1代表连接,func 回调函数  ;return 0 成功net.on(1,on_4g_cb)    net.connect(None)else:print('网络注册失败')while True:if g_connect_status:print('网络连接成功')breaktime.sleep_ms(20)#动态注册回调函数
def on_dynreg_cb(data):global deviceSecret,device_dyn_resigter_succeddeviceSecret = datadevice_dyn_resigter_succed = True# 连接物联网平台
def dyn_register_device(productKey,productSecret,deviceName):global on_dynreg_cb,device,deviceSecret,device_dyn_resigter_succedkey = '_amp_customer_devicesecret'deviceSecretdict = kv.get(key)print("deviceSecretdict:",deviceSecretdict)if isinstance(deviceSecretdict,str):    deviceSecret = deviceSecretdict if deviceSecretdict is None or deviceSecret is None:key_info = {'productKey': productKey  ,'productSecret': productSecret ,'deviceName': deviceName}# 动态注册一个设备,获取设备的deviceSecret#下面的if防止多次注册,当前若是注册过一次了,重启设备再次注册就会卡住,if not device_dyn_resigter_succed:device.register(key_info,on_dynreg_cb)   PPM_data = {}
def upload_PPM():global PPM_data,PPMPPM_data["hcho"]= PPMPPM_data_str=ujson.dumps(PPM_data)data={'params':PPM_data_str}      device.postProps(data)if __name__ == '__main__':ICCID=Noneg_connect_status = Falsenet = Nonedevice = NonedeviceSecret = NonedeviceName = NoneproductKey = "your  productKey "productSecret = "your  productSecret "device_dyn_resigter_succed = False# 连接网络connect_network()# 获取设备的IMEI 作为deviceName 进行动态注册deviceName = modem.info.getDevImei()#获取设备的ICCIDICCID=modem.sim.getIccid()#初始化物联网平台Device类,获取device实例device = Device()if deviceName is not None and len(deviceName) > 0 :#动态注册一个设备dyn_register_device(productKey,productSecret,deviceName)else:print("获取设备IMEI失败,无法进行动态注册")while deviceSecret is None:time.sleep(0.2)print('动态注册成功:' + deviceSecret)key_info = {'region' : 'cn-shanghai' ,'productKey': productKey ,'deviceName': deviceName ,'deviceSecret': deviceSecret ,'keepaliveSec': 60,}#打印设备信息print(key_info)#device.ON_CONNECT 是事件,on_connect是事件处理函数/回调函数device.on(device.ON_CONNECT,on_connect)device.on(device.ON_DISCONNECT,on_disconnect)device.on(device.ON_PROPS,on_props)device.on(device.ON_SERVICE,on_service)device.on(device.ON_ERROR,on_error)device.connect(key_info)#UART初始化uart1=UART()uart1.open("serial1")readBuf=bytearray(9)#切换到主动上传模式writeBuf=bytearray(9)writeBuf = bytearray([0xFF,0x01,0x78,0x40,0x00,0x00,0x00,0x00,0x47])uart1.write(writeBuf)#显示屏disp=SSD1306_128_64()disp.begin()    # 初始化disp.clear()      #清屏  disp.oled_showstr(0,0,"PPM:",2)while True:#读取传感器数据并上传readSize=uart1.read(readBuf)print(readBuf)'''甲醛ppm有两个标准值:在建筑标准中要求空气中甲醛的含量不得高于0.08毫克每立方米,即不能超过0.062ppm;而在装修标准中甲醛浓度应低于0.1毫克每立方米,即不能超过0.07ppm。'''#气体浓度值 PPB=(气体浓度高位*256+气体浓度低位).当转换为PPM时:PPM= PPB/1000PPM = float((readBuf[4]*256+readBuf[5]))/1000disp.oled_showstr(55,0,str(PPM),2)print(PPM) upload_PPM()time.sleep_ms(1100)disp.oled_showstr(55,0,'        ',2)

codetab.py


##*--  文字:  煜  --*#
##*--  文字:  瑛  --*#
##*--  文字:  物  --*#
##*--  文字:  联  --*#
##*--  文字:  网  --*#
##*--  宋体12;  此字体下对应的点阵为:宽x高=16x16   --*#
#列表大小:10*16
F1=[0x80,0x70,0x00,0xFF,0x10,0x08,0x00,0x7E,0x2A,0xAA,0x2A,0x2A,0x2A,0x7E,0x00,0x00,0x80,0x60,0x18,0x07,0x08,0x50,0x42,0x4A,0x52,0x42,0x43,0x42,0x52,0x4A,0x42,0x00, #煜0x84,0x84,0xFC,0x84,0x84,0x00,0x04,0xC4,0x5F,0x44,0xF4,0x44,0x5F,0xC4,0x04,0x00,0x10,0x30,0x1F,0x08,0x08,0x00,0x84,0x47,0x24,0x14,0x0F,0x14,0x24,0x47,0x84,0x00, #瑛0x40,0x3C,0x10,0xFF,0x10,0x10,0x20,0x10,0x8F,0x78,0x08,0xF8,0x08,0xF8,0x00,0x00,0x02,0x06,0x02,0xFF,0x01,0x01,0x04,0x42,0x21,0x18,0x46,0x81,0x40,0x3F,0x00,0x00, #物0x02,0xFE,0x92,0x92,0xFE,0x02,0x00,0x10,0x11,0x16,0xF0,0x14,0x13,0x10,0x00,0x00, 0x10,0x1F,0x08,0x08,0xFF,0x04,0x81,0x41,0x31,0x0D,0x03,0x0D,0x31,0x41,0x81,0x00, #联0x00,0xFE,0x02,0x22,0x42,0x82,0x72,0x02,0x22,0x42,0x82,0x72,0x02,0xFE,0x00,0x00, 0x00,0xFF,0x10,0x08,0x06,0x01,0x0E,0x10,0x08,0x06,0x01,0x4E,0x80,0x7F,0x00,0x00, #网
]# 每个字符是8x16(宽x高) 点阵,
F2=[0x10,0xF0,0x00,0x80,0x80,0x80,0x00,0x00,0x20,0x3F,0x21,0x00,0x00,0x20,0x3F,0x20,    #*"h",0*#0x00,0x00,0x80,0x80,0x80,0x00,0x00,0x00,0x00,0x19,0x24,0x24,0x12,0x3F,0x20,0x00,    #*"a",1*#0x00,0x00,0x80,0x80,0x80,0x00,0x00,0x00,0x00,0x19,0x24,0x24,0x12,0x3F,0x20,0x00,     #*"a",2*#0x00,0x00,0x80,0x80,0x80,0x80,0x80,0x00,0x00,0x33,0x24,0x24,0x24,0x24,0x19,0x00,     #*"s",3*#0x00,0xF8,0x88,0x88,0x88,0x08,0x08,0x00,0x00,0x19,0x20,0x20,0x20,0x11,0x0E,0x00,     #*"5",4*#0x00,0xE0,0x10,0x08,0x08,0x10,0xE0,0x00,0x00,0x0F,0x10,0x20,0x20,0x10,0x0F,0x00,     #*"0",5*#0x00,0xE0,0x10,0x88,0x88,0x90,0x00,0x00,0x00,0x0F,0x11,0x20,0x20,0x20,0x1F,0x00,     #*"6",6*#]#字符串 6x8点阵
F6x8=[[0x00, 0x00, 0x00, 0x00, 0x00, 0x00],# sp[0x00, 0x00, 0x00, 0x2f, 0x00, 0x00],# ![0x00, 0x00, 0x07, 0x00, 0x07, 0x00],# "[0x00, 0x14, 0x7f, 0x14, 0x7f, 0x14],# #[0x00, 0x24, 0x2a, 0x7f, 0x2a, 0x12],# $[0x00, 0x62, 0x64, 0x08, 0x13, 0x23],# %[0x00, 0x36, 0x49, 0x55, 0x22, 0x50],# &[0x00, 0x00, 0x05, 0x03, 0x00, 0x00],# '[0x00, 0x00, 0x1c, 0x22, 0x41, 0x00],# ([0x00, 0x00, 0x41, 0x22, 0x1c, 0x00],# )[0x00, 0x14, 0x08, 0x3E, 0x08, 0x14],# *[0x00, 0x08, 0x08, 0x3E, 0x08, 0x08],# +[0x00, 0x00, 0x00, 0xA0, 0x60, 0x00],# ,[0x00, 0x08, 0x08, 0x08, 0x08, 0x08],# -[0x00, 0x00, 0x60, 0x60, 0x00, 0x00],# .[0x00, 0x20, 0x10, 0x08, 0x04, 0x02],# #[0x00, 0x3E, 0x51, 0x49, 0x45, 0x3E],# 0[0x00, 0x00, 0x42, 0x7F, 0x40, 0x00],# 1[0x00, 0x42, 0x61, 0x51, 0x49, 0x46],# 2[0x00, 0x21, 0x41, 0x45, 0x4B, 0x31],# 3[0x00, 0x18, 0x14, 0x12, 0x7F, 0x10],# 4[0x00, 0x27, 0x45, 0x45, 0x45, 0x39],# 5[0x00, 0x3C, 0x4A, 0x49, 0x49, 0x30],# 6[0x00, 0x01, 0x71, 0x09, 0x05, 0x03],# 7[0x00, 0x36, 0x49, 0x49, 0x49, 0x36],# 8[0x00, 0x06, 0x49, 0x49, 0x29, 0x1E],# 9[0x00, 0x00, 0x36, 0x36, 0x00, 0x00],# :[0x00, 0x00, 0x56, 0x36, 0x00, 0x00],# ;[0x00, 0x08, 0x14, 0x22, 0x41, 0x00],# <[0x00, 0x14, 0x14, 0x14, 0x14, 0x14],# =[0x00, 0x00, 0x41, 0x22, 0x14, 0x08],# >[0x00, 0x02, 0x01, 0x51, 0x09, 0x06],# ?[0x00, 0x32, 0x49, 0x59, 0x51, 0x3E],# @[0x00, 0x7C, 0x12, 0x11, 0x12, 0x7C],# A[0x00, 0x7F, 0x49, 0x49, 0x49, 0x36],# B[0x00, 0x3E, 0x41, 0x41, 0x41, 0x22],# C[0x00, 0x7F, 0x41, 0x41, 0x22, 0x1C],# D[0x00, 0x7F, 0x49, 0x49, 0x49, 0x41],# E[0x00, 0x7F, 0x09, 0x09, 0x09, 0x01],# F[0x00, 0x3E, 0x41, 0x49, 0x49, 0x7A],# G[0x00, 0x7F, 0x08, 0x08, 0x08, 0x7F],# H[0x00, 0x00, 0x41, 0x7F, 0x41, 0x00],# I[0x00, 0x20, 0x40, 0x41, 0x3F, 0x01],# J[0x00, 0x7F, 0x08, 0x14, 0x22, 0x41],# K[0x00, 0x7F, 0x40, 0x40, 0x40, 0x40],# L[0x00, 0x7F, 0x02, 0x0C, 0x02, 0x7F],# M[0x00, 0x7F, 0x04, 0x08, 0x10, 0x7F],# N[0x00, 0x3E, 0x41, 0x41, 0x41, 0x3E],# O[0x00, 0x7F, 0x09, 0x09, 0x09, 0x06],# P[0x00, 0x3E, 0x41, 0x51, 0x21, 0x5E],# Q[0x00, 0x7F, 0x09, 0x19, 0x29, 0x46],# R[0x00, 0x46, 0x49, 0x49, 0x49, 0x31],# S[0x00, 0x01, 0x01, 0x7F, 0x01, 0x01],# T[0x00, 0x3F, 0x40, 0x40, 0x40, 0x3F],# U[0x00, 0x1F, 0x20, 0x40, 0x20, 0x1F],# V[0x00, 0x3F, 0x40, 0x38, 0x40, 0x3F],# W[0x00, 0x63, 0x14, 0x08, 0x14, 0x63],# X[0x00, 0x07, 0x08, 0x70, 0x08, 0x07],# Y[0x00, 0x61, 0x51, 0x49, 0x45, 0x43],# Z[0x00, 0x00, 0x7F, 0x41, 0x41, 0x00],# [[0x00, 0x55, 0x2A, 0x55, 0x2A, 0x55],# 55[0x00, 0x00, 0x41, 0x41, 0x7F, 0x00],# ][0x00, 0x04, 0x02, 0x01, 0x02, 0x04],# ^[0x00, 0x40, 0x40, 0x40, 0x40, 0x40],# _[0x00, 0x00, 0x01, 0x02, 0x04, 0x00],# '[0x00, 0x20, 0x54, 0x54, 0x54, 0x78],# a[0x00, 0x7F, 0x48, 0x44, 0x44, 0x38],# b[0x00, 0x38, 0x44, 0x44, 0x44, 0x20],# c[0x00, 0x38, 0x44, 0x44, 0x48, 0x7F],# d[0x00, 0x38, 0x54, 0x54, 0x54, 0x18],# e[0x00, 0x08, 0x7E, 0x09, 0x01, 0x02],# f[0x00, 0x18, 0xA4, 0xA4, 0xA4, 0x7C],# g[0x00, 0x7F, 0x08, 0x04, 0x04, 0x78],# h[0x00, 0x00, 0x44, 0x7D, 0x40, 0x00],# i[0x00, 0x40, 0x80, 0x84, 0x7D, 0x00],# j[0x00, 0x7F, 0x10, 0x28, 0x44, 0x00],# k[0x00, 0x00, 0x41, 0x7F, 0x40, 0x00],# l[0x00, 0x7C, 0x04, 0x18, 0x04, 0x78],# m[0x00, 0x7C, 0x08, 0x04, 0x04, 0x78],# n[0x00, 0x38, 0x44, 0x44, 0x44, 0x38],# o[0x00, 0xFC, 0x24, 0x24, 0x24, 0x18],# p[0x00, 0x18, 0x24, 0x24, 0x18, 0xFC],# q[0x00, 0x7C, 0x08, 0x04, 0x04, 0x08],# r[0x00, 0x48, 0x54, 0x54, 0x54, 0x20],# s[0x00, 0x04, 0x3F, 0x44, 0x40, 0x20],# t[0x00, 0x3C, 0x40, 0x40, 0x20, 0x7C],# u[0x00, 0x1C, 0x20, 0x40, 0x20, 0x1C],# v[0x00, 0x3C, 0x40, 0x30, 0x40, 0x3C],# w[0x00, 0x44, 0x28, 0x10, 0x28, 0x44],# x[0x00, 0x1C, 0xA0, 0xA0, 0xA0, 0x7C],# y[0x00, 0x44, 0x64, 0x54, 0x4C, 0x44],# z[0x14, 0x14, 0x14, 0x14, 0x14, 0x14]# horiz lines
]#字符串 8x16点阵
F8X16=[0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,# 00x00,0x00,0x00,0xF8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x33,0x30,0x00,0x00,0x00,#! 10x00,0x10,0x0C,0x06,0x10,0x0C,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,#" 20x40,0xC0,0x78,0x40,0xC0,0x78,0x40,0x00,0x04,0x3F,0x04,0x04,0x3F,0x04,0x04,0x00,## 30x00,0x70,0x88,0xFC,0x08,0x30,0x00,0x00,0x00,0x18,0x20,0xFF,0x21,0x1E,0x00,0x00,#$ 40xF0,0x08,0xF0,0x00,0xE0,0x18,0x00,0x00,0x00,0x21,0x1C,0x03,0x1E,0x21,0x1E,0x00,#% 50x00,0xF0,0x08,0x88,0x70,0x00,0x00,0x00,0x1E,0x21,0x23,0x24,0x19,0x27,0x21,0x10,#& 60x10,0x16,0x0E,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,#' 70x00,0x00,0x00,0xE0,0x18,0x04,0x02,0x00,0x00,0x00,0x00,0x07,0x18,0x20,0x40,0x00,#( 80x00,0x02,0x04,0x18,0xE0,0x00,0x00,0x00,0x00,0x40,0x20,0x18,0x07,0x00,0x00,0x00,#) 90x40,0x40,0x80,0xF0,0x80,0x40,0x40,0x00,0x02,0x02,0x01,0x0F,0x01,0x02,0x02,0x00,#* 100x00,0x00,0x00,0xF0,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x1F,0x01,0x01,0x01,0x00,#+ 110x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0xB0,0x70,0x00,0x00,0x00,0x00,0x00,#, 120x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x01,0x01,0x01,0x01,#- 130x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x30,0x00,0x00,0x00,0x00,0x00,#. 140x00,0x00,0x00,0x00,0x80,0x60,0x18,0x04,0x00,0x60,0x18,0x06,0x01,0x00,0x00,0x00,## 150x00,0xE0,0x10,0x08,0x08,0x10,0xE0,0x00,0x00,0x0F,0x10,0x20,0x20,0x10,0x0F,0x00,#0 160x00,0x10,0x10,0xF8,0x00,0x00,0x00,0x00,0x00,0x20,0x20,0x3F,0x20,0x20,0x00,0x00,#1 170x00,0x70,0x08,0x08,0x08,0x88,0x70,0x00,0x00,0x30,0x28,0x24,0x22,0x21,0x30,0x00,#2 180x00,0x30,0x08,0x88,0x88,0x48,0x30,0x00,0x00,0x18,0x20,0x20,0x20,0x11,0x0E,0x00,#3 190x00,0x00,0xC0,0x20,0x10,0xF8,0x00,0x00,0x00,0x07,0x04,0x24,0x24,0x3F,0x24,0x00,#4 200x00,0xF8,0x08,0x88,0x88,0x08,0x08,0x00,0x00,0x19,0x21,0x20,0x20,0x11,0x0E,0x00,#5 210x00,0xE0,0x10,0x88,0x88,0x18,0x00,0x00,0x00,0x0F,0x11,0x20,0x20,0x11,0x0E,0x00,#6 220x00,0x38,0x08,0x08,0xC8,0x38,0x08,0x00,0x00,0x00,0x00,0x3F,0x00,0x00,0x00,0x00,#7 230x00,0x70,0x88,0x08,0x08,0x88,0x70,0x00,0x00,0x1C,0x22,0x21,0x21,0x22,0x1C,0x00,#8 240x00,0xE0,0x10,0x08,0x08,0x10,0xE0,0x00,0x00,0x00,0x31,0x22,0x22,0x11,0x0F,0x00,#9 250x00,0x00,0x00,0xC0,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x30,0x00,0x00,0x00,#: 260x00,0x00,0x00,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x60,0x00,0x00,0x00,0x00,#; 270x00,0x00,0x80,0x40,0x20,0x10,0x08,0x00,0x00,0x01,0x02,0x04,0x08,0x10,0x20,0x00,#< 280x40,0x40,0x40,0x40,0x40,0x40,0x40,0x00,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x00,#= 290x00,0x08,0x10,0x20,0x40,0x80,0x00,0x00,0x00,0x20,0x10,0x08,0x04,0x02,0x01,0x00,#> 300x00,0x70,0x48,0x08,0x08,0x08,0xF0,0x00,0x00,0x00,0x00,0x30,0x36,0x01,0x00,0x00,#? 310xC0,0x30,0xC8,0x28,0xE8,0x10,0xE0,0x00,0x07,0x18,0x27,0x24,0x23,0x14,0x0B,0x00,#@ 320x00,0x00,0xC0,0x38,0xE0,0x00,0x00,0x00,0x20,0x3C,0x23,0x02,0x02,0x27,0x38,0x20,#A 330x08,0xF8,0x88,0x88,0x88,0x70,0x00,0x00,0x20,0x3F,0x20,0x20,0x20,0x11,0x0E,0x00,#B 340xC0,0x30,0x08,0x08,0x08,0x08,0x38,0x00,0x07,0x18,0x20,0x20,0x20,0x10,0x08,0x00,#C 350x08,0xF8,0x08,0x08,0x08,0x10,0xE0,0x00,0x20,0x3F,0x20,0x20,0x20,0x10,0x0F,0x00,#D 360x08,0xF8,0x88,0x88,0xE8,0x08,0x10,0x00,0x20,0x3F,0x20,0x20,0x23,0x20,0x18,0x00,#E 370x08,0xF8,0x88,0x88,0xE8,0x08,0x10,0x00,0x20,0x3F,0x20,0x00,0x03,0x00,0x00,0x00,#F 380xC0,0x30,0x08,0x08,0x08,0x38,0x00,0x00,0x07,0x18,0x20,0x20,0x22,0x1E,0x02,0x00,#G 390x08,0xF8,0x08,0x00,0x00,0x08,0xF8,0x08,0x20,0x3F,0x21,0x01,0x01,0x21,0x3F,0x20,#H 400x00,0x08,0x08,0xF8,0x08,0x08,0x00,0x00,0x00,0x20,0x20,0x3F,0x20,0x20,0x00,0x00,#I 410x00,0x00,0x08,0x08,0xF8,0x08,0x08,0x00,0xC0,0x80,0x80,0x80,0x7F,0x00,0x00,0x00,#J 420x08,0xF8,0x88,0xC0,0x28,0x18,0x08,0x00,0x20,0x3F,0x20,0x01,0x26,0x38,0x20,0x00,#K 430x08,0xF8,0x08,0x00,0x00,0x00,0x00,0x00,0x20,0x3F,0x20,0x20,0x20,0x20,0x30,0x00,#L 440x08,0xF8,0xF8,0x00,0xF8,0xF8,0x08,0x00,0x20,0x3F,0x00,0x3F,0x00,0x3F,0x20,0x00,#M 450x08,0xF8,0x30,0xC0,0x00,0x08,0xF8,0x08,0x20,0x3F,0x20,0x00,0x07,0x18,0x3F,0x00,#N 460xE0,0x10,0x08,0x08,0x08,0x10,0xE0,0x00,0x0F,0x10,0x20,0x20,0x20,0x10,0x0F,0x00,#O 470x08,0xF8,0x08,0x08,0x08,0x08,0xF0,0x00,0x20,0x3F,0x21,0x01,0x01,0x01,0x00,0x00,#P 480xE0,0x10,0x08,0x08,0x08,0x10,0xE0,0x00,0x0F,0x18,0x24,0x24,0x38,0x50,0x4F,0x00,#Q 490x08,0xF8,0x88,0x88,0x88,0x88,0x70,0x00,0x20,0x3F,0x20,0x00,0x03,0x0C,0x30,0x20,#R 500x00,0x70,0x88,0x08,0x08,0x08,0x38,0x00,0x00,0x38,0x20,0x21,0x21,0x22,0x1C,0x00,#S 510x18,0x08,0x08,0xF8,0x08,0x08,0x18,0x00,0x00,0x00,0x20,0x3F,0x20,0x00,0x00,0x00,#T 520x08,0xF8,0x08,0x00,0x00,0x08,0xF8,0x08,0x00,0x1F,0x20,0x20,0x20,0x20,0x1F,0x00,#U 530x08,0x78,0x88,0x00,0x00,0xC8,0x38,0x08,0x00,0x00,0x07,0x38,0x0E,0x01,0x00,0x00,#V 540xF8,0x08,0x00,0xF8,0x00,0x08,0xF8,0x00,0x03,0x3C,0x07,0x00,0x07,0x3C,0x03,0x00,#W 550x08,0x18,0x68,0x80,0x80,0x68,0x18,0x08,0x20,0x30,0x2C,0x03,0x03,0x2C,0x30,0x20,#X 560x08,0x38,0xC8,0x00,0xC8,0x38,0x08,0x00,0x00,0x00,0x20,0x3F,0x20,0x00,0x00,0x00,#Y 570x10,0x08,0x08,0x08,0xC8,0x38,0x08,0x00,0x20,0x38,0x26,0x21,0x20,0x20,0x18,0x00,#Z 580x00,0x00,0x00,0xFE,0x02,0x02,0x02,0x00,0x00,0x00,0x00,0x7F,0x40,0x40,0x40,0x00,#[ 590x00,0x0C,0x30,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x06,0x38,0xC0,0x00,#\ 600x00,0x02,0x02,0x02,0xFE,0x00,0x00,0x00,0x00,0x40,0x40,0x40,0x7F,0x00,0x00,0x00,#] 610x00,0x00,0x04,0x02,0x02,0x02,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,#^ 620x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,#_ 630x00,0x02,0x02,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,#` 640x00,0x00,0x80,0x80,0x80,0x80,0x00,0x00,0x00,0x19,0x24,0x22,0x22,0x22,0x3F,0x20,#a 650x08,0xF8,0x00,0x80,0x80,0x00,0x00,0x00,0x00,0x3F,0x11,0x20,0x20,0x11,0x0E,0x00,#b 660x00,0x00,0x00,0x80,0x80,0x80,0x00,0x00,0x00,0x0E,0x11,0x20,0x20,0x20,0x11,0x00,#c 670x00,0x00,0x00,0x80,0x80,0x88,0xF8,0x00,0x00,0x0E,0x11,0x20,0x20,0x10,0x3F,0x20,#d 680x00,0x00,0x80,0x80,0x80,0x80,0x00,0x00,0x00,0x1F,0x22,0x22,0x22,0x22,0x13,0x00,#e 690x00,0x80,0x80,0xF0,0x88,0x88,0x88,0x18,0x00,0x20,0x20,0x3F,0x20,0x20,0x00,0x00,#f 700x00,0x00,0x80,0x80,0x80,0x80,0x80,0x00,0x00,0x6B,0x94,0x94,0x94,0x93,0x60,0x00,#g 710x08,0xF8,0x00,0x80,0x80,0x80,0x00,0x00,0x20,0x3F,0x21,0x00,0x00,0x20,0x3F,0x20,#h 720x00,0x80,0x98,0x98,0x00,0x00,0x00,0x00,0x00,0x20,0x20,0x3F,0x20,0x20,0x00,0x00,#i 730x00,0x00,0x00,0x80,0x98,0x98,0x00,0x00,0x00,0xC0,0x80,0x80,0x80,0x7F,0x00,0x00,#j 740x08,0xF8,0x00,0x00,0x80,0x80,0x80,0x00,0x20,0x3F,0x24,0x02,0x2D,0x30,0x20,0x00,#k 750x00,0x08,0x08,0xF8,0x00,0x00,0x00,0x00,0x00,0x20,0x20,0x3F,0x20,0x20,0x00,0x00,#l 760x80,0x80,0x80,0x80,0x80,0x80,0x80,0x00,0x20,0x3F,0x20,0x00,0x3F,0x20,0x00,0x3F,#m 770x80,0x80,0x00,0x80,0x80,0x80,0x00,0x00,0x20,0x3F,0x21,0x00,0x00,0x20,0x3F,0x20,#n 780x00,0x00,0x80,0x80,0x80,0x80,0x00,0x00,0x00,0x1F,0x20,0x20,0x20,0x20,0x1F,0x00,#o 790x80,0x80,0x00,0x80,0x80,0x00,0x00,0x00,0x80,0xFF,0xA1,0x20,0x20,0x11,0x0E,0x00,#p 800x00,0x00,0x00,0x80,0x80,0x80,0x80,0x00,0x00,0x0E,0x11,0x20,0x20,0xA0,0xFF,0x80,#q 810x80,0x80,0x80,0x00,0x80,0x80,0x80,0x00,0x20,0x20,0x3F,0x21,0x20,0x00,0x01,0x00,#r 820x00,0x00,0x80,0x80,0x80,0x80,0x80,0x00,0x00,0x33,0x24,0x24,0x24,0x24,0x19,0x00,#s 830x00,0x80,0x80,0xE0,0x80,0x80,0x00,0x00,0x00,0x00,0x00,0x1F,0x20,0x20,0x00,0x00,#t 840x80,0x80,0x00,0x00,0x00,0x80,0x80,0x00,0x00,0x1F,0x20,0x20,0x20,0x10,0x3F,0x20,#u 850x80,0x80,0x80,0x00,0x00,0x80,0x80,0x80,0x00,0x01,0x0E,0x30,0x08,0x06,0x01,0x00,#v 860x80,0x80,0x00,0x80,0x00,0x80,0x80,0x80,0x0F,0x30,0x0C,0x03,0x0C,0x30,0x0F,0x00,#w 870x00,0x80,0x80,0x00,0x80,0x80,0x80,0x00,0x00,0x20,0x31,0x2E,0x0E,0x31,0x20,0x00,#x 880x80,0x80,0x80,0x00,0x00,0x80,0x80,0x80,0x80,0x81,0x8E,0x70,0x18,0x06,0x01,0x00,#y 890x00,0x80,0x80,0x80,0x80,0x80,0x80,0x00,0x00,0x21,0x30,0x2C,0x22,0x21,0x30,0x00,#z 900x00,0x00,0x00,0x00,0x80,0x7C,0x02,0x02,0x00,0x00,0x00,0x00,0x00,0x3F,0x40,0x40,# 910x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,#| 920x00,0x02,0x02,0x7C,0x80,0x00,0x00,0x00,0x00,0x40,0x40,0x3F,0x00,0x00,0x00,0x00,# 930x00,0x06,0x01,0x01,0x02,0x02,0x04,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,#~ 94
]BMP1=[0x00,0x03,0x05,0x09,0x11,0xFF,0x11,0x89,0x05,0xC3,0x00,0xE0,0x00,0xF0,0x00,0xF8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x44,0x28,0xFF,0x11,0xAA,0x44,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x83,0x01,0x38,0x44,0x82,0x92,0x92,0x74,0x01,0x83,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7C,0x44,0xC7,0x01,0x7D,0x7D,0x7D,0x7D,0x01,0x7D,0x7D,0x7D,0x7D,0x01,0x7D,0x7D,0x7D,0x7D,0x01,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x40,0x40,0x40,0x40,0x00,0x00,0x6D,0x6D,0x6D,0x6D,0x6D,0x00,0x00,0x60,0x60,0x60,0x60,0x60,0x00,0x00,0x40,0x40,0x40,0x40,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xDB,0xDB,0xDB,0xDB,0xDB,0x00,0x00,0xDB,0xDB,0xDB,0xDB,0xDB,0x00,0x00,0xDB,0xDB,0xDB,0xDB,0xDB,0x00,0x00,0xDB,0xDB,0xDB,0xDB,0xDB,0x00,0x00,0xDA,0xDA,0xDA,0xDA,0xDA,0x00,0x00,0xD8,0xD8,0xD8,0xD8,0xD8,0x00,0x00,0xC0,0xC0,0xC0,0xC0,0xC0,0x00,0x00,0xC0,0xC0,0xC0,0xC0,0xC0,0x00,0x00,0xC0,0xC0,0xC0,0xC0,0xC0,0x00,0x00,0xC0,0xC0,0xC0,0xC0,0xC0,0x00,0x00,0x80,0x80,0x80,0x80,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x06,0x06,0x06,0x06,0x06,0x00,0x00,0x06,0x06,0x06,0x06,0x06,0x00,0x00,0x06,0x06,0x06,0x06,0x06,0x00,0x00,0x06,0x06,0x06,0x06,0x06,0x00,0x00,0x06,0x06,0x06,0xE6,0x66,0x20,0x00,0x06,0x06,0x86,0x06,0x06,0x00,0x00,0x06,0x06,0x06,0x06,0x86,0x00,0x00,0x06,0x06,0x06,0x06,0x06,0x00,0x00,0x86,0x86,0x86,0x86,0x86,0x80,0x80,0x86,0x86,0x06,0x86,0x86,0xC0,0xC0,0x86,0x86,0x86,0x06,0x06,0xD0,0x30,0x76,0x06,0x06,0x06,0x06,0x00,0x00,0x06,0x06,0x06,0x06,0x06,0x00,0x00,0x06,0x06,0x06,0x06,0x06,0x00,0x00,0x06,0x06,0x06,0x06,0x06,0x00,0x00,0x06,0x06,0x06,0x06,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x1C,0x00,0xFE,0x00,0x01,0x02,0x00,0xC4,0x18,0x20,0x02,0x9E,0x63,0xB2,0x0E,0x00,0xFF,0x81,0x81,0xFF,0x00,0x00,0x80,0x40,0x30,0x0F,0x00,0x00,0x00,0x00,0xFF,0x00,0x23,0xEA,0xAA,0xBF,0xAA,0xEA,0x03,0x3F,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x80,0x80,0x00,0x00,0x00,0x00,0x00,0x80,0x80,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0E,0x0C,0x08,0x00,0x00,0x01,0x01,0x01,0x01,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x81,0x80,0x80,0x81,0x80,0x81,0x80,0x80,0x80,0x80,0x01,0x01,0x01,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x01,0x01,0x09,0x0C,0x0E,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0x00,0x00,0x1E,0x21,0x40,0x40,0x50,0x21,0x5E,0x00,0x1E,0x21,0x40,0x40,0x50,0x21,0x5E,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0xC1,0xC1,0xFF,0xFF,0xC1,0xC1,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0x80,0xFC,0xF3,0xEF,0xF3,0xFC,0x80,0xFF,0x80,0xEE,0xEE,0xEE,0xF5,0xFB,0xFF,0x9C,0xBE,0xB6,0xB6,0x88,0xFF,0x00]#像素:64*64
#列表大小:32*16
BMP2=[0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xC0,0x60,0x38,0x08,0x0C,0x06,0xC2,0xE2,0x33,0x11,0xF9,0x11,0x33,0x73,0xE2,0x06,0x04,0x0C,0x18,0x30,0xE0,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7F,0xF7,0x00,0x00,0x00,0x00,0x00,0xC3,0x87,0x06,0x0C,0xFF,0x0C,0x18,0x18,0xF0,0xE0,0x00,0x00,0x00,0x00,0x81,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x07,0x0C,0x18,0x30,0x30,0x61,0x63,0x46,0x46,0x5F,0x46,0x46,0x43,0x63,0x20,0x30,0x18,0x0C,0x06,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0xE0,0xE0,0xF0,0xE0,0xE0,0xC0,0x60,0x70,0x30,0x38,0x18,0x18,0x0C,0x0C,0x0C,0x66,0x66,0x66,0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x66,0x66,0x0C,0x0C,0x0C,0x18,0x18,0x30,0x30,0x60,0xE0,0xE0,0x70,0x38,0x18,0x0C,0xFC,0xFC,0x1C,0x04,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xC7,0xFF,0x79,0x1B,0x03,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xC3,0xC3,0xC7,0x06,0x0C,0x18,0x70,0xE0,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x00,0x00,0x00,0x00,0x00,0x03,0x03,0x03,0x83,0xFF,0x7F,0x00,0x00,0x00,0x00,0x00,0x03,0x07,0xFE,0xFC,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x80,0x80,0xC0,0xC0,0xC0,0x60,0x60,0x30,0x30,0x18,0x1C,0x0E,0x06,0x03,0x03,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0F,0x3F,0x78,0xE0,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0xFE,0xFE,0x06,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x1C,0x38,0xF0,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0xDC,0xFF,0xC3,0x01,0x01,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
]#32-32.bmp
BMP3=[0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xF8,0x0E,0x02,0x9B,0xBD,0xFF,0x65,0xED,0xCB,0x06,0x9C,0xF8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xC0,0xC0,0xC0,0xC0,0xC0,0x60,0x61,0x23,0xF6,0xFD,0x7F,0x7F,0x7B,0x7D,0xF4,0xF6,0x23,0x60,0x60,0xC0,0xC0,0x60,0x60,0xE0,0x60,0x20,0x00,0x00,0x00,0x00,0x00,0x20,0xFF,0x8F,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x19,0x1B,0x06,0x0C,0x18,0x90,0xF0,0x20,0x00,0x01,0x1F,0x7E,0xE0,0x80,0x80,0xA0,0xF0,0x30,0x20,0x20,0x20,0x20,0x20,0x20,0x60,0xC0,0x80,0x80,0xF0,0xF0,0x18,0x18,0x08,0x0C,0x04,0x06,0x03,0x01,0x01,0x00,
]

ssd1306.py


import utime as time
import codetab# Constants
SSD1306_I2C_ADDRESS = 0x3C    # 011110+SA0+RW - 0x3C or 0x3D
SSD1306_SETCONTRAST = 0x81
SSD1306_DISPLAYALLON_RESUME = 0xA4
SSD1306_DISPLAYALLON = 0xA5
SSD1306_NORMALDISPLAY = 0xA6
SSD1306_INVERTDISPLAY = 0xA7
SSD1306_DISPLAYOFF = 0xAE
SSD1306_DISPLAYON = 0xAF
SSD1306_SETDISPLAYOFFSET = 0xD3
SSD1306_SETCOMPINS = 0xDA
SSD1306_SETVCOMDETECT = 0xDB
SSD1306_SETDISPLAYCLOCKDIV = 0xD5
SSD1306_SETPRECHARGE = 0xD9
SSD1306_SETMULTIPLEX = 0xA8
SSD1306_SETLOWCOLUMN = 0x00
SSD1306_SETHIGHCOLUMN = 0x10
SSD1306_SETSTARTLINE = 0x40
SSD1306_MEMORYMODE = 0x20
SSD1306_COLUMNADDR = 0x21
SSD1306_PAGEADDR = 0x22
SSD1306_COMSCANINC = 0xC0
SSD1306_COMSCANDEC = 0xC8
SSD1306_SEGREMAP = 0xA0
SSD1306_CHARGEPUMP = 0x8D
SSD1306_EXTERNALVCC = 0x1
SSD1306_SWITCHCAPVCC = 0x2# Scrolling constants
SSD1306_ACTIVATE_SCROLL = 0x2F
SSD1306_DEACTIVATE_SCROLL = 0x2E
SSD1306_SET_VERTICAL_SCROLL_AREA = 0xA3
SSD1306_RIGHT_HORIZONTAL_SCROLL = 0x26
SSD1306_LEFT_HORIZONTAL_SCROLL = 0x27
SSD1306_VERTICAL_AND_RIGHT_HORIZONTAL_SCROLL = 0x29
SSD1306_VERTICAL_AND_LEFT_HORIZONTAL_SCROLL = 0x2Aclass SSD1306Base(object):def __init__(self, width, height):self.width = widthself.height = heightself._pages = height//8self._buffer = [0]*(width*self._pages)# Handle hardware I2Cfrom driver import I2Cself._i2c=I2C()self._i2c.open('OLED')def _initialize(self):raise NotImplementedErrordef writeCmd(self, command):"""Send command byte to display."""# I2C write.control = 0x00   # Co = 0, DC = 0# writeBuf=bytearray(2)# writeBuf[0]=control# writeBuf[1]=command# self._i2c.write(writeBuf)writeBuf=bytearray(1)writeBuf[0]=commandself._i2c.memWrite(writeBuf,control,8)def writeDat(self, data):"""Send byte of data to display."""# I2C write.control = 0x40   # Co = 0, DC = 0# writeBuf=bytearray(2)# writeBuf[0]=control# writeBuf[1]=data# self._i2c.write(writeBuf)writeBuf=bytearray(1)writeBuf[0]=dataself._i2c.memWrite(writeBuf,control,8)def begin(self, vccstate=SSD1306_SWITCHCAPVCC):"""Initialize display."""# Save vcc state.self._vccstate = vccstate# Reset and initialize display.# self.reset()self._initialize()# Turn on the display.self.writeCmd(SSD1306_DISPLAYON)# --------------------------------------------------------------
#  Prototype      : oled_fill(fill_data)
#  Parameters     : fill_data,范围0x00-0xff
#  Description    : 全屏填充,例如 0x00-全黑,0xff全亮
# --------------------------------------------------------------def oled_fill(self,fill_data):for i in range(8):#page0-page1self.writeCmd(0xb0+i)# low colum start addressself.writeCmd(0x00)#high colum start addressself.writeCmd(0x10)for i in range(128*64):self.writeDat(fill_data)  # --------------------------------------------------------------
#  Prototype      : clear()
#  Parameters     : none
#  Description    : 全黑
# --------------------------------------------------------------def clear(self):self.oled_fill(0x00)# --------------------------------------------------------------
#  Prototype      : oled_setPos(x,y)
#  Parameters     : x,y -- 起始点坐标(x:0~127, y:0~7)
#  Description    : 设置起始坐标
# --------------------------------------------------------------def oled_setPos(self,x,y):self.writeCmd(0xb0+y)self.writeCmd(((x&0xf0)>>4)|0x10)self.writeCmd((x&0x0f)|0x01)# --------------------------------------------------------------
#  Prototype      : oled_showCN(x,y,n)
#  Parameters     : x,y -- 起始点坐标(x:0~127, y:0~7); N:汉字在codetab.h中的索引
#  Description    : 显示codetab.py中的汉字,16*16点阵
# --------------------------------------------------------------def oled_showCN(self,x,y,n):self.oled_setPos(x,y)adder=32*nfor i in range(16):self.writeDat(codetab.F1[adder])adder+=1self.oled_setPos(x,y+1)for i in range(16):self.writeDat(codetab.F1[adder])adder+=1# --------------------------------------------------------------
#  Prototype      : oled_showStr(x,y,ch,TextSize)
#  Parameters     : x,y -- 起始点坐标(x:0~127, y:0~7); ch[] -- 要显示的字符串; TextSize -- 字符大小(1:6*8 ; 2:8*16)
#  Description    : 显示codetab.py中的ASCII字符,有6*8和8*16可选择
# --------------------------------------------------------------    def oled_showmun(self,x,y,ch,TextSize):c=0j=0if TextSize==1:while ch[j]!='\0':#ord()将字符转换成十进制,如'a'->97c=ch[j]-32if x>126:x=0y+=1self.oled_setPos(x,y)for i in range(6):self.writeDat(codetab.F6x8[c][i]) x+=6j+=1#防止index out of range if j==len(ch):breakif TextSize==2:while ch[j]!='\0':#ord()将字符转换成十进制c=ch[j]-32if x>120:x=0y+=1self.oled_setPos(x,y)for i in range(8):self.writeDat(codetab.F8X16[c*16+i]) self.oled_setPos(x,y+1)for i in range(8):self.writeDat(codetab.F8X16[c*16+i+8])    x+=8j+=1    #防止index out of range                                    if j==len(ch):breakdef oled_showstr(self,x,y,ch,TextSize):c2=0j=0if TextSize==1:while ch[j]!='\0':#ord()将字符转换成十进制,如'a'->97c2=ord(ch[j])-32if x>126:x=0y+=1self.oled_setPos(x,y)for i in range(6):self.writeDat(codetab.F6x8[c2][i]) x+=6j+=1#防止index out of range if j==len(ch):breakif TextSize==2:while ch[j]!='\0':#ord()将字符转换成十进制,如'a'->97c2=ord(ch[j])-32if x>120:x=0y+=1self.oled_setPos(x,y)for i in range(8):self.writeDat(codetab.F8X16[c2*16+i]) self.oled_setPos(x,y+1)for i in range(8):self.writeDat(codetab.F8X16[c2*16+i+8])    x+=8j+=1    #防止index out of range                                    if j==len(ch):break
# # --------------------------------------------------------------
# Prototype      : oled_showPicture(x0,y0,x1,y1,BMP)
# Parameters     : x0,y0 -- 起始点坐标(x0:0~127, y0:0~7); x1,y1 -- 起点对角线(结束点)的坐标(x1:1~128,y1:128)
# Description    : 显示BMP位图
# --------------------------------------------------------------def oled_showPicture(self,x0,y0,x1,y1,BMP):i=0if y1%8==0:y=y1/8else:y=y1/8+1for y in range(y0,y1):self.oled_setPos(x0,y)   for x in range(x0,x1):self.writeDat(BMP[i])  i+=1    if i==len(BMP) :break# --------------------------------------------------------------
# Prototype      : set_contrast(contrast)
# Parameters     : coontrast,取值范围为0-255
# Description    : 对比度/亮度调节
# --------------------------------------------------------------    def set_contrast(self, contrast):if contrast < 0 or contrast > 255:raise ValueError('Contrast must be a value from 0 to 255 (inclusive).')self.writeCmd(SSD1306_SETCONTRAST)self.writeCmd(contrast)class SSD1306_128_64(SSD1306Base):def __init__(self):super(SSD1306_128_64, self).__init__(128, 64)def _initialize(self):# 128x64 pixel specific initialization.self.writeCmd(SSD1306_DISPLAYOFF)                    # 0xAEself.writeCmd(SSD1306_SETDISPLAYCLOCKDIV)            # 0xD5self.writeCmd(0x80)                                  # the suggested ratio 0x80self.writeCmd(SSD1306_SETMULTIPLEX)                  # 0xA8self.writeCmd(0x3F)self.writeCmd(SSD1306_SETDISPLAYOFFSET)              # 0xD3self.writeCmd(0x0)                                   # no offsetself.writeCmd(SSD1306_SETSTARTLINE | 0x0)            # line #0self.writeCmd(SSD1306_CHARGEPUMP)                    # 0x8Dif self._vccstate == SSD1306_EXTERNALVCC:self.writeCmd(0x10)else:self.writeCmd(0x14)self.writeCmd(SSD1306_MEMORYMODE)                    # 0x20self.writeCmd(0x00)                                  # 0x0 act like ks0108self.writeCmd(SSD1306_SEGREMAP | 0x1)self.writeCmd(SSD1306_COMSCANDEC)self.writeCmd(SSD1306_SETCOMPINS)                    # 0xDAself.writeCmd(0x12)self.writeCmd(SSD1306_SETCONTRAST)                   # 0x81if self._vccstate == SSD1306_EXTERNALVCC:self.writeCmd(0x9F)else:self.writeCmd(0xCF)self.writeCmd(SSD1306_SETPRECHARGE)                  # 0xd9if self._vccstate == SSD1306_EXTERNALVCC:self.writeCmd(0x22)else:self.writeCmd(0xF1)self.writeCmd(SSD1306_SETVCOMDETECT)                 # 0xDBself.writeCmd(0x40)self.writeCmd(SSD1306_DISPLAYALLON_RESUME)           # 0xA4self.writeCmd(SSD1306_NORMALDISPLAY)                 # 0xA6class SSD1306_128_32(SSD1306Base):def __init__(self):super(SSD1306_128_32, self).__init__(128, 32)def _initialize(self):self.writeCmd(SSD1306_DISPLAYOFF)                    # 0xAEself.writeCmd(SSD1306_SETDISPLAYCLOCKDIV)            # 0xD5self.writeCmd(0x80)                                  # the suggested ratio 0x80self.writeCmd(SSD1306_SETMULTIPLEX)                  # 0xA8self.writeCmd(0x1F)self.writeCmd(SSD1306_SETDISPLAYOFFSET)              # 0xD3self.writeCmd(0x0)                                   # no offsetself.writeCmd(SSD1306_SETSTARTLINE | 0x0)            # line #0self.writeCmd(SSD1306_CHARGEPUMP)                    # 0x8Dif self._vccstate == SSD1306_EXTERNALVCC:self.writeCmd(0x10)else:self.writeCmd(0x14)self.writeCmd(SSD1306_MEMORYMODE)                    # 0x20self.writeCmd(0x00)                                  # 0x0 act like ks0108self.writeCmd(SSD1306_SEGREMAP | 0x1)self.writeCmd(SSD1306_COMSCANDEC)self.writeCmd(SSD1306_SETCOMPINS)                    # 0xDAself.writeCmd(0x02)self.writeCmd(SSD1306_SETCONTRAST)                   # 0x81self.writeCmd(0x8F)self.writeCmd(SSD1306_SETPRECHARGE)                  # 0xd9if self._vccstate == SSD1306_EXTERNALVCC:self.writeCmd(0x22)else:self.writeCmd(0xF1)self.writeCmd(SSD1306_SETVCOMDETECT)                 # 0xDBself.writeCmd(0x40)self.writeCmd(SSD1306_DISPLAYALLON_RESUME)           # 0xA4self.writeCmd(SSD1306_NORMALDISPLAY)                 # 0xA6class SSD1306_96_16(SSD1306Base):def __init__(self):super(SSD1306_96_16, self).__init__(96, 16)def _initialize(self):self.writeCmd(SSD1306_DISPLAYOFF)                    # 0xAEself.writeCmd(SSD1306_SETDISPLAYCLOCKDIV)            # 0xD5self.writeCmd(0x60)                                  # the suggested ratio 0x60self.writeCmd(SSD1306_SETMULTIPLEX)                  # 0xA8self.writeCmd(0x0F)self.writeCmd(SSD1306_SETDISPLAYOFFSET)              # 0xD3self.writeCmd(0x0)                                   # no offsetself.writeCmd(SSD1306_SETSTARTLINE | 0x0)            # line #0self.writeCmd(SSD1306_CHARGEPUMP)                    # 0x8Dif self._vccstate == SSD1306_EXTERNALVCC:self.writeCmd(0x10)else:self.writeCmd(0x14)self.writeCmd(SSD1306_MEMORYMODE)                    # 0x20self.writeCmd(0x00)                                  # 0x0 act like ks0108self.writeCmd(SSD1306_SEGREMAP | 0x1)self.writeCmd(SSD1306_COMSCANDEC)self.writeCmd(SSD1306_SETCOMPINS)                    # 0xDAself.writeCmd(0x02)self.writeCmd(SSD1306_SETCONTRAST)                   # 0x81self.writeCmd(0x8F)self.writeCmd(SSD1306_SETPRECHARGE)                  # 0xd9if self._vccstate == SSD1306_EXTERNALVCC:self.writeCmd(0x22)else:self.writeCmd(0xF1)self.writeCmd(SSD1306_SETVCOMDETECT)                 # 0xDBself.writeCmd(0x40)self.writeCmd(SSD1306_DISPLAYALLON_RESUME)           # 0xA4self.writeCmd(SSD1306_NORMALDISPLAY)                 # 0xA6

使用USB port5对应串口读取log

  • board.json
{"name": "haas506","version": "2.0.0","io": {"OLED": {"type": "I2C","port": 1,"addrWidth": 7,"freq": 400000,"mode": "master","devAddr": 60},       "serial1": {"type": "UART","port": 0,"dataWidth": 8,"baudRate": 9600,"stopBits": 1,"flowControl": "disable","parity": "none"},"serial2": {"type": "UART","port": 1,"dataWidth": 8,"baudRate": 9600,"stopBits": 1,"flowControl": "disable","parity": "none","timeout": 1000},"serial3": {"type": "UART","port": 2,"dataWidth": 8,"baudRate": 115200,"stopBits": 1,"flowControl": "disable","parity": "none","timeout": 1000}},"debugLevel": "ERROR","repl": "enable","replPort": 3
}

调试

1、串口调试工具log,网络连接成功动态注册成功每秒打印读取的数字及PPM数值

2、云端有数据传入,打开实时刷新,显示数据会自动更新。

点击查看数据,可以看到每次上传的具体数值。

3、物联网应用开发

以下是物联网应用开发流程,接下来按以下流程介绍移动端应用的开发。

3.1新建‘普通项目’

  • 使用阿里云IoTStudio创建项目。
  • 在项目管理新建空白项目

    在新建项目页面点击创建空白项目。

    弹出新建空白项目页面,输入项目名称及描述后点击确定按钮。

    项目创建完成后会自动导航到新创建的项目,新项目需要关联产品,设备,并创建业务逻辑,以实现云端上报信息到钉钉的信息推送。

3.2关联设备


3.3创建web应用

新建一个web应用

添加实时曲线组建

配置曲线数据源


更改曲线图外观(非必要操作)

添加图表标题(非必要操作)

保存并预览

网页端可以看到甲醛的实时浓度

5.20 综合案例2.0-甲醛浓度检测系统(2.2版本接口有更新)相关推荐

  1. 5.22 综合案例2.0-4G远程遥控车DEMO(2.2版本接口有更新)

    综合案例2.0-4G远程遥控车DEMO 简介 准备 硬件连接图 代码流程 1.物联网平台开发 2.设备端开发 调试 3.物联网应用开发 3.1新建'普通项目' 3.2关联产品和设备 3.3新建'移动应 ...

  2. 单片机ch2o程序_基于单片机的室内甲醛浓度检测系统

    基于单片机的室内甲醛浓度检测系统 田秀荣 [期刊名称] <山西电子技术> [年 ( 卷 ), 期] 2014(000)003 [ 摘 要 ] As everyone knows , the ...

  3. 5.31 综合案例2.0 - 在线音乐盒

    综合案例2.0 - 在线音乐盒 一.案例说明 二.准备器件 三.案例连线 四.代码 代码说明 复制 五.测试 一.案例说明 用python写一个在线音乐播放器,MP3云喇叭 本案例制作一个联网下载声音 ...

  4. 5.39 综合案例2.0 - STM32蓝牙遥控小车2(语音控制)

    综合案例2.0 - 蓝牙遥控小车1- 语音控制 成品展示 案例说明 器件说明 小车连线 小车源码 语音模块遥控 语音遥控连线 模块使用说明 1.MLT-BT05 4.0 蓝牙模块 2.ASRPRO-2 ...

  5. 5.38 综合案例2.0 -语音助手(短信,蓝牙,M2M设备间通信)

    综合案例2.0 - 语音助手 效果展示 案例说明 原理 器件 语音助手功能实现 1,ASRPRO-2m模块 下载代码连线 模块编程说明 2,模块与开发板接线 3,语音助手代码 功能1:语音发短信说明 ...

  6. 5.24 综合案例2.0-雷达避障系统(仅支持2.2以上版本)

    综合案例2.0-雷达避障系统 简介 AJ-SR04M- T-X超声波测距模块 准备 硬件连接图 代码流程 功能实现 1.物联网平台开发 2.设备端开发 3.调试 简介 近年来,随着智能汽车.智能机器人 ...

  7. 5.25 综合案例2.0-居家隔离监控系统(2.2版本接口有更新)

    综合案例2.0-居家隔离监控系统 简介 AJ-SR04M- T-X超声波测距模块 准备 硬件连接图 代码流程 功能实现 1.物联网平台开发 2.设备端开发 3.调试 4.创建钉钉机器人 5.IoT S ...

  8. 5.8 综合案例2.0-智能刷卡门禁系统(仅支持2.2以上版本)

    综合案例2.0-智能刷卡门禁系统 简介 准备 硬件连接图 代码流程 功能实现 1.物联网平台开发 2.设备端开发 调试 3.场景联动设定 刷卡测试 简介 使用MFRC522 RFID传感器与舵机制作的 ...

  9. 基于51单片机甲醛浓度检测系统仿真设计(仿真+程序+原理图+报告+讲解)

    文章目录 资料下载(可点击) 功能说明 仿真图 复位电路 晶振电路 程序 原理图: 设计报告: 器件清单: 基于51单片机甲醛浓度检测系统仿真设计(仿真+程序+原理图+报告+讲解) 原理图:Altiu ...

最新文章

  1. 文本文件变身电子表格
  2. sql instr()与LOCATE()字符串查找函数
  3. python装饰器-理解Python装饰器(Decorator)
  4. 数据库系备份相关知识笔记
  5. dev Gridcontrol控件属性部分
  6. 让谷歌、百度最快最多地收录您的网站
  7. 测试面试题集-Dubbo常见面试题
  8. [stm32] 利用uc-gui封装画图和画线函数移植51上的模拟动画
  9. C#通过Kernel32.dll动态调用C++生成dll相关接口(结构体转换)相关问题整理
  10. 俗语:“生不睡柳,死不睡杨”,有什么道理?
  11. androidgpuimage_基于GPUImage的实时美颜滤镜
  12. RabbitMQ与spring的集成,,基础。
  13. Matlab中fprintf函数使用
  14. 谈谈网络蜘蛛 爬开心网001的一些体会
  15. mysql standby_数据库的 standby模式
  16. 珍惜生命之水,节约从我做起
  17. 无线网服务器亮红灯什么情况,无线网猫光信号闪红灯是什么原因
  18. 服务器多个cpu的作用,服务器多核CPU是什么?多核CPU有什么用?
  19. oracle 之 Undo Retention
  20. gb2312的字符串(包括中午)转16进制字符串以及反转义原始字符

热门文章

  1. 《周志华机器学习详细公式推导版》完整PDF首发!1.1w+标星开源项目pumpkin-book...
  2. FPGA初学者(9)
  3. python游戏开发超级玛丽,100%真实版
  4. (转)PSP全游戏图鉴OfflineList 送GBA2802个+310中文游戏 有收藏癖者必备
  5. 2的31次方与2的负31次方
  6. active控件读取服务器文件,Delphi下利用ActiveX控件读取PDF文件
  7. Windows Thin PC体验 语言包更改(win 7 included)
  8. NISP-信息安全事件与应急响应
  9. 【Linux】冯诺依曼体系结构与操作系统概念理解
  10. 信号处理--冲激和冲激串的傅里叶变换