×

以懒惰的方式对电阻器进行排序

消耗积分:0 | 格式:zip | 大小:0.14 MB | 2022-10-27

laisvl

分享资料个

描述

嘿,

您是否厌倦了在这样的情况下完成每个项目后结束?

您是一个懒得检查每个电阻器上的颜色代码以按电阻对它们进行分类的杂乱无章的人吗?你是不是懒到连用万用表都嫌多?也许有适合您的解决方案,终极懒惰的欧姆表

构建这个用于检查未分类电阻值的简单欧姆表所需要的只是一堆电阻器(这次是已知值)、一个 Arduino 和一个显示器(我用的是 I2C OLED 显示器)。

然后,我们将依靠分压器方程来获得与已知值电阻器串联的未知电阻器的值。这种简单的技术只有一个缺点。两个电阻越不同,我们的测量就越不准确。为了克服这种现象,我们需要使用多个电阻器并编写代码,让 Arduino 为未知值计算选择最合适的电阻器。

遵循这一理念,我们可以按照下图中的示意图构建欧姆表。

 
pYYBAGNYk8iAOWHNAAEw6rZpQkg687.jpg
设备示意图。
 

如果您使用 I2C 显示器,您也可以按照原理图进行操作。Arduino Nano 将引脚 A4 用于 SDA,将 A5 用于 SCL。

现在让我们关注编码部分。我使用的代码可以在这里看到:

#include 
#include 
#include 
  
[...]
  
int R1 = 100;
int R2 = 1000;
int R3 = 10000;
long R4 = 100000;
long R5 = 1000000;
long Rn;
int D2 = 2;
int D3 = 3;
int D4 = 4;
int D5 = 5;
int D6 = 6;
float raw = 0;
float Vout = 0;
float Ru = 0;
int Analogohm = A0;
void setup() {
 [...]
}
void loop() {
   pinMode(D2, OUTPUT);
   pinMode(D3, INPUT);
   pinMode(D4, INPUT);
   pinMode(D5, INPUT);
   pinMode(D6, INPUT);
   digitalWrite(D2, HIGH);
   raw = analogRead(Analogohm);
   Serial.println(raw);
   Serial.println("ref 1M");
   Rn = R5;
   if (raw < 350 || raw > 800){
     digitalWrite(D2, LOW);
     pinMode(D2, INPUT);
     pinMode(D3, OUTPUT);
     digitalWrite(D3, HIGH);
     raw = analogRead(Analogohm);
     Serial.println(raw);
     Serial.println("ref 100k");
     Rn = R4;
     if (raw < 350 || raw > 800){
       digitalWrite(D3, LOW);
       pinMode(D3, INPUT);
       pinMode(D4, OUTPUT);
       digitalWrite(D4, HIGH);
       raw = analogRead(Analogohm);
       Serial.println(raw);
       Serial.println("ref 10k");
       Rn = R3;
       if (raw < 350 || raw > 800){
         digitalWrite(D4, LOW);
         pinMode(D4, INPUT);
         pinMode(D5, OUTPUT);
         digitalWrite(D5, HIGH);
         raw = analogRead(Analogohm);
         Serial.println(raw);
         Serial.println("ref 1000");
         Rn = R2;
         if (raw < 350 || raw > 800){
           digitalWrite(D5, LOW);
           pinMode(D5, INPUT);
           pinMode(D6, OUTPUT);
           digitalWrite(D6, HIGH);
           raw = analogRead(Analogohm);
           Serial.println(raw);
           Serial.println("ref 100");
           Rn = R1;
         }
       }
     }
   }
   Vout = 5*(raw/1024);
   Ru = (Rn*Vout)/(5-Vout);
   if (Ru < 10 || Ru < 70) {
     Ru = 10 *round(Ru/10);
   } else if (Ru < 100 || Ru < 700){
     Ru = 100 *round(Ru/100);
   } else if (Ru < 1000 || Ru < 7000){
     Ru = 1000 *round(Ru/1000);
   } else if (Ru < 10000 || Ru < 70000){
     Ru = 10000 *round(Ru/10000);
   } else if (Ru < 100000 || Ru < 700000){
     Ru = 100000 *round(Ru/100000);
   } else if (Ru < 1000000 || Ru < 7000000){
     Ru = 1000000 *round(Ru/1000000);
   }
   Resistance(Ru);
   delay(1000);
}
[...]

对于 OLED 屏幕,我只使用了 Adafruit 库。您只需要通过 Arduino IDE 的库管理器下载它并复制您需要的代码。我使用了两个位图只是为了让阅读更美观,您可以轻松添加位图或替换我添加的位图。

对于欧姆表部分,您需要了解它是如何工作的,因为您可以根据使用多少电阻器作为参考值来更改它。

一旦代码进入 void 循环,Arduino 将检查引脚 A0 上的电压。由于从分压器方程:

 

V0 = Vi*R2/(R1+R2)

 

如果 R1 和 R2 相同,我们应该使 V0 接近 2.5V(因此我们的 10 位读数为 512)。

如果该值与这些结果相差甚远,则代码将移至下一个值,依此类推,直到我们得到最接近的电阻器。一旦满足“闭合电阻”条件,该值将打印在显示屏上。

注意#1:在每个 IF 语句中,我们需要重新定义每个数字引脚的 pinMode,因为如果将其保留为输出,它将表现为低阻抗引脚并破坏我们在引脚 A0 上的测量。

一旦选择了正确的电阻器,未知电阻器值(代码中的 Ru 变量)将使用分压器方程计算。

注意#2:对于这个设备,我只使用了 5 个电阻,但如果你愿意,你可以为板上的每个数字引脚设置更多的值。

系统下方的照片建立在面包板上。

 
poYBAGNYk8-AbbgkAAw89cYeGTs022.jpg
面包板上的懒惰仪表。
 

现在对于实际应用,我们需要构建某种盒子,我们可以在其中插入未知电阻,结果将显示在屏幕上。

我制作的盒子可以很容易地用3D打印机打印出来,所有部件都可以用胶枪固定在一起。需要对已知的电阻器进行一些焊接,以使所有东西都适合小体积。

 
pYYBAGNYk9WAN3nIAAm9Kc-cmAI378.jpg
最终装置。
 

只剩下一件事:将未分类的电阻器插入那些小孔并清洁工作台!

玩得开心,下个教程见。

 

编辑:我修改了代码的舍入部分,因为它可能会在舍入 5k 电阻时导致错误。通过此更改,问题应该得到解决。无论如何,在参考之间添加一个 5k 电阻应该可以完全防止这个问题。


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

评论(0)
发评论

下载排行榜

全部0条评论

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