Модуль Wi-Fi не отправляет данные должным образом

Я написал программу на C++ для Arduino Uno, которая подключается к модулю Wi-Fi (ESP8266) и отправляет рассчитанные данные на сервер через модуль Wi-Fi с почтовым запросом http.

Проблема в том, что программа отправляет данные только 2 раза по http и потом останавливается. Я имею в виду, что он переходит в цикл, но http-send-request не выполняется.

вот моя программа:

#include <MySignals.h>
#include "Wire.h"
#include "SPI.h"

unsigned long currentMillis;

const unsigned long period = 10000;

int a=1;

void setup()  {

Serial.begin(115200);

MySignals.begin();
 void httpBase(int); // Включить питание WiFi ESP8266 -> бит 1:1 > битовый набор (MySignals.expanderState, EXP_ESP8266_POWER);
 MySignals.expanderWrite(MySignals.expanderState);

 MySignals.initSensorUART();

 MySignals.enableSensorUART(WIFI_ESP8266);   delay(1000);

// Проверяем, запущен ли модуль WiFi int8_t answer =
sendATcommand("AT", "OK", 6000);   if (answer == 0)   {
MySignals.println("Error");
// ждем ответа от модуля
while (answer == 0)
{
  // Отправляем AT каждые две секунды и ждем ответа
  answer = sendATcommand("AT", "OK", 6000);
}   }   else if (answer == 1)   {

MySignals.println("WiFi succesfully working!");


if (sendATcommand("AT+CWMODE=1", "OK", 6000))
{
  MySignals.println("CWMODE OK");
}
else
{
  MySignals.println("CWMODE Error");

}


// Измените здесь свой WIFI_SSID и WIFI_PASSWORD
if (sendATcommand("AT+CWJAP=\"********\",\"****\"",
"OK", 20000))
{
  MySignals.println("Connected!");
}
else
{
  MySignals.println("Error");

}   }


 }


void loop()  {




delay(10);  // ждем секунду

a=a+1;

httpBase(a);


 }




 void httpBase(int gsr) {








 String data="value1="+String(gsr); //Нить
 data="a="+String(gsr);
 String postString="POST /ardu.php HTTP/1.1\r\nHost:
 192.168.178.36\r\nContent-Type: application/x-www-form-  
 urlencoded\r\nContent-Length:
 "+String(data.length())+"\r\n\r\n"+data+"\r\n"; char* post = new
 char[postString.length()+1]; strcpy(post,postString.c_str());

 String inf = "AT+CIPSEND="+String(strlen(post)); char *info = new
 char[inf.length() + 1]; strcpy(info, inf.c_str());

 delay(1500); sendATcommand("AT+CIPMUX=0", "OK", 3000);

 // отправить AT-команду («AT+CIPSERVER=1», «ОК», 1000);


 sendATcommand("AT+CIPSTART=\"TCP\",\"192.168.178.36\",80", "OK",
 2000);

 sendATcommand(info, "OK", 2000); sendATcommand(post, "OK", 2000);

 sendATcommand("AT+CIPCLOSE", "OK", 3000);



 delay(10000); }






int8_t sendATcommand(char* ATcommand, char* expected_answer1, 
unsigned
int timeout) {


uint8_t x = 0,  answer = 0;   char response[500];   unsigned long
previous;

memset(response, '\0', sizeof(response));    // Инициализируем
string

delay(100);

while ( Serial.available() > 0) Serial.read();   // Очистить
input
buffer

delay(1000);   Serial.println(ATcommand);    // Отправляем AT-команду

 x = 0;   previous = millis();

 // этот цикл ожидает ответа do {

 if (Serial.available() != 0)
 {
  response[x] = Serial.read();
  x++;
  // проверяем, есть ли нужный ответ в ответе модуля
  if (strstr(response, expected_answer1) != NULL)
  {
    answer = 1;
    //MySignals.println(response);

  }
}
// Ожидание ответа с истечением времени ожидания } while ((answer == 0) && ((millis() - предыдущее) < время ожидания));

 return answer; }

вывод:

AT
WiFi succesfully working!
AT+CWMODE=1
CWMODE OK
AT+CWJAP="*******","******"
Connected!
AT+CIPMUX=0
AT+CIPSTART="TCP","192.168.178.36",80
AT+CIPSEND=127
POST /ardu.php HTTP/1.1
Host: 192.168.178.36
Content-Type: application/x-www-form-urlencoded
Content-Length: 8

value1=2

AT+CIPCLOSE
AT+CIPMUX=0
AT+CIPSTART="TCP","192.168.178.36",80
AT+CIPSEND=127
POST /ardu.php HTTP/1.1
Host: 192.168.178.36
Content-Type: application/x-www-form-urlencoded
Content-Length: 8

value1=3

AT+CIPCLOSE
AT+CIPMUX=0
AT+CIPSTART="TCP","192.168.178.36",80
AT+CIPSEND=127
POST /ardu.php HTTP/1.1
Host: 192.168.1
⸮⸮6⸮
AT+CIPCLOSE
AT+CIPMUX=0
AT+CIPSTART="TCP","192.168.178.36",80
AT+CIPSEND=1
⸮
AT+CIPCLOSE
AT+CIPMUX=0
AT+CIPSTART="TCP","192.168.178.36",80
AT+CIPSEND=1
⸮
AT+CIPCLOSE
AT+CIPMUX=0
AT+CIPSTART="TCP","192.168.178.36",80
AT+CIPSEND=1
AT+CIPCLOSE
AT+CIPMUX=0
AT+CIPSTART="TCP","192.168.178.36",80
AT+CIPSEND=1
⸮
AT+CIPCLOSE
AT+CIPMUX=0
AT+CIPSTART="TCP","192.168.178.36",80

⸮
AT+CIPCLOSE
AT+CIPMUX=0
AT+CIPSTART="TCP","192.168.178.36",80


AT+CIPCLOSE
AT+CIPMUX=0
AT+CIPSTART="TCP","192.168.178.36",80
2


AT+CIPCLOSE
AT+CIPMUX=0
AT+CIPSTART="TCP","192.168.178.36",80
2


AT+CIPCLOSE
AT+CIPMUX=0
AT+CIPSTART="TCP","192.168.178.36",80
⸮
⸮
AT+CIPCLOSE
AT+CIPMUX=0
AT+CIPSTART="TCP","192.168.178.36",80


AT+CIPCLOSE
AT+CIPMUX=0
AT+CIPSTART="TCP","192.168.178.36",80


AT+CIPCLOSE
AT+CIPMUX=0
AT+CIPSTART="TCP","192.168.178.36",80


AT+CIPCLOSE
AT+CIPMUX=0
AT+CIPSTART="TCP","192.168.178.36",80


AT+CIPCLOSE
AT+CIPMUX=0
AT+CIPSTART="TCP","192.168.178.36",80


AT+CIPCLOSE
AT+CIPMUX=0
AT+CIPSTART="TCP","192.168.178.36",80


AT+CIPCLOSE
AT+CIPMUX=0
AT+CIPSTART="TCP","192.168.178.36",80


AT+CIPCLOSE
AT+CIPMUX=0
AT+CIPSTART="TCP","192.168.178.36",80


AT+CIPCLOSE
AT+CIPMUX=0
AT+CIPSTART="TCP","192.168.178.36",80


AT+CIPCLOSE

....

, 👍0

Обсуждение

что такое MySignals.h?, @Juraj

это платформа, которая содержит датчики., @Navid Javan

уменьшите свой код для отправки и получения одного байта ... было ли это успешным?, @jsotola

не используйте класс String https://majenko.co.uk/blog/evils-arduino-strings, @Juraj

void httpBase(int); не имеет смысла, это объявление функции вместо вызова функции., @Sim Son


1 ответ


1

Здравствуйте, Навид, и добро пожаловать в сообщество. Приятель, твой код очень сложно читать.

Посмотрим, смогу ли я помочь вам архивировать цели. Прежде всего постарайтесь вообще не использовать AT-команды, у вас есть ESP8266, это не просто модуль Wi-Fi, но и действительно хороший микроконтроллер, который вы действительно можете использовать, код для него (даже с помощью Arduino IDE). Я бы НАСТОЯТЕЛЬНО предложил вам использовать его, если вы хотите использовать методы POST и GET. AT-команды работают, но они не так надежны, как должны быть, и с вашим кодом, написанным в таком формате, вам будет трудно помочь, приятель.

Теперь, если вы называете его модулем Wi-Fi, я могу предположить, что вы имеете в виду ESP01 (те ESP8266 без USB-подключения), вы можете найти в Интернете несколько руководств о том, как загрузить код в их с помощью чипа FTDI вашего Arduino Uno (по сути, заземляя контакт сброса вашего Arduino).

С учетом сказанного, надеюсь, вы сможете разделить свой код на эти 2 микроконтроллера, если вам действительно нужно использовать Arduino uno, и выполнить несколько функций для запуска на основе последовательной связи с обеих сторон. Я знаю, что это звучит много работы, но поверьте мне, это самое простое и надежное решение, которое вы найдете.

И позвольте мне дать вам бонусный совет: в следующий раз, когда вы захотите работать с приложениями Wi-Fi, купите себе Wemos D1, они маленькие, простые в использовании, надежные, имеют контакты GPIO, а также контакты АЦП и ШИМ, вы можете можно поставить Arduino на полку за 4 доллара.

И, пожалуйста, помните, Навид, синтаксис кода очень важен.

,