Статьи

Подключение чипа ESP8266 к вашей сети

Я работаю над проектом по автоматизации нашего курятника (см. Мою статью « Преодолевая себя и делая вещи простым способом» для более подробной информации о проекте). Прямо сейчас огни открываются и закрываются сами по себе: это нужно было сделать сейчас, так как цыплята испытывали проблемы с откладыванием яиц в наши короткие осенние дни. Текущая система использует Arduino Uno, модуль часов реального времени с микросхемой DS1307 и аналоговым диммером. Вы можете увидеть код этой версии на GitHub: https://github.com/CindyPotvin/Chickmatic/tree/master/Phase1-ScheduleTime

Я работаю над вторым этапом: возможность изменять расписание прямо с наших телефонов и собирать данные о погоде изнутри и снаружи курятника. Я планирую использовать Arduino, который мне уже нужен, для сбора данных и управления диммером, а также добавить чип ESP8266 для подключения этой системы к нашей домашней сети.

Другой сервер внутри дома, вероятно, Raspberry Pi, будет использоваться для размещения небольшого веб-приложения в NodeJS, которое будет сохранять расписание и данные о погоде. Это также выполняется на GitHub по адресу: https://github.com/CindyPotvin/Chickmatic/tree/master/WebServer.

Для начала мне пришлось выяснить, как подключиться к сети с помощью ESP8266. Я купил дешевую, плохо документированную плату (ESP13 от doit.am), которая монтирует чип как щит Arduino, чтобы их можно было сложить:

esp8266

Вот где начались проблемы. Из-за форм-фактора я подумал, что смогу отправлять HTTP-запросы от Arduino, а ESP8266 будет тупым чипом, передающим запрос.

Это далеко от истины: ESP8266 также является микроконтроллером, и он также должен быть запрограммирован. Он поставляется с предустановленной странной китайской прошивкой, которую я мог бы использовать, чтобы увидеть, работает ли плата, но не более того. К счастью, его также можно запрограммировать с помощью Arduino IDE, и есть несколько хороших примеров, поэтому я мог бы начать с этого.

К сожалению, напрямую программировать чип не так просто, так как у него нет собственного USB-порта. В Интернете есть множество предложений о том, как обойти Arduino и использовать его USB-порт для программирования чипа, но он никогда не работал, и я всегда получал следующие ошибки:

warning: espcomm_sync failed
error: espcomm_open failed

TL; DR Единственный способ, которым я легко запрограммировал ESP8266, — это использовать кабель FTDI 3,3 В, который я купил на eBay за несколько долларов, вытянуть цифровой вывод 0 на землю (как указано в документации к ESP8266), перезагрузить компьютер и тогда мне было хорошо идти. Не трать время, как это было.

Хорошо, чтобы пойти на несколько минут, то есть. После первого подключения к сети и поздравления с успехом я никогда не мог подключиться второй раз, используя тот же код. После долгих экспериментов я обнаружил, что лучший способ убедиться, что он всегда работает, — это отключиться от сети, а затем снова подключиться во время загрузки чипа. Вот как выглядит моя установка для ESP8266:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
void setup() {
  Serial.begin(115200);
 
  WiFi.disconnect();  // Required or it won't always reconnect to wifi
  WiFi.persistent(false);
 
  Serial.print("Connecting");
  WiFi.begin(/*username*/,/*password*/);
  while (WiFi.status() != WL_CONNECTED) {
    delay(5500);
    Serial.print("status");
    Serial.println(WiFi.status());
    }
  Serial.println(" connected");
  Serial.println(WiFi.localIP());
}

Итак, я наконец-то готов приступить к программированию теперь, когда я доказал, что могу подключиться к своей сети. Точнее, я хочу использовать шину I2C для соединения Arduino и ESP8266 вместе с помощью библиотеки Wire. ESP8266 отправит все HTTP-запросы и проанализирует ответы. Это оставит стандартные последовательные порты свободными, так что я могу отлаживать и программировать оба чипа, не отключая каждый раз все.

Мне кажется логичным, но экран не соединяет шину I2C для Arduino и ESP8266, а только последовательный порт. Я не могу просто подключить их самостоятельно, так как ESP8266 работает с 3,3 В логическими уровнями, в то время как Arduino работает с 5 В. Мне нужно иметь переключатель логического уровня, как то, что они делали на экране с последовательными портами (синие DIP-переключатели используются для переключения между программированием чипа и соединением чипов вместе). Он может работать некоторое время, если я все равно обманул и подключил их, но в итоге ESP8266 зажарится.

Так как я действительно хочу сохранить последовательные порты для отладки, и поскольку экран на самом деле ничего не добавляет к проекту, я заказал новый ESP8266 от eBay, это всего лишь чип, установленный на плате с открытым портом I2C, наряду с заказ на несколько сменщиков уровня. Чтобы найти хорошую плату, потребовалось некоторое время: многие дешевые модели выставляют только последовательные порты, а я хотел немного больше. Я все еще хочу, чтобы новые фишки появились в почте, так что следите за обновлениями!