原创天气又转热了我给她做了个智能小风扇前言为什么需要智能风扇夏天来了气温一天天攀升。女朋友在房间里工作每次都要手动调节风扇的档位——温度高了要调快凉快了又要调慢非常麻烦。更别提晚上睡觉时她经常忘记关风扇第二天起来就感冒了。作为一个技术博主我决定用 Arduino 和传感器做一个智能小风扇让它能根据环境温度自动调节风速还能通过手机远程控制。这样一来她再也不用操心风扇的档位了真正实现“懒人式”清凉。## 项目概述这个智能风扇的核心功能包括1.温度自动调节通过 DHT11 温湿度传感器检测环境温度自动调整风扇转速温度越高风速越快2.手动控制模式通过手机 App 或网页端手动设置风速3.定时关机设定时间到后自动关闭风扇防止着凉4.节能模式当温度低于某个阈值时风扇自动停止## 硬件准备要完成这个项目你需要以下硬件- Arduino Uno 开发板 × 1- DHT11 温湿度传感器 × 1- L298N 电机驱动模块 × 1- 12V 直流风扇 × 1- 12V 电源适配器 × 1- 杜邦线和面包板若干- 可选ESP8266 WiFi 模块用于远程控制## 电路连接电路连接其实很简单主要分为三部分1. 传感器部分DHT11 的数据引脚连接到 Arduino 的数字引脚 22. 电机驱动部分L298N 的 IN1、IN2 控制风扇正反转这里只用正转ENA 控制速度3. 供电部分Arduino 用 USB 供电L298N 用 12V 电源供电 注意不要直接把风扇连接到 Arduino 的引脚上因为风扇需要的电流较大会烧坏板子。一定要用电机驱动模块。## 核心代码实现### 1. 基础温度控制代码这是最核心的部分——根据温度自动调节风扇转速。python# 智能风扇基础温度控制代码# 使用 MicroPython 编写适用于 ESP8266 或 Raspberry Pi Picoimport machineimport dhtimport time# 初始化温湿度传感器DHT11 连接到 GPIO 2sensor dht.DHT11(machine.Pin(2))# 初始化风扇控制引脚PWM 控制速度fan_pwm machine.PWM(machine.Pin(5))fan_pwm.freq(1000) # 设置 PWM 频率为 1kHz# 温度阈值设置TEMP_MIN 22 # 最低温度阈值摄氏度低于此值风扇停止TEMP_MAX 30 # 最高温度阈值达到此值风扇全速运转def calculate_speed(temperature): 根据温度计算风扇速度0-1023 if temperature TEMP_MIN: return 0 # 温度太低关闭风扇 elif temperature TEMP_MAX: return 1023 # 温度太高全速运转 else: # 线性插值温度在 TEMP_MIN 和 TEMP_MAX 之间 ratio (temperature - TEMP_MIN) / (TEMP_MAX - TEMP_MIN) return int(ratio * 1023)def main_loop(): 主循环读取温度并调节风扇 while True: try: sensor.measure() temp sensor.temperature() speed calculate_speed(temp) # 设置风扇速度 fan_pwm.duty(speed) print(f当前温度: {temp}°C, 风扇速度: {speed}) # 每 2 秒检测一次 time.sleep(2) except OSError as e: print(读取传感器失败重试中...) time.sleep(1)if __name__ __main__: main_loop()这段代码的逻辑很简单- 每隔 2 秒读取一次温度- 温度低于 22°C 时风扇不转节能- 温度在 22-30°C 之间时速度线性增加- 温度超过 30°C 时风扇全速运转### 2. 增加手动控制和定时功能上面的版本只有自动模式但我们还需要手动控制和定时功能。下面这段代码增加了这两个功能python# 智能风扇完整版自动控制 手动控制 定时功能# 使用 MicroPython 编写import machineimport dhtimport timeimport _thread # 使用多线程处理定时任务# 初始化硬件sensor dht.DHT11(machine.Pin(2))fan_pwm machine.PWM(machine.Pin(5))fan_pwm.freq(1000)# 全局变量current_mode auto # 当前模式auto/manualmanual_speed 0 # 手动模式下的速度timer_remaining 0 # 定时剩余时间秒fan_running True # 风扇是否运行def calculate_auto_speed(temperature): 自动模式下的速度计算 TEMP_MIN 22 TEMP_MAX 30 if temperature TEMP_MIN: return 0 elif temperature TEMP_MAX: return 1023 else: ratio (temperature - TEMP_MIN) / (TEMP_MAX - TEMP_MIN) return int(ratio * 1023)def timer_thread(): 定时器线程每秒检查一次定时时间 global timer_remaining, fan_running while True: if timer_remaining 0: timer_remaining - 1 print(f定时剩余: {timer_remaining} 秒) if timer_remaining 0: fan_running False fan_pwm.duty(0) print(定时结束风扇已关闭) time.sleep(1)def main_loop(): 主循环控制风扇运行 global current_mode, manual_speed, fan_running # 启动定时器线程 _thread.start_new_thread(timer_thread, ()) while True: try: # 读取温度 sensor.measure() temp sensor.temperature() # 根据模式设置速度 if current_mode auto: target_speed calculate_auto_speed(temp) print(f自动模式 - 温度: {temp}°C, 目标速度: {target_speed}) else: target_speed manual_speed print(f手动模式 - 速度: {manual_speed}) # 如果风扇在运行且未触发定时停止则设置速度 if fan_running: fan_pwm.duty(target_speed) time.sleep(2) except OSError as e: print(传感器错误保持当前状态) time.sleep(1)def set_manual_speed(speed): 设置手动模式速度0-1023 global current_mode, manual_speed current_mode manual manual_speed max(0, min(1023, speed)) print(f切换到手动模式速度设置为: {manual_speed})def set_timer(seconds): 设置定时关机秒 global timer_remaining timer_remaining seconds print(f定时器已设置: {seconds} 秒后关机)def switch_to_auto(): 切换回自动模式 global current_mode current_mode auto print(已切换到自动模式)if __name__ __main__: # 示例操作 print(智能风扇启动...) switch_to_auto() # 模拟用户操作实际中可通过按键或网络接口调用 # 假设用户想设置手动模式速度为 500并定时 30 分钟 # set_manual_speed(500) # set_timer(1800) # 30 分钟 1800 秒 main_loop()这段代码增加了三个重要功能-模式切换通过current_mode变量在自动和手动之间切换-定时关机使用独立的线程来倒计时不影响主循环-手动速度设置用户可以直接指定 0-1023 之间的速度值## 如何扩展到远程控制如果你想让风扇支持手机控制可以添加 ESP8266 WiFi 模块。基本思路是1. 在 Arduino 上运行一个简单的 Web 服务器2. 通过 HTTP GET/POST 请求来设置模式和速度3. 手机浏览器或 App 发送请求即可控制核心代码片段如下使用 ESP8266python# 简单的 Web 控制接口import networkimport socketdef start_web_server(): 启动 Web 服务器 # 连接 WiFi wlan network.WLAN(network.STA_IF) wlan.active(True) wlan.connect(你的WiFi名称, 密码) # 创建 socket 服务器 addr socket.getaddrinfo(0.0.0.0, 80)[0][-1] s socket.socket() s.bind(addr) s.listen(5) while True: conn, addr s.accept() request conn.recv(1024) # 解析请求中的命令 if b/speed?value500 in request: set_manual_speed(500) elif b/timer?seconds1800 in request: set_timer(1800) # 返回控制页面 response OK conn.send(response) conn.close()这样你只需要在浏览器中输入http://风扇IP地址/speed?value500就能控制速度了。## 实际使用体验做好之后我把风扇放在她的书桌上。效果非常棒-白天工作温度 26°C 左右风扇自动中速运转凉快又不吵-午休时间她手动设置成低速并定时 30 分钟睡着了也不用担心-下午高温温度升到 30°C 以上风扇自动全速运转-晚上温度降下来风扇自动停止省电又安静她再也不用频繁调节风扇了而且再也没有因为忘记关风扇而感冒。## 总结这个智能风扇项目虽然简单但融合了传感器读取、PWM 控制、多线程处理和网络通信等多个技术点。通过这个项目你可以学到1.传感器集成如何读取 DHT11 的数据并处理异常2.PWM 调速通过调节占空比来控制直流电机速度3.状态机设计自动/手动模式的切换逻辑4.多任务处理使用线程处理定时任务5.网络控制扩展 WiFi 模块实现远程操作最重要的是这个项目真正解决了实际生活中的问题——让女朋友在炎热的夏天里能享受智能化的清凉。如果你也想给心爱的人做点什么不妨从这个小风扇开始吧记住技术不仅要酷更要温暖人心。