Как получить страницу с сервера, используя ESP8266 с программой, работающей на Arduino вместо модуля ESP?
Я подключил модуль ESP8266-01 к Arduino, как показано на следующей схеме, где контакты RX и TX заменены на контакты 8 и 9 вместо 0 и 1:
Я использую библиотеку ESP8266wifi по следующей ссылке:
https://github.com/ekstrand/ESP8266wifi
Я просмотрел библиотеку ESP8266HTTPClient, но она предназначена для платы ESP8266. Я хочу, чтобы мой код работал на Arduino Uno, а не на ESP8266! Я написал следующий код:
#include <SoftwareSerial.h>
#include <SerialESP8266wifi.h>
const String API_PASSWORD = "stn1234";
#define RX_PIN 8 // RX Arduino (подключен к TX ESP8266)
#define TX_PIN 9 // TX Arduino (подключен к RX ESP8266)
#define ESP_RESET_PIN 12
#define SERVER_IP "192.168.43.234"
#define SERVER_PORT "80"
#define WIFI_SSID "MyWIFI"
#define WIFI_PASSWORD "myWifiPassword"
uint8_t wifi_started = false;
const char RST[] PROGMEM = "RST";
const char IDN[] PROGMEM = "*IDN?";
#define CHANGE_DELAY 5000
void initializeWifi();
void transmitData(String);
String getResponse();
void transmitStatus();
SoftwareSerial swSerial = SoftwareSerial(RX_PIN, TX_PIN);
SerialESP8266wifi wifi(swSerial, swSerial, ESP_RESET_PIN, Serial);
void setup()
{
Serial.begin(9600);
Serial.println("Initializing...");
initializeWifi();
Serial.println("Initialization complete");
}
void loop()
{
transmitStatus();
Serial.print("Transmission complete, ");
int s = (CHANGE_DELAY/1000);
Serial.print(s);
Serial.println("s until next cycle");
delay(CHANGE_DELAY);
}
void transmitStatus()
{
int a = (int)random(100);
int b = (int)random(100);
String url = "/LocalWebProject/api/testConnection.php?a=" + String(a) + "&b=" + String(b);
transmitData(url);
String response = getResponse();
Serial.print("Reply received: ");
Serial.println(response);
}
void initializeWifi()
{
swSerial.begin(115200);
Serial.println("Starting Wifi");
wifi.setTransportToTCP();
wifi.endSendWithNewline(false); // Завершит все передачи символом новой строки и возвратом каретки, т.е. println.. по умолчанию true
wifi_started = wifi.begin();
if(wifi_started)
{
Serial.println("Wifi started, connecting to AP...");
wifi.connectToAP(WIFI_SSID, WIFI_PASSWORD);
Serial.println("Connected to AP");
} else {
Serial.println("ESP module not working");
}
}
void transmitData(String url)
{
Serial.println("Connecting to server...");
wifi.connectToServer(SERVER_IP, SERVER_PORT);
String data = String("GET ") + url + " HTTP/1.1\r\n" +
"Host: " + wifi.getIP() + "\r\n" +
"Connection: close\r\n\r\n";
Serial.println("Connected. Transmitting data...");
wifi.send(SERVER, data);
}
String getResponse()
{
while(1)
{
Serial.println("Waiting for response...");
WifiMessage in = wifi.listenForIncomingMessage(6000);
if(in.hasData)
{
if(in.channel == SERVER)
{
Serial.print("Reply received from the server: ");
Serial.println(in.message);
return in.message;
}
}
delay(1000);
Serial.print("Retrying, ");
}
}
У меня есть сервер Apache, работающий на Ubuntu 18.10, с проектом PHP, работающим на порту 80. Страница testConnection.php принимает 2 параметра GET (целые числа) и возвращает сумму.
Проблема: Пишет, что модуль ESP не работает. Точка доступа в моем случае — это локальная точка доступа на моем мобильном телефоне.
Я попытался запустить данный пример "SerialESP8266_library_test" и, как ни странно, он печатает, что он успешно подключен к моей точке доступа, но на моем телефоне я не вижу, чтобы он был подключен. Только 1 устройство видно как подключенное, это мой ноутбук, на котором работает сервер Apache и веб-проект. Также connectToAP возвращает 1, а connectToServer возвращает 0.
Что я делаю не так? Я знаю, что модуль ESP требует питания, а Arduino 3V3 недостаточно, но сейчас я просто тестирую код и позже внесу необходимые изменения. В связи с этим я размещаю свой Android-телефон рядом с модулем ESP, чтобы у него не было проблем с подключением к нему.
Буду признателен за любую помощь! Заранее спасибо.
@APN, 👍-1
Обсуждение1 ответ
Наконец-то он работает, установив скорость передачи данных на 9600 и сократив URL-адрес GET. Возможно, в библиотеке есть ограничение по длине.
- Как читать и записывать 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?
https://github.com/jandrassy/WiFiEspAT/blob/master/examples/Basic/WebClient/WebClient.ino, @Juraj
swSerial.begin(115200)
. Я не думаю, что softwareSerial может работать так быстро. Библиотека, которую вы используете для Wi-Fi, использует 9600 бод. Я бы попробовал., @Gerben@Gerben Некоторые модули 9600, некоторые 115200 - зависит от версии прошивки. SoftwareSerial может *работать* на частоте 115200, но не может достаточно быстро реагировать на входящие байты, чтобы надежно получать поток данных., @Majenko
@Juraj WiFiEspAt требует прошивки с AT 1.7, я не хотел этого делать, @APN
@Gerben Я пробовал с 9600 и внес некоторые другие изменения. Теперь он правильно подключается к точке доступа (отображается на моем телефоне), а также подключается к серверу. Но получает ошибку запроса HTTP 400 Bad. Есть ли проблема в формате запроса GET? Моя страница находится по адресу: http://192.168.43.234/LocalWebProject/api/testConnection.php, @APN
Значение заголовка хоста должно быть именем или IP-адресом сервера., @Juraj
@Juraj, как в примерах и т. д., хост — это локальный IP-адрес модуля ESP. В любом случае, я попробовал ваше предложение, предоставив там SERVER_IP, но все же у меня возникла та же проблема., @APN
протокол HTTP не определен в этом примере, @Juraj