Arduino+ESP01+Rfid+WebServer
- Войдите на сайт для отправки комментариев
Здравствуйте!
Есть веб сервер с базой данных для учета входа и выхода по 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;
}
возникла необходимость использовать именно Arduino Uno
можете пояснить, в чем эта "необходимость"? - а то как-то толи бредом. толи курсовой попахивает
возникла необходимость использовать именно Arduino Uno
можете пояснить, в чем эта "необходимость"? - а то как-то толи бредом. толи курсовой попахивает
Необходимость в том,что Ардуино проще запитать с подачей 12v, т.е один блок питания на контроллер и эл.магнит на двери. Также есть сомнения в стабильности сигнала wifi, соответственно для Ардуино есть возможность использовать в крайнем случае шилд с портом под сетевой кабель. Планируется использовать по 1 устройству на двух этажах, для установки в помещения душевых. Плюс устройства уже куплены за свои кровные.
По поводу бреда или курсовых - для курсовых я уже не в том возрасте, да и к тому же все, что нужно (скейтч под ESP8266, сам контроллер и сервер - уже есть и протестирован). Но нужно именно на базе ардуино.
Бред? Может быть, с точки зрения профессионала это и так. Но, я только знакомлюсь с программированием для личных целей, поэтому и попросил о помощи.
Плюс устройства уже куплены за свои кровные.
UNO-350 руб. + ESP-01 -90руб = 440руб.
NODEMCU - 155руб.
Вот только что на Али проверил свежие цены. ;))))))
Ну и плюс минимум 2000р за код, который ты сам написать не можешь, а значит придется заказывать.
Просто интересно, а ножи у тебя дома тоже тупые?
Помни, контроллер подбирают под задачу, а не наоборот. Наоборот - пахнет идиотизмом, типа, парни, мне очень нужно на Жигулях перевезти 2 тонны песка за раз, как мне сделать и закрепить бак такого размера на крыше? Смекаешь?
Uno - 170р + ESP-01 - 90р, ну ни как ни 440р
Nodemcu - 350р
На UNO- 3шт комплекта уже куплено.
С ножами не в тему, или это больной вопрос о ваших ножах у вас дома?
Я попросил о помощи, а не о сарказме. Если вы не можете или не хотите, пройдите просто мимо..
Помни, контроллер подбирают под задачу, а не наоборот. Наоборот - пахнет идиотизмом, типа, парни, мне очень нужно на Жигулях перевезти 2 тонны песка за раз, как мне сделать и закрепить бак такого размера на крыше? Смекаешь?
Вполне, но с данной задачей справляются оба контроллера вполне не плохо. По факту осталось только поправить код, чтобы ардуино понимал, что ему сообщает сервер. Остальное то,работает - метка читается, передается на сервер, ответ от сервера поступает, а вот с реакцией на ответ сервера пока загвоздка..
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. Можешь точно написать что именно не получается? Ответ принимаешь от сервера и просто не знаешь как строки сравнить? Может даже денег не возьму... как настроение будет. Напечатай ответ сервера в Сериал, может сразу всё и так поймешь, бЭЭЭзплатно. ;))
А по задаче нужно делать так:
1. Если есть опасения по поводу WiFi, нужно взять модуль с внешней антенной. Wemos D1 mini + антенна. примерно 450 р на Али.
2. Поставить стабилизатор (раньше называли КРЕН-ка ;)) ) 7809 - на 9 Вольт. Из 12 9 получается на ура и дополнительная стабилизация заодно. 9В уже подавать на ESP8266 (Вемос или Нодмцу).
3. При необходимости Ethernet -модуль подключается к ESP точно так-же, как и к УНО, по SPI. Нет нужды брать модуль в форм-факторе "Шилд", можно взять отдельный.
-------------
Почему так? Задачу решают от "бутылочного горлышка". У тебя это код (судя по вопросу). Код для ЕСП у тебя есть. Зачем ты взялся за то, что сложно для тебя? Тем более применение коммерческое, какие-то душевые?
Попробовал вот таким образом вписать код, все равно не хочет распознавать ответ из порта
{ 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; }Повторю: обратись в "Ищу исполнителя"
Я тут колесо от Оки купил, дёшево и всего 5 Тыр пробега. К моему Билазу подойдёт? А то карьер простаивает..
Я тут колесо от Оки купил, дёшево и всего 5 Тыр пробега. К моему Билазу подойдёт? А то карьер простаивает..
Подойдёт, как только орфографию подтянешь.
вы бы не ерничали, а гребли в платный раздел. А то с кодом у вас кранты, самостоятельно отладить явно не способны :)
Вот это что такое:
это у вас число или строка? :)