天天看点

HaaS-Python实现智能水族生态控制器简介开发准备

简介

背景

每一次去水族馆,水族生态深深的吸引住;总是想着在家中,也拥有这样的水族生态世界,加入了养鱼养生态爱好者中。购买鱼缸,水草灯,除菌灯,打氧机,过滤器水泵,加热棒等设备,组装成为一个生态鱼缸。使用普通的排插,将这些设备拼接起来,还要考虑定时开关水草灯,除菌灯等等。因此开发一款智能水族生态控制器,将每一个设备拼接,并实现云端定时等功能,实现智能养鱼。

用户痛点

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系列产品

HaaS-Python实现智能水族生态控制器简介开发准备

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个步骤:

  1. 创建产品(设备模型)
  2. 定义产品功能(物模型)
  3. 创建设备及获取三元组

创建产品

在物联网平台中,左上角选择“华东2-上海”,点击“公共实例”,即可开通。开通后点击“公共实例”,即可进入控制台进行产品创建。

HaaS-Python实现智能水族生态控制器简介开发准备

在产品界面,点击新建产品,输入产品名称,数据格式默认为“ICA标准数据格式(Alink JSON)”,点击确认键,完成产品创建。

HaaS-Python实现智能水族生态控制器简介开发准备

定义产品功能(物模型)

功能自定义:将设备需要上报的数据内容,在云端定义;

比如:上报水箱的温度,鱼灯的开关灯

操作步骤:点击创建好的产品,点击功能定义,编辑草稿。

HaaS-Python实现智能水族生态控制器简介开发准备

在功能定义界面,阿里云提供添加标准功能和自定义功能两个选择项,开发者根据产品的需求,选择不同的选择项:

标准功能:是官方提供的标准模板功能

自定义功能:开发者自定义

功能类型:属性,服务,事件,本产品仅使用到属性的功能

标识符:在编写软件时,需要根据这个标识符内容,上报数据

数据类型:编写软件时,上报数据的类型;

发布上线:表示确定相关定义功能,接下来就可以正常使用这些功能;

HaaS-Python实现智能水族生态控制器简介开发准备

本次产品开发自定义功能

功能类型 功能名称(全部) 标识符 数据类型 数据定义
属性 故障信息 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

创建设备及获取三元组

在设备列表界面,点击添加设备,并输入设备名称,完成设备创建

HaaS-Python实现智能水族生态控制器简介开发准备

获取到设备三元组信息

HaaS-Python实现智能水族生态控制器简介开发准备

设备开发

环境搭建

在进行下一步之前请确保ESP32开发环境已经搭建完毕。详情请参考esp32开发环境的说明

创建解决方案

如下图所示,在Haas Studio中创建项目。先选择左侧的“ESP32乐鑫开发版”再从右侧的案例中选择“Hello World”案例点击“立即创建”即可。

HaaS-Python实现智能水族生态控制器简介开发准备

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毫秒获取一次状态
           

代码层次

HaaS-Python实现智能水族生态控制器简介开发准备

设备运行

部署运行

HaaS-Python实现智能水族生态控制器简介开发准备

运行效果

HaaS-Python实现智能水族生态控制器简介开发准备

物联网平台

在线调试设备

HaaS-Python实现智能水族生态控制器简介开发准备

设备当前状态展示

HaaS-Python实现智能水族生态控制器简介开发准备