Creating the Program
1. Setting up
First start by connecting your Arduino Nano Every board to the computer and opening the Arduino Create Web Editor. This board will act as the reader. Start a new sketch and name it Nano_I2C_Reader.
2. Reader code explanation
Let’s start by adding the
The
Instead the focus is on the
onoff
3. Uploading the code to the reader
Once we have finished the code, let’s upload it to our Arduino Nano Every board. This board is now programmed to act as the reader in this scenario. Once the code is uploaded, let’s connect the other board to the computer.
4. Writer code
It is time to open a new sketch and name it as Nano_I2C_Writer, then let’s add the Wire library as we did in the previous code.
In the
Next, in the
With
The
5. Uploading the code to the writer
Once we have finished the code, let’s upload it to our Arduino Nano Every board. This board is now programmed to act as the writer.
6. Complete code
If you choose to skip the code building section, the complete code for both the reader and the writer can be found below:
Часть первая, I2C и библиотека «Wire».
Последовательный протокол обмена данными IIC (также называемый I2C — Inter-Integrated Circuits, межмикросхемное соединение). Разработана фирмой Philips Semiconductors в начале 1980-х как простая 8-битная шина внутренней связи для создания управляющей электроники. Так как право на использование его стоит денег фарма Atmel назвала его TWI, но смысл от этого не меняется.
Как это работает ?
Для передачи данных используются две двунаправленные лини передачи данных. SDA (Serial Data) шина последовательных данных и SCL (Serial Clock) шина тактирования. Обе шины подтянуты резисторами к плюсовой шине питания. Передача/Прием сигналов осуществляется прижиманием линии в 0, в единичку устанавливается сама, за счет подтягивающих резисторов.
В сети есть хотя бы одно ведущее устройство (Master), которое инициализирует передачу данных и генерирует сигналы синхронизации и ведомые устройства (Slave), которые передают данные по запросу ведущего. У каждого ведомого устройства есть уникальный адрес, по которому ведущий и обращается к нему. Конечно понятно что Ведущий это наш микроконтроллер , а ведомый наша память. Ведущее устройство начинает прижимать шину SCL к нулю с определенной частотой, а шину SDA прижимать или отпускать на определенное число тактов передавая Единичку или Нолик. Передача данных начинается с сигнала START потом передается 8 бит данных и 9-тым битом Ведомое устройство подтверждает прием байт прижимая шину SDA к минусу. Заканчивается передача сигналом STOP.
Библиотека «Wire».
Для облегчения обмена данными с устройствами по шине I2C для Arduino написана стандартная библиотека Wire которая есть уже в комплекте IDE. Она имеет следующие основные функции:
Wire.begin(Address) вызывается один раз для инициализации и подключения к шини как Ведущий или Ведомое устройство. Если Address не задан подключаемся как Мастер устройство.
Wire.beginTransmission(address) начинает передачу на ведомое I2C устройство с заданным адресом.
Wire.endTransmission() прекращает передачу данных ведомому. Функция возвращает значение типа byte:
- 0 — успех.
- 1- данные слишком длинны для заполнения буфера передачи.
- 2 — принят NACK при передаче адреса.
- 3 — принят NACK при передаче данных.
- 4 — остальные ошибки.
Wire.write() запись данных от ведомого устройства в отклик на запрос от ведущего устройства, или ставит в очередь байты для передачи от мастера к ведомому устройству.Фактически записывает данные в буфер. Размер буфера 32 байта ( минус 2 байта адрес, фактически 30 байт), а передает буфер функция Wire.endTransmission().
- Wire.write(value) — value: значение для передачи, один байт.
- Wire.write(string) — string: строка для передачи, последовательность байтов.
- Wire.write(data, length) — data: массив данных для передачи, байты. length: количество байтов для передачи.
Wire.read() Считывает байт, который был передан от ведомого устройства к ведущему или который был передан от ведущего устройства к ведомому. Возвращаемое значение byte : очередной принятый байт.
Это самые основные функции библиотеке, остальные мы рассмотрим по ходу пьесы ))
Принципы работы интерфейса последовательной связи RS-485
RS-485 представляет собой асинхронный интерфейс последовательной связи, не требующий для своей работы импульсов синхронизации. Для передачи двоичных данных от одного устройства к другому интерфейс использует дифференциальный сигнал.
Если следовать определению из википедии, дифференциальный сигнал представляет собой способ электрической передачи информации с помощью двух противофазных сигналов. В данном методе один электрический сигнал передаётся в виде дифференциальной пары сигналов, каждый по своему проводнику, но один представляет инвертированный сигнал другого, противоположный по знаку. Пара проводников может представлять собой витую пару, твинаксиальный кабель или разводиться по печатной плате. Приёмник дифференциального сигнала реагирует на разницу между двумя сигналами, а не на различие между одним проводом и потенциалом земли.
В нашем случае дифференциальный сигнал образуется при помощи использования положительного и отрицательного напряжения 5V. Интерфейс RS-485 обеспечивает полудуплексную связь (Half-Duplex) при использовании 2-х линий (проводов) и полноценную дуплексную связь (Full-Duplex) при использовании 4-х линий (проводов).
Основные особенности данного интерфейса:
- Максимальная скорость передачи данных в интерфейсе RS-485 – 30 Мбит/с.
- Максимальная дистанция связи – 1200 метров, что значительно больше чем в интерфейсе RS-232.
- Основным достоинством интерфейса RS-485 по сравнению с RS-232 является использование нескольких ведомых (multiple slave) при одном ведущем (single master) в то время как RS-232 поддерживает только одного ведомого.
- Максимальное число устройств, которое можно подключить по интерфейсу RS-485 – 32.
- Также к достоинствам интерфейса RS-485 относится хорошая помехоустойчивость вследствие использования дифференциального сигнала.
- RS-485 обеспечивает более высокую скорость передачи по сравнению с интерфейсом I2C.
Объяснение программы для ведомой (Slave) платы Arduino
1. Как и в ведущей плате, первым делом в программе мы должны подключить библиотеку Wire для задействования возможностей протокола I2C и библиотеку для работы с ЖК дисплеем. Также нам необходимо сообщить плате Arduino к каким ее контактам подключен ЖК дисплей.
Arduino
#include<Wire.h>
#include<LiquidCrystal.h>
LiquidCrystal lcd(2, 7, 8, 9, 10, 11);
1 |
#include<Wire.h> LiquidCrystallcd(2,7,8,9,10,11); |
- В функции void setup():
— мы инициализируем последовательную связь со скоростью 9600 бод/с;
Arduino
Serial.begin(9600);
1 | Serial.begin(9600); |
— далее мы инициализируем связь по протоколу I2C на контактах A4 и A5
В качестве адреса ведомого мы будем использовать значение 8 – очень важно здесь указать адрес ведомого;. Arduino
Wire.begin(8);
Arduino
Wire.begin(8);
1 | Wire.begin(8); |
После этого мы должны вызвать функцию в которой ведомый принимает значение от ведущего и функцию в которой ведущий запрашивает значение от ведомого.
Arduino
Wire.onReceive(receiveEvent);
Wire.onRequest(requestEvent);
1 |
Wire.onReceive(receiveEvent); Wire.onRequest(requestEvent); |
— затем мы инициализируем ЖК дисплей для работы в режиме 16х2, отображаем на нем приветственное сообщение и очищаем его экран через 5 секунд.
Arduino
lcd.begin(16,2); //Initilize LCD display
lcd.setCursor(0,0); //Sets Cursor at first line of Display
lcd.print(«Circuit Digest»); //Prints CIRCUIT DIGEST in LCD
lcd.setCursor(0,1); //Sets Cursor at second line of Display
lcd.print(«I2C 2 ARDUINO»); //Prints I2C ARDUINO in LCD
delay(5000); //Delay for 5 seconds
lcd.clear(); //Clears LCD display
1 |
lcd.begin(16,2);//Initilize LCD display lcd.setCursor(,);//Sets Cursor at first line of Display lcd.print(«Circuit Digest»);//Prints CIRCUIT DIGEST in LCD lcd.setCursor(,1);//Sets Cursor at second line of Display lcd.print(«I2C 2 ARDUINO»);//Prints I2C ARDUINO in LCD delay(5000);//Delay for 5 seconds lcd.clear();//Clears LCD display |
3. Затем нам будут необходимы две функции: одна для события запроса (request event) и одна для события приема (receive event).
Для события запроса:
Эта функция будет выполняться когда ведущий будет запрашивать значение от ведомого. Эта функция будет считывать значение с потенциометра, подключенного к ведомой плате Arduino, преобразовывать его в диапазон 0-127 и затем передавать его ведущей плате.
Arduino
void requestEvent()
{
int potvalue = analogRead(A0);
byte SlaveSend = map(potvalue,0,1023,0,127);
Wire.write(SlaveSend);
}
1 |
voidrequestEvent() { intpotvalue=analogRead(A0); byteSlaveSend=map(potvalue,,1023,,127); Wire.write(SlaveSend); } |
Для события приема:
Эта функция будет выполняться когда ведущий будет передавать данные ведомому с адресом 8. Эта функция считывает принятые значения от ведущего и сохраняет ее в переменной типа byte.
Arduino
void receiveEvent (int howMany)
{
SlaveReceived = Wire.read();
}
1 |
voidreceiveEvent(inthowMany) { SlaveReceived=Wire.read(); } |
4. В функции Void loop():
Мы будем непрерывно отображать принятые от ведущей платы значения на экране ЖК дисплея.
Arduino
void loop(void)
{
lcd.setCursor(0,0); //Sets Currsor at line one of LCD
lcd.print(«>> Slave <<«); //Prints >> Slave << at LCD
lcd.setCursor(0,1); //Sets Cursor at line two of LCD
lcd.print(«MasterVal:»); //Prints MasterVal: in LCD
lcd.print(SlaveReceived); //Prints SlaveReceived value in LCD received from Master
Serial.println(«Slave Received From Master:»); //Prints in Serial Monitor
Serial.println(SlaveReceived);
delay(500);
lcd.clear();
}
1 |
voidloop(void) { lcd.setCursor(,);//Sets Currsor at line one of LCD lcd.print(«>> Slave <<«);//Prints >> Slave << at LCD lcd.setCursor(,1);//Sets Cursor at line two of LCD lcd.print(«MasterVal:»);//Prints MasterVal: in LCD lcd.print(SlaveReceived);//Prints SlaveReceived value in LCD received from Master Serial.println(«Slave Received From Master:»);//Prints in Serial Monitor Serial.println(SlaveReceived); delay(500); lcd.clear(); } |
После того как вы соберете всю схему проекта и загрузите обе программы в платы Arduino вы можете приступать к тестированию работы проекта. Вращая потенциометр на одной стороне вы должны увидеть изменяющиеся значения на экране ЖК дисплея на другой стороне.
Теперь, когда вы разобрались, как работать с интерфейсом I2C в плате Arduino, вы можете использовать описанные в данной статье приемы для подключения к плате Arduino любых датчиков, работающих по данному протоколу.
Использование интерфейса RS-485 в Arduino
Для использования интерфейса RS-485 в плате Arduino мы будем использовать модуль 5V MAX485 TTL to RS485, в основе которого лежит микросхема Maxim MAX485. Модуль является двунаправленным и обеспечивает последовательную связь на расстояние до 1200 метров. В полудуплексном режиме он обеспечивает скорость передачи данных 2,5 Мбит/с.
Модуль 5V MAX485 TTL to RS485 использует питающее напряжение 5V и логический уровень напряжения также 5V, что позволяет без проблем подключать его к платам Arduino.
Данный модуль имеет следующие особенности:
- работает с напряжениями 5V;
- имеет в своем составе чип MAX485;
- отличается низким энергопотреблением;
- всеми его контактами можно управлять с помощью микроконтроллера;
- размеры платы модуля: 44 x 14mm.
Внешний вид модуля RS-485 показан на следующем рисунке.
Назначение контактов (распиновка) модуля RS-485 приведена в следующей таблице.
Название контакта | Назначение контакта |
VCC | 5V |
A | вход/выход линии RS-485 |
B | вход/выход линии RS-485 |
GND | GND (0V) |
R0 | выход приемника (RX pin) |
RE | разрешение работы приемника |
DE | разрешение работы передатчика |
DI | вход передатчика (TX pin) |
Для подключения модуля к платам Arduino (UNO и NANO) мы будем использовать их последовательные порты на контактах 0 (RX) и 1 (TX). Для передачи данных модулю RS-485 мы будем использовать функцию Serial.print(), а для считывания данных из него – функцию Serial.Read() (или аналогичную).
Как подключить нескольких устройств по I2C Arduino
В следующем примере к шине IIC Arduino будет подключено сразу три устройства — текстовый дисплей 1602, датчик давления bmp180 и RTC модуль часов. После сборки схемы можно сделать предварительное сканирование шины, но адреса у всех устройств разные и изменить адрес можно только у дисплея. У других устройств адреса «вшиты» производителем и используются в библиотеках по умолчанию.
Скетч. Подключение нескольких устройств к шине i2c
I2C интерфейс: подключение нескольких устройств
После сборки схемы, убедитесь, что у вас установлены необходимые библиотеки для работы с устройствами по IIC протоколу, и загрузите следующий пример кода в микроконтроллер. Данная программа будет выводить на текстовый экран текущую дату и время суток (устанавливаются в процедуре void setup и время можно поменять), а также данные о температуре воздуха и атмосферном давлении.
#include <Wire.h> // подключаем библиотеку для интерфейса I2C #include <LiquidCrystal_I2C.h> // подключаем библиотеку для 1602 LiquidCrystal_I2C LCD(0x27, 16, 2); // создаем объект LCD #include <SFE_BMP180.h> // подключаем библиотеку для bmp180 SFE_BMP180 pressure; // создаем объект pressure #include <iarduino_RTC.h> // подключаем библиотеку для часов iarduino_RTC time(RTC_DS1307); // создаем объект time void setup() { LCD.init(); // инициализация дисплея LCD.backlight(); // включение подсветки pressure.begin(); // запускаем датчик давления time.begin(); // запускаем модуль часов time.settime(0, 30, 16, 1, 4, 21, 5); // сек, мин, часы, дата, мес, год, день недели } void loop() { char status; double T, P, p0, a; // если прошла 1 секунда обновляем информацию if (millis() % 1000 == 0) { // выводим время с секундами и дату (день, месяц) LCD.setCursor(0, 0); LCD.print(time.gettime("H:i:s - d.m")); // узнаем температуру и выводим на дисплей status = pressure.startTemperature(); if (status != 0) { delay(status); status = pressure.getTemperature(T); if (status != 0) { LCD.setCursor(0, 1); LCD.print("T:"); LCD.print(T, 2); // узнаем давление и выводим на дисплей status = pressure.startPressure(3); if (status != 0) { delay(status); status = pressure.getPressure(P, T); if (status != 0) { p0 = pressure.sealevel(P, 1655.0); LCD.print(" D:"); LCD.print(p0, 2); } else { LCD.setCursor(0, 1); LCD.print("error retrieving pressure"); } } else { LCD.setCursor(0, 1); LCD.print("error starting pressure"); } } else { LCD.setCursor(0, 1); LCD.print("error retrieving temperature"); } } else { LCD.setCursor(0, 1); LCD.print("error starting temperature"); } } }
Пояснения к коду:
- обновление информации на текстовом экране происходит каждую секунду, данный интервал можно увеличить по своему желанию;
- время выводится с секундами, формат вывода времени и даты также можно изменить в строчке
Features
This library has the following features:
- supports only master mode
- compatible with all 8-bit AVR MCUs
- no bus arbitration (i.e., only one master allowed on bus)
- 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!)
- can make use of almost any pin (except for pins on port H and above on large ATmegas)
- very lightweight (roughly 500 bytes of flash and 0 byte of RAM, except for call stack)
- it is not interrupt-driven
- very fast (standard and fast mode on ATmega328, 33 kHz on ATtiny
with 1 MHz CPU clock) - Optional library compatible interface
- GPL license
1Описание FC-113 преобразователя последовательного интерфейса в параллельный
- Модуль FC-113 сделан на базе микросхемы PCF8574T, которая представляет собой 8-битный сдвиговый регистр – «расширитель» входов-выходов для последовательной шины I2C. На рисунке микросхема обозначена DD1.
- R1 – подстроечный резистор для регулировки контрастности ЖК дисплея.
- Джампер J1 используется для включения подсветки дисплея.
- Выводы 1…16 служат для подключения модуля к выводам LCD дисплея.
- Контактные площадки А1…А3 нужны для изменения адреса I2C устройства. Запаивая соответствующие перемычки, можно менять адрес устройства. В таблице приведено соответствие адресов и перемычек: «0» соответствует разрыву цепи, «1» – установленной перемычке. По умолчанию все 3 перемычки разомкнуты и адрес устройства 0x27.
I2C модуль FC-113 для подключения ЖК экрана
Тестирование Arduino I2C
А вот и самая захватывающая часть — включение питания и тестирование!
Используя Arduino IDE, загрузите эскиз мастера Arduino в одну из Ардуино. Затем загрузите скетч наследника в другую Arduino.
- Отрегулируйте потенциометр на ведущем устройстве, чтобы регулировать частоту мигания светодиода ведомого устройства.
- Отрегулируйте потенциометр на ведомом устройстве, чтобы контролировать частоту мигания светодиода ведущего устройства.
Наш код принимает положение потенциометра мастера и посылает его ведомому устройству через I2C. Затем ведомое устройство использует полученное значение для настройки времени задержки мигания светодиода. То же самое происходит и с положением потенциометра ведомого.
Specifications
The specifications of the 16×2, 20×4, and other sized LCDs are mostly the same. They all use the same HD44780 Hitachi LCD controller, so you can easily swap them. You will only need to change the size specifications in your Arduino code.
The specifications of a typical 16×2 I2C display can be found in the table below.
16×2 I2C LCD Specifications
Operating voltage | 5 V |
Controller | Hitachi HD44780 LCD controller |
Default address | 0x27 |
Screen resolution | 2-lines × 16 characters |
Character resolution | 5 × 8 pixels |
Module dimensions | 80 × 36 × 12 mm |
Viewing area dimensions | 64.5 × 16.4 mm |
Cost | Check price |
For more information, you can check out the datasheets below. The 16×2 and 20×4 datasheets include the dimensions of the LCD and you can find more information about the Hitachi LCD driver in the HD44780 datasheet. The PCF8574 chip is used in the I2C module on the back of the LCD.
16×2 Character LCD Datasheet
20×4 Character LCD Datasheet
HD44780 Datasheet
PCF8574 Datasheet
Basic Arduino example code for I2C LCD
You can upload the following example code to the Arduino using the Arduino IDE.
For this tutorial, I used this 16×2 I2C character LCD display, but you can use other I2C LCDs of different sizes as well.
This example sketch will display the classic ‘Hello World!’ on the first line of the LCD and ‘LCD tutorial’ on the second line. Next, I will explain how the code works.
/* I2C LCD with Arduino example code. More info: https://www.makerguides.com */ // Include the libraries: // LiquidCrystal_I2C.h: https://github.com/johnrickman/LiquidCrystal_I2C #include <Wire.h> // Library for I2C communication #include <LiquidCrystal_I2C.h> // Library for LCD // Wiring: SDA pin is connected to A4 and SCL pin to A5. // Connect to LCD via I2C, default address 0x27 (A0-A2 not jumpered) LiquidCrystal_I2C lcd = LiquidCrystal_I2C(0x27, 16, 2); // Change to (0x27,20,4) for 20x4 LCD. void setup() { // Initiate the LCD: lcd.init(); lcd.backlight(); } void loop() { // Print 'Hello World!' on the first line of the LCD: lcd.setCursor(2, 0); // Set the cursor on the third column and first row. lcd.print("Hello World!"); // Print the string "Hello World!" lcd.setCursor(2, 1); //Set the cursor on the third column and the second row (counting starts at 0!). lcd.print("LCD tutorial"); }
You should see the following output on the LCD:
How the code works
First, the required libraries are included. As mentioned earlier we need both the wire.h* and the LiquidCrystal_I2C library. In the rest of this tutorial, I will cover more of the built-in functions of this library.
*When using the latest version of the LiquidCrystal_I2C library it is no longer needed to include the wire.h library in your sketch. The other library imports wire.h automatically.
// Include the libraries: // LiquidCrystal_I2C.h: https://github.com/johnrickman/LiquidCrystal_I2C #include <Wire.h> // Library for I2C communication #include <LiquidCrystal_I2C.h> // Library for LCD
The next step is to create an LCD object with the LiquidCrystal_I2C class and specify the address and dimensions. For this, we use the function . This is where you will need to change the default address to the address you found earlier if it happens to be different.
When using a 20×4 LCD, change this line to
Note that we have called the display ‘lcd’. You can give it a different name if you want like ‘menu_display’. You will need to change ‘lcd’ to the new name in the rest of the sketch.
// Connect to LCD via I2C, default address 0x27 (A0-A2 not jumpered) LiquidCrystal_I2C lcd = LiquidCrystal_I2C(0x27, 16, 2); // Change to (0x27,20,4) for 20x4 LCD.
In the setup, the LCD is initiated with and the backlight is turned on with .
void setup() { // Initiate the LCD: lcd.init(); lcd.backlight(); }
In the loop section of the code, the cursor is set to the third column and the first row of the LCD with . Note that counting starts at 0 and the first argument specifies the column. So sets the cursor on the third column and the second row.
Next the string ‘Hello World!’ is printed with . Note that you need to place quotation marks (” “) around the text since we are printing a text string. When you want to print numbers, no quotation marks are necessary. For example .
void loop() { lcd.setCursor(2, 0); // Set the cursor on the third column and first row. lcd.print("Hello World!"); // Print the string "Hello World!". lcd.setCursor(2, 1); //Set the cursor on the third column and the second row. lcd.print("LCD tutorial"); // Print the string "LCD tutorial". }
If you want to see an example for displaying (changing) variables on the LCD, check out my tutorial for the HC-SR04 ultrasonic distance sensor:
How to use a HC-SR04 Ultrasonic Distance Sensor with Arduino
Creating the Program
1. Setting up
First start by connecting your Arduino Nano Every board to the computer and opening the Arduino Create Web Editor. This board will act as the reader. Start a new sketch and name it Nano_I2C_Reader.
2. Reader code explanation
Let’s start by adding the
The
Instead the focus is on the
onoff
3. Uploading the code to the reader
Once we have finished the code, let’s upload it to our Arduino Nano Every board. This board is now programmed to act as the reader in this scenario. Once the code is uploaded, let’s connect the other board to the computer.
4. Writer code
It is time to open a new sketch and name it as Nano_I2C_Writer, then let’s add the Wire library as we did in the previous code.
In the
Next, in the
With
The
5. Uploading the code to the writer
Once we have finished the code, let’s upload it to our Arduino Nano Every board. This board is now programmed to act as the writer.
6. Complete code
If you choose to skip the code building section, the complete code for both the reader and the writer can be found below:
Arduino I2C OLED display подключение
OLED (Organic Light-Emitting Diode) — это полупроводниковый прибор, излучающий свет при прохождении через него электрического тока. Управление модулем осуществляет с помощью чипа SSD1306, который поддерживает пять разных протоколов связи. Встречаются модули не только с протоколом IIC, но и с протоколом SPI, и даже олед дисплеи с возможностью выбора (переключения) между этими двумя протоколами.
Характеристики OLED I2C 128×64 / 128×32
- Цвет экрана — монохромный;
- Разрешение — 128×64 или 128×32;
- Графический чип — SSD1306;
- Интерфейс — I2C или SPI;
- Питание модуля — от 3 до 5 В;
- Размер модуля — 27x27x4 мм.
Распиновка OLED SPI и дисплея OLED IIC
Главным плюсом OLED 128×64 iic является работа модуля без подсветки, за счет чего обеспечивается низкое потребление тока этим модулем. А высокое разрешение OLED 128×64 px Arduino позволяет вывести на дисплей большее количество информации, в отличии от текстового экрана 1602. Для подключения используется четыре разъема — два провода для питания (5V и GND) и два провода для шины IIC (SDA и SCL).
Creating the Program
1. Setting up
First start by connecting your Arduino Nano 33 BLE Sense board to the computer and opening the Arduino Create Web Editor. This board will act as the reader. Start a new sketch and name it Nano_I2C_Reader.
2. Reader code explanation
Let’s start by adding the
The
Instead the focus is on the
onoff
3. Uploading the code to the reader
Once we have finished the code, let’s upload it to our Arduino Nano 33 BLE Sense board. This board is now programmed to act as the reader in this scenario. Once the code is uploaded, let’s connect the other board to the computer.
4. Writer code
It is time to open a new sketch and name it as Nano_I2C_Writer, then let’s add the Wire library as we did in the previous code.
In the
Next, in the
With
The
5. Uploading the code to the writer
Once we have finished the code, let’s upload it to our Arduino Nano 33 BLE Sense board. This board is now programmed to act as the writer.
6. Complete code
If you choose to skip the code building section, the complete code for both the reader and the writer can be found below:
5Управление устройством по шине IIC
Рассмотрим диаграммы информационного обмена с цифровым потенциометром AD5171, представленные в техническом описании:
Рассмотрим диаграммы чтения и записи цифрового потенциометра AD5171
Нас тут интересует диаграмма записи данных в регистр RDAC. Этот регистр используется для управления сопротивлением потенциометра.
Откроем из примеров библиотеки «Wire» скетч: Файл Образцы Wire digital_potentiometer. Загрузим его в память Arduino.
#include <Wire.h> // подключаем библиотеку "Wire" byte val = 0; // значение для передачи потенциометру void setup() { Wire.begin(); // подключаемся к шине I2C как мастер } void loop() { Wire.beginTransmission(44); // начинаем обмен с устройством с I2C адресом "44" (0x2C) Wire.write(byte(0x00)); // посылаем инструкцию записи в регистр RDAC Wire.write(val); // задаём положение 64-позиционного потенциометра Wire.endTransmission(); // завершаем I2C передачу val++; // инкрементируем val на 1 if (val == 63) { // по достижении максимума потенциометра val = 0; // сбрасываем val } delay(500); }
После включения вы видите, как яркость светодиода циклически нарастает, а потом гаснет. При этом мы управляем потенциометром с помощью Arduino по шине I2C.
По ссылкам внизу статьи, в разделе похожих материалов (по тегу), можно найти дополнительные примеры взаимодействия с различными устройствами по интерфейсу IIC, в том числе примеры чтения и записи.
Описание методов библиотеки LiquidCrystal I2C
LiquidCrystal_I2C(uint8_t, uint8_t, uint8_t)
Конструктор для создания экземпляра класса, первый параметр это I2C адрес устройства, второй — число символов, третий — число строк.
LiquidCrystal_I2C(uint8_t lcd_Addr,uint8_t lcd_cols,uint8_t lcd_rows);
1 | LiquidCrystal_I2C(uint8_tlcd_Addr,uint8_tlcd_cols,uint8_tlcd_rows); |
init()
Инициализация ЖК-дисплея.
void init();
1 | voidinit(); |
backlight()
Включение подсветки дисплея.
void backlight();
1 | voidbacklight(); |
setCursor(uint8_t, uint8_t)
Установка позиции курсора.
void setCursor(uint8_t, uint8_t);
1 | voidsetCursor(uint8_t,uint8_t); |
clear()
Возвращает курсор в начало экрана.
void clear();
1 | voidclear(); |
home()
Возвращает курсор в начало экрана и удаляет все, что было на экране до этого.
void home();
1 | voidhome(); |
write(uint8_t)
Позволяет вывести одиночный символ на экран.
#if defined(ARDUINO) && ARDUINO >= 100
virtual size_t write(uint8_t);
#else
virtual void write(uint8_t);
#endif
1 |
#if defined(ARDUINO) && ARDUINO >= 100 virtualsize_twrite(uint8_t); #else virtualvoidwrite(uint8_t); #endif |
cursor()
Показывает курсор на экране.
void cursor();
1 | voidcursor(); |
noCursor()
Скрывает курсор на экране.
void noCursor();
1 | voidnoCursor(); |
blink()
Курсор мигает (если до этого было включено его отображение).
void blink();
1 | voidblink(); |
noBlink()
Курсор не мигает (если до этого было включено его отображение).
void noBlink();
1 | voidnoBlink(); |
display()
Позволяет включить дисплей.
void display();
1 | voiddisplay(); |
noDisplay()
Позволяет отключить дисплей.
void noDisplay();
1 | voidnoDisplay(); |
scrollDisplayLeft()
Прокручивает экран на один знак влево.
void scrollDisplayLeft();
1 | voidscrollDisplayLeft(); |
scrollDisplayRight()
Прокручивает экран на один знак вправо.
void scrollDisplayRight();
1 | voidscrollDisplayRight(); |
autoscroll()
Позволяет включить режим автопрокручивания. В этом режиме каждый новый символ записывается в одном и том же месте, вытесняя ранее написанное на экране.
void autoscroll();
1 | voidautoscroll(); |
noAutoscroll()
Позволяет выключить режим автопрокручивания. В этом режиме каждый новый символ записывается в одном и том же месте, вытесняя ранее написанное на экране.
void noAutoscroll();
1 | voidnoAutoscroll(); |
leftToRight()
Установка направление выводимого текста — слева направо.
void leftToRight();
1 | voidleftToRight(); |
rightToLeft()
Установка направление выводимого текста — справа налево.
void rightToLeft();
1 | voidrightToLeft(); |
createChar(uint8_t, uint8_t[])
Создает символ. Первый параметр — это номер (код) символа от 0 до 7, а второй — массив 8 битовых масок для создания черных и белых точек.
void createChar(uint8_t, uint8_t[]);
1 | voidcreateChar(uint8_t,uint8_t); |
Установка библиотеки LiquidCrystal I2C
Для работы с данным модулем необходимо установить библиотеку LiquidCrystal I2C. Скачиваем, распаковываем и закидываем в папку libraries в папке Arduino. В случае, если на момент добавления библиотеки, Arduino IDE была открытой, перезагружаем среду.
Библиотеку можно установить из самой среды следующим образом:
- В Arduino IDE открываем менеджер библиотек: Скетч->Подключить библиотеку->Управлять библиотеками…
- В строке поиска вводим «LiquidCrystal I2C», находим библиотеку Фрэнка де Брабандера (Frank de Brabander), выбираем последнюю версию и кликаем Установить.
- Библиотека установлена (INSTALLED).
UART, SPI, I2C Pins on Arduino Boards Examples
Before we start, you may be wondering, where are the UART, SPI and I2C Pins on the different Arduino boards since they are onboard peripherals. Here are some examples:
Arduino Uno Rev3 ($24.95)
- The Arduino Uno Rev 3 is a microcontroller board based on the ATmega328, an 8-bit microcontroller with 32KB of Flash memory and 2KB of RAM.
- It has 14 digital input/output pins (of which 6 can be used as PWM outputs), 6 analog inputs, a 16 MHz crystal oscillator, a USB connection, a power jack, an ICSP header, and a reset button
Seeeduino V4.2 ($6.90)
- Seeeduino V4.2 is an Arduino-compatible board, which is based on ATmga328P MCU. There’re so many Arduinos and Arduino-compatible boards in the world, and we think that compared to other Arduinos, it is much more stable, easy-to-use and even good looking.
- Seeeduino V4.2 is based the Arduino UNO bootloader, and with an ATMEGA16U2 as a UART-to-USB converter, which means that the board can basically work like an FTDI chip.
Seeeduino Nano ($6.90)
- The Seeeduino Nano is a compact board similar to the Seeeduino V4.2/Arduino UNO, and it is fully compatible with Arduino Nano on pinout and sizes.
- The same as Seeedunio V4.2, Seeeduino Nano is built around Atmega328P — 8-bit AVR microcontroller. However, the dimensions of the two are significantly different. Less than a quarter of the size, but with almost the same features, Seeeduino Nano will save more space for your project, more suitable for space-constrained scenes.
- Compared to the Arduino Nano, it has a Type C USB instead of Mini USB and also an additional Grove I2C connector.
- About Grove:
- Grove is Seeed very own modular, standardized connector prototyping system.
- Grove takes a building block approach to assemble electronics, compared to the jumper or solder based system. It is easier to connect, experiment and build and simplifies the learning system for makers.
Without further ado, let us jump right into the first communication peripheral for Arduino: UART