Arduina + esp

Bposter
Bposter аватар
Offline
Зарегистрирован: 05.09.2016

Доброго,  есть задумка передавать  через  ESP данные типа  a, d, g  и тд....  в arduino, то есть  в браузере набираю запрос типа 192.168.1.103/a   ESP как веб сервер принемает a и передает arduino. Первую часть вроде как реализовал (вернее урезал готовый пример)


#include <ESP8266WiFi.h>

const char* ssid = "************";
const char* password = "**********";

WiFiServer server(80);

void setup() {
  Serial.begin(115200);
  delay(10);
  
  // Connect to WiFi network
  Serial.println();
  Serial.println();
  Serial.print("Connecting to ");
  Serial.println(ssid);
  
  WiFi.begin(ssid, password);
  
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  Serial.println("");
  Serial.println("WiFi connected");
  
  // Start the server
  server.begin();
  Serial.println("Server started");

  // Print the IP address
  Serial.println(WiFi.localIP());
}

void loop() {
  // Check if a client has connected
  WiFiClient client = server.available();
  if (!client) {
    return;
  }
  
  // Wait until the client sends some data
  Serial.println("new client");
  while(!client.available()){
    delay(1);
  }
  
  // Read the first line of the request
  String req = client.readStringUntil('\r');
 
  client.flush();
 
  
  client.flush();

  // Prepare the response
  String s = "<!DOCTYPE HTML>\r\n<html>\r";
  s += req;
  s += "</html>\n";

  // Send the response to the client
  client.print(s);
  delay(1);
  Serial.println(req);

}

Единственная проблема  в браузере и в окне мониторинга COM порта  вылазит такое GET /test HTTP/1.1 а нужно чтоб выводило просто test, подскажите где подправить чтоб убрать лишнее?

2.Далее нужно значение test передать в arduino, я так понимаю надо открыть любой pin на вход, а что дальше? как прописать чтоб принять переменную?

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

В строке 49 Вы читаете первую строку запроса и её и возвращаете в строке 58. А Ваше "test" сидит, скорее всего в третьей строке запроса, которую Вы не читаете вовсе.

Ну, а по второму вопросу, я даже не знаю как отвечать. Вы её как в ардуино принимать-то собираетесь? Через какой протокол? Как у Вас связана ESP с Ардуино. КТо ж Вас знает?

ptr
Offline
Зарегистрирован: 28.05.2016

А можно узнать, зачем? ESP мощный 32-х битный 80МГц процессор, программируемый на C так же, как и адруино. Это не ардуино должно им руководить, а ESP использовать ардуино в качестве контроллера ввода/вывода.

 

ptr
Offline
Зарегистрирован: 28.05.2016

ЕвгенийП пишет:

В строке 49 Вы читаете первую строку запроса и её и возвращаете в строке 58. А Ваше "test" сидит, скорее всего в третьей строке запроса, которую Вы не читаете вовсе.

Он же даже написал, где у него test:GET /test HTTP/1.1

Как и положено, сразу после GET и до протокола.

 

Bposter
Bposter аватар
Offline
Зарегистрирован: 05.09.2016

В общем разобрался, соединяю  arduino + ESP  так   TX->RX  и  RX->TX   в arduino в код добавил только  одну строку  val = Serial.read();  и в val приходит переменная без лишнего  GET /***** HTTP/1.1     единственное что иногда не срабатывает но это возможно браузер кеширует?

ptr, все правильно так и есть, темболее это просто эксперементы без определенной цели

ptr
Offline
Зарегистрирован: 28.05.2016

Bposter пишет:

    Serial.println(req);

  {
    char *sptr, *eptr;

    sptr=req;
    if (strncmp(sptr,"GET ",4)==0)
    {
      eptr=sptr+=4;
      while (*eptr && *eptr<>' ') eptr++;
      *eptr=0;
      Serial.println(sptr);
    } else {
      Serial.println(req);
    }
  }

 

ptr
Offline
Зарегистрирован: 28.05.2016

Или так, если ведущий слеш не нужен:

 {
   char *sptr, *eptr;

    sptr=req;
    if (strncmp(sptr,"GET /",5)==0)
    {
      eptr=sptr+=5;
      while (*eptr && *eptr<>' ') eptr++;
      *eptr=0;
      Serial.println(sptr);
    } else {
      Serial.println(req);
    }
  }

 

Bposter
Bposter аватар
Offline
Зарегистрирован: 05.09.2016

ptr пишет:

Bposter пишет:

    Serial.println(req);

  {
    char *sptr, *eptr;

    sptr=req;
    if (strncmp(sptr,"GET ",4)==0)
    {
      eptr=sptr+=4;
      while (*eptr && *eptr<>' ') eptr++;
      *eptr=0;
      Serial.println(sptr);
    } else {
      Serial.println(req);
    }
  }

 

А куда он вставляется и что делает? Я не совсем понимаю что это ( не тот уровень еще :-)

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

ptr пишет:

ЕвгенийП пишет:

В строке 49 Вы читаете первую строку запроса и её и возвращаете в строке 58. А Ваше "test" сидит, скорее всего в третьей строке запроса, которую Вы не читаете вовсе.

Он же даже написал, где у него test:GET /test HTTP/1.1

Как и положено, сразу после GET и до протокола.

 

А, так тест - не запрос, а имя файла. Фу-ты, блин! :(

ptr
Offline
Зарегистрирован: 28.05.2016

ЕвгенийП пишет:

А, так тест - не запрос, а имя файла. Фу-ты, блин! :(

Даже не файл, а просто часть URL после имени сервера )

ptr
Offline
Зарегистрирован: 28.05.2016

Bposter пишет:

ptr пишет:

Bposter пишет:

    Serial.println(req);

  {
    char *sptr, *eptr;

    sptr=req;
    if (strncmp(sptr,"GET ",4)==0)
    {
      eptr=sptr+=4;
      while (*eptr && *eptr<>' ') eptr++;
      *eptr=0;
      Serial.println(sptr);
    } else {
      Serial.println(req);
    }
  }

 

А куда он вставляется и что делает? Я не совсем понимаю что это ( не тот уровень еще :-)

Вместо отквоченной строки.

Bposter
Bposter аватар
Offline
Зарегистрирован: 05.09.2016

Теперь бы запитать отдельно ESP от arduina если я правильно понимаю то это минус на GND   плюс на 3.3v  ?

ptr
Offline
Зарегистрирован: 28.05.2016

Так получилось что хотел?

А по правилам, землю надо все пины GND завести, а питание на все пины 3.3V

Или есть шансы, что сгорит при большом потреблении на фиг.

Bposter
Bposter аватар
Offline
Зарегистрирован: 05.09.2016

ptr пишет:

Так получилось что хотел?

А по правилам, землю надо все пины GND завести, а питание на все пины 3.3V

Или есть шансы, что сгорит при большом потреблении на фиг.

Да все супер, работает, у меня  одним запросом в браузере можно одну лампу отключить вторую включить или две сразу включить,  единственное так и не понял куда питание подавать чтоб запитать ESP отдельно а не через USB

Jeka_M
Jeka_M аватар
Offline
Зарегистрирован: 06.07.2014

Bposter пишет:

Теперь бы запитать отдельно ESP от arduina

Уж сколько раз говорилось, что ESP надо питать отдельно, а не от ардуины. Ардуиновский стабилизатор может не потянуть, у ESP пиковые нагрузки большие. По крайней мере многие жаловались на всякие глюки, когда питали от ардуино. И ещё уровни TR/RX желательно согласовать, если ардуина пятивольтовая. Вход RX у ESP вроде толерантен к 5В, но советуют не рисковать.

UPD: Если у Вас плата такая, как выше на фото - то стабилизатор на 3,3В там уже стоит. Можно подавать 5В на пин 5В (VIN).

ptr
Offline
Зарегистрирован: 28.05.2016

А! Так он уже на плате. Тогда достаточно 3.3 и GND или 5V и GND, если использовать стабилизатор на плате. Все нужные ноги там уже соединены, как следует еще под экраном модуля ESP-12F уже припаянного к плате.

ptr
Offline
Зарегистрирован: 28.05.2016

Jeka_M пишет:

Ардуиновский стабилизатор может не потянуть, у ESP пиковые нагрузки большие.

При WiFi передаче по datasheet 170ма. Но указывается это почему то для 17dBm, а максимальная мощность передатчика 19.5dBm. Так как при 15dBm указано 140ма, я бы ориентировался не меньше, чем на 200ма

 

Bposter
Bposter аватар
Offline
Зарегистрирован: 05.09.2016

Запитывать полюбому буду отдельно от блока питания,  как то не стабильно  все работает, с планшета вообще почти не включается, с пк один можно включить другой выключится, может в коде че не так?

ESP код


#include <ESP8266WiFi.h>

const char* ssid = "******************";
const char* password = "***********";

WiFiServer server(80);

void setup() {
  Serial.begin(115200);
  delay(10);
  
  // Connect to WiFi network
  Serial.println();
  Serial.println();
  Serial.print("Connecting to ");
  Serial.println(ssid);
  
  WiFi.begin(ssid, password);
  
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  Serial.println("");
  Serial.println("WiFi connected");
  
  // Start the server
  server.begin();
  Serial.println("Server started");

  // Print the IP address
  Serial.println(WiFi.localIP());
}

void loop() {
  // Check if a client has connected
  WiFiClient client = server.available();
  if (!client) {
    return;
  }
  
  // Wait until the client sends some data
  Serial.println("new client");
  while(!client.available()){
    delay(1);
  }
  
  // Read the first line of the request
  String req = client.readStringUntil('\r');
 
  client.flush();

  // Prepare the response
  String s = "<!DOCTYPE HTML>\r\n<html>\r";
  s += req;
  s += "</html>\n";

  // Send the response to the client
  client.print(s);
  delay(1);
 
 Serial.println(req);

}

Arduino код

int outputPin = 13;
int p = 8; 
char val;                           

void setup()
{
  Serial.begin(115200);              
  pinMode(outputPin, OUTPUT);      
  pinMode(p, OUTPUT);
}

void loop()
{ 
  if (Serial.available()) {

      val = Serial.read();
                
    if (val == 'q') {               
      digitalWrite(outputPin, HIGH);
    }
    if(val == 'e'){
      digitalWrite(p, HIGH);
    }
    if (val == 'r') {               
      digitalWrite(p, LOW);     
    }
    if (val == 'w') {               
      digitalWrite(outputPin, LOW); 
    }
  }
 }

 

ptr
Offline
Зарегистрирован: 28.05.2016

delay() бы убрать. А то грузите 80МГц числодробилку на 100%

Bposter
Bposter аватар
Offline
Зарегистрирован: 05.09.2016

Есть догадка что может оперативная память забивается предыдущими значениями поэтому работает как хочет, после рестара модулей начинает вроде как норм работать а потом опять не понятно как, можно как то после каждого прохода освобождать память?

ptr
Offline
Зарегистрирован: 28.05.2016

Возможно.

Добавь:

delete client;
delete req;
delete s;

 

 

Bposter
Bposter аватар
Offline
Зарегистрирован: 05.09.2016

Я так понимаю в самом конце программы это добавить  в ESP + в arduino?

ptr пишет:

Возможно.

Добавь:

delete client;
delete req;
delete s;

 

 

 

И вот об этом можно пожайлуста пояснения или ссылку где почитать

Jeka_M пишет:

И ещё уровни TR/RX желательно согласовать, если ардуина пятивольтовая. Вход RX у ESP вроде толерантен к 5В, но советуют не рисковать.

ptr
Offline
Зарегистрирован: 28.05.2016

Bposter пишет:

Я так понимаю в самом конце программы это добавить  в ESP + в arduino?

ptr пишет:

delete client;
delete req;
delete s;

И вот об этом можно пожайлуста пояснения или ссылку где почитать

В коде ардуины у Вас никаких объектов не создается, так что там не надо ничего. В коде ESP неявно вызывается конструктор для перечисленных трех объектов. Уверенности, что для этих объектов был вызван деструктор при выходе из функции у меня нет. C++ для AVR сильно урезан, потому и предлагаю попробовать явно вызвать деструкторы этих объектов.
На PC объекты класса String по умолчанию создаются в стеке и удалять их не надо. Если это так и на AVR - то и деструктор у них пустой. А что за класс WiFiClient я вообще без понятия.

Bposter
Bposter аватар
Offline
Зарегистрирован: 05.09.2016

Ясно, спасибо буду пробывать

ptr
Offline
Зарегистрирован: 28.05.2016

У класса WiFiClient есть деструктор нашел я его исходники:

WiFiClient::~WiFiClient()
{
    WiFiClient::_remove(this);
    if (_client)
        _client->unref();
}

И у String тоже нашел:

String::~String()
{
	free(buffer);
}

 

Bposter
Bposter аватар
Offline
Зарегистрирован: 05.09.2016

ptr пишет:

У класса WiFiClient есть деструктор нашел я его исходники:

WiFiClient::~WiFiClient()
{
    WiFiClient::_remove(this);
    if (_client)
        _client->unref();
}

И у String тоже нашел:

String::~String()
{
	free(buffer);
}

 

ясно значит буду заново переделывать, но для начала думаю надо придумать хорошее питание платам каждой отдельно а не двум от ноута по USB, даже возможно в будующем лучше будет ESP использовать как  клиент и парсить значения с веб сервера

Jeka_M
Jeka_M аватар
Offline
Зарегистрирован: 06.07.2014

Bposter пишет:

И вот об этом можно пожайлуста пояснения или ссылку где почитать

ESP8266 питается от 3.3В, логические уровни ножки TX тоже 0В-3,3В. Ардуина питается от 5В, поэтому логические уровни ножки TX уже 0В-5В. То есть больше, чем у ESP8266. Фраза, что ESP8266 "толерантна" к логическим уровням 5В означает, что по-идее она выдержит повышенное напряжение на ножке RX (от TX ардуины) и там ничего не должно погореть. Но чтобы не рисковать, с помощью некоей схемы делают согласование логических уровней. То есть, когда из ардуины (ножка TX) выходит 5В - на ESP8266 (ножка RX) приходит 3,3В. В обратную сторону не обязательно, т.к. 3,3В от ESP8266 (ножка TX) нормально распознаются ардуиной (ножка RX).

http://chipenable.ru/index.php/how-connection/item/91-soglasovanie-logicheskih-urovney.html

http://we.easyelectronics.ru/Shematech/soglasovanie-logicheskih-urovney-5v-i-33v-ustroystv.html

http://we.easyelectronics.ru/Shematech/devyatikanalnyy-soglasovatel-urovney.html

UPD: Возможно на плате NodeMCU это уже реализовано. Вон там какие-то два транзистора возле D6, D8 стоят.