Smart Cart IOT logistique interne (Intel IoT) (10 / 10 étapes)

Étape 10 : Dernier Intel edison Arduino Code

C’est le code de la dernière Arduino Source. Vous pouvez également utiliser la connectivité cloud au lieu de cette connectivité locale. Pour des nuages intégration, vous devez choisir IBM Bluemix ou toute autre source.
Espoir que vous avez apprécié. N’oubliez pas de mentionner votre précieux commentaire!!! et suivez-moi pour futures mises à jour.


< br >< p > #define uchar unsigned char #define uint unsigned int Servo servo_1 ; Servo servo_2 ; Servo servo_3 ; Servo servo_4 ; Servo servo_5 ; int servo1_pos = 0 ; int servo2_pos = 0 ; int servo3_pos = 0 ; int servo4_pos = 0 ; 数组最大长度 #define MAX_LEN 16 < /p >< p > / / / //set la broche / / / const int chipSelectPin = 10 ; const int NRSTPD = 5; < /p >< p > //MF522命令字 #define //NO PCD_IDLE 0 x 00 action ; 取消当前命令 #define PCD_AUTHENT 0x0E //验证密钥 #define PCD_RECEIVE 0 x 08 //接收数据 #define PCD_TRANSMIT 0 x 04 //发送数据 #define PCD_TRANSCEIVE 0x0C //发送并接收数据 #define PCD_RESETPHASE 0x0F //复位 #define PCD_CALCCRC 0 x 03 //CRC计算 < /p >< p > //Mifare_One卡片命令字 #define PICC_REQIDL 0 x 26 //寻天线区内未进入休眠状态 #define PICC_REQALL 0 x 52 //寻天线区内全部卡 #define PICC_ANTICOLL 0x93 //防冲撞 #define PICC_SElECTTAG 0x93 //选卡 #define PICC_AUTHENT1A 0 x 60 / / 验证A密钥 #define PICC_AUTHENT1B 0x61 //验证B密钥 #define PICC_READ 0 x 30 //读块 #define PICC_WRITE 0xA0 //写块 #define PICC_DECREMENT 0xC0 //扣款 #define PICC_INCREMENT 0xC1 //充值 #define PICC_RESTORE 0xC2 //调块数据到缓冲区 #define PICC_TRANSFER 0xB0 //保存缓冲区中数据 #define PICC_HALT 0 x 50 //休眠 < /p >< p > //和MF522通讯时返回的错误代码 #define MI_OK 0 #define MI_NOTAGERR 1 #define MI_ERR 2 < /p >< p > //---MFRC522寄存器---//Page 0 : Commande et statut #define Reserved00 0 x 00 #define CommandReg 0 x 01 #define CommIEnReg 0 x 02 #define DivlEnReg 0 x 03 #define CommIrqReg 0 x 04 #define DivIrqReg 0 x 05 #define ErrorReg 0 x 06 #define Status1Reg 0 x 07 #define Status2Reg 0 x 08 #define FIFODataReg 0 x 09 #define FIFOLevelReg 0x0A #define WaterLevelReg 0x0B #define ControlReg 0x0C #define BitFramingReg 0x0D #define CollReg 0x0E #define Reserved01 0x0F //Page 1:Command #define Reserved10 0 x 10 #define ModeReg 0 x 11 #define TxModeReg 0 x 12 #define RxModeReg 0 x 13 #define TxControlReg 0 x 14 #define TxAutoReg 0 x 15 #define TxSelReg 0 x 16 #define RxSelReg 0 x 17 #define RxThresholdReg 0 x 18 #define DemodReg 0 x 19 #define Reserved11 0x1A #define réservé12 0x1B #define MifareReg 0x1C #define Reserved13 0x1D #define Reserved14 0x1E #define SerialSpeedReg 0x1F //Page 2:CFG #define Reserved20 0 x 20 #define CRCResultRegM 0 x 21 #define CRCResultRegL 0 x 22 #define Reserved21 0 x 23 #define ModWidthReg 0 x 24 #define Reserved22 0 x 25 #define RFCfgReg 0 x 26 #define GsNReg 0 x 27 #define CWGsPReg 0 x 28 #define ModGsPReg 0 x 29 #define TModeReg 0x2A #define TPrescalerReg 0x2B #define TReloadRegH 0x2C #define TReloadRegL 0x2D #define TCounterValueRegH 0x2E #define TCounterValueRegL 0x2F //Page 3 : TestRegister #define Reserved30 0 x 30 #define TestSel1Reg 0 x 31 #define TestSel2Reg 0 x 32 #define TestPinEnReg 0 x 33 #define TestPinValueReg 0 x 34 #define TestBusReg 0 x 35 #define AutoTestReg 0 x 36 #define VersionReg 0 x 37 #define AnalogTestReg 0 x 38 #define TestDAC1Reg 0 x 39 #define TestDAC2Reg 0x3A #define TestADCReg 0x3B #define Reserved31 0x3C #define Reserved32 0x3D #define Reserved33 0x3E #define Reserved34 0x3F / /---< /p >< p > //---Servo moteur---#include < /p >< p > #define MotorSpeedSet 0 x 82 #define PWMFrequenceSet 0 x 84 #define DirectionSet 0xaa #define MotorSetA 0xa1 #define MotorSetB 0xa5 #define Rien 0 x 01 < /p >< p > #define I2CMotorDriverAdd 0x0f / / définir l’adresse de la I2CMotorDriver < /p >< p > / / / / / Enanble l’i2c moteur pilote pour piloter un moteur pas à pas 4 fils. le pilote automobile i2c sera //driver un 4 fils avec polarité 8. Sens : sens de moteurs pas à pas ; Vitesse de 1/0 //motor : définit l’intervalle de temps le changement de moteur i2C il sortie de conduire le temps d’intervalle stepper //the actul est : motorspeed * 4ms
. autrement dit, lorsque la vitesse du moteur est 10, l’intervalle de temps //would être 40 ms / / / void StepperMotorEnable (unsigned char Direction, unsigned char motorspeed) {Wire.beginTransmission(I2CMotorDriverAdd); / / transmettre à un périphérique I2CMotorDriverAdd / / set pwm en-tête Wire.write(Direction); / / envoyer PW101 Wire.write(motorspeed); / / envoyer pwmb Wire.endTransmission(); / / arrêter la transmission} < /p >< p > / / / //Function pour définir les 2 DC vitesse moteur //motorSpeedA: DC moteur à une vitesse ; doit être de 0 ~ 100 ; motorSpeedB : la vitesse de moteur B DC ; doit être de 0 ~ 100 ; < /p >< p > void MotorSpeedSetAB (unsigned char MotorSpeedA, unsigned char MotorSpeedB) {MotorSpeedA=map(MotorSpeedA,0,100,0,255) ; MotorSpeedB=map(MotorSpeedB,0,100,0,255) ; Wire.beginTransmission(I2CMotorDriverAdd) ; transmettre à un périphérique I2CMotorDriverAdd Wire.write(MotorSpeedSet) ; la valeur d’en-tête pwm Wire.write(MotorSpeedA) ; Envoyer PW101 Wire.write(MotorSpeedB) ; Envoyer pwmb Wire.endTransmission() ; arrêt de transmission} //set la prescale fréquence de PWM, par défaut de 0 x 03 ; void MotorPWMFrequenceSet (unsigned char fréquence) {Wire.beginTransmission(I2CMotorDriverAdd); / / transmettre à un périphérique I2CMotorDriverAdd Wire.write(PWMFrequenceSet); / / définir l’en-tête de fréquence Wire.write(Frequence); / / envoyer la fréquence Wire.write(Nothing); / / besoin d’envoyer cet octet comme la troisième byte(no meaning) Wire.endTransmission(); / / arrêter la transmission} //set la direction du moteur à courant continu. void MotorDirectionSet (unsigned char Direction) {/ / régler l’orientation des moteurs 0b0000 I4 I3 I2 I1 Wire.beginTransmission(I2CMotorDriverAdd); / / transmettre à un périphérique I2CMotorDriverAdd Wire.write(DirectionSet); / / Direction contrôle header Wire.write(Direction); / / envoyer les informations de contrôle de direction Wire.write(Nothing); / / besoin d’envoyer cet octet comme la troisième byte(no meaning) Wire.endTransmission(); / / arrêter la transmission} < /p >< p > void MotorDriectionAndSpeedSet (unsigned char Direction, unsigned char MotorSpeedA unsigned char MotorSpeedB) {//you peut ajuster le descandant et vitesse ensemble MotorDirectionSet(Direction) ; MotorSpeedSetAB(MotorSpeedA,MotorSpeedB) ; } //---Servo < /p >< p > moteur---< /p >< p > //4字节卡序列号,第5字节为校验字节 uchar serNum [5]; < /p >< p > uchar writeData [16] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 100} ; 初始化 100元钱 uchar moneyConsume = 18 ; 消费18元 uchar moneyAdd = 10 ; 充值10元 //扇区A密码,16个扇区, 每个扇区密码6Byte sectorKeyA d’uchar [16] [16] = {{0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, / / {0 x 19, 0 x 84, 0 x 07, 0 x 15, 0x76, 0 x 14}, {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF},} ; sectorNewKeyA UCHAR [16] [16] = {{0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xff, 0 x 07, 0 x 80, 0x69, 0 x 19, 0 x 84, 0 x 07, 0 x 15, 0x76, 0 x 14}, //you pouvez définir un autre ket, telles que « 0 x 19, 0 x 84, 0 x 07, 0 x 15, 0x76, 0 x 14 "/ / {0 x 19, 0 x 84, 0 x 07, 0 x 15, 0x76, 0 x 14, 0xff, 0 x 07, 0 x 80, 0x69, 0 x 19, 0 x 84, 0 x 07, 0 x 15, 0x76, 0 x 14}, / / mais quand boucle, veuillez régler le sectorKeyA la même clé, alors que le module RFID peut lire la carte {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xff, 0 x 07, 0 x 80, 0x69, 0 x 19, 0 x 33, 0 x 07, 0 x 15, 0 x 34, 0 x 14},}; < /p >< p > #include #include < /p >< p > / / mise à jour avec les valeurs appropriées pour votre réseau. Char [] ssid = "Intel_Hackathon" ; votre char SSID (nom) du réseau pass [] = "Intelhack" ; État int de votre mot de passe réseau = WL_IDLE_STATUS ; statut de la radio Wifi < /p >< p > serveur Byte = {192, 168, 21, 96} ; res de char ; < /p >< p > rappel Sub (char * sujet, charge utile octets *, unsigned int longueur) {/ / handle message arrivé < /p >< p > Serial.print ("Message est arrivé [") ; Serial.Print(Topic) ; Serial.Print("]") ; pour (int j’ai = 0; j’ai < longueur; i ++) {Serial.print((char)payload[i]) ; res = charge (char) [i]; < /p >< p >} < /p >< p > si (res == « a ») {/ / digitalWrite (3, élevée); / / allumer la LED (HIGH est le niveau de tension) / / delay(1000) ; rfidon() < /p >< p >; / / motor1.run(FORWARD);} < /p >< p > si (res == « b ») {/ / attendre une seconde / / digitalWrite (3, faible) ; Serial.Print("OFF"); / / éteindre la LED en rendant la tension basse / / delay(1000) ; Attendez une seconde < /p >< p > / / motor1.setSpeed(0) ; } / / < /p >< p >} < /p >< p > WiFiClient wifiClient ; PubSubClient client (serveur, 1883, callback, wifiClient) ; void runFunction() {Wire.begin(); / / join bus i2c (adresse facultatif pour maître) Serial.println ("DC envoyé speed 100") ; MotorDirectionSet(0b0101) ; « 0b1010 » définit la polarité de sortie, qui signifie « 10 » le M + est « positif » tandis que le M - est « negtive » / / / / faire sûr que M + et M - est polatity différent lors de la conduite des moteurs à courant continu. MotorSpeedSetAB (100 100); //defines la vitesse des moteurs 1 et 2 ; Delay(10) ; ce délai nécessaire / / delay(5000) ; < /p >< p > / / MotorDirectionSet(0b0101) ; 0b0101 tournant dans le sens inverse} void setup() {< /p >< p > Serial.begin(9600); / / RFID reader SOUT broche reliée à la broche de la série RX à 2400 bps / / départ de la bibliothèque SPI : SPI.begin() ; < /p >< p > pinMode (chipSelectPin, sortie); / / Set broche numérique 10 comme sortie pour le connecter à la RFID /Enable. broche digitalWrite (chipSelectPin, basse); / / activer la RFID reader pinMode (NRSTPD SORTIE) ; Définir la broche numérique 10, pas remis à zéro et arrêt digitalWrite (NRSTPD, HIGH); < /p >< p > MFRC522_Init() ; Initialiser la série et attendez de port à ouvrir: / / Serial.begin(9600) ; while (!. Série) {; / / attente pour port série pour se connecter. Besoin pour Leonardo seulement} < /p >< p > / / Vérifier la présence du Bouclier : si (WiFi.status() == WL_NO_SHIELD) {Serial.println ("WiFi bouclier n’existe pas"); / / ne continuent pas : tout en (true);} < /P >< p > String fv = WiFi.firmwareVersion() ; Si (fv! = « 1.1.0 ») Serial.println ("s’il vous plaît mettre à jour le firmware"); < /p >< p > / / tentent de se connecter au réseau Wifi : tandis que (statut! = WL_CONNECTED) {Serial.print ("se connecter au WPA SSID:") ; Serial.println(SSID) ; Se connecter au réseau WPA/WPA2 : statut = WiFi.begin (ssid, pass); < /p >< p > / / attendre 10 secondes pour connexion : delay(10000) ; } < /p >< p > / / vous êtes maintenant connecté, alors imprimez les données : Serial.print ("vous êtes connecté au réseau") ; printCurrentNet() ; printWifiData() ; < /p >< p > / / delay(1000) ; < /p >< p > si (! client.connected()) {Serial.println ("client.connected Passed"); < /p >< p > si (! client.connect("Arduino")) / / échoue à chaque fois juste ici Serial.println ("client.connect FAILED"); < /p >< p > si (! client.publish ("outTopic", « hello world »)) Serial.println ("client.publish FAILED"); < /p >< p > si ()! client.subscribe("inTopic")) Serial.println ("client.subscribe FAILED"); < /p >< p > Serial.println ("Publication et abonnement sont fait") ; } else Serial.println ("Connexion échouée") ; } < /p >< p > void loop() {client.loop() < /p >< p > ; < /p >< p >} < /p >< p > void printWifiData() {/ / print adresse IP de votre bouclier WiFi : ip IPAddress = WiFi.localIP() ; Serial.Print ("adresse IP:") ; Serial.println(IP) ; Serial.println(IP) ; < /p >< p > / / imprimer votre adresse MAC : mac octet [6] ; WiFi.macAddress(mac) ; Serial.Print ("adresse MAC:") ; Serial.Print (mac [5], HEX) ; Serial.Print(":") ; Serial.Print (mac [4], HEX) ; Serial.Print(":") ; Serial.Print (mac [3], HEX) ; Serial.Print(":") ; Serial.Print (mac [2], HEX) ; Serial.Print(":") ; Serial.Print (mac [1], HEX) ; Serial.Print(":") ; Serial.println (mac [0], HEX); < /p >< p >} < /p >< p > void printCurrentNet() {/ / print le SSID du réseau vous êtes attaché à: Serial.print ("SSID:") ; Serial.println(WiFi.SSID()) ; < /p >< p > / / imprimer l’adresse MAC du routeur vous êtes attaché à: octet bssid [6] ; WiFi.BSSID(bssid) ; Serial.Print (« BSSID: ") ; Serial.Print (bssid [5], HEX) ; Serial.Print(":") ; Serial.Print (bssid [4], HEX) ; Serial.Print(":") ; Serial.Print (bssid [3], HEX) ; Serial.Print(":") ; Serial.Print (bssid [2], HEX) ; Serial.Print(":") ; Serial.Print (bssid [1], HEX) ; Serial.Print(":") ; Serial.println (bssid [0], HEX); < /p >< p > / / print l’intensité du signal reçu : rssi long = WiFi.RSSI() ; Serial.Print ("force (RSSI) du signal:") ; Serial.println(RSSI) ; < /p >< p > / / Afficher le type de chiffrement : le chiffrement octets = WiFi.encryptionType() ; Serial.Print ("Type de cryptage:") ; Serial.println (cryptage, HEX) ; Serial.println() ; } Sub < /p >< p > rfidon() < /p >< p > {Serial.println ("RFID fonctionne maintenant"); < /p >< p > uchar i, tmp ; statut uchar ; uchar uchar RC_size, str [MAX_LEN]; //选择操作的块地址0~63 ; blockAddr uchar mynum String = ""; < /p >< p > / / runFunction() ; 寻卡, état 返回卡类型 = MFRC522_Request (PICC_REQIDL, str) ; Serial.println(Status) ; Serial.println(MI_OK) ; tandis que (status! = MI_OK) {statut = MFRC522_Request (PICC_REQIDL, str) ; Serial.println(Status) ; Serial.println(MI_OK) ; Si (statut == MI_OK) {Serial.println ("carte détectée"); < /p >< statut p > = MFRC522_Anticoll(str) ; memcpy (serNum, str, 5); if (statut == MI_OK) {faire {Serial.println ("le numéro de carte est:") ; Serial.Print(serNum[0]) ; Serial.Print (",") ; Serial.Print (serNum [1], BIN) ; Serial.Print (",") ; Serial.Print (serNum [2], BIN) ; Serial.Print (",") ; Serial.Print (serNum [3], BIN) ; Serial.Print (",") ; Serial.Print (serNum [4], BIN) ; statut = MFRC522_Request (PICC_REQIDL, str) ; statut = MFRC522_Anticoll(str) ; memcpy (serNum, str, 5) ; Serial.println("") ; < /p >< p > / / doit vraiment vérifier toutes les paires, mais pour l’instant, nous allons juste utiliser le premier} tandis que (serNum [0]! = 225) ; Si (serNum [0] == 225) {Serial.println ("RFID détecté") ; Serial.Print(serNum[0]) ; MotorSpeedSetAB(0,0) ; servo_4.Attach(9) ; < /p >< p > pour (servo4_pos = 175 ; servo4_pos > = 30 ; servo4_pos--) {servo_4.write(servo4_pos) ; delay(20) ; //Serial.println ("à l’intérieur du" servo 4");} servo_4.Detach() ; Delay(1000) ; servo_1.Attach(3) ; pour (servo1_pos = 5; servo1_pos < = 100 ; servo1_pos ++) {servo_1.write(servo1_pos) ; delay(20);} servo_1.detach() ; Delay(1000) ; < /p >< p > delay(1000) ; servo_1.Attach(3) ; pour (servo1_pos = 100 ; servo1_pos > = 5; servo1_pos--) {servo_1.write(servo1_pos) ; delay(20);} delay(1000) ; servo_4.attach(9) < /p >< p > ; < /p >< p > pour (servo4_pos = 30 ; servo4_pos < = 175 ; servo4_pos ++) {servo_4.write(servo4_pos) ; delay(20) ; Serial.println ("à l’intérieur du" servo 4");} servo_4.Detach() ; rupture ; Delay(1000) ; servo_1.Attach(3) ; pour (servo1_pos = 5; servo1_pos < = 100 ; servo1_pos ++) {servo_1.write(servo1_pos) ; delay(20);} pour (servo1_pos = 100 ; servo1_pos > = 5; servo1_pos--) {servo_1.write(servo1_pos) ; delay(20);} servo_1.detach() ; Delay(1000) ; }} / / Serial.print(str[0],BIN) ; Serial.Print (",") ; Serial.Print(STR[1],bin) ; Serial.println("");} //防冲撞 < /p >< p >返回卡的序列号 4字节 < /p >< p >} / / Serial.println("") ; MFRC522_Halt() ; 命令卡片进入休眠状态 < /p >< p >} < /p >< p > void Write_MFRC522 (uchar addr, uchar val) {digitalWrite (chipSelectPin, LOW); < /p >< p > //地址格式:0XXXXXX0 SPI.transfer ((addr << 1) & 0x7E) ; SPI.transfer(val) ; < /p >< p > digitalWrite (chipSelectPin, HIGH) ; } < /p >< p > / * * 函 数 名:Read_MFRC522 * 功能描述:从MFRC522的某一寄存器读一个字节数据 * 输入参数:addr--寄存器地址 * 返 回 值:返回读取到的一个字节数据 * / uchar Read_MFRC522(uchar addr) {uchar val ; < /p >< p > digitalWrite (chipSelectPin, LOW); < /p >< p > //地址格式:1XXXXXX0 SPI.transfer (((addr << 1) & 0x7E) | 0 x 80); val = SPI.transfer(0x00) ; < /p >< p > digitalWrite (chipSelectPin, HIGH); < /p >< p > retour val;} < /p >< p > / * * 函 数 名:SetBitMask * 功能描述:置RC522寄存器位 * 输入参数:reg--寄存器地址 ; masque--置位值 * 返 回 值:无 * / void SetBitMask (uchar reg, uchar masque) {tmp uchar ; tmp = Read_MFRC522(reg) ; Write_MFRC522 (reg, tmp | masque) ; définir le masque de bits} < /p >< p > / * * 函 数 名:ClearBitMask * 功能描述:清RC522寄存器位 * 输入参数:reg--寄存器地址 ; masque--清位值 * 返 回 值:无 * / void ClearBitMask (uchar reg, uchar masque) {tmp uchar ; tmp = Read_MFRC522(reg) ; Write_MFRC522 (reg, tmp & (~ masque)) ; Désactivez le masque de bits} < /p >< p > / * * 函 数 名:AntennaOn * 功能描述:开启天线, 每次启动或关闭天险发射之间应至少有1ms的间隔 * 输入参数:无 * 返 回 值:无 * / void AntennaOn(void) {uchar temp ; < /p >< p > temp = Read_MFRC522(TxControlReg) ; if (! () Temp & 0 x 03)) {SetBitMask (TxControlReg, 0 x 03);}} < /p >< p > / * * 函 数 名:AntennaOff * 功能描述:关闭天线, 每次启动或关闭天险发射之间应至少有1ms的间隔 * 输入参数:无 * 返 回 值:无 * / void AntennaOff(void) {ClearBitMask (TxControlReg, 0 x 03);} < /p >< p > / * * 函 数 名:ResetMFRC522 * 功能描述:复位RC522 * 输入参数:无 * 返 回 值:无 * / void MFRC522_Reset(void) {Write_MFRC522 (CommandReg, PCD_RESETPHASE);} < /p >< p > / * * 函 数 名:InitMFRC522 * 功能描述:初始化RC522 * 输入参数:无 * 返 回 值:无 * / void MFRC522_Init(void) {digitalWrite (NRSTPD, HIGH); < /p >< p > MFRC522_Reset() ; < /p >< p > / / Timer : TPrescaler * TreloadVal / 6,78 MHz = 24ms Write_MFRC522 (TModeReg, 0x8D); //Tauto=1 ; f(Timer) = 6,78 MHz/TPreScaler Write_MFRC522(TPrescalerReg, 0x3E) ; //TModeReg[3..0] + TPrescalerReg Write_MFRC522(TReloadRegL, 30) ; Write_MFRC522(TReloadRegH, 0) ; < /p >< p > Write_MFRC522 (TxAutoReg, 0 x 40) ; Demandez à 100 % Write_MFRC522 (ModeReg, 0x3D) ; CRC初始值0x6363??? < /P >< p > //ClearBitMask (Status2Reg, 0 x 08) ; MFCrypto1On = 0 //Write_MFRC522 (RxSelReg, 0x86) ; RxWait = RxSelReg [5..0] //Write_MFRC522 (RFCfgReg, 0x7F) ; RxGain = 48dB < /p >< p > AntennaOn() ; 打开天线} < /p >< p > / * * 函 数 名:MFRC522_Request * 功能描述:寻卡, 读取卡类型号 * 输入参数:reqMode--寻卡方式, * TagType--返回卡片类型 * 0x4400 = Mifare_UltraLight * 0 x 0400 = Mifare_One(S50) * 0 x 0200 = Mifare_One(S70) * 0 x 0800 = Mifare_Pro(X) * 0x4403 = Mifare_DESFire * 返 回 值:成功返回MI_OK * / uchar MFRC522_Request (uchar reqMode, uchar * TagType) {uchar statut ; uint backBits ; //接收到的数据位数 < /p >< p > Write_MFRC522 (BitFramingReg, 0 x 07); //TxLastBists = BitFramingReg [2..0]??? < /P >< p > TagType [0] = reqMode ; statut = MFRC522_ToCard (PCD_TRANSCEIVE, TagType, 1, TagType, & backBits); < /p >< p > si ((status! = MI_OK) || (backBits! = 0 x 10)) {statut = MI_ERR;} < /p >< p > retour d’État ; } < /p >< p > / * * 函 数 名:MFRC522_ToCard * 功能描述:RC522和ISO14443卡通讯 * 输入参数:command--MF522命令字, * sendData--通过RC522发送到卡片的数据, * sendLen--发送的数据长度 * rétrospectives--接收到的卡片返回数据, * backLen--返回数据的位长度 * 返 回 值:成功返回MI_OK * / uchar MFRC522_ToCard (uchar commande, uchar * sendData, uchar sendLen, uchar * rétrospectives, uint * backLen) {uchar statut = MI_ERR ; uchar irqEn = 0 x 00 ; uchar waitIRq = 0 x 00 ; uchar lastBits ; uchar n; uint i; < /p >< p > interrupteur (commande) {case PCD_AUTHENT : //认证卡密 {irqEn = 0 x 12 ; waitIRq = 0 x 10 ; break;} affaire PCD_TRANSCEIVE : //发送FIFO中数据 {irqEn = 0x77 ; waitIRq = 0 x 30 ; break;} par défaut : break ; } < /P >< p > Write_MFRC522 (CommIEnReg, irqEn | 0 x 80) ; 允许中断请求 ClearBitMask (CommIrqReg, 0 x 80) ; 清除所有中断请求位 SetBitMask (FIFOLevelReg, 0 x 80) ; FlushBuffer = 1, FIFO初始化 < /p >< p > Write_MFRC522 (CommandReg, PCD_IDLE) ; AUCUNE action ; 取消当前命令??? < /P >< p > //向FIFO中写入数据 pour (i = 0; i < sendLen; i ++) {Write_MFRC522 (FIFODataReg, sendData[i]);} < /P >< p > //执行命令 Write_MFRC522 (CommandReg, commande) ; Si (commande == PCD_TRANSCEIVE) {SetBitMask (BitFramingReg, 0 x 80); //StartSend=1,transmission de données commence} < /p >< p > //等待接收数据完成 j’ai = 2000 ; i根据时钟频率调整, 操作M1卡最大等待时间25ms??? {//CommIrqReg[7..0] //Set1 TxIRq RxIRq IdleIRq HiAlerIRq LoAlertIRq ErrIRq TimerIRq n = Read_MFRC522(CommIrqReg); i--;} tandis que ((i! = 0) & &! () n & 0 x 01) & & ! (n & waitIRq)) ; < /P >< p > ClearBitMask (BitFramingReg, 0 x 80) ; StartSend = 0 < /p >< p > si (j’ai! = 0) {si (! () Read_MFRC522(ErrorReg) & 0x1B)) //BufferOvfl Collerr CRCErr ProtecolErr {statut = MI_OK ; if (n & irqEn & 0 x 01) {statut = MI_NOTAGERR; / /??} < /p >< p > si (commande == PCD_TRANSCEIVE) {n = Read_MFRC522(FIFOLevelReg) ; lastBits = Read_MFRC522(ControlReg) & 0 x 07 ; if (lastBits) {* backLen = (n - 1) * 8 + lastBits;} else {* backLen = n * 8;} < /p >< p > si (n == 0) {n = 1;} si (n > MAX_LEN) {n = MAX_LEN;} < /P >< p > //读取FIFO中接收到的数据 pour (i = 0; i < n; i ++) {rétrospectives [i] = Read_MFRC522(FIFODataReg);}} } else {statut = MI_ERR;} < /P >< p >} < /p >< p > / / SetBitMask(ControlReg,0x80) ; minuteur s’arrête //Write_MFRC522 (CommandReg, PCD_IDLE); < /p >< p > renvoyer État ; } < /p >< p > / * * 函 数 名:MFRC522_Anticoll * 功能描述:防冲突检测, 读取选中卡片的卡序列号 * 输入参数:serNum--返回4字节卡序列号, 第5字节为校验字节 * 返 回 值:成功返回MI_OK * / uchar MFRC522_Anticoll(uchar *serNum) {uchar situation ; uchar i; uchar serNumCheck = 0; uint unLen ; < /p >< p > //ClearBitMask (Status2Reg, 0 x 08) //TempSensclear / / ClearBitMask(CollReg,0x80) ; //ValuesAfterColl Write_MFRC522 (BitFramingReg, 0 x 00); //TxLastBists = BitFramingReg [2..0] < /p >< p > serNum [0] = PICC_ANTICOLL ; serNum [1] = 0 x 20 ; statut = MFRC522_ToCard (PCD_TRANSCEIVE serNum, 2, serNum, & unLen); < /p >< p > si (statut == MI_OK) {//校验卡序列号 pour (i = 0; j’ai < 4; i ++) {serNumCheck ^ = serNum [i];} si (serNumCheck! = serNum[i]) {statut = MI_ERR;}} < /P >< p > //SetBitMask (CollReg, 0 x 80) ; ValuesAfterColl = 1 < /p >< p > État de retour ; } < /p >< p > / * * 函 数 名:CalulateCRC * 功能描述:用MF522计算CRC * 输入参数:pIndata--要读数CRC的数据, len--数据长度, pOutData--计算的CRC结果 * 返 回 值:无 * / void CalulateCRC (uchar * pIndata, uchar len, uchar * pOutData) {uchar i, n; < /p >< p > ClearBitMask (DivIrqReg, 0 x 04); //CRCIrq = 0 SetBitMask (FIFOLevelReg, 0 x 80); //清FIFO指针 //Write_MFRC522 (CommandReg, PCD_IDLE); < /p >< p > //向FIFO中写入数据 pour (i = 0; j’ai < len; i ++) {Write_MFRC522 (FIFODataReg *(pIndata + i)) ; } Write_MFRC522(CommandReg, PCD_CALCCRC) ; < /p >< p > //等待CRC计算完成 j’ai = 0xFF ; {n = Read_MFRC522(DivIrqReg); i--;} tandis que ((i! = 0) & &! () n & 0 x 04)) ; CRCIrq = 1 < /p >< p > //读取CRC计算结果 pOutData [0] = Read_MFRC522(CRCResultRegL) ; pOutData [1] = Read_MFRC522(CRCResultRegM) ; } < /p >< p > / * * 函 数 名:MFRC522_SelectTag * 功能描述:选卡, 读取卡存储器容量 * 输入参数:serNum--传入卡序列号 * 返 回 值:成功返回卡容量 * / uchar MFRC522_SelectTag(uchar *serNum) {uchar j’ai uchar statut uchar taille ; uint recvBits ; tampon uchar [9]; < /p >< p > //ClearBitMask (Status2Reg, 0 x 08); //MFCrypto1On=0 < /p >< p > tampon [0] = PICC_SElECTTAG ; tampon [1] = 0 x 70 ; pour (j’ai = 0; j’ai < 5; i ++) {buffer [i + 2] = *(serNum + i);} CalulateCRC (buffer, 7, & buffer[7]) ; //?? statut = MFRC522_ToCard (PCD_TRANSCEIVE, tampon, tampon 9, & recvBits); < /p >< p > si ((status == MI_OK) & & (recvBits == 0 x 18)) {taille = buffer [0];} else {taille = 0;} taille retour < /p >< p > ; } < /p >< p > / * * 函 数 名:MFRC522_Auth * 功能描述:验证卡片密码 * 输入参数:authMode--密码验证模式 0 x 60 = 验证A密钥 0x61 = 验证B密钥 BlockAddr--块地址 Sectorkey--扇区密码 serNum--卡片序列号, 4字节 * 返 回 值:成功返回MI_OK * / uchar MFRC522_Auth (uchar authMode, uchar BlockAddr, uchar * Sectorkey, uchar * serNum) {uchar statut ; uint recvBits ; uchar i; uchar buff [12]; < /p >< chamois //验证指令+块地址+扇区密码+卡序列号 p > [0] = authMode ; buff [1] = BlockAddr ; pour (j’ai = 0; j’ai 6 <; i ++) {buff [i + 2] = *(Sectorkey + i);} pour (j’ai = 0; j’ai < 4; i ++) {buff [i + 8] = *(serNum + i) ; } statut = MFRC522_ToCard (PCD_AUTHENT, chamois, 12, chamois, & recvBits); < /p >< p > si ((status! = MI_OK) || (! (Read_MFRC522(Status2Reg) & 0 x 08))) {statut = MI_ERR;} < /p >< p > retour d’État ; } < /p >< p > / * * 函 数 名:MFRC522_Read * 功能描述:读块数据 * 输入参数:blockAddr--块地址 ; recvData--读出的块数据 * 返 回 值:成功返回MI_OK * / uchar MFRC522_Read (uchar blockAddr, uchar * recvData) {uchar statut ; uint unLen ; < /p >< p > recvData [0] = PICC_READ ; recvData [1] = blockAddr ; CalulateCRC (recvData, 2, & recvData[2]) ; statut = MFRC522_ToCard (PCD_TRANSCEIVE, recvData, 4, recvData, & unLen); < /p >< p > si ((status! = MI_OK) || (unLen! = 0x90)) {statut = MI_ERR;} < /p >< p > retour d’État ; } < /p >< p > / * * 函 数 名:MFRC522_Write * 功能描述:写块数据 * 输入参数:blockAddr--块地址 ; writeData--向块写16字节数据 * 返 回 值:成功返回MI_OK * / uchar MFRC522_Write (uchar blockAddr, uchar * writeData) {uchar statut ; uint recvBits ; uchar i; uchar buff [18]; < /p >< chamois p > [0] = PICC_WRITE ; buff [1] = blockAddr ; CalulateCRC (buff, 2, & buff[2]) ; statut = MFRC522_ToCard (PCD_TRANSCEIVE, chamois, 4, chamois, & recvBits); < /p >< p > si ((status! = MI_OK) || (recvBits! = 4) || ((buff [0] & 0x0F)! = 0x0A)) {statut = MI_ERR;} < /p >< p > si (statut == MI_OK) {pour (i = 0; j’ai < 16; i ++) //向FIFO写16Byte数据 {buff [i] = *(writeData + i);} CalulateCRC (buff, 16, & buff[16]) ; statut = MFRC522_ToCard (PCD_TRANSCEIVE, chamois, 18, chamois, & recvBits); < /p >< p > si ((status! = MI_OK) || (recvBits! = 4) || ((buff [0] & 0x0F)! = 0x0A)) {statut = MI_ERR;} } < /p >< p > retour d’État ; } < /p >< p > / * * 函 数 名:MFRC522_Halt * 功能描述:命令卡片进入休眠状态 * 输入参数:无 * 返 回 值:无 * / void MFRC522_Halt(void) {uchar statut ; uint unLen ; uchar buff [4]; < /p >< chamois p > [0] = PICC_HALT ; buff [1] = 0 ; CalulateCRC (buff, 2, & buff[2]) ; < /p >< p > statut = MFRC522_ToCard (PCD_TRANSCEIVE, chamois, 4, chamois, & unLen) ; } / < p >

Articles Liés

Smart Green House avec Edison Intel et Microsoft Azure

Smart Green House avec Edison Intel et Microsoft Azure

J'ai assisté le Roadshow de l'ITO Intel ici dans la Silicon Valley pendant le week-end dernier et ce projet cool-Smart Green House. Intel a fourni un tas de capteurs, et j'ai pensé à faire quelque chose avec la maison verte. J'ai placé les différents
Dell ordinateur portable WI-FI un Gain élevé antenne Mod, augmentation gamme de cartes réseau internes et Signal!!!

Dell ordinateur portable WI-FI un Gain élevé antenne Mod, augmentation gamme de cartes réseau internes et Signal!!!

Bonjour, ceci est mon premier instructable. Aujourd'hui Im Gonna sho vous comment faire pour augmenter significativement la puissance de gamme et le signal de votre portable pour environ 15$. J'ai un Dell E1505 mais cela peut être facilement adaptée
Smart House week-end avec Intel Edison

Smart House week-end avec Intel Edison

Remarque : Cette instructable est work in progress, car actuellement, je suis très occupé avec l'école donc je n'ai pas beaucoup de temps pour mon projet de côté. Aussi j'ai été écrit cette instructable pendant toute une journée et réussi à le suppri
BeatBox : choc de suivi pour les paquets avec Edison Intel - Intel IOT

BeatBox : choc de suivi pour les paquets avec Edison Intel - Intel IOT

Salut tout le mondeNous sommes rentrés à domicile après avoir participé à Intel IoT Roadshow (et hackathon) à Londres.C'est étonnant et plein d'idées et de créativité tire. Une très bonne expérience. Vous devriez essayer.Nous sommes venus en tant qu'
Intel Edison IoT - Servo contrôle utilisant l’accéléromètre

Intel Edison IoT - Servo contrôle utilisant l’accéléromètre

Bonjour à tous, je suis parmi les gars chanceux qui ont reçu une carte mère Edison Intel et le bosquet IoT Kit. J'ai passé beaucoup de temps pour en savoir plus sur ce nouveau Conseil d'Edison et Arduino impressionnant style de codage. Ils sont vraim
IoT NFT système aquaponique Controler avec WebApp (Intel Edison & Node.js)

IoT NFT système aquaponique Controler avec WebApp (Intel Edison & Node.js)

AquaponiqueAquaponique combine l'Aquaculture (poissons de plus en plus) avec la culture hydroponique (culture des plantes dans l'eau). Poissons excrètent est décomposé par des bactéries en nitrates qui sont absorbés par les plantes sous forme de nutr
La PAC e-refroidissement (Intel IoT)

La PAC e-refroidissement (Intel IoT)

Que fait cette solution ?La PAC e-refroidissement est une PAC portable refroidit votre tête lors des jours ensoleillés chauds. En outre, il aide les utilisateurs connectés pour surveiller la température de votre tête. Il maintient la tête à une certa
ALERTE de mécanisme pour maisons basé sur Ito (INTEL IOT)

ALERTE de mécanisme pour maisons basé sur Ito (INTEL IOT)

Quel est notre projet ?1. ce prototype se compose de galileo Conseil agissant comme serveur et client, en même temps. Ce modèle utilise le capteur tactile comme une sonnette de la porte.2. ce signal est envoyé par internet à l'autre extrémité. Par co
IMPACT DE L’ÉQUIPE ! Smart casque - Intel Edison, Sparkfun 9DOF

IMPACT DE L’ÉQUIPE ! Smart casque - Intel Edison, Sparkfun 9DOF

Edison Intel avec Sparkfun 9DOF LSM9DS0 IMU3ème place @ l'Intel IoT Roadshow NYC 2015Ce Instructable est un casque Smart d'Ito de Edison Intel qui utilise un 9DOF de Sparkfun pour collecter des données par le casque afin de mesurer la tête tramas et
Système de fréquentation (Intel Edison à l’intérieur) Smart

Système de fréquentation (Intel Edison à l’intérieur) Smart

Système intelligent de fréquentation a développé basé sur Intel Edison Conseil et RFID pour l'application de gestion des présences pour les écoles, bureaux et instituts. Ce système est très facile à utiliser, étudiant ou employé transportera un RFID
Dispositif d’interruption de Edison IOT d’allumage

Dispositif d’interruption de Edison IOT d’allumage

récemment, j'ai eu la chance de recevoir un de ces kits de développeur Intel IOT Edison génial de la tenue du concours parrainé par Instructables et Intel. Je suis nouveau sur microcontrôleurs. Bien que je suis un technicien automobile avec A.S.E.s e
Light Plotter with Intel Edison

Light Plotter with Intel Edison

IntroductionJ'ai été heureux d'être sélectionné pour faire partie de l'Intel Edison IoT invitational ici sur Instructables (s'il vous plaît envisager de voter si vous l'aimez!). Le projet que j'ai proposé est un peintre automatisé « léger » qui utili
Automated étude environnement avec Intel Edison

Automated étude environnement avec Intel Edison

Dans ce projet, je vais vous montrer comment faire un environnement d'étude automatisée avec l'Edison Intel !L'Edison Intel utilise plusieurs capteur de surveillance de l'environnement dans votre salle d'étude. L'Edison permettra d'optimiser l'enviro
Robot de téléprésence Edison Intel

Robot de téléprésence Edison Intel

Cette année j'ai été chanceux de me retrouver à INTEL Internet des choses Roadshow dans Pune à hotel VITS. C'était sur des moments plus incroyables cette année et j'ai eu beaucoup à apprendre. Ont pu voir de nombreux projets, prototypes et produits.