风筝
发表于: 2019-12-17 23:15:05 | 显示全部楼层

在本篇文章中,我们将使用Arduino开发板实现一个比较有创意的简易点钞机,通过使用颜色传感器识别纸币,我们可以得知纸币的面值然后进行计算。 TCS230颜色传感器将用于识别纸币,而Arduino UNO将用于处理数据以及在LCD上显示金额。


所需的组件

●    Arduino UNO

●    TCS230颜色传感器

●    红外传感器

●    面包板

●    图形点阵液晶屏LCD1602

●    连接导线


TCS3200颜色传感器的工作原理

TCS3200颜色传感器用于识别多种颜色。TCS230传感器具有内置的红外LED,用于照亮要识别颜色的物体。这确保了外部环境光不会对物体产生影响。该传感器读取一个8 * 8阵列的光电二极管,该光电二极管阵列包括16个带红色滤光片、16个带蓝色滤光片、16个带绿色滤光片和16个不带任何滤光片的光电二极管。根据需要分别选择这三个阵列中的传感器阵列。因此,它被称为可编程传感器。该模块可以具有识别特定颜色并抑制其他颜色的功能。它包含用于该选择目的的过滤器。第四种模式称为“无滤镜模式”,这时传感器检测白光。

TCS3200-Color-Sensor.jpg


TCS230颜色传感器的输出信号是占空比为50%的方波,其频率与所选滤光器的光强度成正比。

TCS3200-Colour-Sensor-Working.png


TCS3200颜色传感器的引脚排布

TCS3200-Pinout.png


VDD  -传感器的电源引脚。它使用DC5V供电。

GND - 颜色传感器的接地参考引脚

S0、S1 - 输出频率缩放比例选择输入

S2、S3 - 光电二极管类型选择输入

OUT - 颜色传感器的输出引脚

OE - 输出频率使能引脚


电路原理图

以下是Arduino点钞机的电路图:

Arduino-Money-Counter-Circuit-Diagram.png

在这里,我制作了一个小结构,类似于POS刷卡机。在这种结构中,颜色传感器和红外传感器固定在纸板上,如下图所示。

Arduino-Money-Counter-IR-and-TCS3200-Sensor-Setup.jpg

在这里,红外传感器(IR Sensor)用于感应插槽内是否有纸币,如果有,那么颜色传感器将识别纸币的颜色,然后将颜色值发送给Arduino。接着Arduino会根据纸币的颜色计算金额。


代码说明

在本文的末尾处给出了完整的代码,以下是代码工作过程的简要说明。


首先,在程序中包含所有库。这里,我们只需要将LCD库包含在程序中即可。然后声明代码中使用的所有变量。

  1. #include <LiquidCrystal.h>
  2. int OutPut = 13;
  3. unsigned int frequency = 0;
  4. LiquidCrystal lcd(4, 6, 7, 8, 9, 10);
  5. int blue1;
  6. int red1;
  7. int green1;
  8. int a = 0, b = 0;
  9. int total = 1000;
复制代码

setup()函数中,首先在LCD上打印欢迎信息,定义程序中使用的数字引脚的数据方向。接下来,设置颜色传感器的输出频率缩放比例,在本例中,将其设置为20%,也就是将S0引脚设置成高电平以及S1引脚设置为低电平。

  1. void setup()
  2. {
  3.   Serial.begin(9600);
  4.   lcd.begin(16, 2);
  5.   lcd.setCursor(0, 0);
  6.   lcd.print("  Smart Wallet  ");
  7.   lcd.setCursor(0, 1);
  8.   lcd.print(" Circuit Digest  ");
  9.   delay(2000);
  10.   lcd.clear();
  11.   pinMode(2, OUTPUT);//S0
  12.   pinMode(3, OUTPUT);//S1
  13.   pinMode(11, OUTPUT);//S2
  14.   pinMode(12, OUTPUT);//S3
  15.   pinMode(13, INPUT);//OUT
  16.   digitalWrite(2, HIGH);
  17.   digitalWrite(3, LOW);
  18. }
复制代码

loop()函数中,读取传感器的所有数据输出。可以通过读取A0引脚来监测IR传感器的输出,并且可以通过分别调用red()blue () green ()函数来找到读取颜色频率。然后将它们全部打印在串口监视器上。当我们需要向程序中添加新纸币时,这是必需的。

  1. int sensor = digitalRead(A0);
  2.   int red1 = red();
  3.   int blue1 = blue();
  4.   int green1 = green();
  5.   Serial.println(red1);
  6.   Serial.println(blue1);
  7.   Serial.println(green1);
  8.   Serial.println("-----------------------------");
复制代码

接下来,以我们之前设置的参考频率检查颜色传感器的输出频率,编写所有的判断条件。如果匹配,则从余额中扣除指定的金额。

  1.   if (red1>=20 && red1<=25 && blue1 >=30 && blue1 <=35 && green1 >=30 && green1 <=35 && a == 0 && sensor == HIGH)
  2.   {
  3.     a = 1;
  4.   }
  5.   else if (sensor == LOW && a == 1)
  6.   {
  7.     a = 0;
  8.     if(total>=10)
  9.     {
  10.     lcd.setCursor(0, 1);
  11.     lcd.print("10 Rupees!!!");
  12.     total=total-10;
  13.     delay(1500);
  14.     lcd.clear();
  15.     }
  16.   }
复制代码

该代码中,我们仅设置了10卢比和50卢比纸币颜色的条件,您可以设置更多条件以检测更多数量的纸币。

Indian-Currency.jpg

注意:根据具体情况,频率输出可能会有所不同,具体取决于外部照明和传感器设置。因此,建议检查纸币的输出频率并相应地设置参考值。


以下代码将在LCD1602上显示可用余额。

  1.   lcd.setCursor(0, 0);
  2.   lcd.print("Total Bal:");
  3.   lcd.setCursor(11, 0);
  4.   lcd.print(total);
  5.   delay(1000);
复制代码

以下函数将获取纸币中红色部分的输出颜色频率。同样,我们可以编写其他函数来获取蓝色和绿色部分的值。

  1. int red()

  2. {

  3.   digitalWrite(11, LOW);
  4.   digitalWrite(12, LOW);
  5.   frequency = pulseIn(OutPut, LOW);
  6.   return frequency;
  7. }
复制代码

Arduino-Money-Counter.jpg


通过使用少量组件即可轻松搭建基于Arduino的点钞机。我们可以通过集成一些图像处理程序和相机检测纸币来进一步完善,这样它将更加准确,并且能够检测任何纸币。


代码

以下是本文使用的完整代码: main.rar (734 Bytes, 下载次数: 42)

跳转到指定楼层
gary545487
发表于: 2022-1-5 10:15:43 | 显示全部楼层

本帖最后由 gary545487 于 2022-1-5 11:58 编辑

請問可變電阻阻值的是多少?
回复

使用道具 举报

风筝
发表于: 2022-1-5 10:45:46 | 显示全部楼层

gary545487 发表于 2022-1-5 10:15
請問LCD第三格連接的是什麼

调整LCD的对比度引脚,有些LCD是内置的。
回复

使用道具 举报

gary545487
发表于: 2022-1-5 11:59:52 | 显示全部楼层

风筝 发表于 2022-1-5 10:45
调整LCD的对比度引脚,有些LCD是内置的。

謝謝,那請問阻值需要用多大的可變電阻
回复

使用道具 举报

风筝
发表于: 2022-1-5 13:56:42 | 显示全部楼层

gary545487 发表于 2022-1-5 11:59
謝謝,那請問阻值需要用多大的可變電阻

10K左右就可以
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题 700 | 回复: 1480



手机版|

GMT+8, 2024-4-24 08:04 , Processed in 0.054574 second(s), 8 queries , Gzip On, MemCache On. Powered by Discuz! X3.5

YiBoard一板网 © 2015-2022 地址:河北省石家庄市长安区高营大街 ( 冀ICP备18020117号 )

快速回复 返回顶部 返回列表