• Система автоматизации с открытым исходным кодом на базе 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);

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