Всем привет! Имеем: Arduino UNO, GPRS sim800l, RFID-RC522. Цель задумки такова: Ардуино проверяет UID номера карточек(или чипов), после чего в зависимости от того какая перед ним карточка находится выполняет действия, а именно - отправляет СМС с состоянием двери и самой системы. Данное устройство планируется для охраны гаража. Но после того как начал пытаться сделать отправку сообщения из-за незарегестрированных карт, все начало работать не по плану.Задержки на 5сек стоят для того, чтобы модуль не отправлял по 10 смс( быстро считывает). Заранее спасибо за помощь! КОД: Код (C++): #include <SoftwareSerial.h> #include <MFRC522.h> // библиотека "RFID". #define SS_PIN 10 #define RST_PIN 9 MFRC522 mfrc522(SS_PIN, RST_PIN); unsigned long uidDec, uidDecTemp; // для храниения номера метки в десятичном формате SoftwareSerial gprsSerial(7, 8); void setup() { Serial.begin(9600); gprsSerial.begin(19200); Serial.println("Hello, I'm OHRANNIK!"); Serial.println("Check system..."); Serial.println("Waiting for card..."); SPI.begin(); // инициализация SPI / Init SPI bus. mfrc522.PCD_Init(); // инициализация MFRC522 / Init MFRC522 card. } void loop() { if (gprsSerial.available()) Serial.write(gprsSerial.read()); if (Serial.available()) gprsSerial.write(Serial.read()); // Поиск новой метки if ( ! mfrc522.PICC_IsNewCardPresent()) { return; } // Выбор метки if ( ! mfrc522.PICC_ReadCardSerial()) { return; } uidDec = 0; // Выдача серийного номера метки. for (byte i = 0; i < mfrc522.uid.size; i++) { uidDecTemp = mfrc522.uid.uidByte[i]; uidDec = uidDec * 256 + uidDecTemp; } Serial.println("Card UID: "); Serial.println(uidDec); // Выводим UID метки в консоль. if (uidDec == 286331153){Serial.println("Key 1"); sms(); delay(5000); } if (uidDec == 572662306){ Serial.println("Key2"); sms2(); delay(5000);} if (uidDec == 2864087051){ Serial.println("Key3"); sms3(); delay(5000);} if (uidDec == 2861542667){ Serial.println("Key4"); sms4(); delay(5000);} if (uidDec == 3132146699){ Serial.println("Key5"); sms5(); delay(5000);} if (uidDec != 286331153||572662306||2864087051||2861542667||3132146699){ Serial.println("NO"); smsUnknownkey();} void sms() { // Устанавливает текстовый режим для SMS-сообщений gprsSerial.print("AT+CMGF=1\r"); delay(100); // даём время на усваивание команды // Устанавливаем адресата: телефонный номер в международном формате gprsSerial.println("AT + CMGS = \"+795........\""); delay(100); // Пишем текст сообщения gprsSerial.println("Key 1 join"); delay(100); // Отправляем Ctrl+Z, обозначая, что сообщение готово gprsSerial.println((char)26); } void sms2() { // Устанавливает текстовый режим для SMS-сообщений gprsSerial.print("AT+CMGF=1\r"); delay(100); // даём время на усваивание команды // Устанавливаем адресата: телефонный номер в международном формате gprsSerial.println("AT + CMGS = \"+795........\""); delay(100); // Пишем текст сообщения gprsSerial.println("Key 2 join"); delay(100); // Отправляем Ctrl+Z, обозначая, что сообщение готово gprsSerial.println((char)26); } void sms3() { // Устанавливает текстовый режим для SMS-сообщений gprsSerial.print("AT+CMGF=1\r"); delay(100); // даём время на усваивание команды // Устанавливаем адресата: телефонный номер в международном формате gprsSerial.println("AT + CMGS = \"+795........\""); delay(100); // Пишем текст сообщения gprsSerial.println("Key 3 join"); delay(100); // Отправляем Ctrl+Z, обозначая, что сообщение готово gprsSerial.println((char)26); } void sms4() { // Устанавливает текстовый режим для SMS-сообщений gprsSerial.print("AT+CMGF=1\r"); delay(100); // даём время на усваивание команды // Устанавливаем адресата: телефонный номер в международном формате gprsSerial.println("AT + CMGS = \"+795........\""); delay(100); // Пишем текст сообщения gprsSerial.println("Key 4 join"); delay(100); // Отправляем Ctrl+Z, обозначая, что сообщение готово gprsSerial.println((char)26); } void sms5() { // Устанавливает текстовый режим для SMS-сообщений gprsSerial.print("AT+CMGF=1\r"); delay(100); // даём время на усваивание команды // Устанавливаем адресата: телефонный номер в международном формате gprsSerial.println("AT + CMGS = \"+795.........\""); delay(100); // Пишем текст сообщения gprsSerial.println("Key 5 join"); delay(100); // Отправляем Ctrl+Z, обозначая, что сообщение готово gprsSerial.println((char)26); } void smsUnknownkey(){ // Устанавливает текстовый режим для SMS-сообщений gprsSerial.print("AT+CMGF=1\r"); delay(100); // даём время на усваивание команды // Устанавливаем адресата: телефонный номер в международном формате gprsSerial.println("AT + CMGS = \"+795..........\""); delay(100); // Пишем текст сообщения gprsSerial.println("Unknown key"); delay(100); // Отправляем Ctrl+Z, обозначая, что сообщение готово gprsSerial.println((char)26); } }
Ну программа же зациклена, вот она и выполняет последнее условие всегда. Заведи флаг, который будет отображать факт подноса карты к считывателю. А вообще, оооочень много лишнего кода.
это условие: 1. как уже сказали, выполняется каждый раз когда выполняется цикл loop, а онo выполняется постоянно. 2. Само условие записано "по-человечески", а надо "по-машинному". 286331153||572662306||2864087051||2861542667||3132146699=какому-то числу Х и уже потом проверяется число Х с uidDec. Чтобы правильно, записать надо uidDec проверить с каждым числом: Код (C++): if (x!=10) или (x!=23).... да, 5 однотипных процедур можно свернуть в одну)
Если у вас процедуры sms отработаны (проверены, что они работают правильно), то обращение к ним можно закомментировать чтобы не слать 10 смс и смотреть в сериал-порт. Когда программу напишете раскомментировать)