Arduino+ESP01+Rfid+WebServer

shadow174
Offline
Зарегистрирован: 07.06.2021

Здравствуйте!

Есть веб сервер с базой данных для учета входа и выхода по Rfid карте, есть рабочий скейтч для Nodemcu. Но возникла необходимость использовать именно Arduino Uno в связке с ESP-01. Мне удалось частично переделать скейтч под Arduino, сейчас данные о карте передаются на сервер, сравниваются по базе и возвращаются обратно в монитор порта, т.е есть передача данных работает в обе стороны.

Проблема заключается в том, что мне нужно прикрутить часть кода от Nodemcu, которая при наличии зарегистрированного пользователя включала например светодиод,но моих знаний не хватает.

Помогите решить задачу.

Эта часть кода, которую нужно внести в Arduino. Нужна реакция контроллера на login и logout, при остальных просто чтение или игнор.

    int httpCode = http.GET();   //Send the request
    String payload = http.getString();    //Get the response payload

    //    Serial.println(Link);   //Print HTTP return code
    Serial.println(httpCode);   //Print HTTP return code
    Serial.println(Card_uid);     //Print Card ID
    Serial.println(payload);    //Print request response payload

    if (httpCode == 200) {
      if (payload.substring(0, 5) == "login") {

        String user_name = payload.substring(5);
        digitalWrite(RedLed, LOW);
        digitalWrite(GriLed, HIGH);
        delay(5000);
        digitalWrite(RedLed, HIGH);
        digitalWrite(GriLed, LOW);

      }
      else if (payload.substring(0, 6) == "logout") {

        String user_name = payload.substring(6);
        digitalWrite(RedLed, LOW);
        digitalWrite(GriLed, HIGH);
        delay(5000);
        digitalWrite(RedLed, HIGH);
        digitalWrite(GriLed, LOW);

      }
      else if (payload == "succesful") {

      }
      else if (payload == "available") {

      }
      delay(100);
      http.end();  //Close connection
    }

Сам код для Ардуино.

#include <SPI.h>
#include <MFRC522.h>
#include "SoftwareSerial.h"

#define SS_PIN 10
#define RST_PIN 9


String ssid = "SHADOW";
String password = "73835264";
const char* device_token  = "beac906e7a4da323";
SoftwareSerial esp(2, 3);// RX, TX
String server = "192.168.0.30"; //Your Host
String uri = "/scud/getdata.php";
//#define LED_G 4 //define green LED pin
#define LED_R 8 //define red LED

MFRC522 mfrc522(SS_PIN, RST_PIN);   // Create MFRC522 instance.

String rfidUid = "";

#define DEBUG true

void setup()
{
  //  Serial.begin(9600);   // Initiate a serial communication

  esp.begin(9600);

  Serial.begin(115200);

  SPI.begin();      // Initiate  SPI bus
  mfrc522.PCD_Init();   // Initiate MFRC522

  connectWifi();

  httpget();

  delay(1000);

  Serial.println("Поднесите свою карту к считывателю...");
  Serial.println();

  pinMode(LED_R, OUTPUT);
  digitalWrite(LED_R, HIGH);  
}

void connectWifi() {

  sendData("AT+RST\r\n", 3000, DEBUG);          //This command will reset module to default
  sendData("AT+CWMODE=3\r\n", 2000, DEBUG);

  String cmd = "AT+CWJAP=\"" + ssid + "\",\"" + password + "\"";

  esp.println(cmd);

  delay(4000);

  if (esp.find("OK")) {
    Serial.println("Подключился к сети!");
  }
  else {
    Serial.println("Не удается подключиться к Wi-Fi ! Снова подключаюсь...");
    connectWifi();
  }

}

void httpget() {
  //  // Look for new cards
  if ( ! mfrc522.PICC_IsNewCardPresent())
  {
    return;
  }
  // Select one of the cards
  if ( ! mfrc522.PICC_ReadCardSerial())
  {
    return;
  }

  Serial.print("UID:");
  String content = "";
  byte letter;

  rfidUid = "";
  for (byte i = 0; i < mfrc522.uid.size; i++)
  {
    Serial.print(mfrc522.uid.uidByte[i] < 0x10 ? " 0" : " ");
    Serial.print(mfrc522.uid.uidByte[i], DEC);
    content.concat(String(mfrc522.uid.uidByte[i] < 0x10 ? " 0" : " "));
    content.concat(String(mfrc522.uid.uidByte[i], DEC));

    rfidUid += String(mfrc522.uid.uidByte[i] < 0x10 ? "0" : "");
    rfidUid += String(mfrc522.uid.uidByte[i], DEC);

  }

  Serial.println();
  content.toUpperCase();

  esp.println("AT+CIPSTART=\"TCP\",\"" + server + "\",80");//start a TCP connection.

  if ( esp.find("OK")) {

    Serial.println("TCP-соединение установлено");

  } delay(1000);

  if ( esp.find("OK")) {

    Serial.println("TCP-соединение установлено");

  } delay(1000);

  String getRequest =
    "GET " + uri + "?card_uid=" + rfidUid + "&device_token=" + String(device_token) + " HTTP/1.0\r\n" +
    "Host: " + server + "\r\n" +
    "Accept: *" + "/" + "*\r\n" +
    "Content-Type: text/plain\r\n" +
    "\r\n";

  String sendCmd = "AT+CIPSEND=";

  esp.print(sendCmd);

  esp.println(getRequest.length());

  delay(500);

  if (esp.find(">")) {

    Serial.println("Отправка..");

    esp.print(getRequest);

    if (esp.find("SEND OK")) {

      Serial.println("Пакет отправлен");

      delay(200);  // ждем немного

      while (esp.available()) {     // читаем ответ и отправляем его в Serial

        String response = esp.readString();

        Serial.println("response.." + response);

      }

      esp.println("AT+CIPCLOSE");

    }
  }
}

void loop()
{

  httpget();

}

String sendData(String command, const int timeout, boolean debug) //Функция отправки данных на esp8266

{

  String response = "";

  esp.print(command);           // Отправьте команду на ESP8266
  long int time = millis();
  while ( (time + timeout) > millis()) // ESP8266 будет ждать некоторое время для получения данных
  {
    while (esp.available())     // ESP8266 будет ждать некоторое время для получения данных

    {
      char c = esp.read();      // Прочитайте следующий символ.
      response += c;                // Сохранение ответа от ESP8266

    }

  }
  if (debug)
  {

    Serial.print(response); // Печать ответа ESP8266 на последовательном мониторе.

  }
  return response;
}

 

b707
Offline
Зарегистрирован: 26.05.2017

shadow174 пишет:

возникла необходимость использовать именно Arduino Uno

можете пояснить, в чем эта "необходимость"? - а то как-то толи бредом. толи курсовой попахивает

shadow174
Offline
Зарегистрирован: 07.06.2021

b707 пишет:

shadow174 пишет:

возникла необходимость использовать именно Arduino Uno

можете пояснить, в чем эта "необходимость"? - а то как-то толи бредом. толи курсовой попахивает

Необходимость в том,что Ардуино проще запитать с подачей 12v, т.е один блок питания на контроллер и эл.магнит на двери. Также есть сомнения в стабильности сигнала wifi, соответственно для Ардуино есть возможность использовать в крайнем случае шилд с портом под сетевой кабель. Планируется использовать по 1 устройству на двух этажах, для установки в помещения душевых. Плюс устройства уже куплены за свои кровные.

По поводу бреда или курсовых - для курсовых я уже не в том возрасте, да и к тому же все, что нужно (скейтч под ESP8266, сам контроллер и  сервер - уже есть и протестирован). Но нужно именно на базе ардуино.

Бред? Может быть, с точки зрения профессионала это и так. Но, я только знакомлюсь с программированием для личных целей, поэтому и попросил о помощи.

wdrakula
wdrakula аватар
Offline
Зарегистрирован: 15.03.2016

shadow174 пишет:

 Плюс устройства уже куплены за свои кровные.

UNO-350 руб. + ESP-01 -90руб = 440руб.

NODEMCU - 155руб.

Вот только что на Али проверил свежие цены. ;))))))

Ну и плюс минимум 2000р за код, который ты сам написать не можешь, а значит придется заказывать.

Просто интересно, а ножи у тебя дома тоже тупые?

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

Помни, контроллер подбирают под задачу, а не наоборот.  Наоборот - пахнет идиотизмом, типа, парни, мне очень нужно на Жигулях перевезти 2 тонны песка за раз, как мне сделать и закрепить бак такого размера на крыше? Смекаешь?

shadow174
Offline
Зарегистрирован: 07.06.2021

Uno - 170р + ESP-01 - 90р, ну ни как ни 440р

Nodemcu - 350р

На UNO- 3шт комплекта уже куплено.

С ножами не в тему, или это больной вопрос о ваших ножах у вас дома?

Я попросил о помощи, а не о сарказме. Если вы не можете или не хотите, пройдите просто мимо..

shadow174
Offline
Зарегистрирован: 07.06.2021

DetSimen пишет:

Помни, контроллер подбирают под задачу, а не наоборот.  Наоборот - пахнет идиотизмом, типа, парни, мне очень нужно на Жигулях перевезти 2 тонны песка за раз, как мне сделать и закрепить бак такого размера на крыше? Смекаешь?

Вполне, но с данной задачей справляются оба контроллера вполне не плохо. По факту осталось только поправить код, чтобы ардуино понимал, что ему сообщает сервер. Остальное то,работает - метка читается, передается на сервер, ответ от сервера поступает, а вот с реакцией на ответ сервера пока загвоздка..

 

wdrakula
wdrakula аватар
Offline
Зарегистрирован: 15.03.2016

shadow174 пишет:

1.Nodemcu - 350р

2.С ножами не в тему, или это больной вопрос о ваших ножах у вас дома?

3.Я попросил о помощи, а не о сарказме. Если вы не можете или не хотите, пройдите просто мимо..

1. https://aliexpress.ru/item/32665100123.html

154руб 65коп. ;))

2. Это был намек на то, что ты тупой. Сорри, если было непонятно. Не сарказм. Просто прямой намек.

3. Какой помощи? Сравнить строки? В УНО тоже String реализован, может у тебя памяти и так хватит. Или на C-string переходи. Все функции описаны тут: http://www.nongnu.org/avr-libc/user-manual/group__avr__string.html

Это ОФИЦИАЛЬНАЯ страница avr-libc. То есть того, что в Arduino IDE использовано.

wdrakula
wdrakula аватар
Offline
Зарегистрирован: 15.03.2016

Со сравнением строк помогать даром точно не стану. Есть нужда - в платный раздел, моя телега @wdrakula. Можешь точно написать что именно не получается? Ответ принимаешь от сервера и просто не знаешь как строки сравнить? Может даже денег не возьму... как настроение будет. Напечатай ответ сервера в Сериал, может сразу всё и так поймешь, бЭЭЭзплатно. ;))

А по задаче нужно делать так:

1. Если есть опасения по поводу WiFi, нужно взять модуль с внешней антенной. Wemos D1 mini + антенна. примерно 450 р на Али.

2. Поставить стабилизатор (раньше называли КРЕН-ка ;)) ) 7809 - на 9 Вольт. Из 12 9 получается на ура и дополнительная стабилизация заодно. 9В уже подавать на ESP8266 (Вемос или Нодмцу).

3. При необходимости Ethernet -модуль подключается к ESP точно так-же, как и к УНО, по SPI. Нет нужды брать модуль в форм-факторе "Шилд", можно взять отдельный.

-------------

Почему так? Задачу решают от "бутылочного горлышка". У тебя это код (судя по вопросу). Код для ЕСП у тебя есть. Зачем ты взялся за то, что сложно для тебя? Тем более применение коммерческое, какие-то душевые?

shadow174
Offline
Зарегистрирован: 07.06.2021

Попробовал вот таким образом вписать код, все равно не хочет распознавать ответ из порта

 {
    while (esp.available())     // ESP8266 будет ждать некоторое время для получения данных


    {
      char c = esp.read();      // Прочитайте следующий символ.
      response += c;                // Сохранение ответа от ESP8266

    }
    {
      payload = Serial.readStringUntil('\n');
    }
    if (payload != 0)
    {
      Serial.println(payload);

      if (payload == "login")
      {
        digitalWrite(LED_R, HIGH);
        delay(1000);
        digitalWrite(LED_R, LOW);
      }

      if (payload == "logout")
      {
        digitalWrite(LED_R, HIGH);
        delay(1000);
        digitalWrite(LED_R, LOW);
      }

      payload = "";
    }
  }
  if (debug)
  {

    Serial.print(response); // Печать ответа ESP8266 на последовательном мониторе.

  }
  return response;
}

 

wdrakula
wdrakula аватар
Offline
Зарегистрирован: 15.03.2016

Повторю: обратись в "Ищу исполнителя"

BOOM
BOOM аватар
Offline
Зарегистрирован: 14.11.2018

Я тут колесо от Оки купил, дёшево и всего 5 Тыр пробега. К моему Билазу подойдёт? А то карьер простаивает..

shadow174
Offline
Зарегистрирован: 07.06.2021

BOOM пишет:

Я тут колесо от Оки купил, дёшево и всего 5 Тыр пробега. К моему Билазу подойдёт? А то карьер простаивает..


Подойдёт, как только орфографию подтянешь.

b707
Offline
Зарегистрирован: 26.05.2017

shadow174 пишет:
Подойдёт, как только орфографию подтянешь.

вы бы не ерничали, а гребли в платный раздел. А то с кодом у вас кранты, самостоятельно отладить явно не способны :)

Вот это что такое:

if (payload != 0)
....
 if (payload == "login")

это у вас число или строка? :)