Отправка данных через esp8266 с помощью arduino

Я пытаюсь отправить данные GPS с помощью esp8266, используя плату Arduino. Я использовал ресивер neo-6m и модуль esp8266-01. Ниже моя программа, использующая AT-команды. Программа успешно скомпилирована и загружена на плату Arduino, но единственный вывод, который она выдает на последовательном мониторе, — это простое начало. Ни одна из AT-команд не выполняется. Даже модуль не подключается к wi-fi. Я не могу указать на ошибку в моем коде. Помогите, пожалуйста, найти возможную ошибку. Спасибо


#include <TinyGPS++.h>
#include <SoftwareSerial.h>

TinyGPSPlus gps;

String ssid = "JioFi_244DB1D";

String password = "q52fq74c9s";

SoftwareSerial esp(6,7);

SoftwareSerial ss(8,9);

char Lat[12], Lon[12], alt[12],ch;

byte NOS;

byte l;

String webpage;

void reset(){

  esp.println("AT+RST");

  delay(1000);

  if(esp.find("OK"))

    Serial.println("Module Reset");

    }    

    void ConnectWifi(){

      esp.println("AT+CIPMUX=1");

      esp.println("AT+CWMODE=1");

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

      esp.println(cmd);

      delay(4000);

      if(esp.find("OK"))

      Serial.println("Connected!");

      else {

        ConnectWifi();

        Serial.println("Connecting..");

        }

      }

void setup(){

  esp.begin(9600);

  Serial.begin(9600);

    Serial.println("begin");

  reset();

  ConnectWifi();

  esp.println("AT+CIFSR");

  while(esp.available()>0){ 

  if(esp.find("STAIP"))

  {Serial.println("IP Address:");

  while(esp.available()>0)

  {ch=esp.read();

  Serial.print(ch);}

  }}}

void loop() {

    ss.listen();

    delay(2000); 

    while(ss.available()>0)

    {

    gps.encode(ss.read());

    {

      if(gps.location.isValid()){

           // dtostrf(gps.location.lat(),1,6,Lat);

      //dtostrf(gps.location.lng(),1,6,Lon);

      webpage = "<!DOCTYPE html><html><body><form method = \"post\" action =\"http://localhost/php/esppost.php\"><метка для = \"широта\">Широта:<\label><тип ввода=число id = \"широта\" name= \"широта\" только для чтения = ";

        // L = Широта.длина();

      l= webpage.length();

      esp.println("AT+CIPSEND=0,");

      esp.print(9+l+5);

      esp.println(webpage);

      esp.print(gps.location.lat(),6);

      esp.print("\">");

      delay(500);

      webpage = "<Label for = \"Longitude\">Longitude:</Label><input type = \"number\" id = \"Longitude\" name = \"Longitude\" readonly value =\"";
      l=webpage.length();

      //L = Lon.length();

      esp.println("AT+CIPSEND=0,");

                        esp.print(9+l+5);

      esp.println(webpage);

      esp.print(gps.location.lng(),6);

      esp.print("\">");

      }

      else

      webpage="Location Invalid";

      l=webpage.length();

      esp.println("AT+CIPSEND=0,");

      esp.print(l+2); 

      esp.println(webpage);

      delay(500);

      if(gps.altitude.isValid()){

      dtostrf(gps.altitude.meters(),1,6,alt);

      webpage = "<label for=\"Altitude\">Altitude:<\label><input type = number id=\"Altitude\" name=\"Altitude\" readonly value=";

      l=webpage.length();

      //L= alt.length();

      esp.println("AT+CIPSEND=0,");

      esp.print(9+l+2);

      esp.println(webpage);

      esp.print(gps.altitude.meters(),6);

      esp.print("\">");

      }

     if(gps.satellites.isValid()){

        NOS= gps.satellites.value();

        webpage= "<lable for = \"NOS \"> Number of Satellites:<\label><input type=number id=NOS name= NOS readonly value =";

        l= webpage.length();

        esp.println("AT+CIPSEND=0,");

        esp.print(2+l+22);

        esp.println(webpage);

        esp.print(gps.satellites.value());

        esp.print("></body></html>");

        delay(500);


     }}

    esp.println("AT+CIPCLOSE");

      }    
} 

, 👍0

Обсуждение

У вас есть RX на TX для esp?, @Juraj

да, я использую аналогичные соединения, @user3185742

написать минимальный тестовый скетч, @Juraj

Спасибо. Я изменил скорость передачи данных на 115200, и теперь все работает хорошо., @user3185742


1 ответ


1

SoftwareSerial не может прослушивать два экземпляра. Существует функция .listen() для переключения между экземплярами SoftwareSerial.

Прошивка esp8266 AT не ждет, пока вы прослушаете экземпляр SoftwareSerial. Если есть соединение с сервером, он отправляет +IPD и данные. Если экземпляр SoftwareSerial не прослушивает, информация о клиентском соединении теряется.

Вы должны постоянно прослушивать esp8266, поэтому вы не можете использовать два экземпляра SoftwareSerial.

Вы можете использовать вывод RX Uno для получения данных от модуля GPS через аппаратный последовательный порт.

,

Я внес некоторые изменения в свою программу. Я подключил GPS Tx к Rx моей платы UNO, заменил ss на Serial и удалил ss.listen(). но все равно получаю тот же результат, что и раньше. Не могли бы вы предложить мне, какую ошибку я все еще делаю?, @user3185742

@ user3185742, этот ответ помог? скорость передачи какого интерфейса вы изменили?, @Juraj