如何构建基于Arduino的电压指示器

电子说

1.3w人已加入

描述

为什么电池电量监控很重要

您是否经历过建设电池供电项目,然后突然无法工作,因为需要收费?

我们都知道电池有一定的电压限制。超过或完全失去电池电压可能导致很多挫折,元件损坏或数据丢失。因此,能够监控电池电量以便您决定是否需要充电或更换电池不是很好吗?这就是本读者将为您做的事情!

需要的材料

Arduino Uno

16 x 2 LCD显示器

LED条形图/10个LED灯泡

Arduino IDE

4 x 1.2V电池

电池座

什么是LED条形图?

LED条形图是一个由10个独立LED组成的LED阵列,带有10个输出引脚。它有各种应用,包括音频设备和工业控制面板。

在我们的项目中,我们将其用作电池电量指示器。与任何其他LED一样,当将LED条连接到微控制器时,必须使用端到地的电阻将阳极引脚连接到正极和阴极引脚。

该项目如何测量电池电量?

很高兴理解电池具有我们称之为电量的电池。它可以理解为电池中包含的电压量。

Arduino的模拟引脚充当一个简单的电压表,可以检索电压值。然后,我们可以使用ADC转换公式将模拟值转换为数字电压值。

我们转换的值将显示在LED条形图上,它可以投射强度。因此,如果所有十个LED都点亮,则电池处于全强度状态。如果只有五个LED亮,则电池的强度为一半。

Arduino Uno ADC的分辨率为10位。 ADC转换器将0到5伏之间的输入电压映射到0到1023之间的整数值。因此,如果我们将输入analogValue乘以(5/1024),那么我们得到输入电压的数字值。

项目示意图

下面是构建的原理图。

电池电量监控代码演练

Arduino

首先,我们需要定义LCD库并指定我们将与Arduino一起使用的引脚。我们将模拟引脚A4分配为用于检查电池电压的模拟引脚。这些值在float中设置,因此我们可以得到最多两位小数的电压值。

#include

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。

完整项目代码

#include

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;

int ledPins[] = { 2, 3, 4, 5, 6, 7, 8, 9, 10, 11 }; // an array of pin numbers to which LEDs are attached

int pinCount = 10; // the number of pins (i.e. the length of the array)

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”);

}

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);

}

}

void loop()

{

// 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);

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);

}

}

现在您不必担心电池意外运行不足。希望这有助于您的下一个电池供电项目!

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分