从调光台灯到智能风扇:用Arduino PWM玩转5个生活中的电子小项目
从调光台灯到智能风扇用Arduino PWM玩转5个生活中的电子小项目你是否曾想过那些看似复杂的电子设备控制原理其实可以用一块小小的Arduino开发板和几行代码来实现PWM脉冲宽度调制技术就像一把神奇的钥匙能够打开数字世界与模拟控制之间的大门。今天我们将通过五个实用又有趣的项目带你深入理解PWM的魅力从可调光台灯到智能风扇控制每个项目都配有详细的接线图和核心代码即使是Arduino新手也能轻松上手。1. 打造无极调光LED台灯想象一下深夜阅读时能够随心所欲地调节灯光亮度既保护眼睛又节省能源。使用Arduino的PWM功能我们可以轻松实现这个需求。所需材料Arduino Uno开发板LED灯珠建议使用高亮度白光LED220欧姆电阻面包板和连接线10kΩ电位器用于亮度调节电路连接示意图电位器中间引脚 → Arduino A0 电位器两侧引脚 → 5V和GND LED正极 → Arduino 9脚通过电阻 LED负极 → GND核心代码解析const int ledPin 9; // PWM输出引脚 const int potPin A0; // 电位器输入引脚 void setup() { pinMode(ledPin, OUTPUT); } void loop() { int potValue analogRead(potPin); // 读取电位器值(0-1023) int brightness map(potValue, 0, 1023, 0, 255); // 映射到PWM范围 analogWrite(ledPin, brightness); // 输出PWM信号 delay(10); // 短暂延迟稳定读数 }提示选择PWM引脚时Arduino Uno的3、5、6、9、10、11脚都支持PWM输出标有~符号这个项目完美展示了PWM如何通过改变占空比来模拟不同电压输出。当占空比为50%时LED亮度约为最大亮度的一半占空比25%时亮度约为最大亮度的四分之一。虽然实际上LED仍在快速开关但由于频率足够高约490Hz人眼看到的是稳定的亮度变化。2. 智能电脑散热风扇控制器夏天电脑容易过热我们可以用Arduino制作一个根据温度自动调节转速的风扇控制器。材料清单Arduino开发板4线PWM电脑风扇如常见的12cm机箱风扇10kΩ NTC热敏电阻1kΩ电阻面包板和连接线接线要点风扇PWM线 → Arduino 9脚 风扇电源 → 12V电源正极 风扇电源- → GND 热敏电阻一端 → 5V 热敏电阻另一端 → A0和1kΩ电阻 1kΩ电阻另一端 → GND温度控制算法实现#include math.h const int fanPin 9; const int tempPin A0; // 风扇控制参数 const int minSpeed 50; // 最低转速(防止停转) const int maxSpeed 255; // 最高转速 const float minTemp 30; // 开始加速温度(℃) const float maxTemp 60; // 全速运转温度(℃) void setup() { pinMode(fanPin, OUTPUT); Serial.begin(9600); } float readTemperature() { int raw analogRead(tempPin); float resistance 10000.0 * (1023.0 / raw - 1.0); float tempK 1.0 / (log(resistance/10000.0)/3950.0 1.0/298.15); return tempK - 273.15; // 转换为摄氏度 } void loop() { float temp readTemperature(); int speed 0; if(temp minTemp) { speed minSpeed; } else if(temp maxTemp) { speed maxSpeed; } else { speed map(temp*10, minTemp*10, maxTemp*10, minSpeed, maxSpeed); } analogWrite(fanPin, speed); Serial.print(Temperature: ); Serial.print(temp); Serial.print(°C, Fan Speed: ); Serial.println(speed); delay(1000); }这个项目有几个关键点值得注意4线风扇的PWM控制频率通常为25kHz而Arduino默认PWM频率较低可能需要调整定时器设置热敏电阻测温使用了Steinhart-Hart方程精度比简单分压计算更高设置了最低转速防止风扇停转同时确保温度过高时能全速运转3. 精准角度控制的SG90舵机系统舵机是机器人项目中常用的执行器PWM信号可以精确控制其转动角度。项目构思制作一个可通过电位器控制舵机转角的演示装置适用于模型控制、摄像头云台等场景。硬件连接SG90舵机橙色信号线 → Arduino 9脚 红色电源线 → 5V 棕色地线 → GND 电位器中间引脚 → A0 两侧引脚 → 5V和GND角度控制代码#include Servo.h Servo myservo; const int potPin A0; const int servoPin 9; void setup() { myservo.attach(servoPin); Serial.begin(9600); } void loop() { int potValue analogRead(potPin); int angle map(potValue, 0, 1023, 0, 180); // 映射到0-180度 myservo.write(angle); // 设置舵机角度 delay(15); // 给舵机时间到达指定位置 Serial.print(Potentiometer: ); Serial.print(potValue); Serial.print(, Angle: ); Serial.println(angle); }舵机PWM信号特点参数值说明频率50Hz周期20ms最小脉宽0.5ms对应0度位置中间脉宽1.5ms对应90度位置最大脉宽2.5ms对应180度位置注意舵机供电需足够多个舵机同时工作时建议使用外部电源避免Arduino板载稳压器过载4. PWM模拟DAC制作简易音频播放器虽然Arduino没有真正的数模转换器(DAC)但我们可以用PWM和简单滤波电路模拟音频输出。材料准备Arduino开发板100Ω电阻10μF电解电容3.5mm音频插孔或小型扬声器电路搭建Arduino 9脚 → 100Ω电阻 → 音频插孔左声道 音频插孔右声道和地 → GND 10μF电容正极接电阻后信号线负极接GND音频生成原理通过快速改变PWM占空比配合RC低通滤波器可以生成近似模拟电压输出。虽然音质有限但足以播放简单的旋律。播放《欢乐颂》示例代码#define NOTE_C4 262 #define NOTE_D4 294 #define NOTE_E4 330 #define NOTE_F4 349 #define NOTE_G4 392 // 更多音符定义省略... const int speakerPin 9; // 欢乐颂旋律 int melody[] { NOTE_E4, NOTE_E4, NOTE_F4, NOTE_G4, NOTE_G4, NOTE_F4, NOTE_E4, NOTE_D4, NOTE_C4, NOTE_C4, NOTE_D4, NOTE_E4, NOTE_E4, NOTE_D4, NOTE_D4 }; // 音符持续时间 int noteDurations[] { 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 2 }; void setup() { for (int thisNote 0; thisNote 15; thisNote) { int noteDuration 1000 / noteDurations[thisNote]; tone(speakerPin, melody[thisNote], noteDuration); int pauseBetweenNotes noteDuration * 1.30; delay(pauseBetweenNotes); noTone(speakerPin); } } void loop() { // 不重复播放 }音质优化技巧使用更高PWM频率可通过修改定时器设置实现增加滤波阶数如使用两级RC滤波在代码中使用8位PCM音频数据而非简单音符考虑使用专用PWM转音频芯片如PT82115. 直流电机PWM调速小车最后我们来制作一个可通过PWM控制速度的简易小车这是许多机器人项目的基础。所需组件Arduino开发板L298N电机驱动模块直流减速电机 ×2小车底盘套件7.4V锂电池电位器用于速度调节接线示意图L298N IN1 → Arduino 5脚 IN2 → 6脚 ENA → 9脚PWM速度控制 电机A输出 → 左电机 电机B输出 → 右电机 12V电源输入 → 锂电池正极 GND → 共地 电位器中间引脚 → A0电机控制代码const int ENA 9; // 使能A PWM输出 const int IN1 5; // 方向控制1 const int IN2 6; // 方向控制2 const int potPin A0; // 速度调节 void setup() { pinMode(ENA, OUTPUT); pinMode(IN1, OUTPUT); pinMode(IN2, OUTPUT); Serial.begin(9600); } void loop() { int potValue analogRead(potPin); int speed map(potValue, 0, 1023, 0, 255); // 始终向前 digitalWrite(IN1, HIGH); digitalWrite(IN2, LOW); analogWrite(ENA, speed); Serial.print(Speed: ); Serial.println(speed); delay(50); }电机控制进阶技巧加入方向控制通过IN1/IN2组合实现正反转使用编码器实现闭环速度控制添加蓝牙或红外遥控功能实现差速转向控制重要安全提示电机工作时会产生反向电动势务必使用续流二极管或电机驱动模块保护电路通过这五个项目我们不仅学习了PWM的基本原理更掌握了它在各种实际场景中的应用方法。从简单的LED调光到相对复杂的电机控制PWM技术展现出了惊人的灵活性和实用性。在实际操作中可能会遇到各种小问题比如LED闪烁不稳定、电机启动困难等这些问题往往可以通过调整PWM频率、增加滤波电容或优化供电来解决。