Optron
26.Август.2024 17:26:40
1
И снова здравствуйте!
Связал WEB-сервер на ESP01 c Arduino UNO и добился управления пином 13 на Arduino с браузера.
Теперь надо получить в браузере ответ от Arduino о состоянии диода “On” или “Off”.
В адресной строке браузера ввожу:
“http://<статический IP>:10200/s?z=a”
диод выключается.
Если же ввожу:
“http://<статический IP>:10200/s?z=b”
диод включается.
Так и было задумано.
в стоке 38 этого скетча передается аргумент в Arduino.
[code]
#include <ESP8266WiFi.h>
#include <ESP8266WebServer.h>
char priem;
bool persim=0;
String stroka="";
char sim;
uint8_t newMACAddress[] = {0xFA, 0xEB, 0xDC, 0xCD, 0xBE, 0xAF};
const char* ssid = "ABRAKADABRA"; // SSID
const char* password = "19661117"; // пароль
ESP8266WebServer server(10200);
void setup()
{
Serial.begin(9600);
delay(100);
WiFi.begin(ssid, password);
WiFi.mode(WIFI_STA);
wifi_set_macaddr(STATION_IF, &newMACAddress[0]);
while (WiFi.status() != WL_CONNECTED)
{
delay(1000);
}
server.on("/s", toarduino);
server.begin();
}
void loop()
{
server.handleClient(); // обработка входящих запросов
}
void toarduino()
{
server.send(200, "text/plain",server.arg(0)); // ответ в браузер
Serial.println(server.arg(0)); // ответ в MK на этот аргумент Arduino реагирует включением/выключением диода
}
[/code]
Вопрос. В каком месте этого скетча организовать получение строки от ардуино для передачи ее в браузер.
Спасибо.
PS. Я понимаю, что в случае передачи в браузер ответа от Arduino строку 37 надо закомментировать.
BOOM
26.Август.2024 17:42:13
2
37 строка и есть выдача в браузер. Вместо последнего аргумента подставишь что нужно «плюнуть» и всё.
Optron
26.Август.2024 17:44:45
3
Но перед этим мне как-то надо получить ответ от Arduino после строки 38, в которой я даю ей “команду”.
BOOM
26.Август.2024 17:47:58
4
Плюнуть в браузер и дать/получить данные с ардуино - это разные вещи. И логичнее сначала получать/отправлять что-то, а уже потом выводить на экран (в данном случае - в браузер).
Optron
26.Август.2024 17:51:45
5
BOOM:
Плюнуть в браузер
Представьте, что строки 37 нет.
В строке 38 я даю команду Arduino, которая возвращает мне ответ: “On” или “Off”.
А затем я этот ответ пересылаю в браузер.
Так логично будет? Точнее, эти операции надо проводить в этом месте?
v258
26.Август.2024 17:54:15
6
Это самый логичный вариант - дать команду, получить результат и отправить его в браузер
BOOM
26.Август.2024 17:56:17
7
Optron:
Так логично будет?
Да, именно так и нужно сделать.
Optron
26.Август.2024 20:03:50
8
Могу ошибаться, но вот что у меня получается.
Arduino может принимать строку от ESP01 на любой свой UART: программный или аппаратный.
А ESP01 принимает строку ТОЛЬКО c аппаратного UART Arduino.
Так и должно быть?
MMM
27.Август.2024 07:47:18
9
нет
Какая скорость у программного Уарта?
Optron
27.Август.2024 09:41:48
12
Код ESP01. Смотрите комментарии в строках 38, 43.
[code]
#include <ESP8266WiFi.h>
#include <ESP8266WebServer.h>
char priem;
bool persim = 0;
uint8_t newMACAddress[] = {0xFA, 0xEB, 0xDC, 0xCD, 0xBE, 0xAF};
const char* ssid = "ABRAKADABRA";
const char* password = "19661117";
ESP8266WebServer server(10200);
void setup()
{
Serial.begin(9600);
delay(100);
WiFi.begin(ssid, password);
WiFi.mode(WIFI_STA);
wifi_set_macaddr(STATION_IF, &newMACAddress[0]);
while (WiFi.status() != WL_CONNECTED)
{
delay(1000);
}
server.on("/s", handleSpecificArg);
server.begin();
}
void loop()
{
server.handleClient();
}
void handleSpecificArg()
{
Serial.println(server.arg(0)); // отсылаю в Arduino заведомо единственный аргумент
delay(250); // жду ответ от Arduino
String stroka = "w"; // здесь будет String stroka = "";
if (Serial.available() > 0) // Если в Arduino UART программный, то это условие не выполняется.
{
while (Serial.available() > 0)
{
char sim = Serial.read();
stroka += sim;
}
server.send(200, "text/plain", stroka);
}
else
{
server.send(200, "text/plain", "Oblom");
}
}
[/code]
Код Arduino-UNO.
[code]
#include <SoftwareSerial.h>
SoftwareSerial port(8, 9); //RX TX
String stroka = "";
void setup()
{
pinMode(13, OUTPUT);
digitalWrite(13, 0);
Serial.begin(9600); // пины 0,1
port.begin(9600);
}
void loop()
{
if (Serial.available() > 0) // if (port.available() > 0)
{
char priem = Serial.read(); // char priem = port.read();
if (priem == '\n')
{
if (stroka == "a")
{
digitalWrite(13, 0);
Serial.println("Off"); // port.println("Off");
}
if (stroka == "b")
{
digitalWrite(13, 1);
Serial.println("On"); // port.println("On");
}
stroka = "";
}
else
{
if ((byte) priem != 13) stroka += priem;
}
}
}
[/code]
v258
27.Август.2024 10:12:15
13
Что-то мне припоминается, что у esp скорость сериала должна быть 115200
MMM
27.Август.2024 10:14:43
14
Судя по коду, вы предполагаете что в этой строке отсылается либо “a\n” либо “b\n”
А с чего вы взяли, что у вас конец строки именно “\n” ? А не “\r\n”, к примеру?
Вы проверяли, что там приходит?
Optron
27.Август.2024 10:37:07
15
Где-то я встречался с тем, что библиотеки такую скорость не поддерживают и её надо снижать. При такой скорости работает корректно.
Optron
27.Август.2024 11:09:31
16
MMM:
А не “\r\n”, к примеру?
\r десятичный код 13. Я игнорирую его в строке 35 скетча Arduino.
Тут ещё вопрос по железу. Может и не в тему. Нужно ли преобразовывать уровень выхода TX Arduino для связи с RX ESP?
Optron
27.Август.2024 11:17:39
18
MMM:
да, нужно
Просто смотрю схемы в интернете. В подавляющем большинтве схем (которые попадаются) соединение напрямую.
MMM
27.Август.2024 11:17:51
19
Ок, принято, не заметил.
Тем не менее, совет тот же - посмотреть что именно приходит. Только так можно понять, почему не срабатывает.
И да, попробуйте поменять местами RX и TX
Optron
27.Август.2024 11:24:34
20
Спасибо за совет. Обязательно посмотрю. И параллельно буду разбираться с проблемой символов кириллицы.
Попробую. Сейчас у меня подключено RX->TX. И TX->RX.