去年夏天改造卧室风扇的经历让我意识到,给普通风扇加上智能控制模块远没有想象中复杂。这个基于HTML的智慧风扇方案,本质上是通过网页界面实现对风扇的远程控制,核心是用前端技术构建控制面板,再通过微控制器搭建硬件桥梁。相比市面上的成品智能风扇,自制方案成本能控制在百元以内,还能完全自定义功能逻辑。
这个项目特别适合两类人:一是想给老家电升级智能控制的DIY爱好者,二是前端开发者想接触硬件交互的入门实践。整个过程不涉及复杂的电路改造,主要工作量集中在网页控制端的开发上。最终实现的效果是:在手机或电脑浏览器输入特定地址,就能调节风扇风速、设置定时关闭,甚至根据温湿度自动启停。
主控芯片推荐使用NodeMCU ESP8266开发板,这是性价比最高的选择(约25元)。它同时具备WiFi功能和GPIO接口,内置的微控制器可以直接运行Arduino代码。相比树莓派等方案,ESP8266功耗更低,持续运行也不会发热。
风扇改装部分需要准备:
重要提示:务必选择带有光耦隔离的继电器模块,避免高压电路对开发板造成损坏。我最初用的廉价继电器就曾导致开发板烧毁。
电路搭建其实只有三个关键连接点:
温湿度传感器接法:
整个接线过程不需要焊接,用杜邦线插接即可完成。建议先用面包板测试所有功能正常,再转移到洞洞板固定。
控制界面采用Bootstrap5快速构建响应式布局,核心元素包括:
html复制<div class="container">
<div class="speed-control">
<input type="range" id="speedSlider" min="0" max="3" step="1">
<div class="speed-labels">
<span>关闭</span><span>低速</span>
<span>中速</span><span>高速</span>
</div>
</div>
<div class="timer-control">
<select id="timerSelect">
<option value="0">常开</option>
<option value="30">30分钟</option>
<option value="60">1小时</option>
</select>
</div>
</div>
样式设计要点:
通过WebSocket建立实时双向通信,关键代码逻辑:
javascript复制const socket = new WebSocket('ws://'+location.hostname+':81');
// 发送控制指令
function sendCommand(cmd, value) {
const msg = {[cmd]: value};
socket.send(JSON.stringify(msg));
}
// 接收硬件状态
socket.onmessage = function(event) {
const data = JSON.parse(event.data);
if(data.temp) updateTempDisplay(data.temp);
if(data.humidity) updateHumidityDisplay(data.humidity);
};
使用Arduino IDE开发,核心依赖库:
网络服务初始化代码:
cpp复制void setup() {
Serial.begin(115200);
WiFi.softAP("SmartFanAP", "12345678"); // 创建热点
webSocket.begin();
webSocket.onEvent(webSocketEvent);
pinMode(FAN_PIN, OUTPUT);
dht.begin();
}
void loop() {
webSocket.loop();
if(millis() - lastSensorRead > 2000) {
readSensorData();
}
}
接收到的JSON指令解析示例:
cpp复制void handleCommand(String cmd, String value) {
if(cmd == "speed") {
int speed = value.toInt();
analogWrite(FAN_PIN, speed * 255 / 3); // 将0-3档转为PWM值
}
else if(cmd == "timer") {
unsigned long timeout = value.toInt() * 60000UL;
if(timeout > 0) fanTurnOffTime = millis() + timeout;
}
}
在loop()中添加智能判断逻辑:
cpp复制float comfortIndex = computeTHI(temp, humidity); // 计算温湿指数
if(comfortIndex > 26 && !fanRunning) {
setFanSpeed(2); // 自动开启中速档
}
else if(comfortIndex < 24 && fanRunning) {
setFanSpeed(0); // 自动关闭
}
温湿指数(THI)计算公式:
THI = (1.8 × 温度 + 32) - (0.55 - 0.0055 × 湿度) × (1.8 × 温度 - 26)
通过记录运行时间估算耗电量:
cpp复制struct EnergyUsage {
float wattHours = 0;
unsigned long lastUpdate;
void update(int speedLevel) {
unsigned long now = millis();
float hours = (now - lastUpdate) / 3600000.0;
wattHours += getWattage(speedLevel) * hours;
lastUpdate = now;
}
float getWattage(int level) {
const float levels[] = {0, 25, 50, 75}; // 各档位功率(W)
return levels[constrain(level, 0, 3)];
}
};
典型排查步骤:
可能原因及对策:
校准技巧:
cpp复制float smoothTemp = 0;
void readSensor() {
float raw = dht.readTemperature();
smoothTemp = smoothTemp * 0.7 + raw * 0.3;
}
淘汰传统的三档位控制,实现平滑调速:
通过以下方式增加语音控制:
摆脱对云服务的依赖:
这个项目最让我惊喜的是,用如此简单的技术组合就实现了媲美商业产品的功能。实际使用半年后,建议重点优化电源稳定性——我在继电器模块前加装了电容滤波后,故障率直接降为零。如果要做第二版,我会尝试用ESP32替代8266,以获得更流畅的网页交互体验。