使用arduino的0-5V电压表。

这篇文章是关于一个简单的3位电压表使用arduino。该电路可以以50mV的精度测量0到5V之间的任何东西。该电路使用最少数量的外部元件,可以很容易地根据不同的电压范围进行修改。显示器件为普通阳极多路七段LED显示模块(型号E1-3056ASR1)。让我们先看一下显示设备。

E1-3056ASR1。

它是常见阳极类型的低成本复用3位七段LED模块。使用这种多路复用模块而不是三个单独的显示模块保存大量布线和努力。现在通常在市场上常用的这种多路复用模块。下图显示了此处使用的E1-3056ASR1显示模块的PIN。

e1 - 3056 asr1引出线

阅读这篇文章电压表使用8051为了更好地理解。想法是一样的,但是这里使用的是Arduino-uno而不是8051微控制器。使用arduino的电压表电路图如下图所示。

电路图。

Arduino电压表每个显示器的公共阳极端子分别与Arduina的数字输出引脚1,2,3接口。显示器的段A到DOTPOINT与ARDUINO的数字输出引脚(5至12)接口。要测量的电压施加到Arduino的模拟输入引脚A0。Arduino-Uno具有名为A0,A1,A2,A3,A4和A5的六个模拟输入通道。施加到每个引脚的0到5V范围内的电压可以使用“Analogread”功能在0到1023的范围内转换为数字值。这意味着每个内部ADC通道的灵敏度是5/1023,其等于4.88mV。使用Arduino的数字电压表的程序如下所示。

程序。

int;int vin;输入int = A0;int disp1 = 1;int disp2 = 2;int disp3 = 3;int世嘉= 5;int segB = 6;int segC = 7;int segD = 8; int segE=9; int segF=10; int segG=11; int segDP=12; void setup() { pinMode(disp1, OUTPUT); pinMode(disp2, OUTPUT); pinMode(disp3, OUTPUT); pinMode(segA, OUTPUT); pinMode(segB, OUTPUT); pinMode(segC, OUTPUT); pinMode(segD, OUTPUT); pinMode(segE, OUTPUT); pinMode(segF, OUTPUT); pinMode(segG, OUTPUT); pinMode(segDP, OUTPUT); pinMode(input,INPUT); } void loop() { vin=analogRead(input); vin=vin/2.046; a = vin%10; if(a<=5) {a=0;} else {a=5;} digitalWrite(disp1,LOW); digitalWrite(disp2,LOW); digitalWrite(disp3, HIGH); digitalWrite(segDP,HIGH); display(a); delay(5); vin = vin/10; a = vin%10; digitalWrite(disp3,LOW); digitalWrite(disp2,HIGH); digitalWrite(segDP,HIGH); display(a); delay(5); vin=vin/10; a=vin; digitalWrite(disp2,LOW); digitalWrite(disp1,HIGH); digitalWrite(segDP,LOW); display(a); delay(5); } int display (int a) { switch (a) { case 0: digitalWrite(segA, LOW); digitalWrite(segB, LOW); digitalWrite(segC, LOW); digitalWrite(segD, LOW); digitalWrite(segE, LOW); digitalWrite(segF, LOW); digitalWrite(segG, HIGH); break; case 1: digitalWrite(segA, HIGH); digitalWrite(segB, LOW); digitalWrite(segC, LOW); digitalWrite(segD, HIGH); digitalWrite(segE, HIGH); digitalWrite(segF, HIGH); digitalWrite(segG, HIGH); break; case 2: digitalWrite(segA, LOW); digitalWrite(segB, LOW); digitalWrite(segC, HIGH); digitalWrite(segD, LOW); digitalWrite(segE, LOW); digitalWrite(segF, HIGH); digitalWrite(segG, LOW); break; case 3: digitalWrite(segA, LOW); digitalWrite(segB, LOW); digitalWrite(segC, LOW); digitalWrite(segD, LOW); digitalWrite(segE, HIGH); digitalWrite(segF, HIGH); digitalWrite(segG, LOW); break; case 4: digitalWrite(segA, HIGH); digitalWrite(segB, LOW); digitalWrite(segC, LOW); digitalWrite(segD, HIGH); digitalWrite(segE, HIGH); digitalWrite(segF, LOW); digitalWrite(segG, LOW); break; case 5: digitalWrite(segA, LOW); digitalWrite(segB, HIGH); digitalWrite(segC, LOW); digitalWrite(segD, LOW); digitalWrite(segE, HIGH); digitalWrite(segF, LOW); digitalWrite(segG, LOW); break; case 6: digitalWrite(segA, LOW); digitalWrite(segB, HIGH); digitalWrite(segC, LOW); digitalWrite(segD, LOW); digitalWrite(segE, LOW); digitalWrite(segF, LOW); digitalWrite(segG, LOW); break; case 7: digitalWrite(segA, LOW); digitalWrite(segB, LOW); digitalWrite(segC, LOW); digitalWrite(segD, HIGH); digitalWrite(segE, HIGH); digitalWrite(segF, HIGH); digitalWrite(segG, HIGH); break; case 8: digitalWrite(segA, LOW); digitalWrite(segB, LOW); digitalWrite(segC, LOW); digitalWrite(segD, LOW); digitalWrite(segE, LOW); digitalWrite(segF, LOW); digitalWrite(segG, LOW); break; case 9: digitalWrite(segA, LOW); digitalWrite(segB, LOW); digitalWrite(segC, LOW); digitalWrite(segD, LOW); digitalWrite(segE, HIGH); digitalWrite(segF, LOW); digitalWrite(segG, LOW); break; }}

关于该计划。

使用Analogread函数读取施加到模拟输入引脚A0的模拟电压。模拟输入电压的数字等效存储在可变VIN中。例如,如果2.5V是模拟输入,则Analogread之后将在变量“Vin”中的数据将为2.5V / 4.8mV = 511.变量“VIN”的数字值分为2.056,以便制作0T0 500在数字读数中摆动对应于输入电压的0至5V摆动。变量“VIN”由划分的结果编写。该程序的下一个作业是在变量“VIN”中显示数字。

因此,变量“vin”中的每个数字都被隔离并显示在适当的段上。例如,如果“vin”中的数字是256,则显示屏1显示为2,显示屏2显示为5,显示屏3显示为6。在段的切换之间给出了大约5ms的小延迟。这是连续进行的,由于视觉的持续性,观察者感觉像256。当切换第一个片段时,第一个显示的小数点也被保持激活。个别数字被隔离和显示的方法如下。

假设256是要显示的数字。首先使用“%”操作员确定256的模量,结果将是6.然后将其存储在变量“a”中。使用if语句检查变量“a”。如果“a”小于五个,则“a”被0覆盖,如果“a”大于5,则逐渐写入5.这降低了电压表的灵敏度,但是使第三位数稳定。然后接通第三显示器,并且将其他显示器保持关闭。然后调用用于显示6的功能“显示”。结果将在第三个显示器上显示6。然后调用5 ms的延迟。

在这个延迟之后,256除以10,变量vin被25的商覆盖。然后确定25的模量。25的模量是5,它被存储在变量a中。第二个显示被激活,其他显示被关闭。然后再次调用函数display。结果将在第二个显示器上显示5。再次调用5毫秒的延迟。

然后变量vin中的数字25再次被10除。这个运算的商是2。这个2被重写为变量vin。然后变量“vin”被复制到变量a。第一个显示被激活,其他的显示被禁用。第一个显示的小数点也被激活。然后再次调用显示函数。结果将是数字2显示在第三个显示器上。再次调用5毫秒的延迟,并重复整个周期。

函数显示是使用基于“switch”和“break”语句的条件分支实现的。每当“显示”功能被调用时,它将在数字输出引脚(5到12)上的变量“a”中输出当前数字的段驱动模式。这是通过检查变量“a”中的当前数字并跳转到适当的情况来实现的。假设变量a中的数字是6。然后语句“switch(a)”将使程序跳转到“case:6”,这将导致在数字输出引脚(5到12)上适当地写入6的段驱动模式。

液晶版的arduino电压表。

这只是上面显示的电压表的LCD版本。JHD162A是这里使用的LCD显示器。它是一个16×2液晶显示屏,背光。使用Arduino的LCD电压表的电路图如下图所示。

电路图。
arduino电压表液晶显示程序。
# include < LiquidCrystal.h > int vin = A0;浮动值;LiquidCrystal液晶(12、11日5、4、3、2);//库初始化void setup() {pinMode(vin,INPUT);lcd.begin(16日2);lcd.setCursor (1,0);液晶显示器。打印(“LCD电压表”);} void loop() {value=analogRead(vin);价值=价值/ 200; value=value*0.978; lcd.setCursor(3,1); lcd.print(value); lcd.print(" volts"); delay(300); }
作者

11评论

  1. SARBJIT辛格

    为获得准确读数,请除以2.042

    • 丹尼斯

      为什么要除以2.042呢

  2. 自制的电流

    请告诉我,我们可以用液晶显示7段吗?

  3. 皮特

    这看起来非常有趣,但你如何将程序放入“Arduino”IC中?我看不到输入程序的引脚!谢谢。

  4. Shiharan

    你好,

    在程序开始时,最好将pic连接作为注释包含进来。

  5. google.com

    这真是一个很好的乐于助人的信息。
    我很满意你只是简单地与我们分享了这些有用的信息。
    请保持最新的日期。感谢分享。

  6. vasudev

    如何增加这伏特表的范围

  7. 亚许帕蒂尔

    先生,你能不能用arduino uno发布四旋翼直升机

    • praveen

      我正在策划它。但它需要一些时间。

Baidu