|
本篇文章主要介绍如何制作基于Arduino的电压指示器。该指示器通过点亮LED光柱显示器(Bar Graph)上的LED来显示电池的状态,具体取决于电池电压读数。但是,如果您没有LED光柱,您可以随时使用多个普通的LED,就像本文使用的那样。
为何电池电量监测很重要 您是否经历过在制作电池供电的项目时因为需要充电而突然无法工作?
我们都知道电池有一定的电压限制。超过或完全失去电池电压可能导致元件损坏或数据丢失。因此,能够监控电池电量以便您决定是否需要充电或更换电池不是很好吗?
需要的材料 ● Arduino Uno开发板 ● LCD显示屏1602 ● LED光柱或10个LED灯 ● Arduino IDE ● 4 个1.2V电池 ● 电池座
什么是LED光柱? LED光柱显示器(Bar Graph)是由10个独立LED组成的LED阵列,带有10个输出引脚。它有各种应用,包括音频设备和工业控制面板。
在本文中,我们将其用作电池电量指示器。与任何其他LED一样,当将LED光柱连接到微控制器时,必须将阳极引脚连接到电源正极,阴极引脚通过下拉电阻连接到地。
如何测量电池电量? Arduino的模拟引脚用作简单的电压表,可监测电压值。然后,我们可以使用ADC转换公式将模拟值转换为数字电压值。
我们转换的值将显示在LED光柱上,代表电池电量。因此,如果所有十个LED都点亮,则电池处于满电量状态。如果只有五个LED亮起,则电池电量为一半。
Arduino Uno的ADC具有10位分辨率。 ADC转换器将0到5V之间的输入电压映射到0到1023之间的整数值。因此,如果我们将输入analogValue乘以(5/1024),那么我们得到输入电压的数字值。
连接原理图 下面是本文制作的原理图。
电池电量指示器代码 首先,我们需要定义LCD库并指定我们将与Arduino一起使用的引脚。我们将模拟引脚A4分配为用于检查电池电压的模拟引脚。这些值设置为float,因此我们可以获得最多两位小数的电压值。 - #include <LiquidCrystal.h>
- const int rs = 12, en = 13, d0 = A0, d1 = A1, d2 = A2, d3 = A3;
- const int analogPin = A4;
- LiquidCrystal lcd(rs, en, d0, d1, d2, d3);
- float analogValue;
- float input_voltage;
复制代码然后,我们定义一个数组,用于将引脚分配给LED光柱显示器,并定义LED所连接的引脚数量。 - int ledPins[] = { 2, 3, 4, 5, 6, 7, 8, 9, 10, 11 }; // The LEDs attach to this array of pin numbers
- int pinCount = 10; // the number of pins
复制代码我们将LCD和模拟引脚设置为OUTPUT引脚。 - void setup()
- {
- Serial.begin(9600); // opens serial port, sets data rate to 9600 bps
- lcd.begin(16, 2); //// set up the LCD's number of columns and rows:
- pinMode(A0,OUTPUT);
- pinMode(A1,OUTPUT);
- pinMode(A2,OUTPUT);
- pinMode(A3,OUTPUT);
- pinMode(A4,INPUT);
- lcd.print("Voltage Level");
- }
复制代码
接下来,我们编写一个函数LED_function,用于操作LED光柱。 - void LED_function(int stage)
- {
- for (int j=2; j<=11; j++)
- {
- digitalWrite(j,LOW);
- }
- for (int i=1, l=2; i<=stage; i++,l++)
- {
- digitalWrite(l,HIGH); //delay(30);
- }
- }
复制代码写完这个函数后,我们需要一种方法将模拟值转换为数字电压值。通过使用Arduino的内置模数转换器和ADC转换公式,我们将能够轻松转换这些值。我们还希望在LCD显示屏上显示这些转换值。 - // Conversion formula for voltage
- analogValue = analogRead (A4);
- Serial.println(analogValue);
- delay (1000);
- input_voltage = (analogValue * 5.0) / 1024.0;
- lcd.setCursor(0, 1);
- lcd.print("Voltage= ");
- lcd.print(input_voltage);
- Serial.println(input_voltage);
- delay(100);
复制代码然后,我们创建一些条件来控制LED光柱,相对于我们从模拟引脚A4读取的输入电压值。 - if (input_voltage < 0.50 && input_voltage >= 0.00 )
- {
- digitalWrite(2, HIGH);
- delay (30);
- digitalWrite(2, LOW);
- delay (30);
- }
- else if (input_voltage < 1.00 && input_voltage >= 0.50)
- {
- LED_function(2);
- }
- else if (input_voltage < 1.50 && input_voltage >= 1.00)
- {
- LED_function(3);
- }
- else if (input_voltage < 2.00 && input_voltage >= 1.50)
- {
- LED_function(4);
- }
- else if (input_voltage < 2.50 && input_voltage >= 2.00)
- {
- LED_function(5);
- }
- else if (input_voltage < 3.00 && input_voltage >= 2.50)
- {
- LED_function(6);
- }
- else if (input_voltage < 3.50 && input_voltage >= 3.00)
- {
- LED_function(7);
- }
- else if (input_voltage < 4.00 && input_voltage >= 3.50)
- {
- LED_function(8);
- }
- else if (input_voltage < 4.50 && input_voltage >= 4.00)
- {
- LED_function(9);
- }
- else if (input_voltage < 5.00 && input_voltage >= 4.50)
- {
- LED_function(10);
- }
复制代码
在上图中,您可以看到我们得到一个几乎完全充电的电池读数,相当于大约3.84V。 现在您不必担心电池电量意外不足。 希望这有助于您的下一个电池供电项目! |