Автор Тема: Простое подключение Arduino к интернету по WiFi  (Прочитано 6356 раз)

Оффлайн Ann

  • Глобальный модератор
  • Habanero
  • *****
  • Сообщений: 1847
  • Лайков: 10
    • Просмотр профиля
Разрожусь еще одной темой. В принципе она является продолжением этой, но учитывая другое железо и задачи выделю в отдельную.
Благодаря kido у меня изменилось представление о правильном интерфейсе Ардуино, за что ему громадное спасибо.
В общем полез я в интернеты искать Wi-Fi модуль для своей меги и вижу, что на рынке из дешевых только различные вариации ESP8266. Но стал изучать как их подключать и программировать - голова закипела, большинство советуют прошивку NodeMCU программирование на языке Lua, чего мне крайне не хотелось - знакомиться с новым языком и средой программирования ради отправки пары строчек на сервер.
И набрел на вот такую штуку, брал там же. В принципе это то же самый ESP8266, но уже распаянный, с программатором на борту (340-й), microUSB-входом, стабилизатором питания и практически за ту же цену, программировать можно а Arduino IDE.
Что имеем:
1. частота 80 или 160 MHz, в отличие от Меги, где только 16.
2. Память 4 Mb, у меги 256кб
3. Оперативка 80кб, у меги 4.
4. И самое главное вайфай, которого у меги нету.
5. Единственный минус - меньше выводов, но на крайний случай можно их увеличить, к примеру так
В общем имеем на порядок (в прямом смысле - в 10 раз) более мощное устройство, но в разы дешевле и компактнее. Ресурсов хватает уже для запуска почти полноценного сервера, типа такого.
Все это счастье всего за 4 у.е., т.е. в 2.5 раза дешевле Меги.

Для понимания - по сути это не просто WiFi модуль, а полностью отдельная Ардуина, которая может выполнять свои задачи, и лишь помогать моей Меге передавать данные на сервер.
Подключается довольно просто, чем меня разочаровала  :) Я выделил целый вечер для борьбы с ней, а она с полпинка практически с первого идущего в комплекте с библиотекой примера, немного подкорректированного под свои нужды, стартанула. Нерастраченую энергию пришлось потратить на переукладку и перепаивание проводов вокруг Меги, там у меня уже добротный бардак образовался.
Вот скетч отправки данных на сервер:
#include <ESP8266WiFi.h>
#include <ESP8266WiFiMulti.h>
ESP8266WiFiMulti WiFiMulti;
const uint16_t port = 80;
const char * host = "anndrew.tk";
void setup() {WiFiMulti.addAP("SSID", "password");} //название сети и пароль вайфая
void loop() {
WiFiClient client;
client_status = client.connect(host, port);
String url =                                                            //здесь формируем строку с GET-запросом
client.print(String("GET ") + url + " HTTP/1.1\r\n" +
                   "Host: " + host + "\r\n" +
                   "User-Agent: ESP8266\r\n" +
                   "Connection: close\r\n\r\n");
client.stop();}
Вот и все премудрости. Конечно, следует добавить таймер.
Программирование его идентично обычной Ардуине, здесь подробно изложено, лично я столкнулся с одной проблемой: старая добрая конкатенация строк с помощью плюсов, типа x="Hello " + "world"; почему-то дает ошибку. Приходится делать либо x.concat() либо постепенно наращивать x+= "world";.
И некорректно отображается количество флеш-памяти, об этом разработчики знают и предупреждают.

Пока передаю на сервер только информацию, а управляю с телефона по Блютузу.
Можно управлять и интернету, но тут есть нюансы, есть два пути:
1. При отправке данных на сервер возвращать Ардуине команды. Просто, но команда поступит не сразу, а только когда Ардуина подключится к серверу.
2. Делать свой сервер на Ардуине, но намного сложнее и нужен статический IP.

Пока сделал отображение основной информации, остальное позже, дополнительно отпишусь.
Вот приборная панель моего коллайдера, по состоянию на текущий момент. Извиняйте за внешний вид, дизайнер из меня никакой. По нажатии на графики открываются большие, более подробные. Шкалы автоматически подстраиваются под минимальное и максимальное значения. Пока в тестовом режиме, позже будут суточные.
Использовал библиотеку Highcharts, до это пробовал еще библиотеку от Гугла, но там настолько идиотская документация (основные настройки разбросаны по разным разделам, нужно потратить кучу времени, что до кучи все собрать), что сразу ее отбросил, а по большому счету они практически одинаковы.
Единственная проблема, с которой столкнулся - периодически появляются левые данные. Ну допустим, ожидается температура 23 градуса, а на сервер попадает 6645, не часто, примерно раз в 100 раз, на разных датчиках, досконально не разбирался, но грешу на преобразователь логических уровней (Wemos логика работает на 3.3В, а Мега на 5В, поэтому, чтоб не спалить первый, сигнал от Меги идет через этот преобразователь, обратно без него, Мега и 3.3В прекрасно понимает). Сначала думал, что питание (Wemos в пике может до 300 мА жрать), кинул конденсатор 3300 мF на шину питания, не помогло, зато датчики точнее стали работать :)
В общем не стал разбираться, а сделал медианный фильтр на Wemose (собираю 20 замеров в массив, сортирую по возрастанию, отсекаю 6 меньших и 6 больших, а из оставшихся беру среднее арифметическое). И глюки пропали и показания более стабильны стали.
С Мегой соединял по Serial.
На сервере данные заношу и беру для построения графиков из MySQL.
Вроде все рассказал.


« Последнее редактирование: 01 Октябрь 2016, 00:50:42 от Ann »

Оффлайн kido

Re: Простое подключение Arduino к интернету по WiFi
« Ответ #1 : 02 Октябрь 2016, 11:37:55 »
Отличная работа, Ann! :good:
Еще немного информации (pH, EC, web camera) и будет чудный мониторинговый инструмент! :)

Оффлайн Ann

  • Глобальный модератор
  • Habanero
  • *****
  • Сообщений: 1847
  • Лайков: 10
    • Просмотр профиля
Re: Простое подключение Arduino к интернету по WiFi
« Ответ #2 : 02 Октябрь 2016, 14:54:20 »
Отличная работа, Ann! :good:
Еще немного информации (pH, EC, web camera) и будет чудный мониторинговый инструмент! :)
Ну рН наврядли, более-менее внятный датчик дороговато стоит, да и мороки с ними много, калибровка периодическая нужна.
А вот ЕС-метр в прямом эфире будет (это если "аэропонику" запущу) из сетевой вилки, кусок скетча для этого еще с лета закомментированым лежит.
И контроль уровня раствора на УЗ-датчике по Вашей идее (это если этот датчик меньшие для робота не конфискуют :) )
И количество влаги для тех, кто в кокосе будет жить, на гвоздях, по своим летним наработкам. Тоже для этого все готово.
Осталось только дождаться команды на старт от Джиз :)
А по WiFi  проблема неприятная вылезла - зависает через несколько часов работы, приходится перезагружать. По Serial-монитору отследил - работает нормально, количество ОЗУ стабильно - 42-45 кБ, а затем резко, в течение 30 секунд падает до 30, затем 12, а затем выдает ошибку - запрос на запись в память по адресу, защищенному от записи.
Уже и delay добавлял (разрабы пишут, что WiFi выполняет в фоне много процессов, поэтому желательно добавить в скетче небольшие паузы, чтоб дать процессорное время для этих процессов)
И сервер подправил, чтоб ничего лишнего в ответ не слал.
И скетч вылизал, убрал все возможные случаи динамического создания переменных, перевел все в глобальные, даже, счетчики циклов.
И ничего. Это распространенная проблема, все на это жалуются, винят сырую прошивку.
В общем еще последняя надежда - сделаю модулю выделенное хорошее питание, если не поможет, путь один - сделать на Меге сторожевой таймер: как только модуль в течение какого-то времени не отчитывается о том, что все нормально, принудительно перезагружать его. 
Хотя еще может какие другие прошивки попробовать, но сторожевой таймер все равно делать - доверия уже к ней нет никакого.  :)

Оффлайн Ann

  • Глобальный модератор
  • Habanero
  • *****
  • Сообщений: 1847
  • Лайков: 10
    • Просмотр профиля
Re: Простое подключение Arduino к интернету по WiFi
« Ответ #3 : 06 Октябрь 2016, 12:31:12 »
Этап подключения Ардуины к wifi можно считать оконченным.
Дальше уже перенос на постоянное место работы и подключение ламп и прочей лабуды.
Муторное это дело: передача данных из Меги в Wemos > прием данных в Wemos > передача на сервер > прием на сервере в РНР > передача в базу MySQL > получение данных из MySQL > вывод в браузер с помощью HTML, PHP и CSS. Если что-то по данным меняешь в Меге, то корректировать приходится всю цепочку.

В общем пытаясь понять причину зависаний, сделал ей выделенное хорошее питание 3.3V 2A, но безрезультатно. Тогда начал подозревать эти самые левые данные, которые у меня регулярно проскакивали из Меги. Видимо получив из Меги вместо числа строку с кучей разных символов и пытаясь еще преобразовать и передать на сервер, чего-то там происходило и зависала. Поэтому стал с ними бороться.
Сначала винил преобразователь уровней 5V > 3.3V, сделал согласование через делитель напряжения из двух резисторов, ноль эффекта.
Затем понял, что левые данные - это нормально, от них все равно на 100% не избавиться, нужно делать фильтр.
Сделал достаточно сложный многоуровневый фильтр (с проверкой длин и целостности строк, адекватности значений ожидаемым, проверкой контрольной суммы) и вуаля - зависания пропали, не знаю на 100% или нет, но два раза по 12 часов отработала. Дольше тестировать времени нет, скоро уже ростки полезут, нужно лампу подключать.

На Меге сделал все равно сторожевой таймер 140 секунд (т.е. должен перезагрузить Wemos в случае неудачной отсылки на сервер двух пакетов подряд):
Wemos отсылает раз в минуту данные на сервер, сервер в ответ возвращает кодовое слово "success", как только оно получено, Wemos отсылает в Мегу слово "ОК", как только мега получила "ОК" время сторожевого таймера снова выставляется на 140 сек и у же с этой цифры продолжается обратный отсчет. Как только Мега в течение 140 секунд не получает от Wemos слово "ОК", подает на его выход RESET землю на 10мс, тем самым перезагружая его.

Сделал на сервере пока временное отображение служебной информации для "понаблюдать":
под графиками строка - это время последней передача данных на сервер
ниже - количество полученных пакетов от Меги в Wemos и процент успешных пакетов из них
еще ниже время работы Wemos с момента последней перезагрузки
внизу - количество перезагрузок за время работы Меги (со вчерашнего вечера).
Видно, что за ночь произошло 4 перезагрузки, но это не значит, что было 4 зависания, это мог глючить роутер, перебои с интернетом у провайдера, неудачная передача "ОК" в Мегу, может еще что.
Видно, что сейчас процент правильных пакетов от Меги 99.9%, а вот когда Wemos был подключен по ЮСБ-кабелю к компу, процент был 96%, видимо какие-то наводки присутствовали.

На больших графиках сделал возможность смотреть данные на любой период времени:
Адресная строка там выглядит так:
http://www.anndrew.tk/Graph/graph.php?graph=Humidity&dot=500
в конце идет цифра с количеством отображаемых точек. Если изменить эту цифру в адресной строке браузера, можно изменить период времени, которое отображает график. Пока в базе 600 значений (почистил старые), на будущее - с нескольких тысяч на слабых компах могут быть тормоза, я пробовал 10 000 точек - секунд 7 отрисовывалось.
И еще: сайт делал под себя (браузер Firefox, разрешение 1920х1080), на других браузерах и разрешениях может некорректно отображаться, извиняйте.

« Последнее редактирование: 06 Октябрь 2016, 12:56:56 от Ann »

Оффлайн vadkoff

Re: Простое подключение Arduino к интернету по WiFi
« Ответ #4 : 06 Октябрь 2016, 12:38:12 »
просто охренеть, мягко говоря. изучаю :D