Отправка данных из ESP8266 в PHP
Я хочу отобразить значение тега RFID в HTML-файле.
Я использую модуль ESP8266 ESP-01, модуль чтения EM-18, Arduino Uno и Xampp для хостинга PHP.
Сейчас я получаю значение «255» в Arduino каждый раз, когда сканирую RFID-метку. Но я должен получить 12-значное буквенно-цифровое значение метки RFID.
Я подключил Arduino, а также экран вывода последовательного монитора.
На следующей неделе у меня будет подача документов в колледж, так что это срочно. Любая помощь будет оценена по достоинству.
#include "SoftwareSerial.h"
String ssid ="Home";
String password="****";
SoftwareSerial esp(2, 3);// RX, TX
String data;
String server = "192.168.0.182"; // www.example.com
String uri = "/testget.php";// наш пример — /esppost.php
int DHpin = 0;//контакт датчика
byte dat [12];
String tag;
void setup() {
pinMode (DHpin, OUTPUT);
esp.begin(9600);
Serial.begin(9600);
reset();
connectWifi();
}
//сбрасываем модуль esp8266
void reset() {
esp.println("AT+RST");
delay(1000);
if(esp.find("OK") )
Serial.println("Module Reset");
}
//подключаемся к вашей сети Wi-Fi
void connectWifi() {
String cmd = "AT+CWJAP=\"" +ssid+"\",\"" + password + "\"";
esp.println(cmd);
delay(4000);
/*
if(esp.find("OK")) {
Serial.println("Connected!");
}
else {
connectWifi();
Serial.println("Cannot connect to wifi"); }*/
}
byte read_data () {
byte data;
for (int i = 0; i < 13; i ++) {
if (digitalRead (DHpin) == LOW) {
while (digitalRead (DHpin) == LOW); // ждем 50 мкс
delayMicroseconds (30); // определяем продолжительность высокого уровня, чтобы определить, что данные равны «0» или «1»
if (digitalRead (DHpin) == HIGH)
data |= (1 << (12-i)); // высоко спереди и низко на стойке
while (digitalRead (DHpin) == HIGH);
// данные '1', ждем следующего получателя
}
}
return data;
}
void start_test () {
digitalWrite (DHpin, LOW); // шина отключена, отправляем сигнал старта
delay (30); // задержка превышает 18 мс, поэтому можно обнаружить сигнал запуска DHT11
digitalWrite (DHpin, HIGH);
delayMicroseconds (40); // Ждем ответа DHT11
pinMode (DHpin, INPUT);
while (digitalRead (DHpin) == HIGH);
delayMicroseconds (80);
// Ответ DHT11, потянул шину 80 мкс
if (digitalRead (DHpin) == LOW);
delayMicroseconds (80);
// DHT11 80 мкс после того, как шина остановилась, чтобы начать отправку данных
for (int i = 0; i < 13; i ++)
// получаем данные значения тега, бит четности не учитывается
dat[i] = read_data ();
pinMode (DHpin, OUTPUT);
digitalWrite (DHpin, HIGH);
// отправляем данные один раз после освобождения шины, ждем, пока хост откроет следующий сигнал Start
}
void loop () {
start_test ();
// преобразуем битовые данные в строковую форму
tag= String(dat[12]);
data = "tag=" + tag;// отправляемые данные должны иметь следующий вид: //name1=value1&name2=value2.
Serial.println(data);
httppost();
delay(1000);
}
void httppost () {
esp.println("AT+CIPSTART=\"TCP\",\"" + server + "\",80");//запускаем TCP-соединение.
if( esp.find("OK")) {
Serial.println("TCP connection ready");
}
delay(1000);
String postRequest =
"POST " + uri + " HTTP/1.0\r\n" +
"Host: " + server + "\r\n" +
"Accept: *" + "/" + "*\r\n" +
"Content-Length: " + data.length() + "\r\n" +
"Content-Type: application/x-www-form-urlencoded\r\n" +
"\r\n" + data;
String sendCmd = "AT+CIPSEND=";//определяем количество отправляемых символов.
esp.print(sendCmd);
esp.println(postRequest.length() );
delay(500);
if(esp.find(">")) {
Serial.println("Sending..");
esp.print(postRequest);
if( esp.find("SEND OK")) {
Serial.println("Packet sent");
while (esp.available()) {
String tmpResp = esp.readString();
Serial.println(tmpResp);
}
//закрываем соединение
esp.println("AT+CIPCLOSE");
}
}
}
Выход:
@curiously77, 👍0
Обсуждение2 ответа
Я заработал, используя приведенный ниже код:
#include "SoftwareSerial.h"
String ssid ="Home";
String password="%Qwerty@123%";
char input[12];
int count = 0;
SoftwareSerial esp(2, 3);// RX, TX
String data;
String server = "192.168.0.182"; // www.example.com
String uri = "/testget.php";// наш пример — /esppost.php
int DHpin = 0;//контакт датчика
byte dat [12];
String temp;
void setup() {
pinMode (DHpin, OUTPUT);
esp.begin(9600);
Serial.begin(9600);
reset();
connectWifi();
}
//сбрасываем модуль esp8266
void reset() {
esp.println("AT+RST");
delay(1000);
if(esp.find("OK") ) Serial.println("Module Reset");
}
//подключаемся к вашей сети Wi-Fi
void connectWifi() {
String cmd = "AT+CWJAP=\"" +ssid+"\",\"" + password + "\"";
esp.println(cmd);
delay(4000);
}
byte read_data () {
byte data;
for (int i = 0; i < 8; i ++) {
if (digitalRead (DHpin) == LOW) {
while (digitalRead (DHpin) == LOW); // ждем 50 мкс
delayMicroseconds (30); // определяем продолжительность высокого уровня, чтобы определить, что данные равны «0» или «1»
if (digitalRead (DHpin) == HIGH){
data |= (1 << (7-i)); // высоко спереди и низко на стойке
}
while (digitalRead (DHpin) == HIGH);
// данные '1', ждем следующего получателя
}
} return data; }
void start_test () {
digitalWrite (DHpin, LOW); // шина отключена, отправляем сигнал старта
delay (30); // задержка превышает 18 мс, поэтому можно обнаружить сигнал запуска DHT11
digitalWrite (DHpin, HIGH);
delayMicroseconds (40); // Ждем ответа DHT11
pinMode (DHpin, INPUT);
while (digitalRead (DHpin) == HIGH);
delayMicroseconds (80);
// Ответ DHT11, потянул шину 80 мкс
if (digitalRead (DHpin) == LOW);
delayMicroseconds (80);
while(count<12){
input[count] = Serial.read(); // Считываем 1 байт данных и сохраняем его в переменной input[]
count++; // увеличиваем счетчик
delay(5);}
// DHT11 80 мкс после того, как шина остановилась, чтобы начать отправку данных
//for (int i = 0; i < 4; i++)
// получаем данные о температуре и влажности, бит четности не учитывается
/*for(int x=0;x<12;x++)
for(int i=0;i<12;i++)
//dat[i] = read_data ();
dat[x]=input[i];*/
pinMode (DHpin, OUTPUT);
digitalWrite (DHpin, HIGH);
// отправляем данные один раз после освобождения шины, ждем, пока хост откроет следующий сигнал Start
}
void loop () {
start_test ();
count = 0; // Сбрасываем счетчик в ноль
temp = "";
// преобразуем битовые данные в строковую форму
for(int i=0;i<13;i++)
temp += input[i];
Serial.println(temp);
//Serial.println(temp);
data = "tag=" + temp;// отправляемые данные должны иметь следующий вид: //name1=value1&name2=value2.
httppost();
delay(200);
}
void httppost () {
esp.println("AT+CIPSTART=\"TCP\",\"" + server + "\",80");//запускаем TCP-соединение.
if( esp.find("OK")) {
Serial.println("TCP connection ready");
} delay(100);
String postRequest =
"POST " + uri + " HTTP/1.0\r\n" +
"Host: " + server + "\r\n" +
"Accept: *" + "/" + "*\r\n" +
"Content-Length: " + data.length() + "\r\n" +
"Content-Type: application/x-www-form-urlencoded\r\n" +
"\r\n" + data;
String sendCmd = "AT+CIPSEND=";//определяем количество отправляемых символов.
esp.print(sendCmd);
esp.println(postRequest.length() );
delay(500);
if(esp.find(">")) { Serial.println("Sending.."); esp.print(postRequest);
if( esp.find("SEND OK")) { Serial.println("Packet sent");
// пока (esp.available()) {
//Строка tmpResp = esp.readString();
//Serial.println(tmpResp);
//}
//закрываем соединение
esp.println("AT+CIPCLOSE");
}
}}
Вы можете следовать этому замечательному руководству, если хотите подключить свой RFID-модуль RC522 к PHP. Предоставляются исходный код и пошаговое руководство. Вам понадобится только NodeMcu и RFID-модуль RC522. https://devcraze.com/tutorials/connecting-rfid-scanner -to-php-using-nodemcu-wifi-module/
- Автопарковка на arduino
- (Код ультразвукового датчика: такого файла или каталога нет)
- rfid_default_keys проверить с помощью RC522
- Несколько неблокирующих таймеров обратного отсчета?
- Датчик HC-SR505 PIR выдает только HIGH уровень
- Определение уровня заряда с помощью датчика тока (ACS758) с arduino uno
- Использование YS-IRTM с Arduino Uno
- Скетч мигания ESP8266 не мигает светодиодом
tag= String(dat[12]);
не делает то, что вы думаете. Также вы пытаетесь прочитать 13 байт в массив из 12 байт и втиснуть 13 бит в байт. И по какой-то причине я использую контакт 0 для датчика, продолжая использовать последовательный порт., @gre_gorПожалуйста, можете ли вы помочь мне с кодом? Я новичок в Arduino, и у меня действительно проблемы с оценками!, @curiously77
измените
<13
на<12
и правильно преобразуйте byte(/char) [массив в строку](https://stackoverflow.com/questions/8960087/how-to-convert-a-char-array- в строку), @GerbenЯ сделал это и теперь получаю 254. Я написал это: String myString = String(myByteArray); для преобразования., @curiously77
В вашем примере кода нет myByteArray, поэтому сообщение о том, что вы попробовали это, никому не поможет понять контекст, в котором вы это пробовали. Вы можете отредактировать свой вопрос, включив в него обновленный код, который вы пробовали, и т. д., @jose can u c