Модуль 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
....
@Navid Javan, 👍0
Обсуждение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 доллара.
И, пожалуйста, помните, Навид, синтаксис кода очень важен.
- Как читать и записывать EEPROM в ESP8266
- Как сделать выводы Tx и Rx на ESP-8266-01 в выводах GPIO?
- Как навсегда изменить скорость передачи данных ESP8266 (12e)?
- Как заставить 5-вольтовое реле работать с NodeMCU
- Как исправить: Invalid conversion from 'const char*' to 'char*' [-fpermissive]
- ESP8266 не подключается к Wi-Fi
- AT-команда не отвечает на последовательный монитор
- Разница между этими двумя платами NodeMCU?
что такое MySignals.h?, @Juraj
это платформа, которая содержит датчики., @Navid Javan
уменьшите свой код для отправки и получения одного байта ... было ли это успешным?, @jsotola
не используйте класс String https://majenko.co.uk/blog/evils-arduino-strings, @Juraj
void httpBase(int);
не имеет смысла, это объявление функции вместо вызова функции., @Sim Son