简介
背景
每一次去水族馆,水族生态深深的吸引住;总是想着在家中,也拥有这样的水族生态世界,加入了养鱼养生态爱好者中。购买鱼缸,水草灯,除菌灯,打氧机,过滤器水泵,加热棒等设备,组装成为一个生态鱼缸。使用普通的排插,将这些设备拼接起来,还要考虑定时开关水草灯,除菌灯等等。因此开发一款智能水族生态控制器,将每一个设备拼接,并实现云端定时等功能,实现智能养鱼。
用户痛点
1、水草灯,除菌灯,打氧机,过滤器水泵,加热棒等设备不能互相联动;
2、不支持定时功能,水草灯和除菌灯都要开启时长需求;
3、不支持远程控制设备和查看当前设备运行情况;
4、加热棒调节水箱温度时,需要手动调节;
需求说明
拥有一款控制水生态系统的控制器,不仅仅适合鱼缸水箱生态,还可以适合水族馆或者鱼塘或者水池。
水草灯:
功能说明:主要对接水草灯,控制水生态的灯光作用
支持功能:开机时支持手动开关灯,同时输出220V和直流5V(家用灯)
过滤器水泵:
功能说明:水生态系统的水循环控制
支持功能:开机时联动过滤器水泵开启,输出220V
打氧泵:
功能说明:控制水系统的氧气供应
支持功能:开机时支持手动开关打氧泵,输出220V
水系统温度控制:
功能说明:冬天时需要控制水系统的水温,通过外接NTC探头,实现加热棒的开关控制
支持功能:制冷和制热模式,控制不同阀,达到制冷和制热的控制(主要是区分冷水和热水鱼)
不支持独立开关,仅支持开机情况下使用
制冷:设定温度≥水系统温度,关闭制冷设备,设定温度≤水系统温度-1(可设定),开启制冷设备
制热:设定温度≤水系统温度,关闭制热设备,设定温度≥水系统温度+1(可设定),开启制冷设备
除菌灯:
功能说明:水系统杀菌灯开启关闭,每一次开启定时1小时后关闭,支持可以设定开启时长
支持说明:仅支持云端开关或者参数手动开启
实现方案
继电器:
V1:鱼灯
V2:循环水泵
V3:打氧水泵
V4:水系统制热阀(冷阀)
V5:除菌灯
V6:联动热泵主机
按键控制
M1:长按M1键,触发开机或者关机(开机时,开启循环泵);短按M1键,触发开关灯操作,退出上一层按键
M2:开机状态下,短按M2,触发开关打氧泵
M3:开机状态下,短按M3,切换制冷制热,长按触发进入设置界面,参数确定键
UP:调节设定温度“+”和系统参数选择和调节参数值
Down:调节设定温度“-”和系统参数选择和调节参数值
逻辑控制:
1、总开关:关机状态下,断开所有的继电器,开启状态下:手动开关鱼灯,过滤器水泵,打氧水泵,根据当前的模式,自动调节水系统温度
2、总关机状态下,会将鱼灯,循环水泵,打氧水泵,除菌灯同步关闭
3、显示当前环境的温度和湿度,并支持显示水箱温度
4、当选择不支持外置NTC传感器时,不读取外置NTC传感器串口,并且界面不显示外置传感器温度和模式,模式按键并不支持切换,并且不支持调节设定温度;
5、当如果支持外置NTC传感器,外置传感器方式故障,则界面显示“--”,并且制热,制冷逻辑不生效,界面显示故障图标;
6、数据上报阿里云并支持云端控制设备;数据变化上报,室内温度变化±0.5℃,室内湿度变化±2%,水箱温度±1℃上报
7、支持本地或者云端调节制冷制热设定温度范围,默认为(12~32℃),支持5~35℃
8、支持本地或者云端调节除菌灯的开启长,默认为(60分钟)
图标显示:
除菌灯开启——除菌亮起,否则熄灭
制热模式——制热亮起,关机熄灭
制冷模式——制冷亮起,关机熄灭
非恒温情况——联动灯亮起,否则熄灭
循环水泵开启——水泵1,否则熄灭
打氧水泵开启——水泵2,否则熄灭
水草灯开启——系统1,否则熄灭
水箱温度——室外温度区域显示,无检测到传感器时,不显示
设定温度——室外温度区域显示,闪烁显示
开发准备
硬件资源
linkedgo ST800系列产品
1、支持内置温湿度传感器
2、支持外置NTC传感器接入
3、支持5路220继电器输出
4、支持2路0-10V直流电压输出
5、支持1路干接点输出
6、支持2路RS485输出
7、主控ESP32芯片
接口定义
接口名称 | 代号 | 规格 | 功能说明 |
继电器1 | Out1 | 220VAC,常开 | 水草灯 |
继电器2 | Out2 | 220VAC,常开 | 过滤器水泵 |
继电器3 | Out3 | 220VAC,常开 | 打氧机 |
继电器4 | Out4 | 220VAC,常开,常闭 | 加热棒或者制冷机 |
继电器5 | Out5 | 220VAC,常开 | 除菌灯 |
继电器6 | Out6 | C1, C2无源触点,触点负载(阻性) | 联动外部热源开停信号 |
0-10 | Out7 | 0-10VDC | 直流5V水草灯 |
外部NTC | OT1 | R25=10K,B25=3950 | 水箱温度 |
室内温湿度 | RTH | SHC3 | 测量室内温度/湿度 |
RS485-1 | A1, B1 | 通信接口 | 第三方通信 |
火线,零线 | L, N | 220VAC,火线,零线 | 供电 |
软件资源
开发工具:Visual Studio Code
开发框架: HaaS-python
云端平台:阿里云
物联网平台开发
整个过程包含以下3个步骤:
- 创建产品(设备模型)
- 定义产品功能(物模型)
- 创建设备及获取三元组
创建产品
在物联网平台中,左上角选择“华东2-上海”,点击“公共实例”,即可开通。开通后点击“公共实例”,即可进入控制台进行产品创建。
在产品界面,点击新建产品,输入产品名称,数据格式默认为“ICA标准数据格式(Alink JSON)”,点击确认键,完成产品创建。
定义产品功能(物模型)
功能自定义:将设备需要上报的数据内容,在云端定义;
比如:上报水箱的温度,鱼灯的开关灯
操作步骤:点击创建好的产品,点击功能定义,编辑草稿。
在功能定义界面,阿里云提供添加标准功能和自定义功能两个选择项,开发者根据产品的需求,选择不同的选择项:
标准功能:是官方提供的标准模板功能
自定义功能:开发者自定义
功能类型:属性,服务,事件,本产品仅使用到属性的功能
标识符:在编写软件时,需要根据这个标识符内容,上报数据
数据类型:编写软件时,上报数据的类型;
发布上线:表示确定相关定义功能,接下来就可以正常使用这些功能;
本次产品开发自定义功能
功能类型 | 功能名称(全部) | 标识符 | 数据类型 | 数据定义 |
属性 | 故障信息 | ErrorInfo | array (数组) | - |
属性 | NTC使能 | NTCEnable | enum (枚举型) | 枚举值:0-1 |
属性 | 开关状态 | Status | enum (枚举型) | 枚举值:0-1 |
属性 | 测试外置NTC温度 | TestNTC | float (单精度浮点型) | 取值范围:0 ~ 60 |
属性 | 设定温度 | SetTemperature | int32 (整数型) | 取值范围:50 ~ 350 |
属性 | 灯光 | Light | enum (枚举型) | 枚举值:0-1 |
属性 | 环境湿度 | humidity | float (单精度浮点型) | 取值范围:0 ~ 100 |
属性 | 室内温度 | temperature | float (单精度浮点型) | 取值范围:-30 ~ 60 |
属性 | 除菌时运行时间 | DegermTime | int32 (整数型) | 取值范围:5 ~ 180 |
属性 | 继电器状态 | RelayStatus | int32 (整数型) | 取值范围:0 ~ 65355 |
属性 | 杀菌灯 | Degerm | enum (枚举型) | |
属性 | 打氧机 | Inflator | enum (枚举型) | 枚举值:0-1 |
属性 | 循环水泵 | PUMP | enum (枚举型) | 枚举值:0-1 |
属性 | 测试温度 | TestTemp | float (单精度浮点型) | 取值范围:0 ~ 35 |
属性 | 测试开关 | TestMode | enum (枚举型) | 枚举值:0-1 |
属性 | 模式 | UserMode | enum (枚举型) | 枚举值:0-1 |
属性 | 水温 | WaterTemperature | float (单精度浮点型) | 取值范围:0 ~ 100 |
创建设备及获取三元组
在设备列表界面,点击添加设备,并输入设备名称,完成设备创建
获取到设备三元组信息
设备开发
环境搭建
在进行下一步之前请确保ESP32开发环境已经搭建完毕。详情请参考esp32开发环境的说明
创建解决方案
如下图所示,在Haas Studio中创建项目。先选择左侧的“ESP32乐鑫开发版”再从右侧的案例中选择“Hello World”案例点击“立即创建”即可。
SHTC3驱动
from machine import Pin,I2C
import utime
i2c = I2C(1, scl=Pin(27), sda=Pin(14), freq=400000)
buf0=bytearray([0x35,0x17])
i2c.writeto(0x70,buf0)
utime.sleep(0.5)
buf=bytearray([0xEF,0xC8])
i2c.writeto(0x70,buf)
i2c.readfrom_into(0x70,buf)
print("buf:",buf)
num=int.from_bytes(buf,'big')
print('I2C device shtc3 init and id is %d'%num)
utime.sleep(0.5)
while True:
buf1=bytearray([0x7C, 0xA2])
i2c.writeto(0x70, buf1)
# # must wait for a little before the measurement finished
utime.sleep_ms(20)
buf2=bytearray([0x00, 0x00, 0x00, 0x00, 0x00, 0x00])
i2c.readfrom_into(0x70, buf2)
# calculate real temperature and humidity according to SHT3X-DIS' data sheet
temp = (buf2[1] | (buf2[0] << 8)) * 175 / 65536.0 - 45.0
humi = (buf2[4] | (buf2[3] << 8)) * 100 / 65536.0
echo_Arg='shtc3: Temperature='+str(temp)+', Humidity='+str(humi)
print(echo_Arg)
utime.sleep(2)
继电器驱动
from machine import Pin
import utime
import random
class sc:
def __init__(self,sclk=21,rclk=19,dio=18):
self.sclk =Pin(sclk,Pin.OUT)
self.rclk =Pin(rclk,Pin.OUT)
self.dio = Pin(dio,Pin.OUT)
def shiftupdata(self,data):
#put latch down to start data sending 启动
self.sclk.value(0)
self.rclk.value(0)
self.sclk.value(1)
#load data in reverse order
for i in range(7, -1, -1):
self.sclk.value(0)
self.dio.value(int(data[i]))
# print("data",data[i])
self.sclk.value(1)
#put latch up to store data on register
self.sclk.value(0)
self.rclk.value(1)
self.sclk.value(1)
使用方法sc.shifutupdata方法
hsc.shiftupdata("00101000") #表示开制热制冷阀和干接点,其中表达逻辑(00干菌热氧泵灯)
LCD屏驱动
#ht1621.py 驱动代码
# -*- coding:UTF-8 -*-
from micropython import const
from time import sleep_ms, sleep_us, sleep
# Command list
# -------------------------
# Function Flag(Flag)
FLAG_CMD = const(0x04) # Command
FLAG_READ = const(0x06) # Read
FLAG_WRITE = const(0x05) # Write
FLAG_MODIFY = const(0x05) # READ-MODIFY-WRITE
# LCD Control
CMD_LCDON = const(0x006) # Turn on LCD bias generator
CMD_LCDOFF = const(0x004) # Turn off LCD bias generator
# System Control
CMD_SYSEN = const(0x002) # Turn on system oscillator
CMD_SYSDIS = const(0x000) # Turn off both system oscillator and LCDbias generator)
# LCD 1/2 bias option
CMD_B2C2 = const(0x040) # 2COM,1/2 bias
CMD_B2C3 = const(0x048) # 3COM,1/2 bias
CMD_B2C4 = const(0x050) # 4COM,1/2 bias
# LCD 1/3 bias option
CMD_B3C2 = const(0x042) # 2COM,1/3 bias
CMD_B3C3 = const(0x04A) # 3COM,1/3 bias
CMD_B3C4 = const(0x052) # 4COM,1/3 bias
# System clock Set
CMD_RC256K = const(0x030) # System clock source, on-chip RC oscillator
CMD_EXT256K = const(0x038) # System clock source, external clock source
CMD_XTAL32K = const(0x028) # System clock source, crystal oscillator
# Time base
CMD_TIMER_EN = const(0x00C) # Enable time base output
CMD_TIMER_DIS = const(0x008) # Disable time base output
CMD_CLR_TIMER = const(0x018) # Clear the contents of time base generator
# WDT set
CMD_WDT_DIS = const(0x00A) # Disable WDT time-out flag output
CMD_WDT_EN = const(0x00E) # Enable WDT time-out flag output
CMD_CLR_WDT = const(0x01C) # Clear the contents of WDT stage
# Sound output set
CMD_TONE2K = const(0x0C0) # Tone frequency, 2kHz
CMD_TONE4K = const(0x080) # Tone frequency, 4kHz
CMD_TONEON = const(0x012) # Turn on tone outputs
CMD_TONEOFF = const(0x010) # Turn off tone outputs
# Time base/WDT clock output set
CMD_F1 = const(0x140) # Time base/WDT clock output:1Hz | The WDT time-out flag after: 4s
CMD_F2 = const(0x142) # Time base/WDT clock output:2Hz | The WDT time-out flag after: 2s
CMD_F4 = const(0x144) # Time base/WDT clock output:4Hz | The WDT time-out flag after: 1s
CMD_F8 = const(0x146) # Time base/WDT clock output:8Hz | The WDT time-out flag after: 1/2s
CMD_F16 = const(0x148) # Time base/WDT clock output:16Hz | The WDT time-out flag after: 1/4s
CMD_F32 = const(0x14A) # Time base/WDT clock output:32Hz | The WDT time-out flag after: 1/8s
CMD_F64 = const(0x14C) # Time base/WDT clock output:64Hz | The WDT time-out flag after: 1/16s
CMD_F128 = const(0x14E) # Time base/WDT clock output:128Hz | The WDT time-out flag after: 1/32s
# IRQ set
CMD_IRQ_DIS = const(0x100) # Disable IRQ output
CMD_IRQ_EN = const(0x110) # Enable IRQ output
# Work mode set
CMD_TEST = const(0x1C0) # Test mode, user don't use
CMD_NORMAL = const(0x1C6) # Normal mode
# -------------- End -----------------
class HT1621B:
def __init__(self, _cs, _rd, _wr, _htdata):
self.CS = _cs # Define the CS Pin
self.RD = _rd # Define the RD Pin
self.WR = _wr # Define the WR Pin
self.DA = _htdata # Define the DATA Pin
self.CS.init(self.CS.OUT, self.CS.PULL_UP, value=1)
self.RD.init(self.RD.OUT, self.RD.PULL_UP, value=1)
self.WR.init(self.WR.OUT, self.WR.PULL_UP, value=1)
self.DA.init(self.DA.OUT, self.DA.PULL_UP, value=1)
self.init()
def init(self,
_timer = CMD_TIMER_DIS,
_wdt = CMD_WDT_DIS,
_scs = CMD_RC256K,
_bias = CMD_B3C4,
_tone = CMD_TONE4K,
_irq = CMD_IRQ_DIS,
_twc = CMD_F128,
_mod = CMD_NORMAL
):
# commend list
lcmd = (_timer, _scs, _bias, _irq, _twc, _mod, CMD_CLR_TIMER, CMD_CLR_WDT)
self.CS.on()
self.WR.on()
self.RD.on()
self.DA.on()
sleep(1)
self.HT1621xWrCmd(CMD_SYSDIS)
self.HT1621xWrCmd(_wdt)
self.HT1621xWrCmd(CMD_SYSEN)
for cmd in lcmd:
self.HT1621xWrCmd(cmd)
self.ALLCLEAR(0, 32)
return True
def _wrData(self, _da):
for i in _da:
self.WR.off()
self.DA.value(int(i))
sleep_us(4)
self.WR.on()
sleep_us(4)
return True
def HT1621xWrCmd(self, _cmd):
FC = bin(FLAG_CMD)[2:]
CMD = bin(_cmd ^ (1 << 9))[3:]
self.CS.off()
sleep_us(4)
self._wrData(FC)
self._wrData(CMD)
self.CS.on()
sleep_us(4)
return True
def HT1621xWrOneData(self, _addr, _htdata):
FW = bin(FLAG_WRITE)[2:]
ad = bin(_addr ^ (1 << 6))[3:] # hex to 6 bit bin
da = bin(_htdata ^ (1 << 4))[3:] # hex to 4 bit bin
self.CS.off()
sleep_us(4)
self._wrData(FW)
self._wrData(ad)
self._wrData(da)
self.CS.on()
sleep_us(4)
return True
def HT1621xWrAllData(self, _addr, _htdata):
FW = bin(FLAG_WRITE)[2:]
ad = bin(_addr ^ (1 << 6))[3:]
self.CS.off()
sleep_us(4)
self._wrData(FW) # write commend
self._wrData(ad) # write address
for da in _htdata:
dat = bin(da ^ (1 << 4))[3:]
self._wrData(dat) # write data
self.CS.on()
sleep_us(4)
return True
def ALLSHOW(self, _addr, _nbit):
htdata = []
for i in range(_nbit):
htdata.append(0x0F)
self.HT1621xWrAllData(_addr, htdata)
return True
def ALLCLEAR(self, _addr, _nbit):
htdata = []
for i in range(_nbit):
htdata.append(0x00)
self.HT1621xWrAllData(_addr, htdata)
return True
def LCDON(self):
self.HT1621xWrCmd(CMD_LCDON)
return True
def LCDOFF(self):
self.HT1621xWrCmd(CMD_LCDOFF)
return True
def HTBEEP(self, _t):
self.HT1621xWrCmd(CMD_TONEON)
sleep(_t)
self.HT1621xWrCmd(CMD_TONEOFF)
return True
LCD显示
#gdc03849.py 封装方法
# -*- coding:UTF-8 -*-
class GDC03849:
def __init__(self, _ht1621x):
self.ht = _ht1621x
self.ht.init() # Here you can add parameters as needed, currently using default parameters
self.ht.LCDON()
self.LCDALLSHOW()
self.ht.HTBEEP(1) # Buzzer sounds for 1 second
self.LCDALLCLEAR()
# the hex list for (0-9、.)
self.NUMCODE_RH_HEX = ((0x0D, 0x0F), # 0
(0x08, 0x06),
(0x0B, 0x0D),
(0x0A, 0x0F),
(0x0E, 0x06),
(0x0E, 0x0B),
(0x0F, 0x0B),
(0x08, 0x0E),
(0x0F, 0x0F),
(0x0E, 0x0F)) # 9
# the hex list for (0-9、.)
self.NUMCODE_TEMP_HEX = ((0x0F, 0x0D), # 0
(0x06, 0x08),
(0x0B, 0x0E),
(0x0F, 0x0A),
(0x06, 0x0B),
(0x0D, 0x0B),
(0x0D, 0x0F),
(0x07, 0x08),
(0x0F, 0x0F),
(0x0F, 0x0B)) # 9
def viewTemp(self, _gdcdata):
val = ()
stda = ('00000' + str(int(_gdcdata * 100)))[-5::]
stda = list(stda)[::-1]
for i in stda:
val = val + self.NUMCODE_TEMP_HEX[int(i)]
self.ht.HT1621xWrAllData(0x0A, val)
return True
def viewRH(self, _gdcdata):
val = ()
stda = ('00000' + str(int(_gdcdata * 100)))[-5::]
for i in stda:
val = val + self.NUMCODE_RH_HEX[int(i)]
self.ht.HT1621xWrAllData(0x00, val)
return True
def LCDALLSHOW(self):
self.ht.ALLSHOW(0x00, 40)
return True
def LCDALLCLEAR(self):
self.ht.ALLCLEAR(0x00, 40)
return True
def TEMPCLEAR(self):
self.ht.ALLCLEAR(0x0A, 10)
return True
def RHCLEAR(self):
self.ht.ALLCLEAR(0x00, 10)
return True
def WIFISHOW(self):
self.ht.HT1621xWrOneData(0x0B,2)
return True
#使用方法类
from ht1621 import HT1621B
from gdc03849 import GDC03849
CS = Pin(5)
RD = Pin(4)
WR = Pin(17)
DA = Pin(16)
ht = HT1621B(CS, RD, WR, DA)
#ht= HT1621B('5','4','17','16')
#ht.init(5,4,17,16)
gdc = GDC03849(ht)
gdc.WIFISHOW()
DC直流驱动
from driver import PWM
from datastorage import DataStorage
import ulogging
log = ulogging.Logger("DC#")
level = ulogging.DEBUG # ulogging.CRITICAL ulogging.ERROR ulogging.WARNING ulogging.INFO ulogging.DEBUG
log.setLevel(level)
class DC(DataStorage):
def __init__(self):
self.buz12 = PWM()
self.buz13 = PWM()
self.buz12.open("buz12")
self.buz13.open("buz13")
def buzzeStartRing(self,duty1,duty2):
# assumes buzzer rings when freq is between 200~9000,duty0-99
if self.getDCData(2) == 0:
log.debug("---buzzeStartRing---",duty2)
param = {'freq':500, 'duty': duty1 }
self.buz12.setOption(param)
param = {'freq':500, 'duty': duty2}
self.buz13.setOption(param)
self.setDCData(1,duty1)
self.setDCData(2,duty2)
else:
pass
# stop buzzer ring
def buzzeStopRing(self):
if self.getDCData(2) !=0:
# assumes buzzer rings when freq is between 200 and 9000, so set PWM's frequence to 100 will stop buzzer ring
log.debug("---buzzeStopRing---")
param = {'freq':100, 'duty': 50 }
self.buz12.setOption(param)
param = {'freq':100, 'duty': 50 }
self.buz13.setOption(param)
self.setDCData(1,0)
self.setDCData(2,0)
else:
pass
board.json
{ "name": "haasedu", "version": "1.0.0", "io": { "buz12": { "type": "PWM", "port": 12 }, "buz13": { "type": "PWM", "port": 13 } } }
按键控制
from machine import Pin ,Timer
import utime
from datastorage import DataStorage
import ulogging
log = ulogging.Logger("touchkey#")
level = ulogging.ERROR # ulogging.CRITICAL ulogging.ERROR ulogging.WARNING ulogging.INFO ulogging.DEBUG
log.setLevel(level)
class Touchkey(DataStorage):
def __init__(self):
self.tim = Timer(0) #计时器
self.up = 1 #0表示触摸,1表示未触摸
self.down = 1
self.M3 = 1
self.M2 = 1
self.M1 = 1
self.B =1 #上电默认为亮屏
self.M =1 #模式的标识
super().__init__()
def get_up(self):
self.up = Pin(33,Pin.IN,Pin.PULL_UP).value()
return self.up
def get_down(self):
self.down = Pin(32,Pin.IN,Pin.PULL_UP).value()
return self.down
def get_M3(self):
self.M3 = Pin(39,Pin.IN,Pin.PULL_UP).value()
return self.M3
def get_M2(self):
self.M2 = Pin(34, Pin.IN, Pin.PULL_UP).value()
return self.M2
def get_M1(self):
self.M1 =Pin(35, Pin.IN, Pin.PULL_UP).value()
return self.M1
#判定按键是否长按或者短按
'''/******************************************************************************
* Name : key_dispose
* Function : 用于监听按键短按或者长按的功能
* Input : None.
* Output: : None.
* Return : None.
* Description: To be done.
* Version : V1.00
* Author : Leon
******************************************************************************/'''
def key_dispose(self):
upcount =0 #记录多少次
up_Eop =0 #表示当前状态未触摸过
while True:
if upcount>=8 and up_Eop == 0:
print("duanan 100<x<800ms")
upcount =0
elif self.up ==0:
upcount = upcount+1
up_Eop = 1
print("upcount:",upcount)
if upcount>80:
print("changan >800ms")
upcount =0
elif self.up ==1:
up_Eop = 0
else :
pass
utime.sleep_ms(10)
'''/******************************************************************************
* Name : key_state_handing
* Function : 用于监听上,下,M1,M2,M3按键短按或者长按的功能
* Input : None.
* Output: : None.
* Return : None.
* Description: To be done.
* Version : V1.00
* Author : Leon
******************************************************************************/'''
def key_state_handing(self):
upDataCount =0
downDataCount =0
M2DataCount =0
M3DataCount =0
M1DataCount =0
while True:
self.get_up()
self.get_down()
self.get_M2()
self.get_M3()
self.get_M1()
#向上键
if self.up ==0:
if upDataCount>=100:
log.debug("---logupkey---1S")
upDataCount =0
else:
upDataCount = upDataCount+1
if upDataCount>=5 and self.up ==1:
log.debug("---upkey---50ms")
self.upKeyLogic()
upDataCount =0
#向下键
if self.down ==0:
if downDataCount>=100:
log.debug("---logdownkey---1S")
self.downKeyLogic()
downDataCount =0
else:
downDataCount = downDataCount+1
if downDataCount>=5 and self.down == 1:
log.debug("---downkey---50ms")
self.downKeyLogic()
downDataCount =0
#M3按键逻辑
if self.M3 ==0:
if M3DataCount>=100:
log.debug("---logM3key---1S")
self.logKeyLigic_M3()
M3DataCount =0
else:
M3DataCount = M3DataCount+1
if M3DataCount>=3 and self.M3 == 1: #调为8体验偏差
log.debug("---M3key---300ms")
self.KeyLigic_M3()
M3DataCount =0
#M2按键逻辑
if self.M2 ==0:
if M2DataCount>=100:
log.debug("---logM2key---1S")
M2DataCount =0
else:
M2DataCount = M2DataCount+1
if M2DataCount>=3 and self.M2 == 1:
log.debug("---M2key---800ms")
self.KeyLigic_M2()
M2DataCount =0
#M1机按键逻辑
if self.M1 ==0:
if M1DataCount>=100:
log.debug("---logM1key---1S")
self.logKeyLogic_M1()
M1DataCount =0
else:
M1DataCount = M1DataCount+1
if M1DataCount>=3 and self.M1 == 1:
log.debug("---M1key---800ms")
self.keyLigic_M1() #
M1DataCount =0
# if self.up ==1 and self.down ==1 and self.M3 ==1 and self.M2==1 and self.M1==1: #当前状态未点击 目前仅监听了三个按键
# self.autoReturn()
log.debug('---state---',self.up,self.down,self.M1,self.M2,self.M3)
if self.up ==1 and self.down ==1 and self.M3 ==1: #当前状态未点击 目前仅监听了三个按键
self.autoReturn()
# elif self.up ==1 and self.down ==1:
# #self.autoReturn()
# pass
# elif self.up ==1 and self.down ==1:
# if self.getLogicData(self.Logic_Temp_UI) ==self.TEMP_SETING and self.B ==2:
# log.debug("---reset timinit---")
# self.tim.init(period=10000, mode=Timer.ONE_SHOT, callback=lambda t:self.backHome()) #处理10秒无操作,返回温度显示界面
# self.B =0
else: #当前状态操作点击
log.debug("---dianjin---",self.B)
log.debug("---Logic_Screen_State---",self.getLogicData(self.Logic_Screen_State))
if self.getLogicData(self.Logic_Screen_State)==self.OFF_SCREEN: #如果息屏,则唤醒屏幕
self.setLogicData(self.Logic_Screen_State,self.ON_SCREEN)
utime.sleep_ms(1000) #防止唤醒屏幕后,里面触发按键功能
self.B=1
utime.sleep_ms(10) #每10毫秒获取一次状态
代码层次
设备运行
部署运行
运行效果
物联网平台
在线调试设备
设备当前状态展示