電池具有一定的電壓限制,如果在充電或放電時(shí)電壓超過規(guī)定的限制,電池的使用壽命會(huì)受到影響或縮短。每當(dāng)我們使用電池供電的項(xiàng)目時(shí),有時(shí)我們需要檢查電池電壓水平,是否需要充電或更換。該電路將幫助您監(jiān)控電池的電壓。此Arduino 電池電壓指示器根據(jù)電池電壓,通過在10 段 LED 條形圖上發(fā)光 LED 來(lái)指示電池狀態(tài)。它還在連接到Arduino的LCD上顯示您的電池電壓。
所需材料
Arduino UNO
10 段 LED 條形圖
液晶屏 (16*2)
電位器-10k
電阻器 (100歐姆-10;330歐姆)
電池(待測(cè)試)
連接線
適用于 Arduino 的 12v 適配器
電路圖
LED 條形圖
LED 條形圖采用工業(yè)標(biāo)準(zhǔn)尺寸,功耗低。條形按發(fā)光強(qiáng)度分類。產(chǎn)品本身仍符合 RoHS 標(biāo)準(zhǔn)。它具有高達(dá) 2.6v 的正向電壓。每段功耗為65mW。LED 條形圖的工作溫度為 -40°C 至 80°C。LED條形圖有許多應(yīng)用,如音頻設(shè)備,儀表板和數(shù)字讀數(shù)顯示。
引腳圖
用于電池電壓監(jiān)控的 Arduino 程序:
在這里,我們正在定義LCD庫(kù)并指定要與Arduino一起使用的LCD引腳。模擬輸入取自引腳A4,用于檢查電池電壓。我們將值設(shè)置為 Float,以使電壓達(dá)到兩位小數(shù)。
#include
const int rs = 12, en = 13, d4 = A0, d5 = A1, d6 = A2, d7 = A3;
LiquidCrystal lcd(rs, en, d0, d1, d2, d3);
const int analogPin = A4;
float analogValue;
float input_voltage;
該陣列用于將引腳分配給 LED 條形圖。
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)
將液晶屏和模擬針腳(A0、A1、A2、A3)設(shè)置為輸出針腳。
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");
}
在這里,我們制作了一個(gè)以簡(jiǎn)單方式使用 LED 條形圖的函數(shù),您甚至可以通過一個(gè)接一個(gè)地編程來(lái)發(fā)光 LED,但代碼變得冗長(zhǎng)。
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);
}
}
在這一部分中,我們使用模擬引腳讀取電壓值。然后,我們使用模數(shù)轉(zhuǎn)換公式將模擬值轉(zhuǎn)換為數(shù)字電壓值,并將其進(jìn)一步顯示在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);
根據(jù)輸入電壓的值,我們給出了一些條件來(lái)控制LED條形圖LED。您可以在代碼中檢查以下條件:
if (input_voltage < 0.50 && input_voltage >= 0.00 )
{
digitalWrite(2, HIGH);
delay (30);
digitalWrite(2, LOW);
delay (30); // when the voltage is zero or low the 1st LED will indicate by blinking
}
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);
}
}
電池電壓指示器的工作原理
電池電壓指示器只需從Arduino模擬引腳讀取值,并使用模數(shù)轉(zhuǎn)換(ADC)公式將其轉(zhuǎn)換為數(shù)字值。Arduino Uno ADC具有 10 位分辨率(因此整數(shù)值從 0 - 2^10 = 1024 個(gè)值)。這意味著它將 0 到 5 伏之間的輸入電壓映射到 0 到 1023 之間的整數(shù)值。因此,如果我們將輸入 anlogValue 乘以 (5/1024),則得到輸入電壓的數(shù)字值。
#include
const int rs = 12, en = 13, d0 = A0, d1 = A1, d2 = A2, d3 = A3;
LiquidCrystal lcd(rs, en, d0, d1, d2, d3);
const int analogPin = A4;
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);
}
}
-
led
+關(guān)注
關(guān)注
242文章
23138瀏覽量
658513 -
指示器
+關(guān)注
關(guān)注
0文章
249瀏覽量
38256 -
Arduino
+關(guān)注
關(guān)注
187文章
6464瀏覽量
186655
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論