скетч Rfid 522 и Wemos d1 (retired)

Тема в разделе "Arduino & Shields", создана пользователем kt315where, 27 дек 2017.

  1. kt315where

    kt315where Гик

    Здравствуйте, возникла проблема:

    Плата Wemos d1 (retired)
    Модуль Rfid rc522

    на Wemos работает вебинтерфейс (вебсервер из стандартных примеров), сам вемос подключен к роутеру,
    К вемосу подключен модуль rfid rc522

    По скетчу привязан uid карты, при поднесении карты должно производиться действие (в данном случае пишет "card ok" в сериал. Вебморда при этом должна работать постоянно и независеть от rfid модуля и карты. в вебморде просто 2 кнопки.

    Собственно проблема в том, что вебинтерфейс начинает работать почему-то когда карта поднесена к модулю. Подозреваю, что надо часть кода (работы с картой) вывести в отдельный цикл, собственно если у кого-то есть желание и возможность- помогите поправить код, буду крайне благодарен

    Скетч такой (работает, карту опознает, но вебинтерфейс не работает пока не поднести карту к rfid модулю, а надо чтобы работал постоянно)

    Код (C++):
    //wemos и rc522
    #include <ESP8266WiFi.h>
    #include <WiFiClient.h>
    #include <MFRC522.h>                                    
    MFRC522 rfid(D4, D9); // пины SDA, RST                      
    unsigned long Key, KeyTemp;  // для храниения № ключа    

    const char* ssid = "test"; // Название точки доступа
    const char* password = "12345678"; // Пароль точки доступа

    WiFiServer server(80);

    void setup()
    {

    Serial.begin(9600);
    SPI.begin();  //  инициализация SPI
    rfid.PCD_Init();     // инициализация rfid модуля

      // Connect to WiFi network
      Serial.println();
      Serial.println();
      Serial.print("Connecting to ");
      Serial.println(ssid);
      WiFi.begin(ssid, password);
      while (WiFi.status() != WL_CONNECTED) {
        delay(500);
        Serial.print(".");
      }
      Serial.println("");
      Serial.println("WiFi connected");
      // Start the server
      server.begin();
      Serial.println("Server started");
      // Print the IP address
      Serial.print("Use this URL : ");
      Serial.print("http://");
      Serial.print(WiFi.localIP());
      Serial.println("/");
    }
    void loop() {

      if ( ! rfid.PICC_IsNewCardPresent()) {return;}// Поиск нового ключа
      if ( ! rfid.PICC_ReadCardSerial()) {return;}// Выбор ключа
      Key = 0;
    for (byte i = 0; i < rfid.uid.size; i++){// Выдача серийного № ключа
    KeyTemp = rfid.uid.uidByte[i];
        Key = Key * 256 + KeyTemp;}
      Serial.print("Card №: ");
      Serial.println(Key); // Выводим № ключа в консоль
    if (Key == 688921751){ // № верного ключа
    Serial.println("Card ok"); // сообщение если карта верная

    }


      // Check if a client has connected
      WiFiClient client = server.available();
      if (!client) {
        return;
      }
      // Read the first line of the request
      String request = client.readStringUntil('\r');
    // Serial.println(request);
      client.flush();
      // Match the request
      if (request.indexOf("/on") != -1)
        delay(100);
        Serial.println("on");
      delay(100);
       
      if (request.indexOf("/off") != -1){
        delay(100);
         Serial.println("off");
      delay(100);
         
      }

      // Return the response
      client.println("HTTP/1.1 200 OK");
      client.println("Content-Type: text/html; charset=utf-8");
      client.println(""); //  do not forget this one
      client.println("<!DOCTYPE HTML>");
      client.println("<html>");
      client.println("<center>");
      client.println("<br><br>");
      client.println("<br><br>");
      client.println("<br><br>");
      client.println("<br><br>");
      client.println("<br><br>");
      client.print("<a href=\"/on\"><button><b>включить</b></button></a>");
      client.println();
      client.print("<a href=\"/off\"><button><b>выключить</b></button></a>");
      client.println("</html>");
      delay(1);
    }
     
  2. DetSimen

    DetSimen Guest

    Ничо не смущает?
     
    kt315where нравится это.
  3. kt315where

    kt315where Гик

    а конкретнее пожалуйста?) эта часть кода взята из рабочих примеров
     
  4. DetSimen

    DetSimen Guest

    мозг наморщи. что делает оператор return?
     
    kt315where нравится это.
  5. b707

    b707 Гуру

    Деда, а что не так? - это действительно код из "букваря". Там перед оператором "!" - это инвертирование
     
    kt315where нравится это.
  6. DetSimen

    DetSimen Guest

    тоись это условие нормально?
    if( ключ НЕ поднесен (! rfid.PICC_IsNewCardPresent())) то {return;} выходим из loop.
    а морда у него дальше в loop().
    не знаю, мошт ему так и надо, канеш. Но он то как раз про противоположное спрашивал
     
    kt315where нравится это.
  7. DetSimen

    DetSimen Guest

    это цытато.
     
    kt315where нравится это.
  8. b707

    b707 Гуру

    Тогда ты, наверно. прав.
    Стандартный скетч ничего не делает, пока карта не поднесена, для этого и return.

    ТС можно посоветовать вставить код чтения карт в конец ЛУП - тогда return не будет мешать вебморде.
     
    kt315where нравится это.
  9. DetSimen

    DetSimen Guest

    Ну вот я то хотел, чтоб ТС до этого сам дашол. методом последовательного приближения.
     
    kt315where нравится это.
  10. kt315where

    kt315where Гик

    Спасибо Гики, вы реально круты, помогли оперативно)

    Что было сделано:

    Закоментил вот это в void setup:

    Код (C++):
    // while (WiFi.status() != WL_CONNECTED) {
      //  delay(500);
      //  Serial.print(".");
    // }
    так же в void loop() убрал ретурн в проверке клиента - закоментил

    Код (C++):
     // if (!client) {
    //   return;
    // }
    исправил пропущенные скобки после if

    Код (C++):
     if (request.indexOf("/on") != -1){
        delay(10);
        Serial.println("on");
      delay(10);}
     
      if (request.indexOf("/off") != -1){
        delay(10);
         Serial.println("off");
      delay(10);
       
      }
    И по совету выше - поставил код Rfid в самый конец Loop:

    Код (C++):
    if ( ! rfid.PICC_IsNewCardPresent()) {return;}// Поиск нового ключа
      if ( ! rfid.PICC_ReadCardSerial()) {return;}// Выбор ключа
      Key = 0;
    for (byte i = 0; i < rfid.uid.size; i++){// Выдача серийного № ключа
    KeyTemp = rfid.uid.uidByte[i];
        Key = Key * 256 + KeyTemp;}
      Serial.print("Card №: ");
      Serial.println(Key); // Выводим № ключа в консоль
    if (Key == 688921751){ // № верного ключа
    Serial.println("Card ok"); // сообщение если карта верная

    }
    }

    В итоге получился такой скетч.

    Код (C++):
    //wemos и rc522
    #include <ESP8266WiFi.h>
    #include <WiFiClient.h>
    #include <MFRC522.h>                                  
    MFRC522 rfid(D4, D9); // пины SDA, RST                    
    unsigned long Key, KeyTemp;  // для храниения № ключа    

    const char* ssid = "test"; // Название точки доступа
    const char* password = "12345678"; // Пароль точки доступа

    WiFiServer server(80);

    void setup()
    {

    Serial.begin(9600);
    SPI.begin();  //  инициализация SPI
    rfid.PCD_Init();     // инициализация rfid модуля

      // Connect to WiFi network
      Serial.println();
      Serial.println();
      Serial.print("Connecting to ");
      Serial.println(ssid);
      WiFi.begin(ssid, password);
    // while (WiFi.status() != WL_CONNECTED) {
      //  delay(500);
      //  Serial.print(".");
    // }
      Serial.println("");
      Serial.println("WiFi connected");
      // Start the server
      server.begin();
      Serial.println("Server started");
    delay(7000);
      // Print the IP address
      Serial.print("Use this URL : ");
      Serial.print("http://");
      Serial.print(WiFi.localIP());
      Serial.println("/");
    }
    void loop() {




      // Check if a client has connected
      WiFiClient client = server.available();
    // if (!client) {
    //   return;
    // }
      // Read the first line of the request
      String request = client.readStringUntil('\r');
    // Serial.println(request);
      client.flush();
      // Match the request
      if (request.indexOf("/on") != -1){
        delay(10);
        Serial.println("on");
      delay(10);}
     
      if (request.indexOf("/off") != -1){
        delay(10);
         Serial.println("off");
      delay(10);
         
      }

      // Return the response
      client.println("HTTP/1.1 200 OK");
      client.println("Content-Type: text/html; charset=utf-8");
      client.println(""); //  do not forget this one
      client.println("<!DOCTYPE HTML>");
      client.println("<html>");
      client.println("<center>");
      client.println("<br><br>");
      client.println("<br><br>");
      client.println("<br><br>");
      client.println("<br><br>");
      client.println("<br><br>");
      client.print("<a href=\"/on\"><button><b>включить</b></button></a>");
      client.println();
      client.print("<a href=\"/off\"><button><b>выключить</b></button></a>");
      client.println("</html>");
      delay(1);

    if ( ! rfid.PICC_IsNewCardPresent()) {return;}// Поиск нового ключа
      if ( ! rfid.PICC_ReadCardSerial()) {return;}// Выбор ключа
      Key = 0;
    for (byte i = 0; i < rfid.uid.size; i++){// Выдача серийного № ключа
    KeyTemp = rfid.uid.uidByte[i];
        Key = Key * 256 + KeyTemp;}
      Serial.print("Card №: ");
      Serial.println(Key); // Выводим № ключа в консоль
    if (Key == 688921751){ // № верного ключа
    Serial.println("Card ok"); // сообщение если карта верная

    }
    }
    Он рабочий 100%, я его погонял как с подключенным wifi, так и без. Теперь rfid работает независимо от наличия wifi подключения, как я и хотел

    Но появилась еще одна проблема. Теперь сериал (команды которые приходят после нажатия кнопки в вебинтерфейсе и от считывания "верной" карты) отрабатывает с небольшой задержкой. Где-то от пол секунды до 1.5 секунды. Ранее, когда не было rfid модуля всё работало чётко моментально, без задержек. Мелочь, но немного неприятно

    Я так понимаю это может быть из-за того, что процессор мк теперь постоянно гоняет проверку rfid + загружен постоянно работающим вебсервером? Если я правильно понял - в оригинале примера вебморда работает только при наличии wifi клиента, т.е для экономии ресурса

    Посоветуйте, что можно сделать для ускорения работы, но при этом сохранив такой же независимиый функционал вебинтерфейса и rfid на этом мк?
     
  11. DetSimen

    DetSimen Guest

    serial поставь на 115200. И в скетче и в мониторе порта
     
    kt315where нравится это.
  12. DetSimen

    DetSimen Guest

    а. стоп. у тебя же не ардуино. Беру свои слова взат.
     
    kt315where нравится это.
  13. kt315where

    kt315where Гик

    Уже попробовал... Тоже самое. Да и если бы скорость решила проблему, это все-равно не мой вариант, т.к я по сериалу в проекте буду передавать данные на другой мк, а там сериал софтвеерный. только 9600
     
  14. DetSimen

    DetSimen Guest

    ну, звиняй. в вемосах я не компетентен.
     
    kt315where нравится это.
  15. kt315where

    kt315where Гик

    Щас попробовал выпилить код Rfid из скетча - задержка осталась. Поэтому я на 99% уверен, что она именно из-за того, что вебморда теперь постоянно подгружает проц.
     
  16. b707

    b707 Гуру

    попробуйте так:
    - после строчки
    WiFiClient client = server.available();
    вставьте
    if (client) {

    а закрывающую скобку - после всей выдачи html
     
    kt315where нравится это.
  17. kt315where

    kt315where Гик

    я правильно понимаю, что именно "(client)", без Восклицательного знака "!" ? В оригинале просто так "(!client)"
     
  18. b707

    b707 Гуру

    да правильно.
     
    kt315where нравится это.
  19. kt315where

    kt315where Гик

    Спасибо, вы оказались правы. Теперь сериал отрабатывает моментально без задержки. Rfid работает нормально как с wifi так и без подключения.

    Я еще немного понаглею))) - объясните в кратце суть дела и с знаком "!" ?
     
  20. b707

    b707 Гуру

    вкратце вряд ли получится :( Дело не в "наглении". Просто, судя по вопросу. вам надо многое с самых азов обьяснять. Я в педагогике не силен... не сочтите за кривляние

    Совсем вкратце - оператор "!" инвертирует логическую переменную.
    if (client) - выполняет условие, если значение client истинно
    if (! client) - выполняет условие, если значение client НЕ истинно - то есть ложно
     
    kt315where нравится это.