鳕鱼天空

This is Mr Wang's Tech Blog.

用Arduino制作简易电压测试仪

一直想用锂电给arduino的板子供电,买了2种带充放的模块,其中一种有电量指示灯,另外一种没有,想在锂电为板子供电同时测量锂电电压,类似手机剩余电量显示这种。

电路比较简单,找2个10K的电阻串联在电池两端,电池负极接GND,电阻连接处接A3,代码如下:

#define voltsInPin A3

void setup()
{
  pinMode(voltsInPin, INPUT);

  Serial.begin(9600);
  Serial.println("volts:");
}

void loop()
{
  int rawReading = analogRead(voltsInPin);
  float volts = rawReading / 220.62 * 2;
  Serial.println(volts);
  delay(500);
}

每隔半秒测试一次,220.62是我根据万用表测出的数值经过换算得来的,理论上应该是(1023/5=204.8),乘以2是因为两个10K的电阻分压了,所以测量到的电压是实际的一半大小,3.7V锂电充满一般4.2V左右。然后我找了个4位计时器(TM1637),加了几句代码,可以用数码管显示电压值了,两个脚分别接D2和D3。

#define voltsInPin A3

// 下面是4位计时器定义
#include "TM1637.h"
#define CLK 3//pins definitions for TM1637 and can be changed to other ports       
#define DIO 2
TM1637 tm1637(CLK, DIO);

void setup()
{
  pinMode(voltsInPin, INPUT);
  //pinMode(ledPin, OUTPUT);
  Serial.begin(9600);
  Serial.println("volts:");

  tm1637.init();
  tm1637.set(BRIGHT_TYPICAL);

}

void loop()
{
  int rawReading = analogRead(voltsInPin);
  float volts = rawReading / 220.62 * 2;
  Serial.println(volts);
  int num = volts*100;
  // 4位数显示
  tm1637.display(0, num / 1000);
  tm1637.display(1, (num % 1000) / 100);
  tm1637.display(2, (num % 100) / 10);
  tm1637.display(3, num % 10);
  delay(500);
}

最后,请大家保持冷静,上面的代码在用USB供电时一点问题都没有,但是直接用升压模块接锂电供电后,测量的电压低了很多,而且跳跃的很厉害,我暂时还没有搞清楚到底是不能这样测试还是数码管的问题(数码管噪音很大),改天再测试了,或者还是直接用带电压显示的升压模块算了。。。。。。