為什么電池電量監控很重要
您是否經歷過建設電池供電項目,然后突然無法工作,因為需要收費?
我們都知道電池有一定的電壓限制。超過或完全失去電池電壓可能導致很多挫折,元件損壞或數據丟失。因此,能夠監控電池電量以便您決定是否需要充電或更換電池不是很好嗎?這就是本讀者將為您做的事情!
需要的材料
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),那么我們得到輸入電壓的數字值。
項目示意圖
下面是構建的原理圖。
電池電量監控代碼演練
首先,我們需要定義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);
}
}
現在您不必擔心電池意外運行不足。希望這有助于您的下一個電池供電項目!
-
指示器
+關注
關注
0文章
251瀏覽量
38459 -
Arduino
+關注
關注
188文章
6479瀏覽量
188612
發布評論請先 登錄
相關推薦
淺談架空暫態特征型遠傳故障指示器
線路故障指示器為什么變成紅色
線路故障指示器工作原理是什么
線路故障指示器怎么判斷故障點
L60系列0.230英寸(5.9毫米)防水面板安裝指示器
如何使用Arduino IDE構建的ELF映像?
利用Arduino的數字水位指示器電路設計

VL53L8CX TOF開發(4)----運動指示器

內置超級電容模塊的故障指示器有哪些特性?

使用Arduino的溫控風扇電路分享

評論