本帖最后由 王乐乐 于 2017-11-28 11:29 编辑
一、项目介绍:
1、自助雨伞租赁系统是一款致力于互联网租赁服务的智能产品。利用手机微信或者支付宝的支付方式与线下雨伞租赁产品相结合,增加消费者对产品的使用价值,避免闲置浪费。2、自助雨伞租赁系统的后台信息管理系统,完成了自助雨伞租赁系统上下位机通信以及数据库管理的智能化,该系统是基于OneNet平台构建于开放的公共协议之上 ,能够大大提高开发效率,OneNet平台的数据便于管理,数据时时更新,便于掌握雨伞的使用情况。
3、自助雨伞租赁系统是集软、硬件及网络一体的综合性管理系统,核心功能为提供自助借还雨伞服务,用户可以在某个租借点进行自助租借雨伞,使用后在任何一个联网的租借点自助归还,系统会根据设定的费率策略自动计算完成扣费。
4、现代科学技术迅猛发展,消费者生产生活所需的工具也日益成熟,日渐智能化、人性化。自动雨伞租赁系统大大提高了消费者的出行效率,给消费者的出行带来便捷。自动雨伞租赁系统是大势所趋,产品智能化转型是互联网发展的必然产物。
5、物联网是通信网和互联网的拓展应用和网络延伸,它利用感知技术与智能装置对物理世界进行感知识别,通过网络传输互联,进行计算、处理和知识挖掘,实现人与人、人与物、物与物之间的信息交互和无缝链接,达到对物理世界实时控制、精确管理和科学决策的目的。该自动雨伞租赁系统将物联网的人与人、人与物、物与物之间的信息交互紧密的结合起来,实现真正意义的互联网时代。
二、基本介绍:
1、自助雨伞租赁系统是一款无人化管理的系统,不需要管理者在雨伞租借点进行人工的管理,只需对后台监控即可掌握雨伞的情况。大大节省了人力。自助雨伞租赁系统只需要支付雨伞租借期间的费用即可,而且雨伞租借费用十分便宜。大大节省了消费者的支出。
2、自助雨伞租赁系统可以在不同地点借、还。使用灵活、自助选择伞、使用及操作流程简单方便。当消费者使用完雨伞后即可在就近的雨伞租赁点还雨伞。给人们提供了方便的出行,同时也增强的雨伞使用的灵活性。
3、自助雨伞租赁系统秉承了避免闲置浪费、节约资源、循环使用的理念,大大提供雨伞的使用量。通过雨伞循环使用,节约了资源,有利于环保,某种程度上体现了循环经济的要旨和科学发展观。对于家庭而言,课减轻家庭的经济负担。
4、为了解决这一系列的生活问题给消费者带来的一些不便,本发明提供一种自助雨伞租赁系统,它既可以有效的并且及时地提供雨伞这项服务,还可以做到无人化管理、操作使用简便。用户可以取之即用,可靠方便,占地面积少,无须专人管理,使用操作方便,使用前景广阔。给消费者提供一个方便、快捷的出行方式。
三、功能介绍:
(1)雨伞在不同地点都可以借还;
(2)显示器显示消费、天气情况;
(3)语音模块播报操作流程及方法;
(4)利用支付宝或者微信收取押金及找零;
(5)使用OneNet平台可以及时更新数据;
四、硬件组成部分:
自助雨伞租赁系统包括雨伞架、电机、RFID芯片、RFID读写器、液晶显示屏、语音播报模块和WIFI模块。本系统的雨伞架是利用市面上的雨伞架改造而成的,将雨伞架卡口锁部件改造为带电机装置的雨伞锁,雨伞锁关闭时无法将雨伞取下。每把伞均带有RFID标签,卡口壳外壁安装RFID读写器。伞架上设计有控制面板,有液晶显示屏、语音播报模块。WIFI模块与OneNet平台相连接,实时更新数据。控制面板内的控制系统由合芯片,其对整个模块进行arduino管理和控制。系统硬件设计:
系统下位机硬件部分由RFID模块、核心单片机模块、步进电机以及电源电路等模块构成。
电源模块主要是为其他模块提供所需电源电压,在构建的自助借伞系统模型中主要产生,12-24V电源,以及5V电压。核心单片机板则通过刷卡模块读取射频卡卡主姓名、卡号、余额等信息,并同时控制电子锁动作进行借伞还伞等活动。该系统还具有异地借还雨伞的功能,每把雨伞带有电子标签的专用雨伞,电子标签用于记录雨伞的编号和使用信息。点击触摸屏上的“借伞”按钮,触摸屏会根据雨伞的信息自动生成二维码,并提示具体的操作流程。 自助雨伞租赁系统检测到支付成功后,通过OneNet平台来控制雨伞卡口打开。卡口闭合同时RFID读卡器感应到相应的RFID标签后,雨伞的信息将上传OneNet平台,OneNet平台予以数据保存。 自助雨伞租赁系统具有独立的密钥系统,大幅提高了系统的安全性, RFID读卡器与后台OneNet平台实现无缝对接。实现实时更新数据,方便后台管理人员掌握雨伞的情况。 RFID无线射频识别技术:RFID标签通过这一区域时被触发,发送存储在标签中的数据。识读器可接收标签发送的数据或向标签发送数据,并能通过标准接口与计算机网络进行通信。 模块及元器件: 硬件模块 型号 步进电机 ULN2003 WiFi模块 ESP8266 触摸屏 6.2寸 伞架 20合一 语音模块 ISD1820 RFID芯片 RC522 雨伞 广告伞8k 制作的基本情况:
触摸屏:通过程序设计相关的按钮,比如:借伞、还伞、支付等,通过选择生产二维码;
步进电机:支付完成后步进电机卡扣自动打开,取走雨伞;
WiFi模块:通过程序与onenet平台相连接;
RFID芯片:感应雨伞的信息通过程序与onenet平台;
该系统主要元件:
(1)arduino单片机中控处理模块:HOLTEK单片机通过对最小系统的扩展,完成对其他模块采集的信号进行处理,传送到OneNet平台;
(2)OneNet平台:对雨伞的信息进行存储、输出以及更新数据;
(3)RFID射频技术:对雨伞进行条码扫描传送到OneNet平台存储;
(4)液晶显示模块:显示操作流程、及其支付方式、天气情况;
(5)验钞机:自动验钞及找零;
(6)语音模块:播报操作流程及方法;系统软件设计: 系统软件主要完成自助借、还伞等功能,具体流程图如图2所示。当用户点击触摸屏上的借伞按钮时,会有语音提示,请使用支付宝或者微信支付一定押金锁伞卡口将自动打开,取走伞即可。当还雨伞的时候只需点击触摸屏上的还伞,把伞放回关上卡口即可,当系统检测到雨伞放入无误是押金将在1~3个工作日返回押金。在onenet平台随时监控当前雨伞借用情况,以便于管理及雨伞的分配。
五、硬、软件图:
六、成品展示图:
七、源程序:RFID 库文件:[kenrobot_code]/* RFID.h - Library to use ARDUINO RFID MODULE KIT 13.56 MHZ WITH TAGS SPI W AND R BY COOQROBOT.
* Based on code Dr.Leong ( WWW.B2CQSHOP.COM )
* Created by Miguel Balboa (circuitito.com), Jan, 2012.
* ??????????????bg1lsy (lsy@sogou.com)
* ???????2013.05.25
*/
#ifndef RFID_h
#define RFID_h
#include <Arduino.h>
#include <SPI.h>
/******************************************************************************
* ????
******************************************************************************/
#define MAX_LEN 16 // ?????????
//MF522??????
#define PCD_IDLE 0x00 //?????????????????
#define PCD_AUTHENT 0x0E //??????
#define PCD_RECEIVE 0x08 //????????
#define PCD_TRANSMIT 0x04 //????????
#define PCD_TRANSCEIVE 0x0C //?????????????
#define PCD_RESETPHASE 0x0F //??λ 00001111
#define PCD_CALCCRC 0x03 //CRC????
//Mifare_One?????????
#define PICC_REQIDL 0x26 //?????????δ??????????
#define PICC_REQALL 0x52 //??????????????
#define PICC_ANTICOLL 0x93 //?????
#define PICC_SElECTTAG 0x93 //???
#define PICC_AUTHENT1A 0x60 //???A???
#define PICC_AUTHENT1B 0x61 //???B???
#define PICC_READ 0x30 //????
#define PICC_WRITE 0xA0 //д??
#define PICC_DECREMENT 0xC0
#define PICC_INCREMENT 0xC1
#define PICC_RESTORE 0xC2 //???????????????
#define PICC_TRANSFER 0xB0 //???滺??????????
#define PICC_HALT 0x50 //????
//??MF522??????????????
#define MI_OK 0
#define MI_NOTAGERR 1
#define MI_ERR 2
//------------------MFRC522?????---------------
//Page 0:Command and Status ?????????????
#define Reserved00 0x00
#define CommandReg 0x01 //??????????? ????????????????
#define CommIEnReg 0x02
#define DivlEnReg 0x03
#define CommIrqReg 0x04
#define DivIrqReg 0x05
#define ErrorReg 0x06
#define Status1Reg 0x07
#define Status2Reg 0x08
#define FIFODataReg 0x09
#define FIFOLevelReg 0x0A
#define WaterLevelReg 0x0B
#define ControlReg 0x0C
#define BitFramingReg 0x0D
#define CollReg 0x0E
#define Reserved01 0x0F
//Page 1:Command ????????
#define Reserved10 0x10
#define ModeReg 0x11 //???巢????????????
#define TxModeReg 0x12 //???巢??????????????
#define RxModeReg 0x13 //???????????????????
#define TxControlReg 0x14 //?????????????????Tx1??Tx2?????????
#define TxAutoReg 0x15
#define TxSelReg 0x16 //?????????????
#define RxSelReg 0x17 //????????????????
#define RxThresholdReg 0x18 //???λ???????????
#define DemodReg 0x19
#define Reserved11 0x1A
#define Reserved12 0x1B
#define MifareReg 0x1C
#define Reserved13 0x1D
#define Reserved14 0x1E
#define SerialSpeedReg 0x1F
//Page 2:CFG ????
#define Reserved20 0x20
#define CRCResultRegM 0x21
#define CRCResultRegL 0x22
#define Reserved21 0x23
#define ModWidthReg 0x24
#define Reserved22 0x25
#define RFCfgReg 0x26
#define GsNReg 0x27
#define CWGsPReg 0x28
#define ModGsPReg 0x29
#define TModeReg 0x2A //??????????????????
#define TPrescalerReg 0x2B //??????????????????
#define TReloadRegH 0x2C
#define TReloadRegL 0x2D
#define TCounterValueRegH 0x2E
#define TCounterValueRegL 0x2F
//Page 3:TestRegister
#define Reserved30 0x30
#define TestSel1Reg 0x31
#define TestSel2Reg 0x32
#define TestPinEnReg 0x33
#define TestPinValueReg 0x34
#define TestBusReg 0x35
#define AutoTestReg 0x36
#define VersionReg 0x37
#define AnalogTestReg 0x38
#define TestDAC1Reg 0x39
#define TestDAC2Reg 0x3A
#define TestADCReg 0x3B
#define Reserved31 0x3C
#define Reserved32 0x3D
#define Reserved33 0x3E
#define Reserved34 0x3F
//-----------------------------------------------
class RFID
{
public:
RFID(int chipSelectPin, int NRSTPD);
bool isCard();
bool readCardSerial();
void init();
void reset();
void setBitMask(unsigned char reg, unsigned char mask);
void clearBitMask(unsigned char reg, unsigned char mask);
void antennaOn(void);
void antennaOff(void);
void calculateCRC(unsigned char *pIndata, unsigned char len, unsigned char *pOutData);
void writeMFRC522(unsigned char addr, unsigned char val);
unsigned char readMFRC522(unsigned char addr);
unsigned char MFRC522Request(unsigned char reqMode, unsigned char *TagType);
unsigned char MFRC522ToCard(unsigned char command, unsigned char *sendData, unsigned char sendLen, unsigned char *backData, unsigned int *backLen);
unsigned char anticoll(unsigned char *serNum);
unsigned char auth(unsigned char authMode, unsigned char BlockAddr, unsigned char *Sectorkey, unsigned char *serNum);
unsigned char read(unsigned char blockAddr, unsigned char *recvData);
unsigned char write(unsigned char blockAddr, unsigned char *writeData);
unsigned char selectTag(unsigned char *serNum);
void halt();
unsigned char serNum[5]; // 4???????к????5????У?????
private:
int _chipSelectPin;
int _NRSTPD;
};
#endif
wifi onenet:
#include <SoftwareSerial.h>
#ifndef RET_OK
#define RET_OK 0
#define RET_ERR 1
#define RET_TIMEOUT 2
#endif
#define TRY_TIMES 2
#define ADDR 0b0100011
#define API_KEY "NJxiLhJ2QtjJ3pggp7WCHTsmPSU=" //APIkey
#define DEVICE_ID "6398093" //设备ID
#define SECOND 1000L
// 串口
#define _baudrate 115200
#define _rxpin 3
#define _txpin 2
#define DBG_UART dbgSerial //调试打印串口
#define WIFI_UART Serial
SoftwareSerial dbgSerial( _rxpin, _txpin ); // 软串口,调试打印
void(* resetFunc) (void) = 0;
unsigned int myIn()
{
int count=0;
int s;
s = digitalRead(6);
if(s)count+=1;
s = digitalRead(7);
if(s)count+=2;
s = digitalRead(8);
if(s)count+=4;
return count;
}
bool findstr(String str,char *key)
{
int num=str.length();
int len=strlen(key);
int i,k;
if(num>=len)
{
for(i=0;i<=num-len;i++)
{
for(k=0;k<len;k++)
{
if(str[k+i]!=key[k])break;
}
if(k>=len)return true;
}
}
return false;
}
/*
* doCmdOk
* 发送命令至模块,从回复中获取期待的关键字
* keyword: 所期待的关键字
* 成功找到关键字返回true,否则返回false
*/
int doCmdOk(String strCmd, char *OkKey,char *ErrKey,unsigned int timeout)
{
String strData="";
unsigned long t = 0;
//清空接收 缓冲区
strData="";
while (WIFI_UART.available())strData+=char(WIFI_UART.read());
//发送AT指令
if(strCmd=="+++")
{
delay(1500);
WIFI_UART.print("+++");
delay(1500);
DBG_UART.println("+++");
return RET_OK;
}
//发送命令
WIFI_UART.println(strCmd);DBG_UART.println(strCmd);
//等待应答
strData="";
t=millis();
while (1) // 等待模块回复
{
while(WIFI_UART.available())
{
strData+=char(WIFI_UART.read());
}
if(findstr(strData,OkKey)==true)
{
DBG_UART.println("---ok---");
DBG_UART.println(strData);
return RET_OK;
}
if(findstr(strData,ErrKey)==true)//后面,可能出现 已经 连接的关键词
{
DBG_UART.println("---err---");
DBG_UART.println(strData);
return RET_ERR;
}
if(millis()-t>timeout)
{
DBG_UART.println("---timeout---");
DBG_UART.println(strData);
return RET_TIMEOUT;//超过时没有应答,需要对模块重新上电。
}
}
return RET_ERR;
}
void setup() {
char buf[100] = {0};
int tmp;
pinMode(6,INPUT);
pinMode(7,INPUT);
pinMode(8,INPUT);
pinMode(13, OUTPUT); //WIFI模块指示灯
digitalWrite(13, HIGH); // 使Led亮
//--------------------------------------
WIFI_UART.begin( _baudrate );
DBG_UART.begin( _baudrate );
WIFI_UART.setTimeout(3000); //设置find超时时间
delay(3000);
while (!WIFI_UART)
{
; // wait for serial port to connect. Needed for Leonardo only
}
while (!DBG_UART)
{
; // wait for serial port to connect. Needed for Leonardo only
}
//------------------------------------------
while(1)
{
int status;
if(doCmdOk("AT", "OK","ERROR",SECOND)==RET_OK)break;
doCmdOk("+++", "OK","ERROR",SECOND);
status=doCmdOk("AT", "OK","ERROR",SECOND);
if(status==RET_OK)break;
if(status==RET_TIMEOUT)resetFunc();
}
if(doCmdOk("AT+CWMODE=3", "OK","ERROR",SECOND)!=RET_OK)resetFunc();
if(doCmdOk("AT+RST", "OK1","ERROR1",4*SECOND)!=RET_OK);//resetFunc();
if(doCmdOk("ATE0", "OK","ERROR",SECOND)!=RET_OK)resetFunc();;
if(doCmdOk("AT+CIFSR", "OK","ERROR",2*SECOND)!=RET_OK)resetFunc();
if(doCmdOk("AT+CWJAP=\"lele\",\"159120721\"", "OK","ERROR",10*SECOND)!=RET_OK)resetFunc();;
if(doCmdOk("AT+CIPMODE=1", "OK","ERROR",SECOND)!=RET_OK)resetFunc();;
}
void loop() {
if (doCmdOk("AT+CIPSTART=\"TCP\",\"183.230.40.33\",80", "CONNECT","ERROR1",3*SECOND)!=RET_OK)resetFunc();
while(1)
{
//检查连接状态?STATUS:4失去连接; STATUS:3建立连接; STATUS:2获得IP; STATUS:5物理掉线
if(doCmdOk("AT+CIPSTATUS","STATUS:3","ERROR",SECOND)!=RET_OK) break;
delay(100);// 等待后续数据接受完
if(doCmdOk("AT+CIPSEND",">","ERROR",2*SECOND)!=RET_OK)resetFunc();
//doCmdOk("+++", "OK","ERROR",SECOND); //切换到DATA状态
SendDataByHttp();
doCmdOk("+++", "OK","ERROR",SECOND); //切换到CMD灯状态
}
}
String CreateDataForHttp(char *strStreamId,unsigned long value)
{
String str="{\"datastreams\":[{\"id\":\""+String(strStreamId)+"\",\"datapoints\":[{\"value\":" + String(value) + "}]}]}";//43
return str;
}
bool SendDataByHttp()
{
int cnt = 61;
String ptr;
String strData="";
unsigned long timeout=0;
int iValue=0;
ptr=CreateDataForHttp("sys_time", myIn()); //////////////////////////////////////////////////////////////////////////////////////////////digitalRead(8)
cnt=ptr.length();
DBG_UART.println(cnt,DEC);
//发送数据 http
WIFI_UART.print("POST /devices/" + String(DEVICE_ID) + "/datapoints HTTP/1.1\r\n"); DBG_UART.print("POST /devices/" + String(DEVICE_ID) + "/datapoints HTTP/1.1\r\n");
WIFI_UART.print("api-key:" + String(API_KEY) + "\r\n");DBG_UART.print("api-key:" + String(API_KEY) + "\r\n");
WIFI_UART.print("Host:api.heclouds.com\r\n");DBG_UART.print("Host:api.heclouds.com\r\n");
WIFI_UART.print("Content-Length:" + String(cnt) + "\r\n");DBG_UART.print("Content-Length:" + String(cnt) + "\r\n");
WIFI_UART.println();DBG_UART.println();
WIFI_UART.print(ptr); DBG_UART.print(ptr);
WIFI_UART.println(); DBG_UART.println();
return 0;
}
RFID 数据采集:
#include <SPI.h>
#include <RFID.h>
#include <SoftwareSerial.h>
#define rxPin 2
#define txPin 3
SoftwareSerial softSerial(rxPin, txPin);
RFID rfid(10,5); //D10--读卡器MOSI引脚、D5--读卡器RST引脚
//4字节卡序列号,第5字节为校验字节
unsigned char serNum[5];
//写卡数据
unsigned char writeDate[16] = {'c', 'q', 'g', 'c', 'x', 'y', 0, 0,0, 0, 0, 0, 0, 0, 0, 0}; //{'G', 'e', 'e', 'k', '-', 'W', 'o', 'r', 'k', 'S', 'h', 'o', 'p', 0, 0, 0};
//原扇区A密码,16个扇区,每个扇区密码6Byte
unsigned char sectorKeyA[16][16] = {
{0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF},
{0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF},
{0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF},};
//新扇区A密码,16个扇区,每个扇区密码6Byte
unsigned char sectorNewKeyA[16][16] = {
{0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF},
{0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xff,0x07,0x80,0x69, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF},
{0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xff,0x07,0x80,0x69, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF},};
char *str1="Geek-WorkShop";
char *str2="cqgcxy";
int count=4;
int flag;
int f;
void setup()
{
Serial.begin(9600);
SPI.begin();
rfid.init();
pinMode(6,OUTPUT);
pinMode(7,OUTPUT);
pinMode(8,OUTPUT);
}
void myout(unsigned char ch)
{
digitalWrite(6, ch&0x01);
digitalWrite(7, (ch>>1)&0x01);
digitalWrite(8, (ch>>2)&0x01);
}
void loop()
{
unsigned char i,tmp;
unsigned char status;
unsigned char str[MAX_LEN];
unsigned char RC_size;
unsigned char blockAddr; //选择操作的块地址0~63
//找卡
rfid.isCard();
//读取卡序列号
if (rfid.readCardSerial())
{
Serial.print("The card's number is : ");
Serial.print(rfid.serNum[0],HEX);
Serial.print(rfid.serNum[1],HEX);
Serial.print(rfid.serNum[2],HEX);
Serial.print(rfid.serNum[3],HEX);
Serial.print(rfid.serNum[4],HEX);
Serial.println(" ");
}
//读卡
blockAddr = 7; //数据块7
status = rfid.auth(PICC_AUTHENT1A, blockAddr, sectorNewKeyA[blockAddr/4], rfid.serNum);
if (status == MI_OK) //认证
{
//读数据
blockAddr = blockAddr - 3 ; //数据块4
if( rfid.read(blockAddr, str) == MI_OK)
{rfid.halt();
Serial.print("Read from the card ,the data is : ");
Serial.println((char *)str);
if(strcmp(str,str1)==0&&flag==0)
{
count--;
Serial.print("伞数量为:");
Serial.print(count);
softSerial.write(count);
myout(count);
flag=1;
delay(1000);
}
else if(strcmp(str,str1)==0&&flag==1)
{
count++;
Serial.print("伞数量为111:");
Serial.print(count);
softSerial.write(count);
myout(count);
flag=0;
delay(1000);
}
else if(strcmp(str,str2)==0&&f==0)
{
count--;
Serial.print("伞数量为2:");
Serial.print(count);
Serial.write(count);
myout(count);
f=1;
delay(1000);
}
else if(strcmp(str,str2)==0&&f==1)
{
count++;
Serial.print("伞数量为3:");
Serial.print(count);
softSerial.write(count);
myout(count);
f=0;
delay(1000);
}
else Serial.print("不符合要求");
}
}
}
}[/kenrobot_code]
八、视频网址:
|