Arduino IDE框架 Arduino Uno

一、唤醒

在Arduino IDE框架中进行Arduino Uno开发时,可以使用SLEEP_MODE_PWR_DOWN模式来实现最深层次的休眠,以降低功耗。在这种模式下,Arduino Uno会关闭大部分微控制器功能,包括定时器中断,因此通常需要一个外部中断来唤醒设备。

为了使用一个按钮来唤醒Arduino Uno,你需要将按钮连接到Arduino Uno的一个外部中断引脚,并配置该引脚以在低电平或高电平变化时产生中断。

以下是唤醒开关连接和代码配置的步骤:

连接唤醒开关

  1. 选择一个外部中断引脚。Arduino Uno上的外部中断引脚是数字引脚2(INT0)和数字引脚3(INT1)。

  2. 将唤醒开关的一个脚连接到GND(地)。

  3. 将唤醒开关的另一个脚连接到你选择的外部中断引脚(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);
}

 

四、输入

五、输出控制







posted @ 2024-08-11 14:16  pearlcity  阅读(10)  评论(0编辑  收藏  举报