Перенос Веб сервера с ардуино на ESP8266 NodeMCU
- Войдите на сайт для отправки комментариев
Ср, 15/01/2020 - 22:47
Здравствуйте, помогите советом,
Есть рабочий скетч открытия ворот через веб сервер с кнопками для ардуино, вот он:
#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 нифига. А на ардуино во всех браузерах открывалось нормально.
В чем может быть причина?