Отправка данных из 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");
    }
  }
}

Выход:

, 👍0

Обсуждение

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


2 ответа


1

Я заработал, используя приведенный ниже код:

#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");

}

}}
,

0

Вы можете следовать этому замечательному руководству, если хотите подключить свой RFID-модуль RC522 к PHP. Предоставляются исходный код и пошаговое руководство. Вам понадобится только NodeMcu и RFID-модуль RC522. https://devcraze.com/tutorials/connecting-rfid-scanner -to-php-using-nodemcu-wifi-module/

,