ESP8266 I2C: настройка для master и slave

Содержание

Введение

ESP8266 — это мощный микроконтроллер с встроенным Wi-Fi, который широко используется в проектах Интернета вещей (IoT). Одной из ключевых его особенностей является поддержка интерфейса I2C, который позволяет подключать различные периферийные устройства, такие как датчики и дисплеи. В этой статье мы рассмотрим, как настроить и использовать интерфейс I2C на ESP8266, а также приведем пример кода настройки интерфейса I2C для режимов master и slave.

Особенности интерфейса I2C на ESP8266:

  1. Гибкость в выборе пинов: На ESP8266 можно настроить любые два доступных GPIO пина для работы в режиме I2C. По умолчанию используются GPIO4 (SDA) и GPIO5 (SCL).
  2. Поддержка множества устройств: Интерфейс I2C поддерживает подключение до 127 устройств, что делает его очень удобным для сложных проектов.
  3. Простота реализации: С помощью библиотеки Wire, доступной в Arduino IDE, настройка и использование I2C на ESP8266 становятся очень простыми.

Объявления интерфейса I2C Master на ESP8266

Приведем пример кода(С/C++), который циклически отправляет слово «Hello world!». Для начала работы с I2C на ESP8266 необходимо подключить библиотеку Wire, которая входит в стандартный набор библиотек Arduino IDE.
#include <Wire.h> // Определение пинов для I2C #define SDA_PIN 4 #define SCL_PIN 5 // I2C адрес ведомого устройства (например, 0x27) #define SLAVE_ADDR 0x27 void setup() { // Инициализация последовательного порта для вывода данных Serial.begin(115200); Serial.println("Инициализация I2C на ESP8266"); // Настройка I2C с использованием определенных пинов Wire.begin(SDA_PIN, SCL_PIN); } void loop() { // Циклическая отправка строки "Hello world!" на ведомое устройство Wire.beginTransmission(SLAVE_ADDR); Wire.write("Hello world!"); Wire.endTransmission(); // Вывод сообщения в Serial Monitor Serial.println("Отправлено: Hello world!"); // Задержка 1 секунда delay(1000); }

Объяснение кода:

  1. Подключение библиотеки Wire:
    • #include <Wire.h> включает библиотеку Wire, необходимую для работы с I2C.
  2. Определение пинов SDA и SCL:
    • #define SDA_PIN 4 и #define SCL_PIN 5 задают пины для линии данных и линии тактового сигнала.
  3. Определение I2C адреса ведомого устройства:
    • #define SLAVE_ADDR 0x27 задает I2C адрес ведомого устройства. В данном примере используется адрес 0x27, который нужно заменить на адрес вашего устройства.
  4. Инициализация I2C:
    • Wire.begin(SDA_PIN, SCL_PIN) инициализирует I2C интерфейс с заданными пинами.
  5. Циклическая отправка данных:
    • В loop() происходит циклическая отправка строки «Hello world!» на ведомое устройство. Сначала открывается I2C передача с Wire.beginTransmission(SLAVE_ADDR), затем данные отправляются с помощью Wire.write(«Hello world!»), и передача завершается вызовом Wire.endTransmission().
    • Сообщение об отправке выводится в Serial Monitor с Serial.println(«Отправлено: Hello world!»).
    • Задержка в 1 секунду между отправками обеспечивается функцией delay(1000).

Объявления интерфейса I2C Slave на ESP8266

В данном примере(С/C++) мы настроим ESP8266 в режиме ведомого устройства (slave) и будем циклически читать данные, поступающие от ведущего устройства (master).
#include <Wire.h> // Определение I2C адреса для ESP8266 в режиме slave #define SLAVE_ADDR 0x08 // Буфер для хранения полученных данных String receivedData = ""; void setup() { // Инициализация последовательного порта для вывода данных Serial.begin(115200); Serial.println("Инициализация I2C Slave на ESP8266"); // Настройка ESP8266 в режиме I2C slave с заданным адресом Wire.begin(SLAVE_ADDR); // Установка функции-обработчика для приема данных Wire.onReceive(receiveEvent); } void loop() { // Основной цикл программы, здесь можно добавить код для обработки полученных данных if (receivedData.length() > 0) { Serial.print("Получено: "); Serial.println(receivedData); // Очистка буфера после обработки данных receivedData = ""; } // Небольшая задержка для стабильной работы delay(100); } // Функция-обработчик для приема данных от I2C master void receiveEvent(int howMany) { receivedData = ""; while (Wire.available()) { char c = Wire.read(); // Чтение каждого байта из буфера receivedData += c; // Добавление байта к строке } }

Объяснение кода:

  1. Подключение библиотеки Wire:
    • #include <Wire.h> включает библиотеку Wire, необходимую для работы с I2C.
  2. Определение I2C адреса:
    • #define SLAVE_ADDR 0x08 задает I2C адрес для ESP8266 в режиме slave. Этот адрес можно изменить на необходимый вам.
  3. Инициализация последовательного порта:
    • Serial.begin(115200) и Serial.println(«Инициализация I2C Slave на ESP8266») инициализируют последовательный порт для вывода данных.
  4. Настройка ESP8266 в режиме I2C slave:
    • Wire.begin(SLAVE_ADDR) настраивает ESP8266 в режиме slave с заданным адресом.
  5. Установка функции-обработчика:
    • Wire.onReceive(receiveEvent) устанавливает функцию receiveEvent как обработчик для приема данных от master.
  6. Основной цикл программы:
    • В loop() происходит проверка, если в буфере receivedData есть данные, они выводятся в Serial Monitor и затем буфер очищается.
  7. Функция-обработчик для приема данных:
    • void receiveEvent(int howMany) — эта функция вызывается автоматически при получении данных от I2C master. Внутри функции читаются все доступные байты из буфера и сохраняются в строку receivedData.

Заключение

Интерфейс I2C на ESP8266 предоставляет отличные возможности для подключения и управления различными периферийными устройствами. Благодаря гибкости настройки пинов и поддержке множества устройств, I2C становится важным инструментом для разработчиков. Приведенный пример кода поможет вам быстро начать работу с I2C на ESP8266 и циклически отправлять данные на ведомое устройство.

FAQ

1. Какие пины используются для I2C на ESP8266?
По умолчанию используются GPIO4 (SDA) и GPIO5 (SCL), но вы можете настроить любые доступные GPIO пины.

2. Какую библиотеку использовать для работы с I2C на ESP8266?
Используйте библиотеку Wire, которая входит в стандартный набор библиотек Arduino IDE.

3. Сколько устройств можно подключить к I2C шине?
Интерфейс I2C поддерживает подключение до 127 устройств.

4. Как часто можно отправлять данные по I2C?
Частота отправки данных зависит от ваших требований. В примере используется задержка в 1 секунду, но вы можете настроить её по своему усмотрению.