【基于Seeed xiao ESP32S3 Sense的自动化HA鱼缸设计】

news2024/10/6 20:33:48

1.前言

基于Seeed xiao ESP32S3 Sense的自动化HA鱼缸

在当今物联网与智能家居科技日益发达的时代,将先进技术和传统养鱼艺术融合,创造出智能、自动化且极具观赏价值的鱼缸已成为一种创新趋势。SeeedStudio推出的Xiao ESP32-S3 Sense开发板以其卓越的性能和丰富的拓展性为这一设想提供了有力的技术支撑。这款开发板搭载了高性能的ESP32-S3芯片,集成了强大的处理能力、Wi-Fi和蓝牙双模无线通讯模块,并内嵌有OV2640摄像头,使其成为构建智能鱼缸的理想核心元件。
在这里插入图片描述
本文旨在探讨如何运用Seeed Xiao ESP32-S3 Cam开发板设计一款自动化、可接入Home Assistant(简称HA)的智能鱼缸系统。系统将集成多项功能,如自动投喂、环境监测(包括温度、湿度)、实时视频监控以及远程管理等,使鱼缸养护工作更加科学便捷,同时也增强了观赏体验和互动性。

1.1 立项目标

  1. 基于ESP32S3 Sense接入ESPHome实体化研究(涉及Camera/DHT/LED/Servo)
  2. 基于NodeRED+小爱自动化服务鱼缸管理研究(涉及自动语音播报温湿度、定时开灯、定时投饵)

通过精心设计和细致调试,我们将借助开源软硬件的优势,搭建起一套涵盖硬件组装、软件编程、云服务对接等多层面技术环节的智能鱼缸解决方案。在这个过程中,不仅体现了技术创新带来的生活乐趣,也展示了物联网技术在改善生活品质、提升宠物养护体验等方面的广泛应用前景。随着篇章的深入,读者将逐步了解如何利用Xiao ESP32-S3 Cam及其周边组件,结合Home Assistant的强大自动化能力,共同构建一个既实用又充满科技魅力的智能鱼缸系统。

1.2 系统设计流程图

在这里插入图片描述

系统设计流程图是一个用于描述HA自动化系统设计过程的流程图。在这个流程中,首先进行的是项目立项,然后进入系统设计阶段,包括结构设计和硬件模块设计。在硬件模块设计中,又包括硬件模块设计和软件模块设计。然后进行联合调试,如果调试成功,就进行系统设计修改,如果调试失败,就回到硬件模块设计进行更改,直到调试成功。最后,进行是总结并记录归档。

2. 关键技术

2.1 HA环境搭建

时隔一年,我又重新开始玩Homeassistant,发现其中奥妙无穷,惊喜不断。在我浅薄的认知中要学好嵌入式,必须玩过Homeassistant,并且玩出自己的名堂!因为这是最贴切实际的生活应用没有之一,每月更新使得唯有活水来;拥抱大千使得永葆青春的活力;鬼斧神工的操作精彩纷呈,可以堪称软件与硬件的完美落地!在2024年我会出一期完整的树莓派与Homeassistant不解之缘的开发教程,只需要简单的代码拼接和模块的堆叠,会在这里看到接地气(GPIO、PWM、UART等)的硬件和妙笔生花(自动化、语音识别、语音合成、chatgpt大语言模型等)的软件之间无机衔接,最终设计一个属于自己的智能家居系统Homeassistant。
在这里插入图片描述
参考教程:【树莓派安装Homeassistant及基本配置】

2.2 ESPHome设备接入

本 教程将逐步介绍如何将 Seeed Studio XIAO ESP32S3 与 Home Assistant 上运行的。
ESPHome 连接,并在将 Grove 模块连接到 XIAO ESP32S3 后发送传感器数据/控制设备。那么,让我们开始吧!
在这里插入图片描述
参考教程:【XIAO ESP32S3 sense 通过 ESPHome 与 Home Assistant 连接】

2.3 NodeRED自动化设计

上面实现HA环境配置和xiao ESP32S3 开发板实体信息接入ESPHome,接下来就需要设计相对应的自动化控制,其中关键在于NodeRED自动化设计。实现是Homeassistant 的Node-red插件之小爱同学语音功能开通,采用NodeRED节点流设计自动化控制流,实现播报任意带变量的文本🥳🥳🥳
在这里插入图片描述

参考教程:【Homeassistant 的Node-red插件之小爱同学语音功能开通】

3. 系统硬件

系统硬件由xiao esp32s3与树莓派400组成,树莓派400是主控服务器,xiao esp32s3是客户端,xiao esp32s3连接Camera/DHT/LED/Servo

名称信号端口功能
DHTGPIO8检测鱼缸外部温湿度
LEDGPIO21鱼缸照明
ServoGPI7鱼缸喂食器

在这里插入图片描述

3.1 Camera

围绕OV2640相机(XIAO ESP32S3 Sense)与鱼缸相结合的应用场景,我们可以设计一个智能鱼缸监控系统。并通过ESP32S3的Wi-Fi功能将视频流发送到云端服务器或本地HA设备,便于远程观察鱼儿的生活状态和鱼缸环境。

畅想:

  1. 自动化喂食:通过对鱼缸内情况进行分析,配合定时功能,可以实现自动化的定时定量喂食。
  2. 健康监测:长期记录并分析鱼类的行为特征,识别异常行为,提前发现潜在的健康问题。
  3. 水质预警:通过图像识别水质的变化,及时提醒用户更换滤材或采取其他水质维护措施。

总结来说,XIAO ESP32S3 Sense与OV2640相机的结合,可以打造一个功能丰富的智能鱼缸监控系统,不仅能提供实时监控功能,还能通过数据分析提升养鱼体验,实现智慧渔业管理。

3.2 DHT

由于鱼缸环境对于水温和湿度稳定性的要求较高,尤其是在饲养热带观赏鱼或者需要保持特定温湿度范围的情况下,DHT传感器成为必不可少的组件。DHT系列传感器包括但不限于DHT11(本文采用型号)和DHT22(也称为AM2302)等型号,它们均能够提供数字信号输出的温湿度测量结果,具有良好的性价比和稳定性。

畅想

  1. 温度监测与控制:DHT传感器可以实时监测鱼缸水体温度,以及周围空气的温度,这些数据对于维持鱼只生存所需的适宜温度至关重要。当温度超过或低于预设的舒适区间时,连接到传感器的控制系统会收到信号,进而启动加热器或冷却设备,自动调整鱼缸水温。
  2. 数据记录与报警:DHT传感器的数据可以被记录下来,形成历史曲线,帮助养鱼者了解鱼缸环境变化趋势。当温度或湿度出现异常波动时,可通过配套的电路和软件系统触发警报,及时通知养鱼者采取相应措施。

因此,将DHT传感器集成到智能鱼缸设计中,不仅有利于保证鱼缸内生物的健康,也有助于提高整个鱼缸系统的自动化程度和管理水平。例如,可以通过ESP32或其他微处理器平台轻松读取DHT传感器的数据,并实现上述功能。

3.3 LED

LED(Light Emitting Diode)与鱼缸的结合,主要体现在鱼缸照明和水生生物生长环境模拟方面。LED灯具有能耗低、寿命长、色彩丰富、亮度可调等特点,非常适合用于鱼缸照明及水草养殖。

畅想

  1. 照明效果:LED鱼缸灯可以根据不同种类的观赏鱼和水草的需求提供特定光谱的光线,比如热带鱼和水草需要蓝光和红光来模拟自然界的日照,促进生理活动和增强观赏效果。
  2. 节能和智能化:LED灯具的能效高,长期使用成本较低,而且很多现代的LED鱼缸灯支持定时开关和亮度调节,可以根据生物作息习惯模拟昼夜交替,甚至可以通过智能家居系统远程控制。

综上所述,LED技术在鱼缸领域扮演着重要的角色,不仅可以满足美学需求,更重要的是能满足鱼类和水生植物在光环境方面的生物学需求,是现代智能鱼缸生态系统不可或缺的一部分。

3.4 Servo

伺服电机(Servo Motor)在鱼缸自动喂食器中的应用是用于精确控制食物投放动作的装置。伺服电机能在特定角度范围内精准定位,这对于确保鱼饲料每次投放的适量非常关键。

在鱼缸自动喂食器中,伺服电机的工作原理如下:

  1. 投放机构:伺服电机通过传动机构(如齿轮、连杆等)连接到食物投放部件,如螺旋推进器或者滑槽等,当伺服电机接收到指令后,旋转到预设的角度,推动饲料颗粒进入鱼缸。
  2. 定时定量喂食:通过编程设定,自动喂食器能够在指定的时间点驱动伺服电机工作,使得投放机构释放预先设定好的饲料量。

总之,伺服电机喂食器与鱼缸相适应,实现了鱼缸自动喂食的精准化、智能化和远程可控化,大大提高了养鱼爱好者的便利性和观赏鱼的饲养质量。

4. 遇到的问题

  1. 小爱同学如何接入HA,每天定时执行任务。解决办法:【Homeassistant 的Node-red插件之小爱同学语音功能开通】
  2. xiao esp32s3如何接入ESPHome。解决办法:【XIAO ESP32S3 sense 通过 ESPHome 与 Home Assistant 连接】

5. 程序设计

程序设计主要是

  1. ESP32S3 Sense 接入ESPHome设备实体yaml代码设计
  2. NodeRED自动化控制流模块配置

5.1 ESPHome设备接入

ESP32S3 Sense 接入ESPHome设备的完整代码如下

esphome:
  name: xiao-cam
  # friendly_name: xiao-cam

esp32:
  board: esp32-s3-devkitc-1
  framework:
    type: arduino


# Enable logging
logger:

# Enable Home Assistant API
api:
  encryption:
    key: "Fabc3YZ2bYG7x8WhupncrCMPqZuPMwxyeCPsgrbQIAI="

ota:
  password: "412c844a7b10765fcd89954e7587e5af"

wifi:
  ssid: "J09 502"
  password: "qwertyuiop111"
  # use_address: elkontrol1
  # use_address: elkontrol1.local

  # Enable fallback hotspot (captive portal) in case wifi connection fails
  ap:
    ssid: "Xiao Fallback Hotspot1"
    password: "YpeK5OYS4Xej"


captive_portal:
# Example configuration entry
external_components:
  - source:
      type: git
      url: https://github.com/MichaKersloot/esphome_custom_components
    components: [ esp32_camera ]


esp32_camera:
  external_clock:
    pin: GPIO10
    frequency: 20MHz
  i2c_pins:
    sda: GPIO40
    scl: GPIO39
  data_pins: [GPIO15, GPIO17, GPIO18, GPIO16, GPIO14, GPIO12, GPIO11, GPIO48]
  vsync_pin: GPIO38
  href_pin: GPIO47
  pixel_clock_pin: GPIO13

  # Image settings
  name: My Camera
  # ...

# Configuration for the status LED light
light:
  - platform: status_led
    id: light0
    name: "Voice Assistant State"
    pin:
      number: GPIO21
      inverted: true

# Configuration for I2S audio
i2s_audio:
  i2s_lrclk_pin: GPIO46 # Note: labeled as "useless"
  i2s_bclk_pin: GPIO42

# Configuration for the microphone using I2S audio
microphone:
  - platform: i2s_audio
    id: echo_microphone
    i2s_din_pin: GPIO41
    adc_type: external
    pdm: true

# Configuration for the Voice Assistant
voice_assistant:
  microphone: echo_microphone

# Configuration for the binary sensor (Boot Switch)
binary_sensor:    
  - platform: gpio
    pin: 
      number: GPIO2
      mode:
        input: true
        pullup: true
    name: Boot Switch
    internal: true
    on_press:
      - voice_assistant.start:
      - light.turn_off: light0
    on_release:
      - voice_assistant.stop:
      - light.turn_on: light0

# Example configuration entry (D2)
sensor:
  - platform: dht
    pin: GPIO7
    temperature:
      name: "Temperature"
    humidity:
      name: "Humidity"
    update_interval: 5s

number:
  - platform: template
    name: Servo Control
    min_value: -100
    max_value: 100
    step: 1
    set_action:
      then:
        - servo.write:
            id: my_servo
            level: !lambda 'return x / 100.0;'

# Example configuration entry
servo:
  - id: my_servo
    output: pwm_output

# Example output platform
# On ESP32, use ledc output
output:
  - platform: ledc
    id: pwm_output
    pin: GPIO8
    frequency: 50 Hz

这段ESPhome配置文件描述了一台基于ESP32-S3芯片的设备(命名为"xiao-cam")的各种配置项,主要用于控制和监控鱼缸环境,并且整合了摄像、音频输入输出、LED指示灯、温湿度传感器以及伺服电机等功能。

  1. 基础配置:设备名为xiao-cam,ESP32框架选用arduino,主板类型为esp32-s3-devkitc-1。开启日志记录功能,并配置Home Assistant API以供远程访问,其中包含API加密密钥。Wi-Fi连接信息,包括SSID、密码,以及在Wi-Fi连接失败时启用的备用热点(captive portal)。
  2. 外部组件:从MichaKersloot的GitHub仓库拉取自定义组件,其中包括esp32_camera组件。
  3. 摄像头配置:配置ESP32-CAM模块的引脚分配和外接晶振频率,用于驱动OV2640摄像头。
  4. LED指示灯:创建一个状态LED灯,当语音助手激活或关闭时,改变LED状态。
  5. 麦克风与语音助手:使用I2S音频接口设置麦克风,用于拾音,并将麦克风绑定到语音助手服务。
  6. 二进制传感器(开机按钮):配置一个GPIO引脚作为开机按钮,按下时启动语音助手服务并关闭LED指示灯,松开时停止语音助手服务并打开LED指示灯。
  7. 温湿度传感器:使用DHT传感器采集鱼缸环境的温度和湿度,每5秒更新一次数据。
  8. 模板数值控制:创建一个虚拟数显控制器,用于调整伺服电机的角度,当数值改变时,将数值映射到伺服电机的控制水平。
  9. 伺服电机:配置一个伺服电机,通过PWM输出控制,这里的输出平台是ledc,也就是LED PWM控制器。
  10. 输出平台配置:设置一个LED PWM输出通道,用于驱动伺服电机,配置了输出频率为50Hz。

综上所述,这段配置文件旨在实现一个具备拍照、录音、语音唤醒、环境温湿度监测以及伺服电机控制等多种功能的智能鱼缸配件。通过ESP32-S3开发板,该设备能够接入家庭自动化系统,实现高度定制化的自动化控制。

5.2 NodeRED控制流

  1. 小爱同学语言播报,测试是否故障
    在这里插入图片描述
    Json代码
[
    {
        "id": "31531595a3887301",
        "type": "tab",
        "label": "小爱同学配置",
        "disabled": false,
        "info": "",
        "env": []
    },
    {
        "id": "01c4904dbc06f88c",
        "type": "inject",
        "z": "31531595a3887301",
        "name": "",
        "props": [
            {
                "p": "payload"
            },
            {
                "p": "topic",
                "vt": "str"
            }
        ],
        "repeat": "",
        "crontab": "",
        "once": false,
        "onceDelay": 0.1,
        "topic": "",
        "payload": "",
        "payloadType": "date",
        "x": 260,
        "y": 120,
        "wires": [
            [
                "5d641ec6b07a673c"
            ]
        ]
    },
    {
        "id": "95179cc4df24244c",
        "type": "debug",
        "z": "31531595a3887301",
        "name": "debug 1",
        "active": true,
        "tosidebar": true,
        "console": false,
        "tostatus": false,
        "complete": "false",
        "statusVal": "",
        "statusType": "auto",
        "x": 820,
        "y": 120,
        "wires": []
    },
    {
        "id": "d03f58e01f4a16b3",
        "type": "inject",
        "z": "31531595a3887301",
        "name": "",
        "props": [
            {
                "p": "payload"
            },
            {
                "p": "topic",
                "vt": "str"
            }
        ],
        "repeat": "",
        "crontab": "",
        "once": false,
        "onceDelay": 0.1,
        "topic": "",
        "payload": "",
        "payloadType": "date",
        "x": 220,
        "y": 220,
        "wires": [
            [
                "a89d1daebe024134"
            ]
        ]
    },
    {
        "id": "8d8e1bd016c64e63",
        "type": "debug",
        "z": "31531595a3887301",
        "name": "debug 2",
        "active": true,
        "tosidebar": true,
        "console": false,
        "tostatus": false,
        "complete": "false",
        "statusVal": "",
        "statusType": "auto",
        "x": 740,
        "y": 220,
        "wires": []
    },
    {
        "id": "5d641ec6b07a673c",
        "type": "xiaoai-volume",
        "z": "31531595a3887301",
        "name": "",
        "xiaoai": "c8dc251df8e97718",
        "volume": "11",
        "device": "",
        "x": 460,
        "y": 120,
        "wires": [
            [
                "95179cc4df24244c"
            ],
            []
        ]
    },
    {
        "id": "a89d1daebe024134",
        "type": "api-call-service",
        "z": "31531595a3887301",
        "name": "测试小爱同学",
        "server": "9e5db24f.d50e5",
        "version": 5,
        "debugenabled": false,
        "domain": "xiaomi_miot",
        "service": "intelligent_speaker",
        "areaId": [],
        "deviceId": [],
        "entityId": [
            "sensor.xiaomi_lx04_5e02_conversation"
        ],
        "data": "{\"text\":\"你好鸭!欢迎来到智慧实验室,我是鹏鹏的小助手\"}",
        "dataType": "jsonata",
        "mergeContext": "",
        "mustacheAltTags": false,
        "outputProperties": [
            {
                "property": "payload",
                "propertyType": "msg",
                "value": "测试小爱同学成功",
                "valueType": "str"
            }
        ],
        "queue": "none",
        "x": 480,
        "y": 220,
        "wires": [
            [
                "8d8e1bd016c64e63"
            ]
        ]
    },
    {
        "id": "6f985e77ba2239d8",
        "type": "inject",
        "z": "31531595a3887301",
        "name": "触发器",
        "props": [
            {
                "p": "payload"
            },
            {
                "p": "topic",
                "vt": "str"
            }
        ],
        "repeat": "",
        "crontab": "",
        "once": false,
        "onceDelay": 0.1,
        "topic": "",
        "payload": "",
        "payloadType": "date",
        "x": 150,
        "y": 380,
        "wires": [
            [
                "c87ec627c3d65acc"
            ]
        ]
    },
    {
        "id": "cdf9b42ee3b909ee",
        "type": "debug",
        "z": "31531595a3887301",
        "name": "打印调试",
        "active": true,
        "tosidebar": true,
        "console": false,
        "tostatus": false,
        "complete": "payload",
        "targetType": "msg",
        "statusVal": "",
        "statusType": "auto",
        "x": 1040,
        "y": 380,
        "wires": []
    },
    {
        "id": "c87ec627c3d65acc",
        "type": "xiaoai-volume",
        "z": "31531595a3887301",
        "name": "",
        "xiaoai": "c8dc251df8e97718",
        "volume": "43",
        "device": "",
        "x": 320,
        "y": 380,
        "wires": [
            [
                "06efbebf06c2e680"
            ],
            [
                "710be66d9ae5fa19"
            ]
        ]
    },
    {
        "id": "710be66d9ae5fa19",
        "type": "api-call-service",
        "z": "31531595a3887301",
        "name": "小助手故障提醒",
        "server": "41ef4b78.2e2ab4",
        "version": 5,
        "debugenabled": false,
        "domain": "smtp",
        "service": "notify",
        "areaId": [],
        "deviceId": [],
        "entityId": [],
        "data": "{\t   \"message\":\"<b>当前智慧实验室小助手失效,请重新检测设备</b>\",\t   \"title\":\"消息来自HomeAssistant\",\t   \"email\":\"3126171871@qq.com\"\t}",
        "dataType": "jsonata",
        "mergeContext": "",
        "mustacheAltTags": false,
        "outputProperties": [
            {
                "property": "payload",
                "propertyType": "msg",
                "value": "小助手故障提醒",
                "valueType": "str"
            }
        ],
        "queue": "none",
        "x": 700,
        "y": 420,
        "wires": [
            [
                "cdf9b42ee3b909ee"
            ]
        ]
    },
    {
        "id": "06efbebf06c2e680",
        "type": "api-call-service",
        "z": "31531595a3887301",
        "name": "测试小爱同学",
        "server": "9e5db24f.d50e5",
        "version": 5,
        "debugenabled": false,
        "domain": "xiaomi_miot",
        "service": "intelligent_speaker",
        "areaId": [],
        "deviceId": [],
        "entityId": [
            "sensor.xiaomi_lx04_5e02_conversation"
        ],
        "data": "{\"text\":\"你好鸭!欢迎来到智慧实验室,我是鹏鹏的小助手\"}",
        "dataType": "jsonata",
        "mergeContext": "",
        "mustacheAltTags": false,
        "outputProperties": [
            {
                "property": "payload",
                "propertyType": "msg",
                "value": "测试小爱同学成功",
                "valueType": "str"
            }
        ],
        "queue": "none",
        "x": 700,
        "y": 320,
        "wires": [
            [
                "cdf9b42ee3b909ee"
            ]
        ]
    },
    {
        "id": "c8dc251df8e97718",
        "type": "xiaoai-tts-configurator",
        "name": "小爱"
    },
    {
        "id": "9e5db24f.d50e5",
        "type": "server",
        "name": "Home Assistant",
        "addon": true
    },
    {
        "id": "41ef4b78.2e2ab4",
        "type": "server",
        "name": "Home Assistant",
        "version": 5,
        "addon": true,
        "rejectUnauthorizedCerts": true,
        "ha_boolean": "y|yes|true|on|home|open",
        "connectionDelay": true,
        "cacheJson": true,
        "heartbeat": false,
        "heartbeatInterval": "30",
        "areaSelector": "friendlyName",
        "deviceSelector": "friendlyName",
        "entitySelector": "friendlyName",
        "statusSeparator": "at: ",
        "statusYear": "hidden",
        "statusMonth": "short",
        "statusDay": "numeric",
        "statusHourCycle": "h23",
        "statusTimeFormat": "h:m",
        "enableGlobalContextStore": true
    }
]
  1. 喂鱼自动化,每天12点自动喂鱼
    在这里插入图片描述
    Json代码
[
    {
        "id": "13c9e0ee685611ac",
        "type": "tab",
        "label": "喂鱼自动化",
        "disabled": false,
        "info": "",
        "env": []
    },
    {
        "id": "2ee71350eab9a05b",
        "type": "inject",
        "z": "13c9e0ee685611ac",
        "name": "",
        "props": [
            {
                "p": "payload"
            },
            {
                "p": "topic",
                "vt": "str"
            }
        ],
        "repeat": "",
        "crontab": "00 12 * * *",
        "once": true,
        "onceDelay": 0.1,
        "topic": "",
        "payload": "",
        "payloadType": "date",
        "x": 260,
        "y": 100,
        "wires": [
            [
                "fd353374c78d82f8"
            ]
        ]
    },
    {
        "id": "87a1d11f9c89367d",
        "type": "debug",
        "z": "13c9e0ee685611ac",
        "name": "debug 3",
        "active": false,
        "tosidebar": true,
        "console": false,
        "tostatus": false,
        "complete": "false",
        "statusVal": "",
        "statusType": "auto",
        "x": 1060,
        "y": 380,
        "wires": []
    },
    {
        "id": "2e6d7d5839debb53",
        "type": "api-call-service",
        "z": "13c9e0ee685611ac",
        "name": "舵机90度",
        "server": "41ef4b78.2e2ab4",
        "version": 5,
        "debugenabled": false,
        "domain": "number",
        "service": "set_value",
        "areaId": [
            "ke_ting"
        ],
        "deviceId": [
            "dc2bd470f44cfb196986ae81f0c54a1b"
        ],
        "entityId": [
            "number.servo_control"
        ],
        "data": "{\"value\":100}",
        "dataType": "jsonata",
        "mergeContext": "",
        "mustacheAltTags": false,
        "outputProperties": [
            {
                "property": "payload",
                "propertyType": "msg",
                "value": "舵机90度",
                "valueType": "str"
            }
        ],
        "queue": "none",
        "x": 800,
        "y": 100,
        "wires": [
            [
                "508e5a9410e2423c"
            ]
        ]
    },
    {
        "id": "a81f43e407aa0c35",
        "type": "api-call-service",
        "z": "13c9e0ee685611ac",
        "name": "舵机0度",
        "server": "41ef4b78.2e2ab4",
        "version": 5,
        "debugenabled": false,
        "domain": "number",
        "service": "set_value",
        "areaId": [
            "ke_ting"
        ],
        "deviceId": [
            "dc2bd470f44cfb196986ae81f0c54a1b"
        ],
        "entityId": [
            "number.servo_control"
        ],
        "data": "{\"value\":-100}",
        "dataType": "jsonata",
        "mergeContext": "",
        "mustacheAltTags": false,
        "outputProperties": [
            {
                "property": "payload",
                "propertyType": "msg",
                "value": "舵机0度",
                "valueType": "str"
            }
        ],
        "queue": "none",
        "x": 400,
        "y": 220,
        "wires": [
            [
                "7a2b85ccb60380df"
            ]
        ]
    },
    {
        "id": "45dbf177629c65d5",
        "type": "api-call-service",
        "z": "13c9e0ee685611ac",
        "name": "舵机90度",
        "server": "41ef4b78.2e2ab4",
        "version": 5,
        "debugenabled": false,
        "domain": "number",
        "service": "set_value",
        "areaId": [
            "ke_ting"
        ],
        "deviceId": [
            "dc2bd470f44cfb196986ae81f0c54a1b"
        ],
        "entityId": [
            "number.servo_control"
        ],
        "data": "{\"value\":100}",
        "dataType": "jsonata",
        "mergeContext": "",
        "mustacheAltTags": false,
        "outputProperties": [
            {
                "property": "payload",
                "propertyType": "msg",
                "value": "舵机90度",
                "valueType": "str"
            }
        ],
        "queue": "none",
        "x": 860,
        "y": 220,
        "wires": [
            [
                "c595f13eb99d5d01"
            ]
        ]
    },
    {
        "id": "d4dce4fd5a1de16d",
        "type": "api-call-service",
        "z": "13c9e0ee685611ac",
        "name": "舵机0度",
        "server": "41ef4b78.2e2ab4",
        "version": 5,
        "debugenabled": false,
        "domain": "number",
        "service": "set_value",
        "areaId": [
            "ke_ting"
        ],
        "deviceId": [
            "dc2bd470f44cfb196986ae81f0c54a1b"
        ],
        "entityId": [
            "number.servo_control"
        ],
        "data": "{\"value\":-100}",
        "dataType": "jsonata",
        "mergeContext": "",
        "mustacheAltTags": false,
        "outputProperties": [
            {
                "property": "payload",
                "propertyType": "msg",
                "value": "舵机0度",
                "valueType": "str"
            }
        ],
        "queue": "none",
        "x": 480,
        "y": 380,
        "wires": [
            [
                "07266ceecfd9a08f"
            ]
        ]
    },
    {
        "id": "508e5a9410e2423c",
        "type": "delay",
        "z": "13c9e0ee685611ac",
        "name": "",
        "pauseType": "delay",
        "timeout": "5",
        "timeoutUnits": "seconds",
        "rate": "1",
        "nbRateUnits": "1",
        "rateUnits": "second",
        "randomFirst": "1",
        "randomLast": "5",
        "randomUnits": "seconds",
        "drop": false,
        "allowrate": false,
        "outputs": 1,
        "x": 1060,
        "y": 100,
        "wires": [
            [
                "a81f43e407aa0c35"
            ]
        ]
    },
    {
        "id": "c595f13eb99d5d01",
        "type": "delay",
        "z": "13c9e0ee685611ac",
        "name": "",
        "pauseType": "delay",
        "timeout": "5",
        "timeoutUnits": "seconds",
        "rate": "1",
        "nbRateUnits": "1",
        "rateUnits": "second",
        "randomFirst": "1",
        "randomLast": "5",
        "randomUnits": "seconds",
        "drop": false,
        "allowrate": false,
        "outputs": 1,
        "x": 1180,
        "y": 220,
        "wires": [
            [
                "d4dce4fd5a1de16d"
            ]
        ]
    },
    {
        "id": "7a2b85ccb60380df",
        "type": "delay",
        "z": "13c9e0ee685611ac",
        "name": "",
        "pauseType": "delay",
        "timeout": "5",
        "timeoutUnits": "seconds",
        "rate": "1",
        "nbRateUnits": "1",
        "rateUnits": "second",
        "randomFirst": "1",
        "randomLast": "5",
        "randomUnits": "seconds",
        "drop": false,
        "allowrate": false,
        "outputs": 1,
        "x": 640,
        "y": 220,
        "wires": [
            [
                "45dbf177629c65d5"
            ]
        ]
    },
    {
        "id": "07266ceecfd9a08f",
        "type": "api-call-service",
        "z": "13c9e0ee685611ac",
        "name": "结束喂鱼",
        "server": "41ef4b78.2e2ab4",
        "version": 5,
        "debugenabled": false,
        "domain": "xiaomi_miot",
        "service": "intelligent_speaker",
        "areaId": [],
        "deviceId": [],
        "entityId": [
            "sensor.xiaomi_lx04_5e02_conversation"
        ],
        "data": "{\"text\":\"小爱同学已经喂鱼成功啦\"}",
        "dataType": "jsonata",
        "mergeContext": "",
        "mustacheAltTags": false,
        "outputProperties": [
            {
                "property": "payload",
                "propertyType": "msg",
                "value": "结束喂鱼",
                "valueType": "str"
            }
        ],
        "queue": "none",
        "x": 800,
        "y": 380,
        "wires": [
            [
                "87a1d11f9c89367d"
            ]
        ]
    },
    {
        "id": "fd353374c78d82f8",
        "type": "api-call-service",
        "z": "13c9e0ee685611ac",
        "name": "开始喂鱼",
        "server": "41ef4b78.2e2ab4",
        "version": 5,
        "debugenabled": false,
        "domain": "xiaomi_miot",
        "service": "intelligent_speaker",
        "areaId": [],
        "deviceId": [],
        "entityId": [
            "sensor.xiaomi_lx04_5e02_conversation"
        ],
        "data": "{\"text\":\"小爱同学开始喂鱼啦\"}",
        "dataType": "jsonata",
        "mergeContext": "",
        "mustacheAltTags": false,
        "outputProperties": [
            {
                "property": "payload",
                "propertyType": "msg",
                "value": "测试小爱同学成功",
                "valueType": "str"
            }
        ],
        "queue": "none",
        "x": 460,
        "y": 100,
        "wires": [
            [
                "2e6d7d5839debb53"
            ]
        ]
    },
    {
        "id": "41ef4b78.2e2ab4",
        "type": "server",
        "name": "Home Assistant",
        "version": 5,
        "addon": true,
        "rejectUnauthorizedCerts": true,
        "ha_boolean": "y|yes|true|on|home|open",
        "connectionDelay": true,
        "cacheJson": true,
        "heartbeat": false,
        "heartbeatInterval": "30",
        "areaSelector": "friendlyName",
        "deviceSelector": "friendlyName",
        "entitySelector": "friendlyName",
        "statusSeparator": "at: ",
        "statusYear": "hidden",
        "statusMonth": "short",
        "statusDay": "numeric",
        "statusHourCycle": "h23",
        "statusTimeFormat": "h:m",
        "enableGlobalContextStore": true
    }
]
  1. 开灯自动化
    在这里插入图片描述
    Json代码
[
    {
        "id": "10765693b6bcfeaf",
        "type": "tab",
        "label": "开灯自动化",
        "disabled": false,
        "info": "",
        "env": []
    },
    {
        "id": "3eca89300da6a067",
        "type": "api-call-service",
        "z": "10765693b6bcfeaf",
        "name": "开灯",
        "server": "9e5db24f.d50e5",
        "version": 5,
        "debugenabled": false,
        "domain": "light",
        "service": "turn_on",
        "areaId": [
            "ke_ting"
        ],
        "deviceId": [
            "dc2bd470f44cfb196986ae81f0c54a1b"
        ],
        "entityId": [
            "light.voice_assistant_state"
        ],
        "data": "",
        "dataType": "jsonata",
        "mergeContext": "",
        "mustacheAltTags": false,
        "outputProperties": [
            {
                "property": "payload",
                "propertyType": "msg",
                "value": "开灯",
                "valueType": "str"
            }
        ],
        "queue": "none",
        "x": 810,
        "y": 300,
        "wires": [
            [
                "d4b489b84d3a1a11"
            ]
        ]
    },
    {
        "id": "d16b213857492fcb",
        "type": "time-range-switch",
        "z": "10765693b6bcfeaf",
        "name": "",
        "lat": "",
        "lon": "",
        "startTime": "07:28",
        "endTime": "12:28",
        "startOffset": 0,
        "endOffset": 0,
        "x": 550,
        "y": 320,
        "wires": [
            [
                "784f9bc1adca590d"
            ],
            [
                "3eca89300da6a067"
            ]
        ]
    },
    {
        "id": "784f9bc1adca590d",
        "type": "api-call-service",
        "z": "10765693b6bcfeaf",
        "name": "关灯",
        "server": "9e5db24f.d50e5",
        "version": 5,
        "debugenabled": false,
        "domain": "light",
        "service": "turn_off",
        "areaId": [
            "ke_ting"
        ],
        "deviceId": [
            "dc2bd470f44cfb196986ae81f0c54a1b"
        ],
        "entityId": [
            "light.voice_assistant_state"
        ],
        "data": "",
        "dataType": "jsonata",
        "mergeContext": "",
        "mustacheAltTags": false,
        "outputProperties": [
            {
                "property": "payload",
                "propertyType": "msg",
                "value": "关灯",
                "valueType": "str"
            }
        ],
        "queue": "none",
        "x": 790,
        "y": 400,
        "wires": [
            [
                "d4b489b84d3a1a11"
            ]
        ]
    },
    {
        "id": "d4b489b84d3a1a11",
        "type": "debug",
        "z": "10765693b6bcfeaf",
        "name": "debug 5",
        "active": true,
        "tosidebar": true,
        "console": false,
        "tostatus": false,
        "complete": "false",
        "statusVal": "",
        "statusType": "auto",
        "x": 1000,
        "y": 360,
        "wires": []
    },
    {
        "id": "56a173656eee3993",
        "type": "inject",
        "z": "10765693b6bcfeaf",
        "name": "",
        "props": [
            {
                "p": "payload"
            },
            {
                "p": "topic",
                "vt": "str"
            }
        ],
        "repeat": "",
        "crontab": "0 7-13 * * *",
        "once": false,
        "onceDelay": 0.1,
        "topic": "",
        "payload": "",
        "payloadType": "date",
        "x": 370,
        "y": 320,
        "wires": [
            [
                "d16b213857492fcb"
            ]
        ]
    },
    {
        "id": "1ff3db3ea7622884",
        "type": "inject",
        "z": "10765693b6bcfeaf",
        "name": "",
        "props": [
            {
                "p": "payload"
            },
            {
                "p": "topic",
                "vt": "str"
            }
        ],
        "repeat": "",
        "crontab": "",
        "once": false,
        "onceDelay": 0.1,
        "topic": "",
        "payload": "",
        "payloadType": "date",
        "x": 650,
        "y": 220,
        "wires": [
            [
                "3eca89300da6a067"
            ]
        ]
    },
    {
        "id": "6c19a3bec41654a6",
        "type": "inject",
        "z": "10765693b6bcfeaf",
        "name": "",
        "props": [
            {
                "p": "payload"
            },
            {
                "p": "topic",
                "vt": "str"
            }
        ],
        "repeat": "",
        "crontab": "",
        "once": false,
        "onceDelay": 0.1,
        "topic": "",
        "payload": "",
        "payloadType": "date",
        "x": 650,
        "y": 460,
        "wires": [
            [
                "784f9bc1adca590d"
            ]
        ]
    },
    {
        "id": "9e5db24f.d50e5",
        "type": "server",
        "name": "Home Assistant",
        "addon": true
    }
]

6. 效果展示

实物图制作

在这里插入图片描述
主视图
在这里插入图片描述
侧视图

6.1 HA界面

在这里插入图片描述
这个概览界面显示小爱同学和ESP32S3 Sense设备接入情况

  1. 滑动Servo control控制喂食
  2. 点击Voice Assistant State鱼缸补光
  3. 查看当前鱼缸外围温湿度
  4. 通过My Camera实时摸鱼

6.2 NodeRED自动化

设计每天12定时喂鱼,喂鱼效果如下,下面是滑动Servo control-100~100
在这里插入图片描述

测试小爱同学,点击触发就可让小爱同学发声
在这里插入图片描述

7. 总结

这是我第五次参加嵌入式相关的网上比赛活动
● 第一次是RT-Thread的【基于RT-Thread+RA6M4的智能鱼缸系统设计之鱼我所欲也】活动,作品是2022年暑假做的获得第六名,还是比较开心!
● 第二次2023年寒假做的是【基于MAX7800羽毛板语音控制ESP8266小车】,成绩还不错第七名,让对小车车的可玩性又近了一步!
● 第三次2023年春做的【基于腾讯云的CH32V307开发板远程机械臂小车】,由于图床引用CSDN导致最后评审没有显示出来,最后获得安慰奖!
● 第四次2023年冬做的【FastBond2阶段2——基于ESP32C3开发的简易IO调试设备 - 电子森林 (eetree.cn) 】 ,最终获得三等奖,再接再厉哦!
● 第五次实现了【基于LicheePi-4A的 人脸识别系统软件设计】,人脸识别系统软件设计和调试全流程,加深了对tkinter GUI设计思路,对LicheePi-4A 国产单板计算机更有信心,最终获得参与奖!

这一次我又回到最开始,用HA重新做了一遍,发现代码量减少许多,对智能家居有更深刻认识啦!😘😘😘
建议:

  1. 希望硬禾与Seeed多多合作定期举办博客活动,让更加优质的国产嵌入式生态做大做强;
  2. 期待硬禾平台推出更多有质量有意义持续性的创客活动!
    非常硬禾举行寒假在家一起练活动,大家都为这个国内嵌入式生态出一份力,只要努力认真做了都会有所收获,期盼这些作品在将来某一天为构建美好未来贡献一份微博之力!

我后期会持续更新我测评的一系列国内开发板测评,并且会积极参加有质量的玄铁杯活动🛹🛹🛹每天都一点点结合实际需求联动丰富生活,从而实现对外部世界进行充分的感知,尽最大努力认识这个有机与无机的环境,科学地合理地进行创作和发挥效益,然后为人类社会发展贡献一点微薄之力。🤣🤣🤣

🥳🥳🥳再次非常感谢硬禾的相关组织者支持等等🥳🥳🥳期待这一次的成绩哟!

参考文献:

  1. 【树莓派安装Homeassistant及基本配置】
  2. 【XIAO ESP32S3 sense 通过 ESPHome 与 Home Assistant连接】
  3. 【Homeassistant的Node-red插件之小爱同学语音功能开通】

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1525003.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

sadtalker-api/

———— 下载sadtalker工程文件&#xff0c;包括844个模型 。。。。。。。。。。。。。。。。 配置环境&#xff1a; pip源&#xff0c;设置&#xff1a; pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple anaconda prompt, 进入命令行 how在 …

【教学类-44-07】20240318 0-9数字描字帖 A4横版整页(宋体、黑体、文鼎虚线体、print dashed 德彪行书行楷)

背景需求: 前文制作了三种字体的A4横版数字描字帖 【教学类-44-06】20240318 0-9数字描字帖 A4横版整页&#xff08;宋体、黑体、文鼎虚线体&#xff09;-CSDN博客【教学类-44-06】20240318 0-9数字描字帖 A4横版整页&#xff08;宋体、黑体、文鼎虚线体&#xff09;https://…

蓝桥杯刷题 Day36 倒计时26天 纯练题的一天

[蓝桥杯 2022 省 B] 积木画 题目描述 小明最近迷上了积木画&#xff0c;有这么两种类型的积木&#xff0c;分别为 I 型&#xff08;大小为 2个单位面积) 和 L 型 (大小为 3 个单位面积): 同时&#xff0c;小明有一块面积大小为2N 的画布&#xff0c;画布由2N 个 11 区域构成。…

vb.net+zxing.net随机彩色二维码、条形码

需要zxing库支持ZXing.NET Generate QR Code & Barcode in C# Alternatives | IronBarcode 效果图&#xff1a; 思路&#xff1a;先生成1个单位的二维码&#xff0c;然后再通过像素填充颜色&#xff0c;颜色数组要通过洗牌算法 洗牌算法 Dim shuffledCards As New List(…

docker-compose 部署nginx和jdk步骤

** yum安装jdk ** 1、​​yum -y list java* 查看可安装java版本 选择安装 java-1.8.0-openjdk-accessibility.x86_64 2、​​yum install -y java-1.8.0-openjdk-devel.x86_64 耐心等待安装完成即可 3、​java -version​​ 即可查看当前安装的java版本 4、yum安装的jdk&am…

Java代码审计安全篇-XXE(XML外部实体注入)漏洞

前言&#xff1a; 堕落了三个月&#xff0c;现在因为被找实习而困扰&#xff0c;着实自己能力不足&#xff0c;从今天开始 每天沉淀一点点 &#xff0c;准备秋招 加油 注意&#xff1a; 本文章参考qax的网络安全java代码审计&#xff0c;记录自己的学习过程&#xff0c;还希望各…

HTML5+CSS3小实例:衣服颜色选择器

实例:衣服颜色选择器 技术栈:HTML+CSS 效果: 源码: 【HTML】 <!DOCTYPE html> <html lang="zh-CN"> <head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=…

软件杯 深度学习 python opencv 实现人脸年龄性别识别

文章目录 0 前言1 项目课题介绍2 关键技术2.1 卷积神经网络2.2 卷积层2.3 池化层2.4 激活函数&#xff1a;2.5 全连接层 3 使用tensorflow中keras模块实现卷积神经网络4 Keras介绍4.1 Keras深度学习模型4.2 Keras中重要的预定义对象4.3 Keras的网络层构造 5 数据集处理训练5.1 …

262:vue+openlayers 移动地图获取中心点经纬度信息

第262个 点击查看专栏目录 本示例介绍演示如何在vue+openlayers中移动地图并获取中心点经纬度信息。这里主要用到了是view的getCenter方法,这一功能在实际项目中很有用,能给出一个清晰的定位。 直接复制下面的 vue+openlayers源代码,操作2分钟即可运行实现效果 文章目录 示…

解决后端传给前端的日期问题

解决方式&#xff1a; 1). 方式一 在属性上加上注解&#xff0c;对日期进行格式化 但这种方式&#xff0c;需要在每个时间属性上都要加上该注解&#xff0c;使用较麻烦&#xff0c;不能全局处理。 2). 方式二&#xff08;推荐 ) 在WebMvcConfiguration中扩展SpringMVC的消息转…

JDBC基础(CRUD)使用详解(mysql)

1. 什么是JDBC JDBC,即Java Database Connectivity,java数据库连接.是一种用于执行SQL语句的Java API,它是 Java中的数据库连接规范.这个API由 java.sql.*,javax.sql.* 包中的一些类和接口组成,它为Java 开发人员操作数据库提供了一个标准的API,可以为多种关系数据库提供统一访…

测试人员Bug书写规范

&#x1f4cb; 个人简介 作者简介&#xff1a;大家好&#xff0c;我是凝小飞&#xff0c;软件测试领域作者支持我&#xff1a;点赞&#x1f44d;收藏⭐️留言&#x1f4dd; 在测试人员日常工作中&#xff0c;关于bug的编写和定义是一个比较经常的工作&#xff0c;如果bug编写描…

FPGA高端项目:FPGA基于GS2971+GS2972架构的SDI视频收发+HLS多路视频融合叠加,提供1套工程源码和技术支持

目录 1、前言免责声明 2、相关方案推荐本博已有的 SDI 编解码方案本方案的SDI接收发送本方案的SDI接收图像缩放应用本方案的SDI接收纯verilog图像缩放纯verilog多路视频拼接应用本方案的SDI接收HLS图像缩放HLS多路视频拼接应用本方案的SDI接收OSD多路视频融合叠加应用本方案的S…

【Flink SQL】Flink SQL 基础概念(四):SQL 的时间属性

《Flink SQL 基础概念》系列&#xff0c;共包含以下 5 篇文章&#xff1a; Flink SQL 基础概念&#xff08;一&#xff09;&#xff1a;SQL & Table 运行环境、基本概念及常用 APIFlink SQL 基础概念&#xff08;二&#xff09;&#xff1a;数据类型Flink SQL 基础概念&am…

Java多线程实战-CountDownLatch模拟压测实现

&#x1f3f7;️个人主页&#xff1a;牵着猫散步的鼠鼠 &#x1f3f7;️系列专栏&#xff1a;Java全栈-专栏 &#x1f3f7;️本系列源码仓库&#xff1a;多线程并发编程学习的多个代码片段(github) &#x1f3f7;️个人学习笔记&#xff0c;若有缺误&#xff0c;欢迎评论区指正…

QT UI窗口常见操作

MainWidget::MainWidget(QWidget *parent): QWidget(parent), ui(new Ui::MainWidget) {ui->setupUi(this);// 设置主窗口背景颜色QPalette plt;plt.setColor(QPalette::Window,QColor(180,220,130));this->setPalette(plt);// 禁止窗口最大化按钮setWindowFlags(windowF…

【前端Vue】Vue3+Pinia小兔鲜电商项目第1篇:认识Vue3,1. Vue3组合式API体验【附代码文档】

全套笔记资料代码移步&#xff1a; 前往gitee仓库查看 感兴趣的小伙伴可以自取哦&#xff0c;欢迎大家点赞转发~ 全套教程部分目录&#xff1a; 部分文件图片&#xff1a; 认识Vue3 1. Vue3组合式API体验 通过 Counter 案例 体验Vue3新引入的组合式API vue <script> ex…

Python爬虫与数据可视化源码免费领取

引言 作为一名在软件技术领域深耕多年的专业人士&#xff0c;我不仅在软件开发和项目部署方面积累了丰富的实践经验&#xff0c;更以卓越的技术实力获得了&#x1f3c5;30项软件著作权证书的殊荣。这些成就不仅是对我的技术专长的肯定&#xff0c;也是对我的创新精神和专业承诺…

Ubuntu18.04 中编译 TI 官方的ros驱动包中 autonomous_robotics_ros 包所存在的问题及解决方案

环境&#xff1a; 安装有 ROS 系统的 Ubuntu18.04 环境&#xff0c;并且已将 TI 官方的毫米波雷达 ROS 驱动下载到Ubuntu18.04系统中&#xff0c;如需获取此代码请点击此链接根据教程下载即可。 代码下载链接&#xff1a;TI IWR6843ISK ROS驱动程序搭建-CSDN博客 问题1&…

天软专业课 C语言 24

文章目录 基础知识进制转换字符在计算机内部的表示 程序设计的基本概念程序结构化程序设计 C程序设计的初识简单的C程序标识符、常量与变量整型数据实型数据字符型数据算数表达式赋值表达式自加自减与逗号运算符 顺序结构赋值语句数据的输出数据的输入复合语句与空语句程序实例…