• Уважаемые посетители сайта esp8266.ru!
    Мы отказались от размещения рекламы на страницах форума для большего комфорта пользователей.
    Вы можете оказать посильную поддержку администрации форума. Данные средства пойдут на оплату услуг облачных провайдеров для сайта esp8266.ru
  • Система автоматизации с открытым исходным кодом на базе esp8266/esp32 микроконтроллеров и приложения IoT Manager. Наша группа в Telegram

ESP8266 Чтение из порта Arduino

sER

New member
Код:
#include <ESP8266WiFi.h>
const char* ssid = "Internet";
const char* password = "40061991";
WiFiServer server(80);

void setup() {
  Serial.begin(115200);
  delay(10);
WiFi.begin(ssid, password);

  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
  }
  server.begin();
}

void loop() {

  WiFiClient client = server.available();
  if (!client) {
    return;
  }

  while(!client.available()){
    delay(1);
  }


  String req = client.readStringUntil('\r');
  client.flush();

if (req.indexOf("/?start") != -1)
Serial.println("1");
else if (req.indexOf("/?stop") != -1)
Serial.println("2");
else if (req.indexOf("/?volt") != -1)
Serial.println("3");
   
else {

    client.stop();
    return;
  }
client.flush();

if (Serial.available() > 0)
{
нужно считать данные из порта ардуино и добавить в текст ниже.
Как считать эти данные из порта?
}
String s = "HTTP/1.1 200 OK\r\nContent-Type: text/plain\r\n\r\n";
s += "Tekst iz arduino\r\n";


client.print(s);
  delay(1);

}
Код:
int incomingInt = 0;
void setup()
{
   Serial.begin(115200);
   Serial.setTimeout(2000);
}

void loop()
{
   if (Serial.available() > 0)
   {
      incomingInt = Serial.parseInt();
    if (incomingInt==1)
     Serial.println("Start");
    else if (incomingInt==2)
    Serial.println("Stop");
    else if (incomingInt==3)
    Serial.println("Volt");
   }
}
 

sER

New member
Ардуино
Код:
char incomingByte;

void setup() {
Serial.begin(115200);
}
void loop() {
  if (Serial.available() > 0) { 
    incomingByte = Serial.read();
    if(incomingByte == '0') {
      Serial.println("Stop\n"); 
    }
    if(incomingByte == '1') {
      Serial.println("Start\n");
    }
  }
}

ESP8266-01
Код:
#include <ESP8266WiFi.h>
String inString;
const char* ssid = "Internet";
const char* password = "40061991";
WiFiServer server(80);

void setup() {
  Serial.begin(115200);
  delay(10);
WiFi.begin(ssid, password);
 
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);  
  }
server.begin();
}

void loop() {
WiFiClient client = server.available();
  if (!client) {
    return;
  }
    while(!client.available()){
    delay(1);
  }
  String req = client.readStringUntil('\r');
  client.flush();
 
  if (req.indexOf("/gpio/0") != -1)
   Serial.println("0");
else if (req.indexOf("/gpio/1") != -1)
    Serial.println("1");
 
  else {
    client.stop();
    return;
  }
  client.flush();

while (Serial.available()) {
    char inChar = Serial.read();
    inString += inChar;
    if (inChar == '\n') {
   client.print(inString);
      inString = "";
    }
  }
 
  delay(1);
}
Почему и в порт и в ответ я получаю
Start

Start

или

Stop

Stop

Т.е. по два раза.
 

CodeNameHawk

Moderator
Команда форума
Напечатайте строку(например в дополнительный программный Serial порт) полученную в String req = client.readStringUntil('\r'); и сами сможете ответить.
 

sER

New member
Честно говоря я не понял, стало только ещё больше Start Stop приходить в монитор
 

sER

New member
Код:
e]char incomingByte;
int  LED = 13;
void setup() {
  Serial.begin(115200);
  pinMode(LED, OUTPUT);
}
void loop() {
  if (Serial.available() > 0) {
    incomingByte = Serial.read();
    if(incomingByte == '0') {
       digitalWrite(LED, LOW);
       Serial.println("Start");
    }
    if(incomingByte == '1') {
       digitalWrite(LED, HIGH);
       Serial.println("Stop");
    }
  }
}
00000.png
Светодиод включается и выключается когда я обращаюсь по адресам
http://192.168.0.28/gpio/0
http://192.168.0.28/gpio/1
В порт приходит Start и Stop по одному разу на каждый запрос соответственно.

Код:
#include <ESP8266WiFi.h>
String inString;
const char* ssid = "Internet";
const char* password = "40061991";
WiFiServer server(80);

void setup() {
  Serial.begin(115200);
  delay(10);
  WiFi.begin(ssid, password);

  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
  }
server.begin();
}

void loop() {

  WiFiClient client = server.available();
  if (!client) {
    return;
  }
  while(!client.available()){
    delay(1);
  }

String req = client.readStringUntil('\r');
client.flush();
if (req.indexOf("/gpio/0") != -1)
  Serial.println("0");
  else if (req.indexOf("/gpio/1") != -1)
  Serial.println("1");
  else {
    client.stop();
    return;
  }

String s = "HTTP/1.1 200 OK\r\nContent-Type: text/html\r\n\r\n<!DOCTYPE HTML>\r\n<html>\r\nStart-Stop";
s += "</html>\n";

client.flush();
client.print(s);
delay(1);
}
 

sER

New member
Код:
client.flush();
if (req.indexOf("/gpio/0") != -1){
  Serial.println("0");
  delay(1000);
if (Serial.available() > 0)
   {
      Serial.readBytes(incomingBytes, 6);
   }
  }
 
  else if (req.indexOf("/gpio/1") != -1)
  Serial.println("1");
  else {
    client.stop();
    return;
  }

String s = "HTTP/1.1 200 OK\r\nContent-Type: text/html\r\n\r\n<!DOCTYPE HTML>\r\n<html>\r\nStart-Stop";
s += incomingBytes;
s += "</html>\n";
Сделал вот так, теперь в порт приходит всё как надо, по одному разу...НО, в ответе на запрос в браузере я получаю нечто такое:
Start-Stop賠
 

sER

New member
Код:
char incomingByte;
int  LED = 13;
void setup() {
  Serial.begin(115200);
  pinMode(LED, OUTPUT);
}
void loop() {
  if (Serial.available() > 0) {
    incomingByte = Serial.read();
    if(incomingByte == '0') {
       digitalWrite(LED, LOW);
       Serial.println("Start#");
    }
    if(incomingByte == '1') {
       digitalWrite(LED, HIGH);
       Serial.println("Stop#");
    }
  }
}
Код:
#include <ESP8266WiFi.h>
String inString;

const char* ssid = "Internet";
const char* password = "40061991";
WiFiServer server(80);

void setup() {
  Serial.begin(115200);
  delay(10);
  WiFi.begin(ssid, password);
 
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
  }
server.begin();
}

void loop() {

  WiFiClient client = server.available();
  if (!client) {
    return;
  }
  while(!client.available()){
    delay(1);
  }
 
String req = client.readStringUntil('\r');
client.flush();
if (req.indexOf("/gpio/0") != -1)
  Serial.println("0");
  else if (req.indexOf("/gpio/1") != -1)
  Serial.println("1");
  else {
    client.stop();
    return;
  }
while (Serial.available()) {
    char inChar = Serial.read();
    inString += inChar;
    if (inChar == '#') {
     String s = "HTTP/1.1 200 OK\r\nContent-Type: text/html\r\n\r\n<!DOCTYPE HTML>\r\n<html>\r\n";
     s += inString;
     s += "</html>\n";
     client.print(s);
     inString = "";
     client.flush();
     }
  }
delay(1);
}


В итоге получаю:
Start# HTTP/1.1 200 OK Content-Type: text/html Start#
 

sER

New member
Start# HTTP/1.1 200 OK Content-Type: text/html Start#
Почему опять два раза Start# Start#
 

CodeNameHawk

Moderator
Команда форума
Смотреть всю писанину нет желания, выделите то, что важно, тогда будет ясно что не работает.
Примерно так: выполняю такую команду, на входе такие данные на выходе ожидаю получить то-то, почему получаю не то что ожидаю.
А то у вас в листинге нет ни одного комментария, что кто должен делать.
 

sER

New member
Зайдя на тот или иной адрес я хочу получить данные с ардуино, точнее управлять ардуино.
К примеру:
http://192.168.0.28/gpio/1 //Включаю светодиод на 13 ноге и в ответ получаю команду Start#
http://192.168.0.28/gpio/0 //Выключаю светодиод на 13 ноге и в ответ получаю команду Stop#
http://192.168.0.28/gpio/2 //Получаю из ардуино температуры с датчика 30.00#
И т.п.

Вот пример кода ардуино.
Код:
char incomingByte;
int  LED = 13;
void setup() {
  Serial.begin(115200);
  pinMode(LED, OUTPUT);
}
void loop() {
  if (Serial.available() > 0) {
    incomingByte = Serial.read();
    if(incomingByte == '1') {
       digitalWrite(LED,HIGH );
       Serial.println("Start#");
    }
    if(incomingByte == '0') {
       digitalWrite(LED,LOW );
       Serial.println("Stop#");
    }
  }
}
Код ESP8266-01
Код:
#include <ESP8266WiFi.h>
String inString;
#include <SoftwareSerial.h>

const char* ssid = "Internet";
const char* password = "40061991";
WiFiServer server(80);

void setup() {
  Serial.begin(115200);
  delay(10);
  WiFi.begin(ssid, password);

  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
  }
server.begin();
}

void loop() {

  WiFiClient client = server.available();
  if (!client) {
    return;
  }
  while(!client.available()){
    delay(1);
  }

String req = client.readStringUntil('\r');
client.flush();
if (req.indexOf("/gpio/0") != -1)
  Serial.println("0");
  else if (req.indexOf("/gpio/1") != -1)
  Serial.println("1");
  else {
    client.stop();
    return;
  }
while (Serial.available()) {
    char inChar = Serial.read();
   inString += inChar;
   if (inChar == '#') {
     String s = "HTTP/1.1 200 OK\r\nContent-Type: text/html\r\n\r\n<!DOCTYPE HTML>\r\n<html>\r\n";
     s += inString;
     s += "</html>\n";
     client.print(s);
     inString = "";
     client.flush();
     }
  }
delay(1);
}
Загрузил этот код,открываю монитор порта, захожу на адрес:
http://192.168.0.28/gpio/1
http://192.168.0.28/gpio/0
http://192.168.0.28/gpio/1
http://192.168.0.28/gpio/0
В монитор порта получаю:
1
0
1
0
Работает. Иду дальше.
Загружаю код в ардуино. (Так как esp прошиваю через ардуино, отключаю ресет от gnd, загружаю код в ардуино и меняю местами rx tx)
Безымянный.png

Открываю монитор порта ардуино, и на каждый запрос
http://192.168.0.28/gpio/1 или http://192.168.0.28/gpio/0
я получаю
В порт:
Start#
Start#

Stop#
Stop#

В браузер:
Start# HTTP/1.1 200 OK Content-Type: text/html Start#

Stop# HTTP/1.1 200 OK Content-Type: text/html Stop#


Светодиод на Ардуино соответственно включается-выключается
 

sER

New member
Откуда берётся текст выделенный красным
Start# HTTP/1.1 200 OK Content-Type: text/html Start#
Stop# HTTP/1.1 200 OK Content-Type: text/html Stop#
 

sER

New member
Код:
char incomingByte;
int  LED = 13;
void setup() {
  Serial.begin(115200);
  pinMode(LED, OUTPUT);
}
void loop() {
  if (Serial.available() > 0) {
    incomingByte = Serial.read();
    if(incomingByte == '1') {
       digitalWrite(LED,HIGH );
       Serial.println("Start#");
       delay(500);
    }
    if(incomingByte == '0') {
       digitalWrite(LED,LOW );
       Serial.println("Stop#");
       delay(500);
    }
  }
}
Добавил задержки. Теперь:

http://192.168.0.28/gpio/0
В ответ получаю:Stop#
<!DOCTYPE HTML><html>Stop#</html>
Всё как и должно быть.

Захожу ещё раз http://192.168.0.28/gpio/0
В ответ получаю:Stop# HTTP/1.1 200 OK Content-Type: text/html Stop#
<!DOCTYPE HTML>
<html>
Stop#</html>
HTTP/1.1 200 OK
Content-Type: text/html
<!DOCTYPE HTML>
<html>
Stop#</html>

И ещё раз
http://192.168.0.28/gpio/0
В ответ получаю:Stop#
<!DOCTYPE HTML><html>Stop#</html>

В чём косяк?
 

CodeNameHawk

Moderator
Команда форума
Тут надо подумать
Код:
while (Serial.available()) {
    char inChar = Serial.read();
   inString += inChar;
   if (inChar == '#') {
ждете '#', но что запишется в inString ? (явно ожидаете Start, но что там будет не ясно)
По идее дожидайтесь знака '#' и только потом заносите символы в inString. (Попробуйте передавать #Start)
Ну и отладка к Arduino на второй Serial подключаете внешний COM-USB переходник...
 

sER

New member
if (req.indexOf("/gpio/0") != -1)
Serial.println("0");
delay(300);
else if (req.indexOf("/gpio/1") != -1)
Serial.println("1");
delay(300);

Вроде как-бы стало работать стабильно
 
Сверху Снизу