Пока на шине один slave все работает, но стоит добавить устройств и ESP8266 начинает виснуть с перезагрузкой. Либа wire.h иногда не корректно завершает чтение, а slave не закончив передачу вешает SDA на землю и ждет от мастера SCL, чтоб отдать оставшийся кусок байта. Драйвер написан так, что он об этом ничего не знает и начинает передавать на этот или следующий slave новое сообщение. Устройства ничего не получают тк наш slave удерживает SDA. Либа ничего не получив начинает растягивать SCL. Когда растягивать уже некуда, главный цикл встает колом. Через ~3 секунды, после остановки loop(), срабатывает WDT и модуль перегружается. Самый треш и угар начинается если slave — это часы реального времени с резервным питанием. ESP8266 перегрузился, а часы все удерживают SDA и ждут когда же wire.h с ними закончит. Через ~3 секунды опять сработает WDT и модуль снова перезагрузится. Круг замкнулся. Не поможет даже передергивание общего питания тк часики в этот момент питаются от батарейки.
Arduino сообщество и модераторы форума esp8266.ru морозились:
— не подключайте больше одного устройства
— не используйте i2c и перейдите на spi
— добавьте еще один МК с нативной поддержкой i2c и передавайте данные в esp по uart
— у меня с одним slave все работает…
Такое чувство, что они все на заплате у Espressif. Помучившись нескольких месяцев и покурив официальный datasheet на i2c переписал драйвер и библиотеку обертку под Arduino. Теперь ничего не виснет и работает стабильно. Тестировал на скоростях шины 10KHz, 15KHz, 25KHz, 50KHz 100KHz, 200KHz, 250KHz, 300KHz, 400kHz и частоте камня 80MHz.
Забирать тут.
UDP: Официальный стандарт на i2c шину здесь.
UDP2: Народ разучился читать read.me поэтому продублирую тут.
Скопируйте и замените twi.h и core_esp8266_si2c.cpp в папке %USERPROFILE%\AppData\Local\Arduino15\pa
Скопируйте и замените Wire.h и Wire.cpp в папке %USERPROFILE%\AppData\Local\Arduino15\pa
Цифры 2.5.2 могут отличаться, зависят от версии установленного ядра. Заменить значит удалить старый и на его место записать новый. Если вы хотите сохранить исходные файлы — просто измените расширение файла например так — twi.h.OLD и т. д. Если изменить только имя файла, вы получите ошибку во время компиляции. Потому что линковщик работает с тем что внутри файлов *.h и *.cpp, а не с именами. Это вам не windows!!!
UDP3: Похоже многие свалились с луны и не знают, что для нормальной работы i2c шины линии SDA и SCL должны быть подтянуты к питанию. Почему, читаем тут и тут.
UDP4: Для сенсорных панелей и длинных проводов добавил кучу медленных скоростей: 10KHz, 15KHz, 25KHz, 50KHz. Парочку быстрых для разгона: 250KHz, 300KHz, 600KHz. Например экран на PCF8574 легко взял отметку в 600KHz. Скорость меняется так — Wire.setClock(15000), где число в герцах. По умолчанию, библиотека не получив вовремя ответ, начинает растягивать SCL до 250 микросекунд, временно уменьшая частоту до 4KHz. По совету gihub юзера добавил нулевой значение. Теперь если в setup() сразу после декларации ВСЕХ устройств на I2C вписать Wire.setClockStretchLimit(0), где число в микросекундах. Драйвер будет растягивать SCL до бесконечности, те 0Hz. Недостаток — если на шине беда, вся система подвиснет в бесконечном цикле. В общем фича для отчаянных. Лучше вписать 1250 микросекунд — скорости 0.8Hz должно хватить любому тормозу. Ширину импульсов смотрел клоном Saleae Logic.
Все популярные и стандартные библиотеки Arduino Uno ► в одном месте. Предлагаем бесплатно скачать библиотеки Ардуино для создания различных проектов.
Библиотеки для Ардуино делятся на две группы — стандартные и пользовательские. При установке Arduino IDE в папке Program Files\Arduino\libraries имеется набор стандартных библиотек для базовых функций видов, коммуникации платы и для подключения устройств: сервомоторов, шаговых двигателей, LCD-дисплеев и т.д. Стандартные библиотеки скачать можно на официальном сайте www.arduino.cc.
EEPROM — чтение и запись в энергонезависимую память (скачать eeprom.h)
Ethernet — связь с Интернет с помощью Ethernet Shield (скачать ethernet.h)
Firmata — для взаимодействия Arduino и ПК (скачать firmata.h)
GSM — коммуникация по GSM/GRPS протоколу для GSM Shield (скачать gsm.h)
LiquidCrystal — управление LCD дисплеем (скачать liquidcrystal.h)
SD — чтение и запись в SD карту (скачать sd.h)
Пользовательские библиотеки создаются разработчиками модулей и плат расширений для Ардуино. Большинство популярных библиотек Ардуино скачать можно на сайте GitHub. Это сервис для совместной разработки IT-проектов, где можно отследить историю изменений исходного кода. Чтобы пройти уроки Ардуино для начинающих, все необходимые для занятий библиотеки Arduino UNO можно скачать здесь:
TroykaCurrent — перевод аналоговых значений в Амперы (скачать TroykaCurrent.h)
Стандартные файлы Arduino IDE хранятся в каталоге Program Files\Arduino\libraries. Если вам требуется дополнительно установить библиотеку для Ардуино, то архив можно распаковать в этот каталог или в папку Мои документы\Arduino\libraries. Установить библиотеку можно также и через меню программы Ардуино IDE. Как это сделать правильно мы рассказывали (переход к инструкции по ссылке выше).
Arduino IDE для ESP8266 позволяет писать скетчи и загружать их одним кликом в ESP8266 в знакомой среде (я бы даже сказал «до боли знакомой») Arduino IDE. Для тех кому интерфейс Arduino IDE не очень по душе, есть поддержка плагина для Eclipse. Итак, обо всем по порядку. Самые нетерпеливые могут сразу перейти к Arduino IDE для ESP8266: быстрый старт
Arduino IDE для ESP8266 позволяет создавать прошивки и прошивать их в ESP8266 точно так же, как вы это делаете с Arduino. При этом никаких плат Arduino не требуется, это не тот случай, когда ESP8266 используется в качестве WiFi шилда для Arduino. Кроме того, вы можете использовать практически все Arduino библиотеки с ESP8266 после небольшой доработки. В настоящее время уже достаточно много библиотек адаптировано для использования с ESP8266, но о них чуть ниже.
Arduino IDE для ESP8266 поддерживает все существующие на сегодняшний день модули ESP8266 (потому что они особо и не отличаются), включая модули с флеш бОльшего, чем 512k объема. Поддерживаются модули NodeMCU (всех версий), Olimex-MOD-WiFi-ESP8266.
Поддерживается режим авторестарта и прошивки по RTS+DTR, как у обычной Arduino, для этого потребуется USB-TTL адаптер с разведенными пинами DTR и RTS. Если у вас только RX, TX и GND на USB-TTL, то придется по-старинке вручную притягивать к земле GPIO0 и передергивать питание модуля для прошивки.
Управление GPIO осуществляется точно также, как и управление pin для arduino: pinMode, digitalRead, digitalWrite, analogWrite функционируют как обычно. GPIO нумеруются так, как мы уже привыкли: для чтения состояния GPIO2 нужно использовать команду digitalRead(2)
GPIO0-GPIO15 могут быть INPUT, OUTPUT, INPUT_PULLUP, и INPUT_PULLDOWN. GPIO16 может быть только INPUT, OUTPUT или INPUT_PULLDOWN. Команда analogRead(A0) считывает значение ADC (АЦП) с TOUT.
Команда analogWrite(pin, value) включает программный PWM (ШИМ) на указанном GPIO. Команда analogWrite(pin, 0) отключает PWM. value может быть в диапазоне от 0 до PWMRANGE. Константа PWMRANGE в настоящее время равна 1023.
Поддержка прерываний обеспечивается функциями attachInterrupt, detachInterrupt. Прерывания могут быть назначены на любой GPIO, кроме GPIO16. Стандартные прерывания Arduino CHANGE, RISING, FALLING тоже поддерживаются.
ESP8266 — функции пинов
Функции millis и micros возвращают миллисекунды и микросекунды соответственно, прошедшие с момента старта модуля. Любимая многими функция delay также присутствует и приостанавливает выполнение скетча на указанное время в миллисекундах и позволяет отработать операциям WiFi и TCP/IP. Функция delayMicroseconds используется аналогично, только время задается в микросекундах.
Помните о том, что когда модуль поддерживает WiFi соединение, ему приходится выполнять множество фоновых задач, кроме вашего скетча. WiFi и TCP/IP функции библиотек SDK имеют возможность обработать все события в очереди после завершения каждого цикла вашей функции loop() или во время выполнения delay(…). Если в вашем коде есть фрагменты, которые выполняются более 50 миллисекунд, то необходимо использовать delay(…) для сохранения нормальной работоспособности стека WiFi.
Также вы можете использовать функцию yield(), которая эквивалентна delay(0). С другой стороны, функция delayMicroseconds блокирует выполнение других задач, поэтому ее использование для временных задержек свыше 20 миллисекунд не рекомендуется.
Объект Serial работает точно также, как и с Arduino. Помимо аппаратного FIFO (по 128 байт для приема и передачи) определен и программный буфер размером по 256 байт для приема и передачи данных. Прием и передача данных происходит по прерываниям, прозрачно для вашего скетча. Функции записи и чтения блокируют выполнение скетча только когда аппаратный FIFO и программный буфер переполняются.
Serial использует аппаратный UART0, работающий на GPIO1(TX) и GPIO3(RX). Эти пины могут быть переназначены на GPIO15 (TX) и GPIO13 (RX) вызовом функции Serial.swap(); после Serial.begin();. Повторный вызов Serial.swap(); вернет все на свои места.
Serial1 использует аппаратный UART1, работающий только на передачу. UART1 TX это GPIO2. Для включения Serial1 используйте Serial1.begin();
По умолчанию, отладочная информация библиотек WiFi выключается, когда вы вызываете функцию Serial.begin();. Для включения отладочной информации на UART0 используйте Serial.setDebugOutput(true); Для перенаправления вывода отладочной информации на UART1 используйте команду Serial1.setDebugOutput(true);
И Serial и Serial1 поддерживают 5, 6, 7, 8 бит данных, odd (O), even (E), и no (N) режимы четности, и 1 или 2 стоп бита. Для выбора нужного режима вызывайте Serial.begin(baudrate, SERIAL_8N1); или Serial.begin(baudrate, SERIAL_6E2); и т.д.
Макрос PROGMEM работает точно также, как в Arduino, помещая read only данные и строковые константы (литералы) во флеш память, высвобождая HEAP. Важное отличие состоит в том, что в ESP8266 одинаковые литералы не хранятся в одном месте, поэтому использование строковых констант внутри конструкций F(«») и/или PSTR(«») приводит к расходованию флеш памяти при каждом вызове этих функций. Вы должны самостоятельно управлять одинаковыми строками для экономичного расходования места во флеш памяти.
Функции библиотеки WiFi ESP8266 очень схожи с функциями библиотеки для обычного WiFi шилда.
Список отличий:
Класс WiFiUDP поддерживает прием и передачу multicast пакетов в режиме клиента. Для передачи multicast пакета используйте вместо udp.beginPacket(addr, port) функцию udp.beginPacketMulticast(addr, port, WiFi.localIP()). Когда вы ожидаете multicast пакеты, используйте вместо udp.begin(port) функцию udp.beginMulticast(WiFi.localIP(), multicast_ip_addr, port). Вы можете использовать udp.destinationIP() для определения того, был ли пакет отправлен на multicast адрес или предназначался именно вам. Multicast функции не поддерживаются в режиме точки доступа.
WiFiServer, WiFiClient, и WiFiUDP работаю точно так же, как и с библиотекой обычного WiFi шилда. Четыре примера идет в комплекте с этой библиотекой.
Библиотека Ticker может быть использована для выполнения периодически повторяющихся событий через определенное время. Два примера включено в поставку.
В настоящее время не рекомендуется блокировать операции ввода-вывода (сеть, последовательный порт, файловые операции) в callback функциях тикера. Вместо блокирования устанавливайте флаг в callback функциях и проверяйте этот флаг в основном цикле.
Эта библиотека немного отличается от стандартной Arduino EEPROM. Необходимо вызвать функцию EEPROM.begin(size) каждый раз перед началом чтения или записи, размер (указывается в байтах) соответствует размеру данных, которые вы намереваетесь использовать в EEPROM. Размер данных должен быть в диапазоне от 4 до 4096 байт.
Функция EEPROM.write не производит запись данных во флеш память немедленно, вы должны использовать функцию EEPROM.commit() каждый раз, когда вы хотите сохранить данные в память. Функция EEPROM.end() тоже производит запись данных, а также освобождает оперативную память от данных, запись которых произведена. Библиотека EEPROM использует один сектор во флеш памяти, начиная с адреса 0x7b000 для хранения данных. В поставку включено три примера работы с EEPROM.
Реализован только режим ведущего, частота ориентировочно до 450 кГц. Перед использованием шины I2C, нужно выбрать пины SDA и SCL путем вызова функции Wire.pins(int sda, int scl), например Wire.pins(0, 2) для модуля ESP-01. Для других модулей пины по умолчанию 4(SDA) и 5(SCL).
Библиотека SPI поддерживает весь Arduino SPI API, включая транзакции, в том числе фазу синхронизации (CPHA). Clock polarity (CPOL) пока не поддерживается (SPI_MODE2 и SPI_MODE3 не работают).
Поддержка функций, специфичных для ESP8266 (режим глубокого сна и сторожевой таймер), реализована в объекте ESP. Функция ESP.deepSleep(microseconds, mode) переводит модуль в режим глубокого сна. Параметр mode может принимать значения: WAKE_DEFAULT, WAKE_RFCAL, WAKE_NO_RFCAL, WAKE_RF_DISABLED. GPIO16 должен быть соединен с RESET для выхода из режима глубокого сна.
Функции ESP.wdtEnable(), ESP.wdtDisable(), и ESP.wdtFeed() управляют сторожевым таймером.
ESP.reset() перезагружает модуль
ESP.getFreeHeap() возвращает размер свободной памяти
ESP.getFreeHeap() возвращает размер свободной памяти
ESP.getChipId() возвращает ESP8266 chip IDE, int 32bit
ESP.getFlashChipId() возвращает flash chip ID, int 32bit
ESP.getFlashChipSize() возвращает размер флеш памяти в байтах, так, как его определяет SDK (может быть меньше реального размера).
ESP.getFlashChipSpeed(void) возвращает частоту флеш памяти, в Гц.
ESP.getCycleCount() возвращает количество циклов CPU с момента старта, unsigned 32-bit. Может быть полезна для точного тайминга очень коротких операций
Библиотека OneWire была адаптирована для ESP8266 (внесены изменения в OneWire.h) Если у вас установлена библиотека OneWire в папку Arduino/libraries, то будет использоваться именно она, а не из комплекта поставки.
Библиотека позволяет реализовать в вашей программе ответ на мультикастовые DNS запросы для локальной зоны, например «esp8266.local». В настоящее время поддерживается только одна зона. Позволяет обращаться к WEB серверу ESP8266 по имени, а не только по IP адресу. Дополнительную информацию вы можете найти в прилагаемом примере и в файле readme данной библиотеки.
Библиотека позволяет управлять сервомоторами. Поддерживает до 24 сервоприводов на любых доступных GPIO. По умолчанию первые 12 сервоприводов будут использовать Timer0 и будут независимы от любых других процессов. Следующие 12 сервоприводов будут использовать Timer1 и будут разделять ресурсы с другими функциями, использующими Timer1. Большинство сервоприводов будут работать с управляющим сигналом ESP8266 3,3в, но не смогут работать на напряжении 3,3в и потребуют отдельный источник питания. Не забудьте соединить общий провод GND этого источника с GND ESP8266
Почти все библиотеки, которые не используют низкоуровневый доступ к регистрам микропроцессора AVR должны работать без каких-либо доработок. На сегодняшний день можно точно сказать, что протестированы и полностью работоспособны следующие библиотеки:
Оптимальное подключение ESP8266 для Arduino IDE
Подключение ESP8266 | Примечание | USB-TTL |
---|---|---|
VCC | ESP8266 подключайте к внешнему источнику питания >300мА, 3,3V | |
GND | все контакты GND должны быть соединены вместе: ESP8266, USB-TTL и источника питания | GND |
TX (UTXD) | RX | |
RX (URXD) | TX | |
GPIO0 | подтягивающий к питанию резистор 10k | DTR (если на вашем USB-TTL не разведен пин DTR, то вам придется вручную переключать GPIO0 на землю для перевода ESP8266 в режим прошивки) |
RESET (RSBT, REST) | подтягивающий к питанию резистор 10k, также можете добавить кнопку, соединяющую RESET и GND для ручного сброса модуля | RTS (если на вашем USB-TTL не разведен пин RTS, то вам придется вручную перезагружать модуль ) |
CH_PD (CH_EN) | подтягивающий к питанию резистор 10k | |
GPIO15 (MTDO) | подтягивающий к земле резистор 10k (для тех модулей, где выведен пин GPIO15) | |
GPIO2 | подтягивающий к питанию резистор 10k (на схеме не показан, но рекомендуется для увеличения стабильности) | |
GPIO16 | для успешного выхода из режима Deep Sleep необходимо соединить пины ESP8266 GPIO16 и RESET через резистор 470 Ом (на схеме не показан) |
Примечания.
1. Не на всех модулях выведены все пины. Перед приобретением модуля ознакомьтесь с видами модулей и их распиновкой.
2. Если на вашем USB-TTL конвертере выведены пины CTS и DSR — для автозагрузки прошивки они вам не помогут, т.к. работают только на вход.
3. Для стабильной работы ESP8266 требуется источник стабилизированного питания 3,3 вольт, ток более 250 миллиампер. Использование питания от USB-TTL конвертера может привести к нестабильности в работе.
Минимальное подключение ESP8266
Минимальное подключение ESP8266 (повышенная стабильность)
Более подробно, со всеми деталями, о подключении ESP8266 вы можете прочитать в нашей статье ESP8266 – подключение и обновление прошивки
1. Подключить USB-TTL к USB
2. Подключить ESP8266 к USB-TTL как обычно. Если вы подключили ESP8266 по схеме без поддержки автозагрузки прошивки (не подключены DTR и RTS), то вручную соедините GPIO0 с землей, передерните питание модуля — все готово для прошивки
3. Запускаем Arduino IDE
4. В меню Инструменты — Плата — Generic ESP8266 board (в самом низу)
5. В меню Инструменты выбираем порт, к которому подключен наш USB-TTL
6. В меню Инструменты — выбираете частоту, размер флеш памяти вашего модуля
7. В меню Файл — Примеры (Образцы) — ESP8266WiFi — WiFiWebServer
8. В скетче заполняете SSID и пароль вашей WiFi сети
9. Жмем кнопку компиляции и загрузки скетча
10. Ждем окончании процесса прошивки. После прошивки, если модуль подключен по схеме без поддержки автопрошивки, отсоедините GPIO0 от земли и передерните питание модуля без отключения USB-TTL от питания
11. В меню Инструменты — Монитор последовательного порта
12. Выбираем скорость 115200
13. Смотрим что происходит в терминале
14. Когда модуль подключится к сети, то появятся надписи в мониторе «WiFi connected» и «Server started»
15. Ниже будет IP адрес вашего модуля ESP8266, например 192.168.1.248
16. Открываете любой браузер, в строке адреса вбиваете «http://192.168.1.248/gpio/1»
17. Смотрите монитор последовательно порта и если к ESP8266 к GPIO2 у вас подключен светодиод (через резистор, разумеется), то он включится.
18. Profit!
Автором этого проекта адаптации Arduino IDE для ESP8266 является наш соотечественник из Санкт-Петербурга Иван Грохотков.
Скачать Arduino IDE для ESP8266 с github
Скачать Arduino IDE для ESP8266 с build сервера
Скачать исходный код Arduino IDE для ESP8266
Задать вопросы автору проекта Ивану Грохоткову aka igrr или сообщить об ошибке в Arduino IDE для ESP8266 можно в специальном разделе на нашем форуме.
Библиотека состоит из следующих файлов
OWISWBitFunction.h
OWISWBitFunction.c
OWIUARTBitFunction.c
OWIHighLevelFunction.h
OWIHighLevelFunction.c
OWIPolled.h
compilers.h
OWIdefs.h
OWIdevicespecific.h
OWIcrc.h
OWIcrc.c
Процесс интеграции 1-Wire библиотеки с проектом заключается в следующем: — переписываем файлы библиотеки в папку проекта— подключаем сишные файлы к проекту
OWIHighFunction.c
OWISWBitFunction.c
OWIUARTBitFunction.c
— добавляем заголовочные файлы в main.c
#include «OWIPolled.h»
#include «OWIHighLevelFunctions.h»
#include «OWIBitFunctions.h»
#include «common_files\OWIcrc.h» — настраиваем файл OWIPolled.h— выбираем реализацию OneWire интерфейса – программную
#define OWI_SOFTWARE_DRIVER
//#define OWI_UART_DRIVER— задаем тактовую частоту микроконтроллера
#define CPU_FREQUENCY 16.000— задаем порт, к которому подключена OneWire шина
#define OWI_PORT PORTD //!< 1-Wire PORT Data register.
#define OWI_PIN PIND //!< 1-Wire Input pin register.
#define OWI_DDR DDRD //!< 1-Wire Data direction register.— в main.c задаем вывод, к которому подключена OneWire шина
#define BUS OWI_PIN_7
Для GCC проектов в makefile нужно будет добавить все сишные файлы.
Например, так:
SRC = $(TARGET).c bcd.c lcd_lib.c OWISWBitFunctions.c OWIHighLevelFunctions.c OWIUARTBitFunctions.c common_files/OWIcrc.c
Application note AVR318: Dallas 1-WireПроекты проверялись в железе и никаких нареканий не вызывали. В Proteus`е я их тоже запустил, но не сразу. Оказывается по умолчанию датчикам DS18B20 присваиваются одинаковые адреса. При использовании нескольких датчиков адреса нужно подправить ручками.
Подробное описание проектов будет уже в новом году…