Программный i2c arduino library. Теория I2C, EEPROM от Atmel. Платы со светодиодными индикаторами
Описание библиотеки Wire
Данная библиотека позволяет вам взаимодействовать с I2C / TWI устройствами. На платах Arduino с компоновкой R3 (распиновка 1.0) SDA (линия данных) и SCL (линия тактового сигнала) находятся на выводах около вывода AREF. Arduino Due имеет два I2C / TWI интерфейса: SDA1 и SCL1 находятся около вывода AREF, а дополнительные линии находятся на выводах 20 и 21.
В таблице ниже показано, где расположены TWI выводы на разных платах Arduino.
Начиная с Arduino 1.0, данная библиотека наследует функции Stream , что делает ее совместимой с другими библиотеками чтения/записи. Из-за этого send() и receive() были заменены на read() и write() .
Примечание
Существуют 7- и 8-битные версии адресов I2C. 7 битов идентифицируют устройство, а восьмой бит определяет, идет запись или чтение. Библиотека Wire использует 7 битные адреса. Если у вас есть техническое описание или пример кода, где используется 8-битный адрес, вам нужно откинуть младший бит (т.е. сдвинуть значение на один бит вправо), получив адрес от 0 до 127. Однако адреса от 0 до 7 не используются, так как зарезервированы, поэтому первым адресом, который может быть использован, является 8. Обратите внимание, что при подключении выводов SDA/SCL необходимы подтягивающие резисторы. Для более подробной информации смотрите примеры. На плате MEGA 2560 есть подтягивающие резисторы на выводах 20 и 21.
Описание методов
Wire.begin()
ОписаниеИнициализирует библиотеку Wire и подключается к шине I2C как ведущий (мастер) или ведомый. Как правило, должен вызываться только один раз.
Синтаксис
Wire.begin(address)
Параметры
address: 7-битный адрес ведомого устройства (необязательно); если не задан, плата подключается к шине как мастер.
Возвращаемое значение
Пример
Примеры для ведомого устройства смотрите в примерах к методам onReceive() и onRequest() . Примеры для ведущего устройства смотрите в примерах к остальным методам. .
Wire.requestFrom()
ОписаниеИспользуется мастером для запроса байтов от ведомого устройства. Эти байты могут быть получены с помощью методов available() и read() .
Если этот аргумент равен true , то requestFrom() после запроса посылает сообщение STOP, освобождая шину I2C.
Если этот аргумент равен false , то requestFrom() после запроса посылает сообщение RESTART. Шина не освобождается, что мешает другому устройству-мастеру влезть между сообщениями. Это позволяет одному ведущему устройству посылать несколько запросов, пока оно контролирует шину.
Синтаксис
Wire.requestFrom(address, quantity)
Wire.requestFrom(address, quantity, stop)
Параметры
- address: 7-битный адрес устройства, у которого запрашиваются байты;
- quantity: количество запрашиваемых байтов;
- stop: boolean . true посылает сообщение STOP после запроса. false посылает сообщение RESTART после запроса, сохраняя соединение активным.
byte: количество байтов, возвращенных от ведомого устройства.
Пример
Wire.beginTransmission()
ОписаниеНачинает передачу на ведомое I2C устройство с заданным адресом. После него последовательность байтов для передачи ставится в очередь с помощью функции write() , и их передача с помощью вызова endTransmission() .
Синтаксис
Wire.beginTransmission(address)
Параметры
address: 7-битный адрес устройства, на которое необходимо передать данные.
Возвращаемое значение
Пример
Wire.endTransmission()
ОписаниеЗавершает передачу на ведомое устройство, которая была начата методом beginTransmission() и передает байты, которые были поставлены в очередь методом write() .
Для совместимости с определенными I2C устройствами, начиная с Arduino 1.0.1, requestFrom() принимает аргумент логического типа данных, меняющий его поведение.
Если этот аргумент равен true , то requestFrom() после передачи посылает сообщение STOP, освобождая шину I2C.
Если этот аргумент равен false , то requestFrom() после передачи посылает сообщение RESTART. Шина не освобождается, что мешает другому устройству-мастеру влезть между сообщениями. Это позволяет одному ведущему устройству посылать несколько передач, пока оно контролирует шину.
По умолчанию этот аргумент равен true .
Синтаксис
Wire.endTransmission()
Wire.endTransmission(stop)
Параметры
stop: boolean . true посылает сообщение STOP после передачи. false посылает сообщение RESTART после передачи, сохраняя соединение активным.
Возвращаемое значение
byte , который указывает на состояние передачи:
- 0: успех;
- 1: данные слишком длинны для заполнения буфера передачи;
- 2: принят NACK при передаче адреса;
- 3: принят NACK при передаче данных;
- 4: остальные ошибки.
Смотрите пример к методу write() .
Wire.write()
ОписаниеЗаписывает данные от ведомого устройства в отклик на запрос от ведущего устройства, или ставит в очередь байты для передачи от мастера к ведомому устройству (между вызовами beginTransmission() и endTransmission()).
Синтаксис
Wire.write(value)
Wire.write(string)
Wire.write(data, length)
Параметры
- value: значение для передачи, один байт.
- string: строка для передачи, последовательность байтов.
- data: массив данных для передачи, байты.
- length: количество байтов для передачи.
byte: write() возвращает количество записанных байтов, хотя чтение этого количества не обязательно.
Пример #include
Wire.available()
ОписаниеВозвращает количество байтов, доступных для получения с помощью read() . Этот метод должен вызываться на ведущем устройстве после вызова requestFrom() или на ведомом устройстве внутри обработчика onReceive() .
Синтаксис
Wire.available()
Параметры
Возвращаемое значение
Количество байтов, доступных для чтения.
Пример
Смотрите пример к методу read() .
Wire.read()
ОписаниеСчитывает байт, который был передан от ведомого устройства к ведущему после вызова requestFrom() , или который был передан от ведущего устройства к ведомому.
Синтаксис
Параметры
Возвращаемое значение
byte: очередной принятый байт.
Пример #include
Wire.setClock()
ОписаниеИзменяет тактовую частоту для связи по шине I2C. У ведомых I2C устройств нет минимальной рабочей тактовой частоты, однако обычно используется 100 кГц.
Синтаксис
Wire.setClock(clockFrequency)
Параметры
clockFrequency: значение частоты (в герцах) тактового сигнала. Принимаются значения 100000 (стандартный режим) и 400000 (быстрый режим). Некоторые процессоры также поддерживают 10000 (низкоскоростной режим), 1000000 (быстрый режим плюс) и 3400000 (высокоскоростной режим). Чтобы убедиться, что необходимый режим поддерживается, обращайтесь к технической документации на конкретный процессор.
Возвращаемое значение
Wire.onReceive()
ОписаниеРегистрирует функцию, которая будет вызываться, когда ведомое устройство принимает передачу от мастера.
Синтаксис
Wire.onReceive(handler)
Параметры
handler: функция, которая должна будет вызываться, когда ведомое устройство принимает данные; она должна принимать один параметр int (количество байтов, прочитанных от мастера) и ничего не возвращать, т.е.:
void myHandler(int numBytes)
Возвращаемое значение
Пример
#include
Wire.onRequest()
ОписаниеРегистрирует функцию, которая будет вызываться, когда мастер запрашивает данные от ведомого устройства.
Синтаксис
Wire.onRequest(handler)
Параметры
handler: функция, которая должна будет вызываться, она не принимает параметров и ничего не возвращает, т.е.:
void myHandler()
Возвращаемое значение
Пример
Код для платы Arduino, работающей в качестве ведомого устройства:
#include
В этой статье мы сделали попытку собрать в одном месте ссылки на все самые популярные библиотеки Ардуино, а также подготовили подборку наиболее популярных библиотек. Рано или поздно, любой ардуинщик сталкивается с необходимостью использования той или иной библиотеки. Ведь использование готового кода сильно сокращает время на программирование. Надеемся, что собранные в одном месте и снабженные ссылками для скачивания и короткими примерами использования, сведения о популярных библиотеках помогут вам в ваших проектах.
Библиотека ардуино – это некий программный код, хранящийся не в скетче, а во внешних файлах, которые можно подключить к вашему проекту. В библиотеке хранятся различные методы и структуры данных, которые нужны для упрощения работы с датчиками, индикаторами, модулями и другими компонентами. Использование готовых программ существенно упрощает работу над проектами, потому что можно сосредоточиться на основной логике, не тратя время на множество мелочей.
Сегодня создано огромное количество библиотек, которые можно легко найти и скачать в интернете. Подавляющее большинство библиотек распространяются по свободной лицензии, поэтому необходимости в поиске “пиратских” версий нет. Главное, это научиться .
Стандартные библиотеки Ардуино
Начать знакомство с библиотеками лучше с официального сайта, на котором можно найти внушительный список стандартных модулей и ссылки на официальные библиотеки партнеров.
Список встроенных библиотек (они поставляются вместе с дистрибутивом Arduino IDE):
- EEPROM
- Ethernet / Ethernet 2
- Firmata
- LiquidCrystal
- Servo
- SoftwareSerial
- Stepper
Подборка библиотек в одном архиве
Если у вас нет времени на детальный анализ множества сайтов и вы хотите скачать все необходимое для работы с внешними устройствами Ардуино в одном архиве, мы подготовили список 40 самых популярных библиотек. Просто и распакуйте его содержимое (папку libraries) в папку Arduino.
Библиотеки для экранов, индикаторов и дисплеев
Библиотека I2C
Библиотека, предназначенная для работы периферийного устройства по протоколу I2C.
Пример использования:
#ifndef I2C_MASTER_H
#define I2C_MASTER_H
void I2C_init (void) – создание объекта, настройка на правильную частоту для шины.
uint8_t I2C_start () – установка соединения с новым устройством.
uint8_t I2C_write() – запись данных на текущее устройство.
uint8_t I2C_read_ack() – считывание байта с устройства, запрос следующего байта.
Библиотека LiquidCrystal
Стандартная библиотека, установленная в Arduino IDE. Предназначена для управления жидкокристаллическими дисплеями LCD.
Пример использования:
#include
Конструктор класса – LiquidCristal(…). Аргументами являются rs, rw, en, do…d7. Первые 3 соответствую выводам сигналов RS, RW и Enable. Выводы d соответствуют номерам шин данных, к которым подключен дисплей.
void begin(cols, rows) – метод, который инициализирует интерфейс дисплея. Аргументами являются количество знаков в строке (cols) и число строк (rows). Этот метод должен задаваться первым.
void createChar(num, data) – метод, необходимый для создания пользовательских символов.
Библиотека UTFT
Стандартная библиотека, необходимая для работы Ардуино с TFT экранами разных типов. Все поддерживаемые дисплеи представлены в сопроводительном документе с библиотекой.
Пример использования:
#include
UTFT(); – создание экземпляра UTFT.
textRus(char*st, int x, int y); – метод, позволяющий выводить строку из указателя. Например, char *dht = “Температура,С”;
textRus(string st, int x, int y); – вывод строки с указанием в параметре. Например, g.textRus(“Температура, С”, 0, 20);
Библиотека LedControl
Позволяет управлять семисегментными дисплеями, объединять массив из светодиодов в одну матрицу.
Пример использования:
#include
LedControl lc1= LedControl();
– требуется для инициализации библиотеки. Должна состоять из четырех аргументов – номера пинов, к которым подключен дисплей (первые 3 аргумента) и количество подключенных чипов.
writeArduinoOn7Segment() – отображение на дисплее всех чисел от 0 до 15. Использует функции setChar() для символов a и d и setRow() для создания макета пропущенных символов.
LedControl.shutdown() – отключение изображения.
setIntensity() – контроль яркости.
Библиотеки для работы с датой и временем ардуино
Библиотека RTClib
Библиотека для работы с часами реального времени, упрощающая взаимодействие с Ардуино.
Пример использования:
#include
RTC_DS1307 RTC; – выбор датчика (в данном случае DS1307).
rtc.adjust(DateTime(Date, Time)); – настройка времени и календаря.
dayOfTheWeek () – вывод дня недели. Аргумент от 0 до 6, 0 – воскресенье.
Библиотека Timelib
Позволяет Ардуино получать информацию о дате и времени в данный момент.
Пример использования:
#include
Time(); – создание экземпляра.
setTime (t); – установка времени. Аргумент t – час, минута, секунда, день, месяц и год.
timeStatus(); – показывает, установлено ли время.
adjustTime(adjustment); – настройка времени.
Библиотека Ds1307
Библиотека для удобного взаимодействия часов DS1307 с Ардуино c использованием библиотеки Wire.
Пример использования:
#include
class DS1307RTC – создание объекта DS1307.
SetTime() – установка времени.
get() – считывает RTC, возвращает полученную дату в формате POSIX.
Set(time_t t) – запись даты в RTC
Библиотека DS 3231
Предназначена для управления датой и временем в модуле ds3231.
#include “ds3231.h”
DS3231 Clock(SDA, SCL); – создание объекта DS3231, подключение к линии тактирования и линии данных.
getTime(); – считывание даты и времени с часов.
setDate(date, mon, year); – установка даты.
Системные библиотеки ардуино
Библиотека EEPROM
Стандартная библиотека. Предназначена для работы с энергонезависимой памятью (запись данных, их чтение).
Пример использования:
#include
EEPROM.read(); – создание объекта, считывание байта по адресу из энергонезависимой памяти.
EEPROM.write(address, value)– запись байта в энергонезависимую память.
EEPROM.put() – запись строк чисел с плавающей запятой.
EEPROM.get() – чтение строк и чисел с плавающей запятой.
Библиотека SoftwareSerial
Библиотека, которая позволяет реализовывать последовательные интерфейсы с любых цифровых пинов. Также позволяет создавать несколько последовательных портов, которые работают на скорости до 115200 бод.
#include
SoftwareSerial mySerial(RX, TX) – создание объекта, аргументы – выводы, к которым подключены RX и TX.
Serial.begin(); – устанавливает скорость порта для связи ардуино и компьютера.
mySerial.overflow() – проверка входного буфера на переполнение.
Библиотека Math
Включает в себя большое количество математических функций для работы с числами с плавающей запятой.
Пример использования:
#include
Math(); – создание экземпляра Math.
Serial.print(“cos num = “); – возвращает косинус числа.
Serial.println (fmod (double__x, double__y)); – возвращает числа по модулю.
Библиотека Scheduler
Предназначена для работы с Arduino Due, позволяет работать в режиме многозадачности. Пока является экспериментальной библиотекой.
Пример использования:
#include
Scheduler; – создание экземпляра.
Scheduler.startLoop() – позволяет добавить функцию, которая будет выполняться вместе с loop().
yield() – позволяет передать управление другим задачам.
Библиотеки серво моторов и шаговых двигателей
Библиотека Servo
Стандартная библиотека. Необходима для управления серводвигателями и часто используется в робототехнических проектах с манипуляторами.
Пример использования:
#include
Servo myservo; – создание объекта для серводвигателя..
myservo.attach(); – номер выхода, к которому подключен серводвигатель.
myservo.write(180, 30, true); – движение на 180 градусов, скорость 30, ожидание окончания движения.
Библиотека Stepper
Небходима для управления шаговым униполярным и биполярным двигателем.
#include
const int stepsPerRevolution = ; – количество шагов, за которое двигатель проходит полный поворот.
Stepper myStepper = Stepper(steps, pin1, pin2) – создает экземпляр класса с указанным количеством шагов и выводами, к которым подключается двигатель.
Библиотеки датчиков ардуино
Библиотека DHT
#include < DHT.h>
DHT dht(DHTPIN, DHT11); – инициализирует датчик (в данном случае DHT11).
dht.begin(); – запуск датчика.
float t = dht.readTemperature(); – считывание текущего значения температуры в градусах Цельсия.
Библиотека DallasTemperature
Предназначается для работы с датчиками Dallas. Работает совместно с библиотекой OneWire.
#include
DallasTemperature dallasSensors(&oneWire); – передача объекта oneWire для работы с датчиком.
положить ее в регистр.
printTemperature(sensorAddress); – запрос получить измеренное значение температуры.
Библиотека Ultrasonic
Обеспечивает работу Ардуино с ультразвуковым датчиком измерения расстояния HC-SR04.
#include
Ultrasonic ultrasonic (tig , echo) – объявление объекта, аргументы – контакт Trig и контакт Echo.
dist = ultrasonic.distanceRead(); – определение расстояния до объекта. Агрумент – сантиметры(СМ) или дюймы (INC).
Timing() – считывание длительности импульса на выходе Echo, перевод в необходимую систему счисления.
Библиотека ADXL345
Предназначается для работы с акселерометром ADXL345.
Пример использования:
#include
ADXL345_ADDRESS – создание объекта, указание его адреса.
ADXL345_REG_DEVID – идентификация устройства.
ADXL345_REG_OFSX – смещение по оси Х.
ADXL345_REG_BW_RATE – управление скоростью передачи данных.
Библиотека BME280
Предназначается для работы с датчиком температуры, влажности и давления BME280.
Пример использования:
#include
BME280_ADDRESS – создание объекта BME280, указание его адреса.
begin(uint8_t addr = BME280_ADDRESS); – начало работы датчика.
getTemperature – получение измеренной температуры.
getPressure – получение измеренного давления.
Библиотека BMP280
Требуется для работы с датчиком атмосферного давления BMP280.
Пример использования:
#include
BMP280_CHIPID – создание экземпляра, указание его адреса.
getTemperature(float *temp); – получение измеренной температуры.
getPressure(float *pressure); – получение измеренного значения давления.
Библиотека BMP085
Требуется для работы с датчиком давления BMP085.
Пример использования:
#include
Adafruit_BMP085 bmp; – создание экземпляра BMP085.
dps.init(MODE_ULTRA_HIGHRES, 25000, true); – измерение давления, аргумент 25000 – высота над уровнем моря (в данном случае 250 м. над уровнем моря).
dps.getPressure(&Pressure); – определение давления.
Библиотека FingerPrint
Требуется для работы со сканером отпечатков пальцев.
Пример использования :
#include
Adafruit_Fingerprint finger = Adafruit_Fingerprint(&mySerial); – объявление объекта Finger. Параметр – ссылка на объектр для работы с UART, кокторому подключен модуль.
finger.begin(); – инициализация модуля отпечатков пальцев.
Func_sensor_communication(); – вызов модуля отпечатков пальцев.
Библиотеки коммуникации
Библиотека Wire
Требуется для работы с двухпроводным интерфейсом I2C.
Пример использования:
#include
Wire.begin() – инициализация библиотеки, подключение к шине I2C.
Wire.requestFrom() – запрос мастером байтов от ведомого устройства.
Wire.beginTransmission() – начало передачи на ведомое устройство.
Библиотека Irremote
Требуется для работы ардуино с ИК приемником.
Пример использования:
#include
IRrecv irrecv(RECV_PIN); – пин, к которому подключен ИК приемник.
SetPinAndButton(int ir1,int ir2,int pin) – позволяет настроить определенный выход на срабатывание при заданных значениях ir1, ir2.
Библиотека GSM
Требуется для соединения через GSM-плату с сетью GSM/GRPS. С ее помощью можно реализовать операции, свершаемые GSM-телефоном, работать с голосовыми вызовами и подключаться к сети интернет через GRPS.
Пример использования:
#include
GSM GSMAccess – инициализирует экземпляр класса.
gprs.powerOn() – включение питания.
GPRS – настройка подключения к интернету.
GSM – управление радио-модемом.
Библиотека RFID
Требуется для соединения Ардуино и RFID -модуля.
Пример использования:
#include
RFID rfid(SS_PIN, RST_PIN); – создание экземпляра rfid, аргументы – пины, к которым подключен модуль.
rfid.init(); – инициализация модуля RFID.
Библиотека MFRC 522
Требуется для соединения Ардуино и MFRC522 -модуля.
Пример использования:
#include
MFRC522 mfrc522(SS_PIN, RST_PIN); – создание экземпляра MFRC522, аргументами указаны выходы, к которым подключен модуль.
mfrc522.PCD_Init(); – инициализация MFRC522.
Библиотека Ethershield
Новая версия https://github.com/jcw/ethercard
Требуется для подключения Ардуино к локальной сети или сети интернет. Библиотека больше не поддерживается, более новая версия Ethercard. Также существует стандартная библиотека Ethernet.
Пример использования:
#include «EtherShield.h»
#include
EtherShield es = EtherShield (); – подготовка веб-страницы
ether.begin(sizeof Ethernet::buffer, mymac,); – начало работы, аргументы – адрес Mac и номер порта, к которому подключен выход CS.
Библиотека Nrf24l01
Требуется для работы с RF24-радиомодулем.
Пример использования:
#include “RF24.h”
RF24 – Конструктор создает новый экземпляр драйвера. Перед тем, как использовать, нужно создать экземпляр и указать пины, к которым подключен чип (_cepin: контакт модуля Enable, cspin: контакт модуля Select).
Begin – начало работы чипа.
setChannel – каналы для связи RF.
setPayloadSize – установка фиксированного размера передачи.
getPayloadSize – получение фиксированного размера.
Библиотека TinyGPS
Требуется для чтения сообщений GPGGA и GPRMC. Помогает считывать данные о положении, дате, времени, высоте и других параметрах.
Пример использования:
#include
TinyGPS gps; – создание экземпляра TinyGPS.
encode () – подача на объект последовательных данных по одному символу.
gps.stats() – метод статистики. Показывает, получены корректные данные или нет.
Библиотеки в Arduino IDE
Среди всего разнообразия библиотек можно выделить 3 основных группы:
- Встроенные – это библиотеки, изначально установленные в среде Arduino IDE. Их не нужно скачивать и устанавливать дополнительно, они доступны для использования в программе сразу после запуска среды разработки.
- Дополнительные – это библиотеки, которые нужно самостоятельно скачивать устанавливать. Обычно такой вид библиотек разрабатывает производитель датчиков, сенсоров и других компонентов для облегчения работы с ардуино.
- Зависимые библиотеки – устанавливаются как помощник дополнительной библиотеки, отдельно от нее не работает.
Самым простым способом работы с библиотеками в ардуино является использование встроенных возможностей среды разработки Arduino IDE. Об этом мы поговорим в отдельной статье.
LCD дисплей – частый гость в проектах ардуино. Но в сложных схемах у нас может возникнуть проблема недостатка портов Arduino из-за необходимости подключить экран, у которого очень очень много контактов. Выходом в этой ситуации может стать I2C /IIC переходник, который подключает практически стандартный для Arduino экран 1602 к платам Uno, Nano или Mega всего лишь при помощи 4 пинов. В этой статье мы посмотрим, как можно подключить LCD экран с интерфейсом I2C, какие можно использовать библиотеки, напишем короткий скетч-пример и разберем типовые ошибки.
Жидкокристаллический дисплей (Liquid Crystal Display) LCD 1602 является хорошим выбором для вывода строк символов в различных проектах. Он стоит недорого, есть различные модификации с разными цветами подсветки, вы можете легко скачать готовые библиотеки для скетчей Ардуино. Но самым главным недостатком этого экрана является тот факт, что дисплей имеет 16 цифровых выводов, из которых обязательными являются минимум 6. Поэтому использование этого LCD экрана без i2c добавляет серьезные ограничения для плат Arduino Uno или Nano. Если контактов не хватает, то вам придется покупать плату Arduino Mega или же сэкономить контакты, в том числе за счет подключения дисплея через i2c.
Краткое описание пинов LCD 1602
Давайте посмотрим на выводы LCD1602 повнимательней:
Каждый из выводов имеет свое назначение:
- Земля GND;
- Питание 5 В;
- Установка контрастности монитора;
- Команда, данные;
- Записывание и чтение данных;
- Enable;
7-14. Линии данных;
- Плюс подсветки;
- Минус подсветки.
Технические характеристики дисплея:
- Символьный тип отображения, есть возможность загрузки символов;
- Светодиодная подсветка;
- Контроллер HD44780;
- Напряжение питания 5В;
- Формат 16х2 символов;
- Диапазон рабочих температур от -20С до +70С, диапазон температур хранения от -30С до +80 С;
- Угол обзора 180 градусов.
Схема подключения LCD к плате Ардуино без i2C
Стандартная схема присоединения монитора напрямую к микроконтроллеру Ардуино без I2C выглядит следующим образом.
Из-за большого количества подключаемых контактов может не хватить места для присоединения нужных элементов. Использование I2C уменьшает количество проводов до 4, а занятых пинов до 2.
Где купить LCD экраны и шилды для ардуино
LCD экран 1602 (и вариант 2004) довольно популярен, поэтому вы без проблем сможете найти его как в отечественных интернет-магазинах, так и на зарубежных площадках. Приведем несколько ссылок на наиболее доступные варианты:
Модуль LCD1602+I2C с синим экраном, совместим с Arduino | Простой дисплей LCD1602 (зеленая подсветка) дешевле 80 рублей | Большой экран LCD2004 с I2C HD44780 для ардуино (синяя и зеленая подсветка) |
Дисплей 1602 с IIC адаптером и синей подсветкой | Еще один вариант LCD1602 со впаянным I2C модулем | Модуль адаптера Port IIC/I2C/TWI/SPI для экрана 1602, совместим с Ардуино |
Дисплей с RGB-подсветкой! LCD 16×2 + keypad +Buzzer Shield for Arduino | Шилд для Ардуино с кнопками и экраном LCD1602 LCD 1602 | LCD дисплей для 3D принтера (Smart Controller for RAMPS 1.4, Text LCD 20×4), модулем кардридера SD и MicroSD- |
Описание протокола I2C
Прежде чем обсуждать подключение дисплея к ардуино через i2c-переходник, давайте вкратце поговорим о самом протоколе i2C.
I2C / IIC (Inter-Integrated Circuit) – это протокол, изначально создававшийся для связи интегральных микросхем внутри электронного устройства. Разработка принадлежит фирме Philips. В основе i2c протокола является использование 8-битной шины, которая нужна для связи блоков в управляющей электронике, и системе адресации, благодаря которой можно общаться по одним и тем же проводам с несколькими устройствами. Мы просто передаем данные то одному, то другому устройству, добавляя к пакетам данных идентификатор нужного элемента.
Самая простая схема I2C может содержать одно ведущее устройство (чаще всего это микроконтроллер Ардуино) и несколько ведомых (например, дисплей LCD). Каждое устройство имеет адрес в диапазоне от 7 до 127. Двух устройств с одинаковым адресом в одной схеме быть не должно.
Плата Arduino поддерживает i2c на аппаратном уровне. Вы можете использовать пины A4 и A5 для подключения устройств по данному протоколу.
В работе I2C можно выделить несколько преимуществ:
- Для работы требуется всего 2 линии – SDA (линия данных) и SCL (линия синхронизации).
- Подключение большого количества ведущих приборов.
- Уменьшение времени разработки.
- Для управления всем набором устройств требуется только один микроконтроллер.
- Возможное число подключаемых микросхем к одной шине ограничивается только предельной емкостью.
- Высокая степень сохранности данных из-за специального фильтра подавляющего всплески, встроенного в схемы.
- Простая процедура диагностики возникающих сбоев, быстрая отладка неисправностей.
- Шина уже интегрирована в саму Arduino, поэтому не нужно разрабатывать дополнительно шинный интерфейс.
Недостатки:
- Существует емкостное ограничение на линии – 400 пФ.
- Трудное программирование контроллера I2C, если на шине имеется несколько различных устройств.
- При большом количестве устройств возникает трудности локализации сбоя, если одно из них ошибочно устанавливает состояние низкого уровня.
Модуль i2c для LCD 1602 Arduino
Самый быстрый и удобный способ использования i2c дисплея в ардуино – это покупка готового экрана со встроенной поддержкой протокола. Но таких экранов не очень много истоят они не дешево. А вот разнообразных стандартных экранов выпущено уже огромное количество. Поэтому самым доступным и популярным сегодня вариантом является покупка и использование отдельного I2C модуля – переходника, который выглядит вот так:
С одной стороны модуля мы видим выводы i2c – земля, питание и 2 для передачи данных. С другой переходника видим разъемы внешнего питания. И, естественно, на плате есть множество ножек, с помощью которых модуль припаивается к стандартным выводам экрана.
Для подключения к плате ардуино используются i2c выходы. Если нужно, подключаем внешнее питание для подстветки. С помощью встроенного подстроечного резистора мы можем настроить настраиваемые значения контрастности J
На рынке можно встретить LCD 1602 модули с уже припаянными переходниками, их использование максимально упощено. Если вы купили отдельный переходник, нужно будет предварительно припаять его к модулю.
Подключение ЖК экрана к Ардуино по I2C
Для подключения необходимы сама плата Ардуино, дисплей, макетная плата, соединительные провода и потенциометр.
Если вы используете специальный отдельный i2c переходник, то нужно сначала припаять его к модулю экрана. Ошибиться там трудно, можете руководствоваться такой схемой.
Жидкокристаллический монитор с поддержкой i2c подключается к плате при помощи четырех проводов – два провода для данных, два провода для питания.
- Вывод GND подключается к GND на плате.
- Вывод VCC – на 5V.
- SCL подключается к пину A5.
- SDA подключается к пину A.
И это все! Никаких паутин проводов, в которых очень легко запутаться. При этом всю сложность реализации i2C протокола мы можем просто доверить библиотекам.
Библиотеки для работы с i2c LCD дисплеем
Для взаимодействие Arduino c LCD 1602 по шине I2C вам потребуются как минимум две библиотеки:
- Библиотека Wire.h для работы с I2C уже имеется в стандартной программе Arduino IDE.
- Библиотека LiquidCrystal_I2C.h, которая включает в себя большое разнообразие команд для управления монитором по шине I2C и позволяет сделать скетч проще и короче. Нужно дополнительно установить библиотеку После подключения дисплея нужно дополнительно установить библиотеку LiquidCrystal_I2C.h
После подключения к скетчу всех необходимых библиотек мы создаем объект и можем использовать все его функции. Для тестирования давайте загрузим следующий стандартный скетч из примера.
#include
Описание функций и методов библиотеки LiquidCrystal_I2C:
- home() и clear() – первая функция позволяет вернуть курсор в начало экрана, вторая тоже, но при этом удаляет все, что было на мониторе до этого.
- write(ch) – позволяет вывести одиночный символ ch на экран.
- cursor() и noCursor() – показывает/скрывает курсор на экране.
- blink() и noBlink() – курсор мигает/не мигает (если до этого было включено его отображение).
- display() и noDisplay() – позволяет подключить/отключить дисплей.
- scrollDisplayLeft() и scrollDisplayRight() – прокручивает экран на один знак влево/вправо.
- autoscroll() и noAutoscroll() – позволяет включить/выключить режим автопрокручивания. В этом режиме каждый новый символ записывается в одном и том же месте, вытесняя ранее написанное на экране.
- leftToRight() и rightToLeft() – Установка направление выводимого текста – слева направо или справа налево.
- createChar(ch, bitmap) – создает символ с кодом ch (0 – 7), используя массив битовых масок bitmap для создания черных и белых точек.
Альтернативная библиотека для работы с i2c дисплеем
В некоторых случаях при использовании указанной библиотеки с устройствами, оснащенными контроллерами PCF8574 могут возникать ошибки. В этом случае в качестве альтернативы можно предложить библиотеку LiquidCrystal_PCF8574.h. Она расширяет LiquidCrystal_I2C, поэтому проблем с ее использованием быть не должно.
Проблемы подключения i2c lcd дисплея
Если после загрузки скетча у вас не появилось никакой надписи на дисплее, попробуйте выполнить следующие действия.
Во-первых, можно увеличить или уменьшить контрастность монитора. Часто символы просто не видны из-за режима контрастности и подсветки.
Если это не помогло, то проверьте правильность подключения контактов, подключено ли питание подсветки. Если вы использовали отдельный i2c переходник, то проверьте еще раз качество пайки контактов.
Другой часто встречающейся причиной отсутствия текста на экране может стать неправильный i2c адрес. Попробуйте сперва поменять в скетче адрес устройства с 0x27 0x20 или на 0x3F. У разных производителей могут быть зашиты разные адреса по умолчанию. Если и это не помогло, можете запустить скетч i2c сканера, который просматривает все подключенные устройства и определяет их адрес методом перебора. Пример скетча i2c сканера .
Если экран все еще останется нерабочим, попробуйте отпаять переходник и подключить LCD обычным образом.
Заключение
В этой статье мы рассмотрели основные вопросы использования LCD экрана в сложных проектах ардуино, когда нам нужно экономить свободные пины на плате. Простой и недорогой переходник i2c позволит подключить LCD экран 1602, занимая всего 2 аналоговых пина. Во многих ситуациях это может быть очень важным. Плата за удобство – необходимость в использовании дополнительного модуля – конвертера и библиотеки. На наш взгляд, совсем не высокая цена за удобство и мы крайне рекомендуем использовать эту возможность в проектах.
Мне нужно было сделать часы на основе микросхемы, имеющей I 2 C интерфейс. Микросхема RTC, т.н. "часы реального времени" PCF8583.
Внутри микросхемы расположены: часы, будильник, таймер, календарь (кривой), и 240 байт оперативной памяти, куда можно записывать любую информацию, которую только вздумается. Оперативная память это очень полезная штука, в отличии от флеш-памяти, оперативная память не имеет ограничений по количеству циклов перезаписи, и в неё можно сохранять какие-то данные, настройки, сколь угодно часто.
Но была одна проблемка - писАть код жутко не хотелось, и я решил найти готовый код в интернете. Как позже выяснилось, найти «на свою голову». Скачал пример работы с I 2 C, подправил, прошил микроконтроллер. Не заработало. Стал ковырять код, искать причину неработоспособности… и ужаснулся!! Запись в некоторых случаях велась во весь порт сразу, а не в конкретные биты. Таким образом, если на порт повесить ещё что-то, например, дисплей, то скорее всего, оно работать не будет. Также неправильно было реализовано чтение данных по шине (без генераций условия окончания приёма, или просто без NACK). Но это пол-беды. Основная проблема в другом. Зачастую автор кода выставлял в порт логическую «1», а как мы знаем, шина I 2 C управляется «притягиванием» выводов SDA и SCL к общему проводу. А логическая «1» на шине, в свою очередь, формируется за счёт подтяжки к плюсу питания резисторами на 4,7 килоом. Таким образом, если на выходе микроконтроллера выставить логическую «1», а ведомое устройство «притянет» этот выход к общему проводу, то получится «ба-бах» короткое замыкание. Мне это очень не понравилось, и я решил изобрести свой велосипед написать свою библиотеку, а вернее даже 2 библиотеки: одна для работы с шиной I 2 C, а другая непосредственно для работы с часами реального времени PCF8583. Да, кстати, код написан в .
Для того, чтобы подключить библиотеку I 2 C к проекту, нужно прописать её через include, как на картинке, а также скопировать библиотеку в папку с проектом.
После чего, необходимо открыть файл "i2c.h", и указать ножки микроконтроллера, которые будут выступать в роли шины I 2 C. По умолчанию шина настроена на ножки PC0 (SCL) и PC1 (SDA). А настройка делается вот тут:
Всё, библиотеку I2C мы подключили, ножки настроили, библиотека готова к работе. Пример использования:
I2c_init (); // Инициализация шины I2C i2c_start_cond(); // старт шины i2c_send_byte (0xA0); // адрес устройства, которое висит на шине i2c_send_byte (0x10); // байт данных, который записываем в устройство i2c_send_byte (0x10); // ещё один байт данных, который записываем в устройство i2c_stop_cond(); // стоп шины
После стоп-условия, мы можем проверить, всё ли у нас в порядке с шиной I 2 C. Для этого нужно прочитать переменную «i2c_frame_error». Если всё нормально, то в ней будет 0. Если один из выводов шины не «подтянулся» к питанию, и логическая «1» не установилась на шине, то библиотека генерирует ошибку, и записвает в переменную «i2c_frame_error» циферку 1. Читать переменную «i2c_frame_error» нужно после стоп-условия. На рисунке ниже продемонстрирую как работает контроль ошибки:
Теперь займёмся подключением библиотеки часов реального времени PCF8583. Для этого нужно проделать те же самые действия. Скопируем в папку с проектом файл "PCF8583.h", и пропишем его в include, как на фото:
Готово. Библиотека часов реального времени PCF8583 подключена. Она не требует каких-либо настроек, поэтому можно сразу приступать к чтению времени и даты с микросхемы. Обращаю внимание, что библиотека PCF8583 работает при помощи библиотеки I2C, поэтому если хотим работать с PCF8583, то нужно подключить обе библиотеки!
Пример использования библиотеки (запись и чтение времени и даты):
// Инициализация шины I2C i2c_init (); // Подготавливаем время и дату для записи в микросхему PCF8583 PCF_hour=23; // 23 часа PCF_min=59; // 59 минут PCF_day=31; // 31 число PCF_month=12; // 12 месяц - декабрь PCF_year=0; // год (0 - не високосный) PCF_weekday=6; // 6 день недели (воскресенье) // Записываем время и дату в микросхему PCF8583 PCF_write_hh_mm_ss(); // Считываем время и дату из микросхемы PCF8583 PCF_read_hh_mm_ss(); Пример работы с оперативной памятью (запись и чтение): // Подготавливаем 5 байт для записи в микросхему PCF8583 PCF_data_ram_1=255; // байт 1 PCF_data_ram_2=255; // байт 2 PCF_data_ram_3=255; // байт 3 PCF_data_ram_4=255; // байт 4 PCF_data_ram_5=255; // байт 5 // Записываем 5 байт в микросхему PCF8583 PCF_write_ram(); // Считываем 5 байт из микросхемы PCF8583 PCF_read_ram();
Чтение из микросхемы ещё проще – достаточно вызвать функцию PCF _ read _ hh _ mm _ ss () после чего, время и дата появятся в переменных, откуда их только забирай. Для чтения оперативной памяти соответственно используем функцию PCF _ read _ ram () после чего данные забираем в переменных PCF _ data _ ram _ N
Вот список переменных, где и что хранится:
// время и дата PCF_hour=0; // время, часы (от 0 до 23, защита от переполнения при записи и чтении) PCF_min=0; // время, минуты (от 0 до 59, защита от переполнения при записи и чтении) PCF_sec=0; // время, секунды (только для чтения, при записи сбрасываются в 00) PCF_day=0; // день (от 1 до 31, защита от переполнения при записи и чтении) PCF_weekday=0 // день недели (0-понедельник; 6-воскресенье, защита от переполнения при записи и чтении) PCF_month=0; // месяц (от 1 до 12, защита от переполнения при записи и чтении) PCF_year=0; // год (0-високосный; 1,2,3-невисокосные, защита от переполнения при записи и чтении) // оперативная память PCF_data_ram_1; // Данные (ОЗУ PCF8583), байт 1 PCF_data_ram_2; // Данные (ОЗУ PCF8583), байт 2 PCF_data_ram_3; // Данные (ОЗУ PCF8583), байт 3 PCF_data_ram_4; // Данные (ОЗУ PCF8583), байт 4 PCF_data_ram_5; // Данные (ОЗУ PCF8583), байт 5
Теперь расскажу про защиту от переполнения. Допустим, мы забыли подключить микросхему. Прочитаем данные с микросхемы, и… прочитается байт 11111111, или число 255. Всё дело в том, что в основе шины I 2 C лежат 2 подтягивающих резистора, вот они то и выдают нам логические «единички» если микросхема не подключена. Для защиты от подобных случаев, в библиотеке PCF8583 я сделал защиту от переполнений, которая следит за тем, чтобы часики не показывали вам 62 часа 81 минуту… Наличие переполнения можно проследить, прочитав переменную «PCF_overflow». Если в ней 0, значит ошибок переполнения не было. Если в ней 1 или более, значит ошибки переполнения имеются. Читать переменную «PCF_overflow» нужно после функции чтения даты и времени PCF _ read _ hh _ mm _ ss ()
Для наглядности, проект AVR Studio 6 под ATmega32 прилагается. Перекомпилировать можно под любой AVR. В проекте я также подключил дисплей для визуального контроля. При подаче питания, микроконтроллер устанавливает 23 часа 59 минут, 31 декабря, Воскресенье. И через минуту становится 00 часов 00 минут, 1 января, Понедельник.
Теперь расскажу, почему я говорил про «кривой» календарь этой микросхемы. Всё дело в том, что микросхема не умеет хранить текущий календарный год, а хранит лишь флаг високосного года. Короче говоря:
0 – високосный год
1 – не високосный год
2 – не високосный год
3 – не високосный год
И так по циклу 0-1-2-3-0-1-2-3-0…
В общем чтобы сделать нормальный календарь, нужно реализовывать программный расчёт и сохранение года, например, в ту же оперативную память PCF8583, но это не удобно. А главное, что при обесточенной схеме память, увы, никто не перезапишет...
Также прилагаю в конце статьи небольшой видеоотчёт. В программировании я можно сказать новичок, хоть и программирую уже 3 года (понемногу), за код строго не судите, если есть какие-либо дополнения и замечания, пишите, будем исправлять. Всем удачных самоделок!
Список радиоэлементов
Обозначение | Тип | Номинал | Количество | Примечание | Магазин | Мой блокнот |
---|---|---|---|---|---|---|
МК AVR 8-бит | ATmega32 | 1 | В блокнот | |||
Часы реального времени (RTC) | PCF8583 | 1 | В блокнот | |||
LCD-дисплей | WH1602 | 1 |
Why another I2C library?
The standard I2C library for the Arduino is the Wire library . While this library is sufficient most of the time, there are situations when it cannot be used:
- the I2C pins A4/A5 (or SDA/SCL) are in use already for other purposes,
- the code shall run on both an ATmega processor with 16 MHz and an ATtiny processor with 1 MHz ,
- you are short on memory (flash and RAM).
Features
- compatible with all 8-bit AVR MCUs
- can make use of almost any pin
- clock stretching (by slaves) supported
- timeout on clock stretching
- timeout on ACK polling for busy devices (new!)
- internal MCU pullup resistors can be used (new!)
- very lightweight (roughly 250 bytes of flash and 0 byte of RAM, except for call stack)
- very fast (standard and fast mode on UNO, 33 kHz with 1 MHz CPU clock)
- Optional Wire library compatible interface
- no bus arbitration (i.e., only one master allowed on bus)
- supports only master mode
- GPL license
Using the library
Alternative Interface
Meanwhile, I have written a wrapper around SoftI2CMaster that emulates the Wire library (master mode only). It is another C++-header file called SoftWire .h which you need to include instead of SoftI2CMaster .h . Directly after this include statement you need to create a Wire instance.
This interface sacrifices some of the advantages of the original library, in particular its small footprint, but comes handy if you need a replacement of the original Wire library. The following table lists the memory requirements.
1956 | 252 | 712 | RAM208 | 0 | 64 |