1. 项目概述:为什么选择涂鸦IoT来改造直流变频风扇?
最近在折腾一个挺有意思的玩意儿:把一台普通的直流变频风扇,改造成能通过手机App远程控制、语音操控,甚至能接入智能家居场景的“聪明”风扇。听起来像是智能家居厂商的成品,对吧?但这次我选择不走寻常路,用涂鸦IoT的开发平台自己动手做一个原型。这不仅仅是为了实现功能,更是想深入理解一下,一个消费级的智能硬件,从零到一的原型开发到底要经历哪些环节,以及涂鸦的生态到底能给我们这些开发者提供多大的便利。
直流变频风扇本身是个好东西,相比传统的交流风扇,它更省电、噪音更低,而且调速范围更广、更平顺。但市面上很多所谓的“智能变频风扇”,其智能部分往往是个黑盒,功能固定,无法深度自定义,更别提后续的扩展了。用涂鸦IoT平台来改造,核心目标就是打破这个黑盒,获得完全的控制权。你可以自定义风扇的开关、风速档位(精确到百分比)、摇头模式、定时开关,甚至结合温湿度传感器实现自动启停。涂鸦提供了从硬件模组、嵌入式SDK、云平台到手机App端的一整套解决方案,让我们可以专注于产品逻辑本身,而不用从零开始搭建云端服务和移动应用。
这个项目非常适合有一定嵌入式开发基础(比如玩过Arduino、ESP32)、对智能硬件感兴趣的朋友。无论你是想为自己的小窝添置一个独一无二的智能风扇,还是想学习消费级IoT产品的完整开发流程,这个原型开发过程都会给你带来不少收获。接下来,我就把从硬件选型、电路设计、固件开发,到云平台配置、功能调试的完整过程,以及其中踩过的坑和总结的经验,毫无保留地分享出来。
2. 核心硬件选型与电路设计解析
动手之前,得先把“武器”准备好。硬件是整个项目的物理基础,选型是否合理直接决定了后续开发的难度和产品的稳定性。
2.1 主控与联网模组的选择
这是最关键的一步。涂鸦平台支持多种联网模组,如Wi-Fi、蓝牙、Zigbee等。对于风扇这种通常位于家庭固定位置、且有持续供电的设备, Wi-Fi模组 是最直接的选择,它能让设备直接连接家庭路由器,无需网关,手机App就能全球范围内控制。
涂鸦官方提供了丰富的Wi-Fi模组,对于开发者原型来说,我强烈推荐使用 涂鸦WB3S模组 。理由如下:
- 开发友好 :WB3S基于乐鑫ESP8266,这是一款资料极其丰富的芯片,有Arduino核心支持,意味着我们可以用熟悉的Arduino IDE进行开发,极大降低了入门门槛。
- 成本与集成度 :模组本身集成了射频电路、天线和Flash,外围电路简单,价格也相当有竞争力。
-
官方支持
:涂鸦提供了专门的Arduino库
Tuya-ESP8266-MCU-SDK,封装了与涂鸦云的通信协议,我们只需关心业务逻辑,通信细节由SDK处理。
除了模组,我们还需要一个MCU(微控制器)来驱动风扇电机并处理逻辑吗?这取决于风扇电机的控制方式。许多直流变频风扇的驱动板本身就是一个MCU,接收PWM(脉冲宽度调制)信号来控制转速。在这种情况下,我们可以选择 “MCU方案” :即WB3S模组作为通信协处理器,另一个MCU(如STM32或Arduino)作为主控。但为了极致简化,如果风扇驱动板支持直接通过IO口或简单的协议控制,我们可以采用 “SoC方案” :即直接使用WB3S模组上的ESP8266作为唯一主控,既负责联网,也负责生成控制风扇的PWM信号。本项目原型为了简洁,采用SoC方案,前提是风扇电机驱动接口要足够简单。
2.2 直流变频风扇电机接口剖析
改造前,必须搞清楚原有风扇的控制接口。拆开一台典型的直流变频风扇,其控制板通常会引出以下几组线:
- 电源输入 :通常是12V或24V直流电源适配器接口。
- 电机驱动输出 :连接无刷直流电机(BLDC)的3相线(U, V, W)。
-
控制信号输入
:这可能是按键面板的排线,或者直接是几个控制引脚。我们需要关注的就是这部分。常见信号包括:
- PWM调速线 :一根线,输入一个0-5V或0-3.3V的PWM信号,占空比对应风扇转速。
- 使能/开关线 :一根线,高电平或低电平控制电机启停。
- 摇头电机控制线 :通常是两根线,控制一个小型同步电机的正反转来实现摇头。
注意 :在拆解和测量时,务必断开电源!使用万用表测量按键按下时各引脚的电压变化,是判断信号类型最直接的方法。记录下有效控制电平是3.3V还是5V,这关系到后续与WB3S模组的电平匹配。
2.3 原型电路搭建设计
基于SoC方案,我们的电路连接将非常简洁:
- WB3S模组 :VCC和GND连接一个稳定的 3.3V电源 。 重要提示 :虽然ESP8266的工作电压是3.3V,但WB3S模组上的LDO(低压差线性稳压器)允许输入更宽的电压(如5V)。但为了稳定,建议直接提供3.3V。可以从原风扇控制板的3.3V稳压芯片处取电,或者使用一个额外的AMS1117-3.3稳压模块从风扇的12V主电源降压得到。
-
控制信号连接
:
- 将WB3S的某个GPIO(例如GPIO4)连接到风扇的 PWM调速线 。
- 将另一个GPIO(例如GPIO5)连接到风扇的 使能线 。
- 再将两个GPIO(例如GPIO12, GPIO13)连接到摇头电机的控制继电器或H桥电路(用于控制正反转)。
- 电平转换 :如果风扇控制信号是5V电平,而WB3S的GPIO是3.3V且不耐5V输入,则必须加入电平转换电路。一个简单的分压电阻网络(如1kΩ和2kΩ电阻串联)或专用的电平转换芯片(如TXS0108E)是必要的,否则可能烧毁模组。
我建议在面包板或洞洞板上先搭建这个最小系统进行功能验证,确认每个GPIO都能正确控制对应功能后,再考虑制作PCB。
3. 涂鸦IoT平台配置与产品创建
硬件连好了,接下来就要在“云端”给我们的设备一个身份和一套能力定义。这是涂鸦平台的核心优势所在。
3.1 创建产品与选择功能点
首先,登录涂鸦IoT平台。在“产品”页面创建一个新产品,品类可以选择“家电” -> “风扇”。关键步骤在于 “功能定义” 。这里你需要像搭积木一样,为你的智能风扇添加它所能支持的所有功能,涂鸦称之为 DP点 。
根据我们的原型设计,至少需要添加以下标准功能点:
- 开关 :布尔型DP,用于控制风扇电源。
- 风速档位 :枚举型或数值型DP。枚举型可以是“低、中、高”几档;但我更推荐使用 数值型 ,范围0-100,这对应PWM的0-100%占空比,可以实现无级调速,体验更好。
- 摇头开关 :布尔型DP,控制是否摇头。
- 摇头角度 :枚举型DP,可选“30°”、“60°”、“90°”、“120°”等(如果支持)。
- 定时关机 :数值型DP,单位分钟,设置多少分钟后自动关闭。
每个DP点都有唯一的标识符
code
,后续在固件代码中,我们就通过这个
code
来上报和接收数据。
3.2 面板配置与App关联
功能定义好后,需要为产品配置一个 操作面板 。涂鸦提供了丰富的模板,你可以选择一个现成的风扇面板进行微调,也可以使用“可视化”工具自定义布局。这里可以设置面板上每个按钮、滑块对应控制哪个DP点。
配置完成后, 最重要的一步是发布产品 。只有发布后,你才能在涂鸦智能App中通过“扫码添加”或“自动发现”找到并绑定你的设备原型。发布时,平台会为这个产品生成一个唯一的 PID 。这个PID就是设备的“身份证号”,必须在固件代码中正确填写,设备才能成功激活并连接到正确的产品云端。
实操心得 :在开发测试阶段,涂鸦平台提供了“调试模式”或“开发证书”。使用开发证书烧录的固件,设备只能被添加到“涂鸦智能”App的特定开发项目下,而不会出现在公开市场。这保证了测试的私密性。务必在平台上下载并妥善保管你的开发证书(
product.key和product.secret),它们需要被放入固件代码中。
4. 固件开发详解:从初始化到业务逻辑
这是整个项目的代码核心。我们将使用Arduino IDE进行开发。
4.1 环境搭建与SDK初始化
首先,在Arduino IDE中安装ESP8266开发板支持,并通过库管理器搜索安装
Tuya-ESP8266-MCU-SDK
库。
新建一个项目,核心代码结构如下:
#include <TuyaWifi.h>
#include <TuyaLight.h> // 或其他控制类,这里风扇控制我们主要用通用DP
// 定义涂鸦Wi-Fi对象
TuyaWifi my_device;
// 定义连接到风扇的GPIO引脚
#define FAN_PWM_PIN 4 // GPIO4, PWM调速
#define FAN_ENABLE_PIN 5 // GPIO5,使能控制
#define SWING_MOTOR_A_PIN 12
#define SWING_MOTOR_B_PIN 13
// 定义DP点的ID,必须与云平台创建的一致
#define DPID_SWITCH 1 // 开关
#define DPID_FAN_SPEED 2 // 风速
#define DPID_SWING_SWITCH 3 // 摇头开关
// 存储当前设备状态的变量
bool power_state = false;
int fan_speed = 0; // 0-100
bool swing_state = false;
void setup() {
Serial.begin(9600);
// 初始化硬件引脚
pinMode(FAN_ENABLE_PIN, OUTPUT);
pinMode(SWING_MOTOR_A_PIN, OUTPUT);
pinMode(SWING_MOTOR_B_PIN, OUTPUT);
analogWriteRange(100); // 设置PWM范围0-100,便于直接映射风速值
analogWrite(FAN_PWM_PIN, 0);
digitalWrite(FAN_ENABLE_PIN, LOW); // 初始关闭
// 初始化涂鸦Wi-Fi模块
my_device.init("你的产品PID", "你的MCU软件版本号");
my_device.setDeviceResetPin(0); // 如果需要硬件复位,设置对应引脚
// 注册DP点处理回调函数
my_device.setDpFuncHandle(dp_process);
// 进入配网模式(SmartConfig或AP模式)
my_device.startSmartConfig(); // 或 my_device.startAPConfig();
}
void loop() {
my_device.uart_service(); // 必须循环调用,处理与Wi-Fi模组的通信
// 其他循环任务...
}
4.2 DP点数据处理与风扇控制逻辑
核心在于回调函数
dp_process
,它负责处理从App或云端下发的控制指令。
void dp_process(uint8_t dpid, const uint8_t value[], uint32_t len) {
switch(dpid) {
case DPID_SWITCH: // 开关
power_state = value[0];
digitalWrite(FAN_ENABLE_PIN, power_state ? HIGH : LOW);
if (!power_state) {
// 关闭时,同时停止PWM输出
analogWrite(FAN_PWM_PIN, 0);
fan_speed = 0;
}
// 状态变化后,需要主动上报当前状态给云端,确保App显示同步
my_device.mcu_dp_update(DPID_SWITCH, value, 1);
break;
case DPID_FAN_SPEED: // 风速
fan_speed = value[0]; // 假设是数值型,直接取值0-100
if (power_state) { // 只有开机状态才调整风速
analogWrite(FAN_PWM_PIN, fan_speed); // 将0-100映射到PWM占空比
}
my_device.mcu_dp_update(DPID_FAN_SPEED, &fan_speed, 1);
break;
case DPID_SWING_SWITCH: // 摇头开关
swing_state = value[0];
if (swing_state) {
// 控制摇头电机正转
digitalWrite(SWING_MOTOR_A_PIN, HIGH);
digitalWrite(SWING_MOTOR_B_PIN, LOW);
} else {
// 停止摇头电机
digitalWrite(SWING_MOTOR_A_PIN, LOW);
digitalWrite(SWING_MOTOR_B_PIN, LOW);
}
my_device.mcu_dp_update(DPID_SWING_SWITCH, &swing_state, 1);
break;
default:
break;
}
}
4.3 配网功能实现
设备第一次使用需要连接家庭Wi-Fi。涂鸦SDK提供了两种主流配网方式:
-
SmartConfig
:手机App发送包含Wi-Fi SSID和密码的加密包,设备在混杂模式下监听捕获。在
setup()中调用my_device.startSmartConfig()后,设备进入等待配网状态。用户在App上输入家庭Wi-Fi密码,即可完成配网。这种方式最便捷。 -
AP模式
:设备自身开启一个Wi-Fi热点(如
SmartLife-XXXX),用户手机连接这个热点后,通过浏览器访问特定页面(如192.168.4.1)来配置网络。调用my_device.startAPConfig()即可。
在代码中,我们需要监听配网状态的变化,并在连接成功后,保存网络信息以避免每次上电重新配网。
// 在loop中或通过事件回调检查状态
TY_RESP_STAT_E_T status = my_device.getWfNetState();
if (status == STAT_LOW_POWER) {
// 低功耗模式,通常不会
} else if (status == STAT_UNPROVISION) {
// 未配网
} else if (status == STAT_AP_STA_UNCONFIG) {
// AP模式未配置
} else if (status == STAT_AP_STA_CONFIG) {
// AP模式已配置
} else if (status == STAT_STA_UNCONFIG) {
// STA模式未配置
} else if (status == STAT_STA_CONFIG) {
// STA模式已配置,连接路由器中
} else if (status == STAT_CLOUD_CONN) {
Serial.println("设备已连接涂鸦云!");
// 连接成功后,可以主动上报一次所有DP点状态
report_all_dp_status();
} else if (status == STAT_AP_CLOUD_CONN) {
// AP模式且云连接
} else if (status == STAT_STA_AP_CLOUD_CONN) {
// STA&AP模式且云连接
}
5. 调试、烧录与功能验证全流程
代码写完了,接下来就是把它“灌入”硬件并验证一切是否按预期工作。
5.1 编译与烧录注意事项
- 开发板选择 :在Arduino IDE中,选择开发板为 “NodeMCU 1.0 (ESP-12E Module)”。虽然我们是WB3S模组,但其核心与NodeMCU兼容。
-
端口选择
:通过USB转TTL串口模块连接WB3S的
TX、RX、GND引脚。连接时注意,WB3S的TX接串口模块的RX,RX接TX。同时,需要将WB3S的IO0引脚在烧录时拉低(接地),进入下载模式。烧录完成后,断开IO0与地的连接,复位设备。 - 烧录参数 :Flash Size选择“4MB (FS:3MB OTA:~512KB)”,这为后续可能的OTA升级留出空间。Upload Speed可以用“921600”以加快速度。
-
证书烧录
:首次烧录前,需要先将从涂鸦平台下载的开发证书(
product.key和product.secret)通过涂鸦提供的 “涂鸦生产烧录授权平台” 或使用tuya-iotos-embedded工具烧录到模组的Flash特定位置。这是设备激活的必需步骤。SDK库中通常包含一个示例工具或说明。
5.2 上电调试与问题排查
烧录完成后,给设备上电。打开串口监视器(波特率通常为9600),观察日志输出。正常流程应该是:
- 模组启动,打印初始化信息。
- 进入配网模式(打印相关提示)。
- 手机打开“涂鸦智能”App,确保在同一Wi-Fi网络下,按照提示添加设备(选择“智能家居”->“添加设备”->“自动发现”或“扫码添加”)。
- 配网成功后,串口会打印连接路由器和涂鸦云成功的日志。
- 在App的设备面板上操作开关、调速滑块,观察串口是否收到对应的DP点数据,同时观察风扇是否响应。
常见问题与排查技巧实录:
| 问题现象 | 可能原因 | 排查步骤 |
|---|---|---|
| 串口无任何输出 | 电源问题、串口接线错误、波特率不对 |
1. 检查3.3V电源是否稳定。2. 确认TX/RX交叉连接。3. 尝试不同的波特率(115200, 9600)。4. 检查
IO0
引脚是否已悬空(非下载模式)。
|
| 一直打印配网提示,无法连接 | Wi-Fi信号弱、密码错误、路由器设置了MAC过滤或隔离 | 1. 将设备靠近路由器。2. 确认手机App输入的Wi-Fi密码正确。3. 检查路由器后台,暂时关闭AP隔离或MAC过滤功能。4. 尝试使用AP配网模式。 |
| App显示设备离线 | 设备未成功连接云端、本地网络问题、PID/证书错误 |
1. 查看串口日志,确认是否有“cloud connected”或类似信息。2. 重启家中路由器。3.
重点检查
:固件中填写的PID、以及烧录的
product.key/secret
是否与IoT平台创建的产品完全一致。这是最易出错的地方。
|
| App操作无反应,但串口收到数据 | 硬件控制引脚连接错误、电平不匹配、风扇驱动板需特定时序 | 1. 用万用表或LED测试控制引脚在收到指令时是否有电压变化。2. 检查是否需要电平转换。3. 查阅原风扇驱动板资料,看控制信号是否需要特定波形或初始化序列。 |
| 控制功能错乱(如开关控制摇头) |
DP点ID (
dpid
) 在代码与云平台定义不一致
|
逐一核对代码中每个
#define DPID_XXX
的数值,是否与涂鸦IoT平台产品功能定义页面里每个DP点的“标识符”完全一致。
|
踩坑心得 :在调试初期,建议在
dp_process函数的每个case里都加入详细的串口打印,例如Serial.printf("DP %d received, value: %d\n", dpid, value[0]);。这能让你清晰地看到数据流,快速定位问题是出在通信链路还是硬件控制端。另外,涂鸦SDK的网络状态机需要你在loop()中持续调用my_device.uart_service(),如果这里被长时间阻塞(比如用了delay(1000)),会导致网络心跳超时而掉线。
6. 功能进阶与场景联动探索
基础遥控功能实现后,涂鸦平台的威力才真正开始显现。我们可以让风扇变得更“聪明”。
6.1 实现温湿度自动控制
只需添加一个廉价的DHT11或DHT22温湿度传感器到电路中(连接WB3S的另一个GPIO),就能实现自动化。 在固件中,定期(如每30秒)读取温湿度值。然后,你可以设定简单的规则:
if (temperature > 28.0 && !power_state) {
// 温度高于28度且风扇关闭时,自动打开风扇并设置到中等风速
power_state = true;
fan_speed = 50;
digitalWrite(FAN_ENABLE_PIN, HIGH);
analogWrite(FAN_PWM_PIN, fan_speed);
// 上报状态
my_device.mcu_dp_update(DPID_SWITCH, &power_state, 1);
my_device.mcu_dp_update(DPID_FAN_SPEED, &fan_speed, 1);
}
更进一步,你甚至可以在涂鸦IoT平台上创建“场景联动”,设置“当温湿度传感器检测到温度高于XX度时,自动开启风扇”。这需要传感器也接入涂鸦生态。
6.2 利用涂鸦云API与第三方平台集成
涂鸦开放了丰富的云API。这意味着你可以编写一个简单的脚本(Python、Node.js等),调用涂鸦云API获取风扇的状态或发送控制指令。这样,你就可以:
- 将风扇控制集成到自己的家庭自动化服务器(如Home Assistant)中,虽然涂鸦本身支持与HA集成,但自定义API提供了更多灵活性。
- 创建定时任务,比如在工作日的晚上10点自动关闭风扇。
- 与天气API结合,在暴雨来临前自动关闭窗户并调低风扇风速。
6.3 OTA远程升级
这是产品化至关重要的一步。涂鸦平台支持OTA升级。你需要:
-
在平台上传编译好的新版本固件(
.bin文件)。 - 在设备代码中,确保启用了OTA功能,并正确处理升级回调事件。
- 通过App或云API向设备推送升级指令。 设备在空闲时会下载新固件并校验,然后在下次重启时完成更新。这让你可以在产品部署后,远程修复bug或增加新功能。
7. 从原型到产品的思考
完成一个可以工作的原型只是第一步。如果你真的想把它变成一个稳定、可靠、可以小规模使用的产品,还需要考虑更多:
- 电源稳定性 :风扇电机启停时会有电流冲击,可能引起3.3V电源的波动,导致Wi-Fi模组重启。解决方案是使用独立的LDO或DC-DC为模组供电,并在电源输入处增加大电容缓冲。
- PCB设计 :洞洞板不是长久之计。使用KiCad或EasyEDA设计一块简单的PCB,将WB3S、电平转换电路、电源模块集成在一起,会稳定和美观得多。
- 外壳与安全 :为整个控制板设计一个绝缘外壳,确保高压部分(12V/24V电源)与低压部分(3.3V控制电路)完全隔离,防止触电风险。
- 认证与合规 :如果计划销售,需要关注无线电型号核准、安全规范等认证,这是一笔不小的投入。
- 量产烧录 :涂鸦提供了量产烧录工具和方案,可以批量烧录PID、证书和固件。
通过这个“Prototype a Tuya IoT Connected DC Inverter Fan”项目,我们不仅获得了一个个性化的智能风扇,更走通了一个典型的消费级IoT设备从概念到原型的全流程。涂鸦的生态确实大幅降低了联网和云服务的门槛,让我们能聚焦在产品创意和硬件交互本身。最难的部分往往不是代码本身,而是对原有硬件的逆向工程、电平匹配的细节以及调试过程中耐心的排查。希望这份详细的记录,能帮你少走些弯路。

2万+

被折叠的 条评论
为什么被折叠?



