硬币存款机

来自Labplus盛思维基百科
Tangliufeng讨论 | 贡献2018年5月29日 (二) 15:08的版本
(差异) ←上一版本 | 最后版本 (差异) | 下一版本→ (差异)
跳转至: 导航搜索
硬币存款机.png

概述

本作品可实现自动记录硬币存贮数量功能,支持断电记忆。使用时先根据制作说明将作品组装完整,然后 接上电源(9V电池或USB供电),打开主控板开关,放入硬币即可自动计数。硬币经过入口时,遮挡入口下 方光线传感器,用光线传感器遮挡次数记录放入硬币的数量;需要重置存款机时,遮挡光线传感器5秒, 数码管自动归零。DIY动手组装,锻炼动手能力,了解智能创意电子套件的使用,激发创新思维,增加学 习乐趣。

使用教程

程序控制流程:
1.通过光线传感器检测是否有硬币落下,当检测到硬币落下,计数器加1,并加数值写到EEPROM中,实现断电储存计数器。
2.当检测到光线传感器为暗时超过5秒,即将EEPROM中的计数器值清零。

组装说明

点击下载.png
  1. File:硬币存款机装配.pdf
  2. File:智能存钱罐制作说明.pdf


硬币存款机 装配.png

电子模块清单

模块名称 数量
W1主控板 x1
光线传感器 x1
LED灯 x1
数码管 x1

电子模块连接说明

模块 引脚 说明
光线传感器 W1-A0/A1接口
LED灯 W1-3/11接口
数码管 W1-I2C接口

Arduino程序/图形化程序

点击下载.png
硬币存款机Arduino程序包
#include "Wire.h"
#include "TM1650.h"
#include "EEPROM.h"

#define Light_int    A0

#define Led_out      3


typedef union
{
   uint8_t byteData[2];
   uint16_t intData;
}BYTE_INT;

BYTE_INT counct;


unsigned int Light_sr = 0;


int val,vall;
int16_t temp = 0;
TM1650  d;
char line[] = {"----"};
unsigned long blanktime;

unsigned char TEMP;

void Display_LED();

void hexToBCD(int16_t val);
char getTochar(uint8_t bcd);
unsigned int getTime(unsigned long ntime);

unsigned int number=0; /* 代表那个非常大的数字 */
unsigned char ge,shi,bai,qian,wan;
int16_t DispData[5];  //数据缓冲数组
int ks=0;
unsigned long flag=0;
void setup() 
{
  // put your setup code here, to run once:
  Wire.begin();      // join i2c bus (address optional for master)
  d.init();
  d.displayOff();

  counct.byteData[0] = EEPROM.read(1);
  counct.byteData[1] = EEPROM.read(2);
  
  pinMode(Light_int,INPUT);
  pinMode(Led_out,OUTPUT);
  analogWrite(Led_out, 60);
  number = counct.intData;
  hexToBCD(counct.intData);  
  d.displayString(line);
  d.setBrightness(2);
  d.displayOn();
  Serial.begin(115200);
}

void loop() 
{
  Display_LED();//光存钱罐
}

/**********************************************************************************
 * 
 **********************************************************************************/
void hexToBCD(int16_t val)
{
  int i;
  int16_t num = val;
  if (num > 999) num = 999;
  for (i=0; num > 99; i++) num -= 100;
  if(i != 0) line[1] = getTochar(i); else line[1] = ' ';
  for (i=0; num > 9; i++) num -= 10;
  line[2] = getTochar(i);
  line[3] =  getTochar(num);
  line[0] = ' ';
}
/**********************************************************************************
 * 
 **********************************************************************************/
char getTochar(uint8_t bcd)
{
  char c;
  switch (bcd)
  {
    case 0:
      c = '0';
      break;
    case 1:
      c = '1';
      break;
    case 2:
      c = '2';
      break;
    case 3:
      c = '3';
      break;
    case 4:
      c = '4';
      break;
    case 5:
      c = '5';
      break;
    case 6:
      c = '6';
      break;
    case 7:
      c = '7';
      break;
    case 8:
      c = '8';
      break;
    default:
      c = '9';
      break;
  }
  return c;
}
/********************************************************************************************************
*时间获取函数
********************************************************************************************************/
unsigned int getTime(unsigned long ntime)
{
  if(millis() < ntime)
  {
    return ((unsigned int)((millis() + (~ntime) + 1)));
  }
  else
  {
    return ((unsigned int)((millis() - ntime)));
  }
}

void Display_LED()
{
  Light_sr = analogRead(Light_int);//读取光线值
//  Serial.println("1:  ");//测试用
//  Serial.println(Light_sr);//测试用
   
   if(Light_sr<5)
   {
    delay(1);
    if(analogRead(Light_int)<5)
    {
      blanktime = millis();
      while(Light_sr<30)
      {
        Light_sr = analogRead(Light_int);
        if((millis()-blanktime)>=5000)
        {
          number = 0;
          counct.intData = number;        
          
          EEPROM.write(1,counct.byteData[0]);
          EEPROM.write(2,counct.byteData[1]);
          
          hexToBCD(number);  
          d.displayString(line);
          d.displayOn();
          delay(2000);
          ks = 0;
          break;        
        }
        else
        {
            ks=1;                  
        }
//        Serial.println("2:  "); //测试用
//        Serial.println(Light_sr); //测试用
      }
    }
   }
  if(ks)      //环境变暗,即投下硬币
  {
    ks = 0;
    number++;    
	Serial.print("number:");
	Serial.println(number);
    counct.intData = number;
    
    EEPROM.write(1,counct.byteData[0]);
    EEPROM.write(2,counct.byteData[1]);
    
    hexToBCD(number);  
    d.displayString(line);
    d.displayOn();    
  }
}

FAQ

版本历史记录

Version Date 新增/删除/修复
V1.2