Кузбасслак

Тема в разделе "Arduino & Shields", создана пользователем DanilRyzhov, 7 июн 2018.

  1. DanilRyzhov

    DanilRyzhov Нерд

    Всем привет!

    Имеем: 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);
    }
    }
     
     
  2. parovoZZ

    parovoZZ Гуру

    Ну программа же зациклена, вот она и выполняет последнее условие всегда. Заведи флаг, который будет отображать факт подноса карты к считывателю.
    А вообще, оооочень много лишнего кода.
     
  3. Daniil

    Daniil Гуру

    это условие:
    1. как уже сказали, выполняется каждый раз когда выполняется цикл loop, а онo выполняется постоянно.
    2. Само условие записано "по-человечески", а надо "по-машинному".
    286331153||572662306||2864087051||2861542667||3132146699=какому-то числу Х и уже потом проверяется число Х с uidDec. Чтобы правильно, записать надо uidDec проверить с каждым числом:
    Код (C++):
    if (x!=10) или (x!=23)....
    да, 5 однотипных процедур можно свернуть в одну)
     
    arkadyf нравится это.
  4. Daniil

    Daniil Гуру

    Если у вас процедуры sms отработаны (проверены, что они работают правильно), то обращение к ним можно закомментировать чтобы не слать 10 смс и смотреть в сериал-порт.
    Когда программу напишете раскомментировать)
     
    arkadyf нравится это.