|
在本篇文章中,我们将使用Arduino开发板实现一个比较有创意的简易点钞机,通过使用颜色传感器识别纸币,我们可以得知纸币的面值然后进行计算。 TCS230颜色传感器将用于识别纸币,而Arduino UNO将用于处理数据以及在LCD上显示金额。
所需的组件 ● Arduino UNO ● TCS230颜色传感器 ● 红外传感器 ● 面包板 ● 图形点阵液晶屏LCD1602 ● 连接导线
TCS3200颜色传感器的工作原理 TCS3200颜色传感器用于识别多种颜色。TCS230传感器具有内置的红外LED,用于照亮要识别颜色的物体。这确保了外部环境光不会对物体产生影响。该传感器读取一个8 * 8阵列的光电二极管,该光电二极管阵列包括16个带红色滤光片、16个带蓝色滤光片、16个带绿色滤光片和16个不带任何滤光片的光电二极管。根据需要分别选择这三个阵列中的传感器阵列。因此,它被称为可编程传感器。该模块可以具有识别特定颜色并抑制其他颜色的功能。它包含用于该选择目的的过滤器。第四种模式称为“无滤镜模式”,这时传感器检测白光。
TCS230颜色传感器的输出信号是占空比为50%的方波,其频率与所选滤光器的光强度成正比。
TCS3200颜色传感器的引脚排布
VDD -传感器的电源引脚。它使用DC5V供电。 GND - 颜色传感器的接地参考引脚 S0、S1 - 输出频率缩放比例选择输入 S2、S3 - 光电二极管类型选择输入 OUT - 颜色传感器的输出引脚 OE - 输出频率使能引脚
电路原理图 以下是Arduino点钞机的电路图:
在这里,我制作了一个小结构,类似于POS刷卡机。在这种结构中,颜色传感器和红外传感器固定在纸板上,如下图所示。
在这里,红外传感器(IR Sensor)用于感应插槽内是否有纸币,如果有,那么颜色传感器将识别纸币的颜色,然后将颜色值发送给Arduino。接着Arduino会根据纸币的颜色计算金额。
代码说明 在本文的末尾处给出了完整的代码,以下是代码工作过程的简要说明。
首先,在程序中包含所有库。这里,我们只需要将LCD库包含在程序中即可。然后声明代码中使用的所有变量。 - #include <LiquidCrystal.h>
- int OutPut = 13;
- unsigned int frequency = 0;
- LiquidCrystal lcd(4, 6, 7, 8, 9, 10);
- int blue1;
- int red1;
- int green1;
- int a = 0, b = 0;
- int total = 1000;
复制代码
在setup()函数中,首先在LCD上打印欢迎信息,定义程序中使用的数字引脚的数据方向。接下来,设置颜色传感器的输出频率缩放比例,在本例中,将其设置为20%,也就是将S0引脚设置成高电平以及S1引脚设置为低电平。 - void setup()
- {
- Serial.begin(9600);
- lcd.begin(16, 2);
- lcd.setCursor(0, 0);
- lcd.print(" Smart Wallet ");
- lcd.setCursor(0, 1);
- lcd.print(" Circuit Digest ");
- delay(2000);
- lcd.clear();
- pinMode(2, OUTPUT);//S0
- pinMode(3, OUTPUT);//S1
- pinMode(11, OUTPUT);//S2
- pinMode(12, OUTPUT);//S3
- pinMode(13, INPUT);//OUT
- digitalWrite(2, HIGH);
- digitalWrite(3, LOW);
- }
复制代码
在loop()函数中,读取传感器的所有数据输出。可以通过读取A0引脚来监测IR传感器的输出,并且可以通过分别调用red()、blue () 和green ()函数来找到读取颜色频率。然后将它们全部打印在串口监视器上。当我们需要向程序中添加新纸币时,这是必需的。 - int sensor = digitalRead(A0);
- int red1 = red();
- int blue1 = blue();
- int green1 = green();
- Serial.println(red1);
- Serial.println(blue1);
- Serial.println(green1);
- Serial.println("-----------------------------");
复制代码接下来,以我们之前设置的参考频率检查颜色传感器的输出频率,编写所有的判断条件。如果匹配,则从余额中扣除指定的金额。 - if (red1>=20 && red1<=25 && blue1 >=30 && blue1 <=35 && green1 >=30 && green1 <=35 && a == 0 && sensor == HIGH)
- {
- a = 1;
- }
- else if (sensor == LOW && a == 1)
- {
- a = 0;
- if(total>=10)
- {
- lcd.setCursor(0, 1);
- lcd.print("10 Rupees!!!");
- total=total-10;
- delay(1500);
- lcd.clear();
- }
- }
复制代码该代码中,我们仅设置了10卢比和50卢比纸币颜色的条件,您可以设置更多条件以检测更多数量的纸币。
注意:根据具体情况,频率输出可能会有所不同,具体取决于外部照明和传感器设置。因此,建议检查纸币的输出频率并相应地设置参考值。
以下代码将在LCD1602上显示可用余额。 - lcd.setCursor(0, 0);
- lcd.print("Total Bal:");
- lcd.setCursor(11, 0);
- lcd.print(total);
- delay(1000);
复制代码以下函数将获取纸币中红色部分的输出颜色频率。同样,我们可以编写其他函数来获取蓝色和绿色部分的值。 - int red()
- {
- digitalWrite(11, LOW);
- digitalWrite(12, LOW);
- frequency = pulseIn(OutPut, LOW);
- return frequency;
- }
复制代码
通过使用少量组件即可轻松搭建基于Arduino的点钞机。我们可以通过集成一些图像处理程序和相机检测纸币来进一步完善,这样它将更加准确,并且能够检测任何纸币。
代码 以下是本文使用的完整代码:
main.rar
(734 Bytes, 下载次数: 52)
|