ESP8266

Mestniy96
Offline
Зарегистрирован: 31.08.2015

Добрый день. Помогите пожалуйста в моей хотелке))). Видел как на ethernet шилде поднимают сервера, и к ним обращаются по интернету, с любой точки мира. Можно ли такое реализовать на ESP8266? Хотел бы для начала помигать светодиодом через сайт. Можете подсказать, какой хостинг использовать, если он нужен и если не трудно ссылки на материал. 

Пока что нашел только 

http://www.cyberforum.ru/post5915692.html

http://forum.arduino.cc/index.php?topic=114436.msg1008272#msg1008272

http://ar2u.ru/index.php/article/datchiki-i-moduli/65-wi-fi-modul-esp826...

http://ar2u.ru/index.php/article/datchiki-i-moduli/65-wi-fi-modul-esp826...

Заранее спасибо...

Mestniy96
Offline
Зарегистрирован: 31.08.2015

Может я ошибаюсь, но тут придется создавать сайт и на него через esp, подключенный к интернет, отправлять GET запросы, о состоянии реле?

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

Правильное место для вопросов/обсуждений по этой микросхеме - http://esp8266.ru/

Mestniy96
Offline
Зарегистрирован: 31.08.2015

Спасибо, а если использовать ethernet шилд?

Mestniy96
Offline
Зарегистрирован: 31.08.2015

Мне просто хочется понять принцып работы ардуино с сайтами... Например, если я создам веб-сервер на шилде, то я смогу на него попасть из любой точки мира, где есть интернет? ТОгда как определить какой у него адрес?

Mestniy96
Offline
Зарегистрирован: 31.08.2015

Подскажите пожалуйста, кто как это делает?

Mestniy96
Offline
Зарегистрирован: 31.08.2015

Помогите ктонибудь!!! Пожалуйста!!! Хочу создать сайт и помигать светодиодом!!! Подключиться по вайфай сумел, вот пример: http://ar2u.ru/index.php/article/datchiki-i-moduli/65-wi-fi-modul-esp8266-esp-01

А вот как сделать сайт, недошел. Помогите плиз!!!

NeiroN
NeiroN аватар
Offline
Зарегистрирован: 15.06.2013

Все зависит от провайдера интернет. Если провайдер дает белый адрес - то все просто. Так как сам шилд к интернету подключить достаточно сложно - интернет скорее всего подключен через роутер. На роутере смотрим внешний адрес, настраиваем проброс порта до устройства. Внешний порт лучше выбирать из диапазона 8000...40000, внутренний порт любой(по умолчанию 80). Если внешний адрес динамический(выбирается первый доступный из списка адресов провайдера) то настраиваем DDNS сервис.

Если внешний адрес не известен(и нет доступа к натройке роутера) - тогда понадобится сайт, на который устройство будет переодически отправлять запрос, а сайт будет отвечать что делать устройству.

Mestniy96
Offline
Зарегистрирован: 31.08.2015

Спасибо! МОжно про ddns подробнее?

Mestniy96
Offline
Зарегистрирован: 31.08.2015

Я в правильном направлении? 

http://www.noip.com/

Mestniy96
Offline
Зарегистрирован: 31.08.2015

Как вместо ПК привязть ардуино?

NeiroN
NeiroN аватар
Offline
Зарегистрирован: 15.06.2013

DDNS - это обновление ip адреса привязанного к dns имени в реальном времени. 

Обычно роутеры поддерживают несколько сервисов dyndns.org no-ip.com - нужно зарегистрироваться на сервисе, выбрать имя, прописать учетные данные в роутер.

 

Ардуино уже должна работать как вебсервер и открываться с компа по адресу типа 192.168.0.130 - мы рассматриваем как высунуть это дело в инет.

Для доступа к устройствам во внутреней сети используется проброс портов - это когда роутер при подключении на внешнем адресе к определенному порту пробрасывает это подключение на выбраннный внутренний IP и порт.

Нужно знать внутренний адрес 192.168.0.130 и порт 80, а внешний порт пусть будет 8000.

Также в роутере надо разрешить в фаерволе подключения на внешнем интерфейсе на этот порт 8000.

после этого будет можно открыть c телефона(друго компа с инетом) адрес типа http://blabla.no-ip.org:8000/

и если ардуина включена и в нее залит вебсервер - то все будет работать.

Mestniy96
Offline
Зарегистрирован: 31.08.2015

Спасибо буду пробовать!

Можете ссылочку на код дать. Ну или примерно написать скетч. Для наглядности!

Mestniy96
Offline
Зарегистрирован: 31.08.2015

Вы есть ВК, я бы вам заплатил за инсрукцию...

Mestniy96
Offline
Зарегистрирован: 31.08.2015
Mestniy96
Offline
Зарегистрирован: 31.08.2015

Или вот твиттер: https://twitter.com/greben_evgeniy

wdrakula
wdrakula аватар
Offline
Зарегистрирован: 15.03.2016

Для поднятия WEB сервера у себя дома, неважно на какой железке - своем компе, мобильнике, утюге, микроволновке или Ардуино - Вам нужно только желание и умения.

Для доступности этого сервера из любой точки мира Вам нужен "статический IP". ДинДНС не всегда поможет, так как динамический IP провайдеры, чаще всего, дают из т.н. "приват" блоков, то есть типа таких 192.168.... или 10...., или 172.16....., подробнее смотрите в поиске по словам: "приватные блоки IP". Эти адреса специально сделаны так, что маршрутизация на них из "внешнего мира" невозможна.

Поэтому Вам следует купить у провайдера статик IP, если такой услуги у Вашего провайдера нет, то нужно купить VPS сервер с небольшим пулом (обычно 20 шт.) открытых портов и организовать туннель к себе домой. В поиске ищем "дешевый VPS" и "VPN туннель домой", возможно потребуется фантазия в запросах ;). Теперь у Вас на маршрутизаторе (нужен софтовый или хорошо продвинутый железный) есть статический IP.  Это стартовая ситуация для поднятия серверов в своей внутренней сети. Ищите в поиске "проброс портов на роутере".

wdrakula
wdrakula аватар
Offline
Зарегистрирован: 15.03.2016

Да. И, в догонку, Ваш вопрос НИКАКОГО отношения к Ардуино не имеет. Примеры WEB сервера на 5100 или на WiFi плате есть прямо в примерах к соответствующим библиотекам. А доступность из "внешнего мира" - вопрос знания маршрутизации и туннелей в сетях IP, о чем я и написал выше. Если Вы не очень хорошо знаете структуру Интернет - задавайте вопросы в теметических форумах.

Mestniy96
Offline
Зарегистрирован: 31.08.2015

Все сложнее чем я думал.... Ну спасибо хоть ответили)))

Mestniy96
Offline
Зарегистрирован: 31.08.2015

Я всетаки попробую для начала использовать DinDNS...

Mestniy96
Offline
Зарегистрирован: 31.08.2015

NeiroN пишет:

DDNS - это обновление ip адреса привязанного к dns имени в реальном времени. 

Обычно роутеры поддерживают несколько сервисов dyndns.org no-ip.com - нужно зарегистрироваться на сервисе, выбрать имя, прописать учетные данные в роутер.

 

Ардуино уже должна работать как вебсервер и открываться с компа по адресу типа 192.168.0.130 - мы рассматриваем как высунуть это дело в инет.

Для доступа к устройствам во внутреней сети используется проброс портов - это когда роутер при подключении на внешнем адресе к определенному порту пробрасывает это подключение на выбраннный внутренний IP и порт.

Нужно знать внутренний адрес 192.168.0.130 и порт 80, а внешний порт пусть будет 8000.

Также в роутере надо разрешить в фаерволе подключения на внешнем интерфейсе на этот порт 8000.

после этого будет можно открыть c телефона(друго компа с инетом) адрес типа http://blabla.no-ip.org:8000/

и если ардуина включена и в нее залит вебсервер - то все будет работать.

И вы не подскажите как собрать код. С каналом и внутренним IP, понял, но вот про порт не знаю как это сделать. Работать решил с ESP8266, но буду рад любому виду скетча. Меня, повторюсь, интересует именно, как сделать назначение порта (тот 8000 напр.).

Заранее спасибо.

Mestniy96
Offline
Зарегистрирован: 31.08.2015

Я зарегался в noip, но ничего не понял, как связть мое устройство с роутером(((. Помогите пожалуйста...

alexvs
Offline
Зарегистрирован: 22.07.2014

Mestniy96 пишет:

Я зарегался в noip, но ничего не понял, как связть мое устройство с роутером(((. Помогите пожалуйста...

А на Амперке вы прямо спец, да же за чужые проекты беретесь за денежку......

А тут - такой новичек, новичек :)

Mestniy96
Offline
Зарегистрирован: 31.08.2015

Я НИКОГДА НЕ ГОВОРИЛ ЧТО Я СПЕЦ!!! Я всегда учцсь чемуто новому!!! Если можете, помочь, то помогите пожалуйста, а если нет, то к чему этот воздух?

Mestniy96
Offline
Зарегистрирован: 31.08.2015

И можно ли как-то подключить устройство на прямую не через роутер?

alexvs
Offline
Зарегистрирован: 22.07.2014

Вам же ясно ответили, что данные вопрсы уже не имеют отношение к Ардуино и к ESP8266, спрашивайте на соответсвующих тематических форумах.

Mestniy96
Offline
Зарегистрирован: 31.08.2015

Спасибо что заметели, т.е. ничего существенного сказать не хотите? Пожалуйста если можете помочь - помогите. Я в курсе, что вы меня недолюбливаеете! Но я человек который просит помощи в конкретном вопросе.

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

Mestniy96 пишет:

И можно ли как-то подключить устройство на прямую не через роутер?

Напрямую к чему?

Mestniy96
Offline
Зарегистрирован: 31.08.2015

сервис на noip подключить напрямую к esp8266 или даже к арде?

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

Mestniy96 пишет:

сервис на noip подключить напрямую к esp8266 или даже к арде?

Как Вы себе это видите? Вы будете от "сервиса на noip" провод тянуть или оттуда wi-fi добивает?

Jatixo
Offline
Зарегистрирован: 13.01.2016

Mestniy96 пишет:

сервис на noip подключить напрямую к esp8266 или даже к арде?

У Вас интернет через что? Кабель приходит и в компьютер вставляется? Или Wi-Fi есть? Или ADSL модем?

Andrey_Y_Ostanovsky
Offline
Зарегистрирован: 03.12.2012

Mestniy96 пишет:
И можно ли как-то подключить устройство на прямую не через роутер?

Можно, наверное, только в чем профит именно так вот "голой задницей в интернет"? :) Лавры ipv6 соблазняют? :)

Для общения с "сервером" - Вам нужен всего один порт, вот его и пробрасывайте на устройство внутри своей сети.

krepton85
Offline
Зарегистрирован: 02.02.2016

Вот и я тоже мучался над этим вопросом и наконец то решил его.

Вот скетч для esp 8266, esp-01 (заливать его нужно прямо в сам wi fi модуль, а не плату Ардуино): 

#include <ESP8266WiFi.h>

 
const char* ssid = "...................";// ssid вашего роутера
const char* password = "................";// пароль вашего роутера
 
//int ledPin = 2; // GPIO2
WiFiServer server(80);


boolean PinStatus[] = {
  1, 2
};
int incomingByte;

void setup() {
  Serial.begin(115200);
  delay(10);
 
 
  //pinMode(ledPin, OUTPUT);
  //digitalWrite(ledPin, LOW);
   
  // 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.print("Use this URL to connect: ");
  Serial.print("http://");
  Serial.print(WiFi.localIP());
  Serial.println("/");
  int i = 0; 
  i <= 2;
  i++;
  PinStatus[i] = false;
    
}
 
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 request = client.readStringUntil('\r');
  //Serial.println(request);
  client.flush();
   
  // Match the request

  // Return the response
  client.println("HTTP/1.1 200 OK");
  client.println("Content-Type: text/html");
  client.println(""); //  do not forget this one
  client.println("<!DOCTYPE HTML>");
  client.println("<html>");
  

  if (request.indexOf("/LED1=ON") != -1) {
    Serial.println("LED1-ON");
    PinStatus[1] = true;
  } 
  if (request.indexOf("/LED1=OFF") != -1){
    Serial.println("LED1-OFF");
    PinStatus[1] = false;
  }
    if (request.indexOf("/LED2=ON") != -1) {
    Serial.println("LED2-ON");;
    PinStatus[2] = true;
  } 
  if (request.indexOf("/LED2=OFF") != -1){
    Serial.println("LED2-OFF");
    PinStatus[2] = false;
  }
// Set ledPin according to the request
//digitalWrite(ledPin, value);
   
 
  
   
 // client.print("Led pin 1 is now: ");
   
 // if(PinStatus[1] == true) client.print("ON");  
   
  //if(PinStatus[1] == false) client.print("OFF");
  
  //client.println("");

  //client.print("Led pin 2 is now: ");

  //if(PinStatus[2] == true) client.print("ON");  
   
  //if(PinStatus[2] == false) client.print("OFF");  
  

  
  client.println("<br><br>");
  if(PinStatus[1] == false) client.println("ArduinoPIN 1: <a href=\"/LED1=ON\">OFF</a><br>");
  if(PinStatus[1] == true) client.println("ArduinoPIN 1: <a href=\"/LED1=OFF\">ON</a><br>");
  if(PinStatus[2] == false) client.println("ArduinoPIN 2: <a href=\"/LED2=ON\">OFF</a><br>");
  if(PinStatus[2] == true) client.println("ArduinoPIN 2: <a href=\"/LED2=OFF\">ON</a><br>");
  
  client.println("</html>");
 
  delay(1);
  //Serial.println("Client disonnected");
  //Serial.println("");
 if (Serial.available() > 0)  //если есть доступные данные

      incomingByte = Serial.read();

    if (incomingByte == 'Q')PinStatus[1] = true;
    if (incomingByte == 'W')PinStatus[1] = false;
    if (incomingByte == 'E')PinStatus[2] = true;
    if (incomingByte == 'R')PinStatus[2] = false;
}
 

Все сделано на подобие ArduinoPin Web server на ethernet enc28j60, модуль esp8266 подключается через uart к плате ардуино, а там уже сами напишите скетч. И не забываем понизить уровень Tx идущий от платы ардуино к wi fi модулю на rx esp 8266, до уровня 3,3 вольта.

Для доступа чрез интернет делаем проброс партов на вашем wi fi роутаре, кстати здесь для модуля esp8266 используется DHCP сервер на роутаре, а нам нужен статический ip, как это сделать в этом модуле я пока не понял, но это можно и на роутаре настроить привязку ip адреса к mac данного wi fi модуля.

Bront
Offline
Зарегистрирован: 05.04.2016

Забудьте от ESP8266

Посмотрите это

http://www.seeedstudio.com/depot/LinkIt-Smart-7688-p-2573.html

за 16 баксов и интернет какой хочешь + atmega32u4

Mestniy96
Offline
Зарегистрирован: 31.08.2015

Спасибо Вам всем, особенно krepton85. Сейчас остановился на проброске портов)) И можете немного рассказать о том, как прошить esp из ардуино ИДЕ? В интернете, много реализаций, какой из них выбрать?

Mestniy96
Offline
Зарегистрирован: 31.08.2015

Данный метод, надеюсь подойдет? https://geektimes.ru/post/271754/

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

Я же Вам давал ссылку на сообщество фанатов этой микросхемы. У них про неё есть ВСЁ. Вот, например, как программировать её из среды Ардуино IDE - http://esp8266.ru/arduino-ide-esp8266/

toc
Offline
Зарегистрирован: 09.02.2013

>> .. роутеры поддерживают несколько сервисов dyndns.org ..

DynDNS два года назад перестал предоставлять бесплатные услуги. И умер для diy-сообщества, по моему скромному мнению.
http://dyn.com/blog/why-we-decided-to-stop-offering-free-accounts/

Mestniy96
Offline
Зарегистрирован: 31.08.2015

Извините что отвлекаю, но я тут недогнал, куда подключены светодиоды 1 и 2? 

krepton85
Offline
Зарегистрирован: 02.02.2016

Светадиоды здесь ни куда не подключены, эти строки закоментированы, а светадиоды подключены к плате ардуино. Данный модуль через serial порт синхронизирован с платой ардуино.
Но работает криво этот скетчь, сервер зависает постоянно, данные идущие от платы ардуино не сразу обрабатываются поче му то, а только после обновления пару раз вебстраницы в браузере.

Mestniy96
Offline
Зарегистрирован: 31.08.2015

А как она может управлять ардуино, если скетч залит в а esp?

krepton85
Offline
Зарегистрирован: 02.02.2016

Нет, так яж написал что скетчь для ардуино напишете сами ну или в готовый проект включить поддержку управления по wi fi, это уже на ваше усмотрение.
Ведь от модуля первой версии ничего ожидать серьезного не стоит - пинов мало, только с ардуино можно использовать.

Mestniy96
Offline
Зарегистрирован: 31.08.2015

Не поможете со скетчем для ардуино? Мне бы принцып понять, взаимодействия этих скетчей!

Заранее спасибо.

Mestniy96
Offline
Зарегистрирован: 31.08.2015

Вот сделал такой скетч, но чето нефига не работает. В сериал выводит значения состояния при нажатии кнопки на сервере, но вот светодиод 13 не загорается.

HardwareSerial & ESPport = Serial3; 
const int COM_BAUD = 9600; 
String searching;
void setup() { 
pinMode(13, OUTPUT);
ESPport.begin(115200); 
Serial.begin(COM_BAUD); 
Serial.println("Setup done"); 
} 

void loop() { 
if ( ESPport.available() )
{ 
Serial.write( ESPport.read() );
}
if ( Serial.available() ) 
searching += Serial.read();
if (searching = "LED1-ON") 
{
  digitalWrite(13, 1);
  searching = "";
}
if (searching = "LED1-OFF")
{
  digitalWrite(13,0);
  searching = "";
}
}

 

Andy
Andy аватар
Offline
Зарегистрирован: 01.01.2016

В строках 18, 23 вместо = должно быть ==

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

Коллега правильно сказал, но этого недостаточно. Работать толком всё равно не будет.

Вы слишком неаккуратно работаете с потоком ввода. Вот смотрите, вот Вы вводите из монитора команды.

LED1-ON
LED1-OFF

Первая, допустим ввелась и всё сработало, а переменная searching стала пустой.

Далее в потоке символ перевода строки, который попадёт в начало новой searching и та уже никогда не будет равной "LED1-OFF". Приехали!

Можно, конечно, сказать монитору порта, чтобы он не передавал символы перевода строки и возврата каретки и тогда всё может и сработать, но любой случайный символ типа лишнего пробела, убьёт систему.

Попробуйте вводить как-то более интеллектуально.

Например,

1. игнорировать все символы, не являющиейся буквой, цифрой, минусом или переводом строки / возвратом каретки.

2. Если попался перевод строки / возврат каретки - тут же обновлять searching  (делать её пустой).

Тогда по идее толжно сработать, а в случае ошибки в наборе всегда можно нажать Enter и начать ввод команды сначала.

Mestniy96
Offline
Зарегистрирован: 31.08.2015

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

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

Ну, что значит, Вы не поняли в чём проблема? Запустите и попробуйте, она сразу себя проявит.

Вот смотрите , в потоке идут символы

L,E,D,1,-,O,N,\r,\n,L,E,D,1,-,O,F,F,\r,\n

запятые здесь просто раздлители для удобства чтения - в потоке их нет.

Ну и как будт работать Ваша программа?

Она будет накапливать в переменной searching  символ за символом (L, E, D, и т.д.), пока переменная searching не станет равной "LED1-ON".

После этого сработает условие в строке 18 (если Вы его исправите, как Вам Andy написал), включится светодиод и переменная searching станет равной "" (пустой строке)

Следующий сивол, который Ваша программа прочитает из потока будет символ возврата каретки (\r), затем символ перевода строки (\n), затем она начнёт читать символы L, E, D, и т.д.

Получающаяся в переменной searching строка никогда не станет равна  "LED1-OFF" потому что searching начинается с символов \r\n.

Допустим, Вы запретите монитору порта передавать символы \r\n. Тогад всё как бы заработает, но до первой опечатки. Любой неверный символ приведёт к тому, что переменная searching строка никогда не станет равна  "LED1-OFF" и никакого способа сбросить её и нчачать сначала у Вас нет.

Вот собственно я и написал Вам как с этим бороться.

Mestniy96
Offline
Зарегистрирован: 31.08.2015

Вот изменил код, но до сих пор ничего не работает. Помогите плиз.(

HardwareSerial & ESPport = Serial3; 
const int COM_BAUD = 9600; 
String searching;
void setup() { 
pinMode(13, OUTPUT);
ESPport.begin(115200); 
Serial.begin(COM_BAUD); 
Serial.println("Setup done"); 
} 

void loop() { 
if ( ESPport.available() )
{ 
Serial.write( ESPport.read() );
}
if ( Serial.available() )
{ 
searching += Serial.read();
if (searching == "\r\n")
{
 searching = "";
}
if (searching == "LED1-ON") 
{
  digitalWrite(13, 1);
  searching = "";
}
if (searching == "LED1-OFF")
{
  digitalWrite(13,0);
  searching = "";
}
}
}

 

Andy
Andy аватар
Offline
Зарегистрирован: 01.01.2016

Mestniy96, тут два варианта: либо проверяй каждый символ полученный при serialRead(); если получил '\r' или '\n', значит теперь можно сравнивать строку, но сами '\r' или '\n' к строке не добавляй, либо при получении любого символа проверяй не содержит ли строка искомую подстроку indexOf("LED1-ON"); Первый вариант предпочтительнее, во втором строка может разрастаться, её надо будет чистить даже если подстрока не найдена.

Mestniy96
Offline
Зарегистрирован: 31.08.2015

Можете помочь в скетче, я мало что понял. Помогите пожалуйста.