25、实践:语音控制智能风扇

实践:语音控制智能风扇

1. 概述

本文将介绍如何打造一个语音控制的智能风扇,涵盖了硬件配置、解决方案架构以及具体的实现步骤。通过该项目,我们可以实践配置 ESP32 的 GPIO 引脚,连接本地 Wi-Fi 网络,开发 AWS 云端的后端服务,并利用 Amazon Alexa 实现语音控制功能。

2. 技术要求

2.1 代码和库

2.2 硬件清单

面包板原型阶段
  • ESP32 开发板
  • 面包板、四个触觉按钮和跳线
  • 至少带有三个继电器的继电器模块(5V DC 输入驱动 230V AC 输出)
  • 3.3V 到 5V 的逻辑转换器(如 AZ - Delivery TXS0108E 逻辑电平转换模块)
  • 电源(如 ELEGOO 套件中的电源模块)
最终成品阶段
  • 具有三个速度档位的风扇(如 Daewoo 12 英寸台式便携式风扇)
  • 电源模块(如 AZ - Delivery 220V 到 5V 迷你电源模块)
  • 第一个原型中的组件:ESP32 开发板、继电器模块和逻辑转换器
  • 用于组装组件、电线和接头的通用 PCB

2.3 注意事项

在第二个原型中,将组件组装到通用 PCB 上需要焊接设备和一定的焊接技能,并且涉及高压电操作,测试由市电供电的风扇时需采取所有必要的预防措施。

2.4 账户准备

如果之前未完成相关示例,需要创建 Amazon 和 Alexa 开发者账户,可参考: https://developer.amazon.com/en-US/docs/alexa/smarthome/steps-to-build-a-smart-home-skill.html#prerequisites

2.5 代码演示视频

查看代码运行效果的视频: https://bit.ly/3xsLbdI

3. 智能风扇功能列表

功能 描述
停止按钮 有一个按钮开关用于停止风扇
速度调节按钮 有三个按钮用于改变风扇速度,分别为低速、正常速度和高速
语音控制 支持 Alexa 语音控制,可通过语音命令改变风扇速度
状态同步 在 AWS IoT Core 上跟踪风扇的当前状态,保持设备和云端状态一致

4. 解决方案架构

4.1 设备固件

设备固件主要由以下组件构成:

graph LR
    classDef process fill:#E5F6FF,stroke:#73A6FF,stroke-width:2px;
    A(GPIO 控制器):::process --> B(Wi-Fi 通信模块):::process
    A --> C(AWS 通信模块):::process
    B --> C
    D(输入引脚 - 按钮):::process --> A
    A --> E(输出引脚 - 继电器):::process
    C --> F(云端):::process
  • GPIO 控制器 :配置和驱动 ESP32 的 GPIO 引脚,四个输入引脚读取按钮状态,三个输出引脚控制继电器。按下停止按钮时,所有继电器关闭;按下速度按钮时,相应继电器打开。同时与 AWS 模块通信,发送按钮状态信息并接收 Alexa 语音命令。
  • Wi-Fi 通信模块 :根据 SSID 和密码连接本地 Wi-Fi 网络,连接成功后通知 AWS 模块连接 AWS 云端。
  • AWS 通信模块 :监控云端请求,将请求传递给 GPIO 模块设置/重置继电器引脚;用户按下按钮时,将风扇速度信息传递给云端。

4.2 云架构

graph LR
    classDef process fill:#E5F6FF,stroke:#73A6FF,stroke-width:2px;
    A(智能风扇):::process --> B(AWS IoT Core - 设备):::process
    B --> C(Lambda 函数):::process
    C --> D(Alexa Voice Service):::process
    D --> E(用户):::process
    E --> D
    D --> C
    C --> B
    B --> A
  • 创建 IoT 事物 :在 Amazon IoT Core 上创建一个事物作为智能风扇的云端表示,风扇和事物的状态变化将同步。
  • Lambda 函数 :作为事物和 Alexa Voice Service (AVS) 之间的桥梁,解析来自 Alexa 技能的请求并根据上下文回复,根据 Alexa 命令更新事物状态,最终实现物理设备的速度变化。在 Lambda 函数中实现 Alexa.PowerLevelController 接口,参考文档: https://developer.amazon.com/en-US/docs/alexa/device-apis/alexa-powerlevelcontroller.html
  • Alexa 智能家庭技能 :创建并配置 Alexa 智能家庭技能,提供现成的语音交互模型,用户可以使用百分比形式的语音命令,如“Alexa,将智能风扇设置为 40%”或“Alexa,将智能风扇速度提高 10%”。

5. 实现步骤

5.1 创建智能家庭技能

  1. 登录 Amazon 开发者控制台: https://developer.amazon.com/alexa/console/ask
  2. 创建名为 myhome_smartfan 的技能,选择 Smart Home 模型
  3. 记录页面上的技能 ID,格式类似 amzn1.ask.skill.

5.2 创建 Lambda 函数

  1. 创建角色
    • 编辑文件 lambda_trust_policy.json,内容如下:
{
    "Version": "2012-10-17",
    "Statement": [{
        "Effect": "Allow",
        "Principal": {
            "Service": "lambda.amazonaws.com"
        },
        "Action": "sts:AssumeRole"
    }]
}
- 使用以下命令创建角色:
$ aws iam create-role --role-name smartfan_lambda_role --assume-role-policy-document file://lambda_trust_policy.json
- 记录角色的 Amazon Resource Name (ARN),格式类似 arn:aws:iam::<your_account_id>:role/smartfan_lambda_role
  1. 创建策略
    • 编辑文件 lambda_permissions.json,内容如下:
{
    "Version": "2012-10-17",
    "Statement": [{
            "Effect": "Allow",
            "Action": [
                "logs:CreateLogGroup",
                "logs:CreateLogStream",
                "logs:PutLogEvents",
                "logs:DescribeLogStreams"
            ],
            "Resource": "arn:aws:logs:*:*:*"
        },
        {
            "Effect": "Allow",
            "Action": [
                "iot:*"
            ],
            "Resource": "arn:aws:iot:*:*:*"
        }
    ]
}
- 使用以下命令创建策略:
$ aws iam create-policy --policy-name smartfan_lambda_policy --policy-document file://lambda_permissions.json
- 记录策略 ARN,格式类似 arn:aws:iam::<your_account_number>:policy/smartfan_lambda_policy
  1. 附加策略到角色
$ aws iam attach-role-policy --role-name smartfan_lambda_role --policy-arn <the_policy_ARN>
  1. 创建临时代码文件
    创建文件 lambda_function.py,内容如下:
import json
def lambda_handler(request, context):
    pass
  1. 创建代码包
$ zip lambda_package.zip lambda_function.py
  1. 创建 Lambda 函数
$ aws lambda create-function --function-name smartfan_lambda \
--zip-file fileb://lambda_package.zip \
--handler 'lambda_function.lambda_handler' \
--runtime python3.8 \
--role <the_role_ARN>

记录 Lambda 函数的 ARN,格式类似 arn:aws:lambda: : :function:smartfan_lambda
7. 创建触发
由于没有命令行选项,需要登录 AWS 网页控制台( https://aws.amazon.com/console/ ),导航到 Lambda 服务中的 smartfan_handler 函数,从 Alexa 开发者控制台复制技能 ID,点击 + Add trigger 后使用技能 ID 作为触发配置参数。
8. 关联 Lambda ARN 到技能
复制 Lambda ARN 并返回技能配置页面,将 Lambda ARN 粘贴到标记为 Default endpoint* 的文本框中,点击保存按钮。

5.3 账户关联

  1. 在 Alexa 开发者控制台中导航到技能的 ACCOUNT LINKING,填写以下信息:
  2. 点击配置页面上的保存按钮完成账户关联
  3. 登录 https://alexa.amazon.com/ ,在 DEV SKILLS 中找到 myhome_smartfan,点击 ENABLE 按钮,若配置正确,页面将显示成功消息,关闭成功页面时跳过发现过程。

5.4 创建事物

  1. 创建事物
$ aws iot create-thing --thing-name myhome_fan1
  1. 创建策略文件 myhome_fan1_policy.json,内容如下:
{
    "Version": "2012-10-17",
    "Statement": [{
            "Effect": "Allow",
            "Action": [
                "iot:*"
            ],
            "Resource": "arn:aws:iot:*:*:*"
        }
    ]
}
  1. 创建策略
$ aws iot create-policy \
    --policy-name myhome_fan1_policy \
    --policy-document file://myhome_fan1_policy.json
  1. 创建证书和公私钥对
$ aws iot create-keys-and-certificate \
    --certificate-pem-outfile "certificate.pem.crt" \
    --public-key-outfile "public.pem.key" \
    --private-key-outfile "private.pem.key" \
    --set-as-active

记录证书 ARN,将密钥嵌入设备固件中。
5. 附加策略到证书

$ aws iot attach-policy \
    --policy-name myhome_fan1_policy \
    --target <certificate_ARN>
  1. 附加证书到事物
$ aws iot attach-thing-principal \
    --thing-name myhome_fan1 \
    --principal <certificate_ARN>

5.5 开发 Lambda 函数

在 Lambda 函数中,需要回复来自 AVS 的以下请求:
- 来自 Alexa.Discovery 命名空间的发现请求,用于查找与用户账户关联的风扇。
- 来自 Alexa.Authorization 命名空间的 AcceptGrant 请求,用于获取识别用户的凭证。
- 来自 Alexa.PowerLevelController 命名空间的 SetPowerLevel 请求,用于设置风扇的功率级别。
- 来自 Alexa.PowerLevelController 命名空间的 AdjustPowerLevel 请求,用于按指定量更改功率级别。
- 来自 Alexa 命名空间的 ReportState 请求,用于发送设备状态。
- 来自 Alexa.EndpointHealth 命名空间的连接状态。

import logging
import time
import json
import uuid
import boto3
from fan1_responses import *

logger = logging.getLogger()
logger.setLevel(logging.INFO)
client = boto3.client('iot-data')

def lambda_handler(request, context):
    try:
        logger.info("Directive:")
        logger.info(json.dumps(request, indent=4, sort_keys=True))
        request_namespace = request["directive"]["header"]["namespace"]
        request_name = request["directive"]["header"]["name"]
        corrTkn = ""
        if "correlationToken" in request["directive"]["header"]:
            corrTkn = request["directive"]["header"]["correlationToken"]

        if request_namespace == "Alexa.Discovery" and request_name == "Discover":
            response = gen_discovery_response()
        elif request_namespace == "Alexa.Authorization" and request_name == "AcceptGrant":
            response = gen_acceptgrant_response()
        elif request_namespace == "Alexa.PowerLevelController" and request_name == "SetPowerLevel":
            response = set_power_level(request["directive"]["payload"]["powerLevel"], corrTkn)
        elif request_namespace == "Alexa.PowerLevelController" and request_name == "AdjustPowerLevel":
            response = adj_power_level(request["directive"]["payload"]["powerLevelDelta"], corrTkn)
        elif request_namespace == "Alexa" and request_name == "ReportState":
            response = gen_report_state(corrTkn)
        else:
            logger.error("unexpected request")
            return response

        logger.info("Response:")
        logger.info(json.dumps(response, indent=4, sort_keys=True))
        return response
    except ValueError as error:
        logger.error(error)
        raise


下面详细介绍几个重要的辅助函数:

处理 SetPowerLevel 请求
def set_power_level(power_level, tkn):
    power_level = update_power(power_level)
    set_power_level_shadow(power_level)
    response = init_response(set_power_level_response, tkn, power_level)
    return response

set_power_level 函数中,首先调用 update_power 函数将功率级别归一化为以下值之一:
| 输入范围 | 归一化值 | 对应模式 |
| ---- | ---- | ---- |
| 0 | 0 | 风扇关闭 |
| 1 - 33 | 33 | 低速模式 |
| 34 - 66 | 66 | 正常速度模式 |
| > 66 | 100 | 高速模式 |

归一化后,调用 set_power_level_shadow 函数更新设备影子的期望状态:

def set_power_level_shadow(power_level):
    payload = json.dumps({'state': { 'desired': { 'powerlevel': power_level } }})
    response = client.update_thing_shadow(
        thingName = endpoint_id, 
        payload =  payload)
    logger.info("update shadow result: " + response['payload'].read().decode('utf-8'))

5.6 更新和测试 Lambda 函数

  1. 更新 Lambda 代码包
$ zip -u lambda_package.zip *.py
  1. 更新 AWS 上的 Lambda 代码
$ aws lambda update-function-code --function-name smartfan_lambda --zip-file fileb://./lambda_package.zip
  1. 测试所有请求类型
    示例请求可在 https://github.com/PacktPublishing/Internet-of-Things-with-ESP32/tree/main/ch12/smart_fan/aws 找到。
$ aws lambda invoke \
    --cli-binary-format raw-in-base64-out \
    --function-name smartfan_lambda \
    --payload file://./discovery_request.json \
    response.json

所有测试应返回状态码 200。

5.7 开发智能风扇固件

根据前面介绍的设备固件架构,开发智能风扇固件,实现 GPIO 控制、Wi-Fi 连接和 AWS 通信等功能。

5.8 语音命令测试

完成上述步骤后,使用 Alexa 语音命令测试智能风扇,验证风扇是否能根据语音指令正确调整速度。

总结

通过以上步骤,我们成功实现了一个语音控制的智能风扇。整个过程涵盖了硬件配置、云架构搭建、Lambda 函数开发和固件编程等多个方面。在实际操作中,需要注意 AWS 资源的配置和权限管理,以及设备固件与云端服务的通信协调。希望本文能为你开发智能设备提供有价值的参考。

graph LR
    classDef process fill:#E5F6FF,stroke:#73A6FF,stroke-width:2px;
    A(创建智能家庭技能):::process --> B(创建 Lambda 函数):::process
    B --> C(账户关联):::process
    C --> D(创建事物):::process
    D --> E(开发 Lambda 函数):::process
    E --> F(更新和测试 Lambda 函数):::process
    F --> G(开发智能风扇固件):::process
    G --> H(语音命令测试):::process

这个流程图展示了实现语音控制智能风扇的主要步骤,从技能创建到最终测试,各个步骤依次进行,形成一个完整的开发流程。

带开环升压转换器和逆变器的太阳能光伏系统 太阳能光伏系统驱动开环升压转换器和SPWM逆变器提供波形稳定、设计简单的交流电的模型 Simulink模型展示了一个完整的基于太阳能光伏的直流到交流电力转换系统,该系统由简单、透明、易于理解的模块构建而成。该系统从配置为提供真实直流输出电压的光伏阵列开始,然后由开环DC-DC升压转换器进行处理。升压转换器将光伏电压提高到适合为单相全桥逆变器供电的稳定直流链路电平。 逆变器使用正弦PWM(SPWM)开关来产生干净的交流输出波形,使该模型成为研究直流-交流转换基本操作的理想选择。该设计避免了闭环和MPPT的复杂性,使用户能够专注于光伏接口、升压转换和逆变器开关的核心概念。 此模型包含的主要功能: •太阳能光伏阵列在标准条件下产生~200V电压 •具有固定占空比操作的开环升压转换器 •直流链路电容器,用于平滑和稳定转换器输出 •单相全桥SPWM逆变器 •交流负载,用于观察实际输出行为 •显示光伏电压、升压输出、直流链路电压、逆变器交流波形和负载电流的组织良好的范围 •完全可编辑的结构,适合分析、实验和扩展 该模型旨在为太阳能直流-交流转换提供一个干净高效的仿真框架。布局简单明了,允许用户快速了解信号流,检查各个阶段,并根据需要修改参数。 系统架构有意保持模块化,因此可以轻松扩展,例如通过添加MPPT、动态负载行为、闭环升压控制或并网逆变器概念。该模型为进一步开发或整合到更大的可再生能源模拟中奠定了坚实的基础。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值