Перенос Веб сервера с ардуино на ESP8266 NodeMCU

Нет ответов
Draku1a551
Offline
Зарегистрирован: 11.01.2020

Здравствуйте, помогите советом,

Есть рабочий скетч открытия ворот через веб сервер с кнопками для ардуино, вот он:

#include <SPI.h>             //библиотека для работы с SPI
#include <UIPEthernet.h>       //библиотека для работы с Ethernet 
#define txPin 3
#define Te 320

boolean newInfo = 0;        //переменная для новой информации
//MAC адрес вашего Ethernet-модуля, если его у вас нет, введите любой
//или оставьте тот, что в примере
byte mac[] = { 0x00, 0xAA, 0xBB, 0xCC, 0xDA, 0x02 };     

//указываем IP адрес
//будьте внимательны! IP адрес указывается тот, который вы получили запустив пример DhcpAdressPrinter
IPAddress ip(192,168,1,170);    //пример МОЕГО IP адреса, вы вводите сюда СВОЙ

//инифиализация библиотеки Ethernet server library
EthernetServer server(80);

void setup()
{
  pinMode(3, OUTPUT);                               //инициализируем 8 пин как выход для светодиода                  
  //запускаем сервер с указанными ранее MAC и вашим IP
  Ethernet.begin(mac, ip);
  server.begin();
  Serial.begin(9600);
}

void loop()
{
  //принимаем данные, посылаемые клиентом
  EthernetClient client = server.available();
  if(client){                                       //если запрос оканчивается пустой строкой
  boolean currentLineIsBlank = true;                //ставим метку об окончании запроса (дословно: текущая линия чиста)
  while (client.connected()) {                      //пока есть соединение с клиентом
    if (client.available()) {                       //если клиент активен
      char c = client.read();                       //считываем посылаемую информацию в переменную "с"
                                                  
      if(newInfo && c == ' '){                      //если переменная новой информации = 1 и "с", в которой записан запрос, равен пустой строке
        newInfo = 0;                                //то обнуляем переменную поступления новой информации
      }
      
      if(c == '$'){                                 //если переменная "с", несущая отправленный нам запрос, содержит символ $ 
                                                    //(все новые запросы) - "$" подразумевает разделение получаемой информации (символов)
        newInfo = 1;                                //то пришла новая информация, ставим метку новой информации в 1
      }
      
      /************************************************************************************************
      Примечание:
      Символ $ используется как обычный символ, который разделяет 1 от 2
      На практике применяют символ &, который разделяет новые переменные от последующих
      Это использьуется, например, в GET-запросах, которые выглядят подобным образом:
      client.print("GET /controlbar/wp-content/data.php?uid=" + ID + "&type=" + type + "&value=" + value);
      как видите, знак & разделяет значение переменной - ID и переменную type     
      ***************************************************************************************************/
      
                                                     //Проверяем содержание URL - присутствует $1 или $2
      if(newInfo == 1){                              //если есть новая информация
          Serial.println(c);
          if(c == '1'){
  SendCame(0b101011101100);
}
          
          if(c == '2'){
  SendCame(0b101111101111);
}
          
          if(c == '3'){
  SendCame(0b110010111110);
}
      } 
      
      if (c == '\n') {                              //если "с" равен символу новой строки
        currentLineIsBlank = true;                  //то начинаем новую строку
      } 
      else if (c != '\r') {                         //иначе, если "с" не равен символу возврата курсора на начало строки
        currentLineIsBlank = false;                 //то получаем символ на текущей строке
      }
    
      if (c == '\n' && currentLineIsBlank) {        //выводим HTML страницу
        client.println("HTTP/1.1 200 OK");          //заголовочная информация
        client.println("Content-Type: text/html");
        client.println("Connection: close");  
        client.println("Refresh: 30");              //автоматическое обновление каждые 30 сек
        client.println();
        client.println("<!DOCTYPE HTML>");          //HTML тип документа
        client.println("<html>");                   //открытие тега HTML 
        client.print("<title>My web Server</title>");                  //название страницы
        client.print("<H1>My web Server</H1>");                        //заголовк на странице
        client.print("<a href=\"/$1\"><button>1</button></a>");       //Ворота 1
        client.print("<a href=\"/$2\"><button>2</button></a>");      //Ворота 2
        client.print("<a href=\"/$3\"><button>4</button></a>");      //Ворота 3
        client.println("<br />");       
        client.println("</html>");                  //закрываем тег HTML
        break;                                      //выход
      }
    
    }
    
  }
  delay(1);                                          //время на получение новых данных
  client.stop();                                     //закрываем соеднение 
}

}
void SendCameqBit(byte b)
{
  delayMicroseconds(Te);
  if (!b) digitalWrite(txPin,HIGH);
  delayMicroseconds(Te);
  digitalWrite(txPin,HIGH);
  delayMicroseconds(Te);
  digitalWrite(txPin,LOW);
}

void SendCame(long Code)
{     
  for (int j=0;j<5;j++) // посылку посылаем как и брелок - 4 раза подряд.
  {
    digitalWrite(txPin,HIGH);
    delayMicroseconds(Te);
    digitalWrite(txPin,LOW);// посылаем стартовый импульс
    
    for (byte i=12;i>0;i--){
      SendCameqBit(bitRead(Code, i-1)); // побитово перебираем и посылаем код
    }
    delay(16);
  }
  delay(2000); // сделать паузу после посылки на 2 с
}

Я его переделал для запуска на ESP8266 NodeMCU, вот так:


IP-АДРЕС - тот IP, полученный при запуске примера DhcpAdressPrinter
#include <ESP8266WiFi.h>

http://IP-АДРЕС/$1

Для того, чтобы выключить:
http://IP-АДРЕС/$2

*/

#include <ESP8266WiFi.h>
#define txPin 0
#define Te 320

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

WiFiServer server(80);

boolean newInfo = 0;        //переменная для новой информации

//инифиализация библиотеки Ethernet server library
#include <ESP8266WiFi.h>



void setup()
{
  Serial.begin(9600);
  pinMode(0, OUTPUT);                                    

 Serial.print("Connecting to ");
  Serial.println(ssid);
  WiFi.begin(ssid, password);
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  // Print local IP address and start web server
  Serial.println("");
  Serial.println("WiFi connected.");
  Serial.println("IP address: ");
  Serial.println(WiFi.localIP());
  server.begin();

}

void loop()
{
  //принимаем данные, посылаемые клиентом
  WiFiClient client = server.available();
  if(client){                                       //если запрос оканчивается пустой строкой
  boolean currentLineIsBlank = true;                //ставим метку об окончании запроса (дословно: текущая линия чиста)
  while (client.connected()) {                      //пока есть соединение с клиентом
    if (client.available()) {                       //если клиент активен
      char c = client.read();                       //считываем посылаемую информацию в переменную "с"
                                                  
      if(newInfo && c == ' '){                      //если переменная новой информации = 1 и "с", в которой записан запрос, равен пустой строке
        newInfo = 0;                                //то обнуляем переменную поступления новой информации
      }
      
      if(c == '$'){                                 //если переменная "с", несущая отправленный нам запрос, содержит символ $ 
                                                    //(все новые запросы) - "$" подразумевает разделение получаемой информации (символов)
        newInfo = 1;                                //то пришла новая информация, ставим метку новой информации в 1
      }
      
      /************************************************************************************************
      Примечание:
      Символ $ используется как обычный символ, который разделяет 1 от 2
      На практике применяют символ &, который разделяет новые переменные от последующих
      Это использьуется, например, в GET-запросах, которые выглядят подобным образом:
      client.print("GET /controlbar/wp-content/data.php?uid=" + ID + "&type=" + type + "&value=" + value);
      как видите, знак & разделяет значение переменной - ID и переменную type     
      ***************************************************************************************************/
      
                                                     //Проверяем содержание URL - присутствует $1 или $2
      if(newInfo == 1){                              //если есть новая информация
          Serial.println(c);
          if(c == '1'){
  SendCame(0b101011101100);
}
          
          if(c == '2'){
  SendCame(0b101111101111);
}
          
          if(c == '3'){
  SendCame(0b110010111110);
}
      } 
      
      if (c == '\n') {                              //если "с" равен символу новой строки
        currentLineIsBlank = true;                  //то начинаем новую строку
      } 
      else if (c != '\r') {                         //иначе, если "с" не равен символу возврата курсора на начало строки
        currentLineIsBlank = false;                 //то получаем символ на текущей строке
      }
    
      if (c == '\n' && currentLineIsBlank) {        //выводим HTML страницу
        client.println("HTTP/1.1 200 OK");          //заголовочная информация
        client.println("Content-Type: text/html");
        client.println("Connection: close");  
        client.println("Refresh: 30");              //автоматическое обновление каждые 30 сек
        client.println();
        client.println("<!DOCTYPE HTML>");          //HTML тип документа
        client.println("<html>");                   //открытие тега HTML 
        client.print("<title>My web Server</title>");                  //название страницы
        client.print("<H1>My web Server</H1>");                        //заголовк на странице
        client.print("<a href=\"/$1\"><button>1</button></a>");       //Ворота 1
        client.print("<a href=\"/$2\"><button>2</button></a>");      //Ворота 2
        client.print("<a href=\"/$3\"><button>3</button></a>");      //Ворота 3
        client.println("<br />");       
        client.println("</html>");                  //закрываем тег HTML
        break;                                      //выход
      }
    
    }
    
  }
  delay(1);                                          //время на получение новых данных
  client.stop();                                     //закрываем соеднение 
}

}
void SendCameqBit(byte b)
{
  delayMicroseconds(Te);
  if (!b) digitalWrite(txPin,HIGH);
  delayMicroseconds(Te);
  digitalWrite(txPin,HIGH);
  delayMicroseconds(Te);
  digitalWrite(txPin,LOW);
}

void SendCame(long Code)
{     
  for (int j=0;j<5;j++) // посылку посылаем как и брелок - 4 раза подряд.
  {
    digitalWrite(txPin,HIGH);
    delayMicroseconds(Te);
    digitalWrite(txPin,LOW);// посылаем стартовый импульс
    
    for (byte i=12;i>0;i--){
      SendCameqBit(bitRead(Code, i-1)); // побитово перебираем и посылаем код
    }
    delay(16);
  }
  delay(2000); // сделать паузу после посылки на 2 с
}

После переделки на ESP на экране в браузере ничего не выводиться но если отправлять прямой запрос например 192.168.1.23/$1 то запрос срабатывает и ворота открываются, но на экране браузера ничего не появляется. И попробовал в браузере Safari зайти там почему то все работает, а в хроме и IE нифига. А на ардуино во всех браузерах открывалось нормально.

В чем может быть причина?