Arduino IDE框架 Arduino Uno
一、唤醒
在Arduino IDE框架中进行Arduino Uno开发时,可以使用SLEEP_MODE_PWR_DOWN
模式来实现最深层次的休眠,以降低功耗。在这种模式下,Arduino Uno会关闭大部分微控制器功能,包括定时器中断,因此通常需要一个外部中断来唤醒设备。
为了使用一个按钮来唤醒Arduino Uno,你需要将按钮连接到Arduino Uno的一个外部中断引脚,并配置该引脚以在低电平或高电平变化时产生中断。
以下是唤醒开关连接和代码配置的步骤:
连接唤醒开关
-
选择一个外部中断引脚。Arduino Uno上的外部中断引脚是数字引脚2(INT0)和数字引脚3(INT1)。
-
将唤醒开关的一个脚连接到GND(地)。
-
将唤醒开关的另一个脚连接到你选择的外部中断引脚(INT0或INT1)。
代码配置
下面是一个示例代码,展示如何配置外部中断并使用按钮来唤醒Arduino Uno:
#include <avr/sleep.h> #include <avr/power.h> // 假设使用INT0,即数字引脚2作为唤醒引脚 const byte wakePin = 2; // INT0 // 唤醒中断服务程序 void wakeUpNow() { // 这里什么也不做,只是中断睡眠模式 } void setup() { pinMode(wakePin, INPUT_PULLUP); // 设置为输入并启用内部上拉电阻 attachInterrupt(0, wakeUpNow, LOW); // 使用INT0,当引脚电平为低时唤醒 // 初始化串行通信 Serial.begin(9600); Serial.println("Going to sleep..."); } void loop() { // 进入休眠模式 set_sleep_mode(SLEEP_MODE_PWR_DOWN); // 设置休眠模式为最深睡眠 sleep_enable(); // 启用休眠模式 // 确保外部中断可以唤醒设备 attachInterrupt(0, wakeUpNow, LOW); // 再次确认外部中断配置 // 现在进入休眠模式 sleep_mode(); // 唤醒后,会从这里继续执行 // 禁用休眠模式 sleep_disable(); // 清除外部中断标志位(如果有的话) EIFR = bit(INTF0); // 对于INT0 // 干扰处理程序后可能需要执行的代码 Serial.println("Woke up!"); // 这里可以添加你的代码,例如检查按钮状态或执行其他任务 // 延迟一下,防止按钮去抖导致的立即再次唤醒 delay(100); }
二、过压断路保护模块
三、测量电源压降,计算电量百分比
如果您的供电是4节5号电池,最高电压大约是6V,那么您可以直接将这个电压连接到Arduino Uno的VIN引脚,因为这是在VIN引脚接受的电压范围内(7V到12V)。
由于电池组的电压低于VIN引脚可以接受的最高电压,您不需要使用电阻分压器来测量电压。您可以直接使用一个模拟引脚来测量电池电压,但是要注意,Arduino Uno的模拟引脚最大只能测量到5V。
为了测量6V以下的电池电压,您可以使用一个简单的电路,比如一个电压分压器,或者如果您知道电池组的电压不会超过5V,您可以直接连接到模拟引脚。
以下是修改后的代码,用于测量最高6V的电池电压:
// 定义模拟输入引脚,这里我们使用A0 const int voltagePin = A0; void setup() { // 初始化串行通信 Serial.begin(9600); } void loop() { // 读取VIN引脚的模拟电压值 int voltageValue = analogRead(voltagePin); // 对于Arduino Uno,模拟读数范围是0到1023,对应于0V到5V // 使用以下公式将模拟读数转换为实际的电压值 float voltage = (voltageValue * 5.0) / 1023.0; // 打印电压值 Serial.print("Battery Voltage: "); Serial.println(voltage); // 等待一段时间,避免快速连续读取导致的串行通信问题 delay(1000); }
但是,由于您的电池组最高电压为6V,您可能想要使用一个简单的电压分压器来确保不会超过Arduino的模拟输入电压范围。例如,如果您使用10kΩ和5kΩ的电阻来构建电压分压器,那么您可以通过以下方式计算实际电压:
// 定义模拟输入引脚,这里我们使用A0 const int voltagePin = A0; const float resistorDivisor = 5.0 / (5.0 + 10.0); // 5kΩ / (5kΩ + 10kΩ) void setup() { // 初始化串行通信 Serial.begin(9600); } void loop() { // 读取VIN引脚的模拟电压值 int voltageValue = analogRead(voltagePin); // 将模拟值转换为实际的电压值 float voltage = (voltageValue * 5.0) / 1023.0; // 分压后的电压 float actualVoltage = voltage / resistorDivisor; // 实际电池电压 // 打印电压值 Serial.print("Battery Voltage: "); Serial.println(actualVoltage); // 等待一段时间 delay(1000); }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 【自荐】一款简洁、开源的在线白板工具 Drawnix