? lcd 16×2 i2c подключение дисплея к ардуино

Содержание

How to use it

The HardWire lib instantiates a Wire object, so that if in the code were previously used the Wire, no changes are required, except for the header, which shall be «HardWire.h» instead of «Wire.h».
When referring to the «data buffer» or «shared buffer», it is intended the buffer handled by the Wire, accessed only using the API from the Wire or HardWire library, which are the same.

Handlers

This «hardened» (or more «hardware», «hardwired») version also supports the following handlers assigned during the initialization (are listed also the official ones). Note that the use of the additional HardWire handlers is never mandatory.

Officials from original Wire

Wire.onReceive(myHandler) -> handler takes the number of bytes received and returns void. In the handler the data buffer can be read, since the master has terminated the communication

Wire.onRequest(myHandler) -> handler takes no parameters and returns void. It is called to notify the slave to prepare data to be sent using the standard Wire methods available, like read() and write()

New in the HardWire

Wire.onReceiveData(myHandler) -> handler takes as a parameter the last received byte and returns void. It is used for the slave runtime computation, but the data buffer is still filled with that byte, as the official Wire does this transparently

Wire.onReceiveDataNack(handler) -> handler takes no parameters and returns void. It is used to notify the slave, since this received byte shall not be used.

Wire.onReceiveAdx(handler) -> handler takes no parameters and returns void. The slave is notified to prepare itself to receive data in the next bus transaction, while in the official Wire it is done transparently since this mode is not exploited.

Wire.onRequestData(handler) -> handler returns a byte to be sent to the master and takes no arguments. This byte can be generated from the slave in the handler at runtime, or using the shared buffer. If not defined, the default behavior of the Wire is implemented (which automatically reads from the previously filled shared buffer).

Wire.onRequestDataNack(handler) -> handler takes no parameters and returns void. Used when the master still requires data which is not available from the shared buffer. It is done transparently in the official Wire.

Initialization

This version supports a particular mode that shall be notified in the init. If omitted, it is initialized as the normal Wire.

New in the HardWire

  • Wire.begin(slaveAddress, mode) -> join the bus as a Slave and

    -> if mode = HARD_WIRE_MODE, will be supported all the additional handlers, with an undefined (vitually infinite) number of read/write cycles, as any I2C slave device would do.

    -> if mode = NORMAL_MODE, will be supported all the additional handlers, but when the shared buffer is full, it needs to be flushed or read before accepting any new incoming byte: this behavior is the same as the Wire library.

  • Wire.addressBitMask(mask) -> takes the mask as byte or int, same format of I2C address (7 bit). Used to set which bit will be ignored by the I2C hardware when evaluating the address match. I.e.: if address is 0x09 and mask is 0x04, slave I2C will acknowledge both 0x09 and 0x0D, because the bit in the value 0x04 allow to be valid either values of the bits in the third position from the LSB (bit in third position is 0x04).

Officials from original Wire

  • Wire.begin() -> join the bus as a Master
  • Wire.begin(slaveAddress) -> join the bus as a Slave (additional HardWire handlers are still supported as in NORMAL_MODE)

Notes

When registering the Wire.onRequestData(handler) handler, the slave transmit buffer will not be utilized. This means that in slave mode, with onRequestData() registered, writing to Wire.write() will not send anything to master when the master will request. The only way to send data to master while in this mode, is to use the retuned value from onRequestData().
Reading the data from the master in this mode will stay as per Wire library. 🙂

Библиотеки датчиков ардуино

Библиотека DHT

Библиотека, которая позволяет считать данные с температурных датчиков DHT-11 и DHT-22.

#include < DHT.h>

DHT dht(DHTPIN, DHT11); – инициализирует датчик (в данном случае DHT11).

dht.begin(); – запуск датчика.

float t = dht.readTemperature(); – считывание текущего значения температуры в градусах Цельсия.

Библиотека DallasTemperature

Предназначается для работы с датчиками Dallas. Работает совместно с библиотекой OneWire.

#include <DallasTemperature.h>

DallasTemperature dallasSensors(&oneWire); – передача объекта oneWire для работы с датчиком.

requestTemperatures() – команда считать температуру с датчика и

положить ее в регистр.

printTemperature(sensorAddress); – запрос получить измеренное значение температуры.

Библиотека Ultrasonic

Обеспечивает работу Ардуино с ультразвуковым датчиком измерения расстояния HC-SR04.

#include <Ultrasonic.h>

Ultrasonic ultrasonic (tig , echo) – объявление объекта, аргументы – контакт Trig и контакт Echo.

dist = ultrasonic.distanceRead(); – определение расстояния до объекта. Агрумент – сантиметры(СМ) или дюймы (INC).

Timing() – считывание длительности импульса на выходе Echo, перевод в необходимую систему счисления.

Библиотека ADXL345

Предназначается для работы с акселерометром ADXL345.

Пример использования:

#include <Adafruit_ ADXL345.h>

ADXL345_ADDRESS – создание объекта, указание его адреса.

ADXL345_REG_DEVID  – идентификация устройства.

ADXL345_REG_OFSX – смещение по оси Х.

ADXL345_REG_BW_RATE – управление скоростью передачи данных.

Библиотека BME280

Предназначается для работы с датчиком температуры, влажности и давления BME280.

Пример использования:

#include <Adafruit_BME280.h>

BME280_ADDRESS  – создание объекта BME280, указание его адреса.

begin(uint8_t addr = BME280_ADDRESS); – начало работы датчика.

getTemperature – получение измеренной температуры.

getPressure – получение измеренного давления.

Библиотека BMP280

Требуется для работы с датчиком атмосферного давления BMP280.

Пример использования:

#include <Adafruit_BMP280.h>

BMP280_CHIPID – создание экземпляра, указание его адреса.

getTemperature(float *temp); – получение измеренной температуры.

getPressure(float *pressure); – получение измеренного значения давления.

Библиотека BMP085

Требуется для работы с датчиком давления BMP085.

Пример использования:

#include <Adafruit_BMP085.h>

Adafruit_BMP085 bmp; – создание экземпляра BMP085.

dps.init(MODE_ULTRA_HIGHRES, 25000, true); – измерение давления, аргумент 25000 – высота над уровнем моря (в данном случае 250 м. над уровнем моря).

dps.getPressure(&Pressure); – определение давления.

Библиотека FingerPrint

Требуется для работы со сканером отпечатков пальцев.

Пример использования

#include <Adafruit_Fingerprint.h>

Adafruit_Fingerprint finger = Adafruit_Fingerprint(&mySerial); – объявление объекта Finger. Параметр – ссылка на объектр для работы с UART, кокторому подключен модуль.

finger.begin();  – инициализация модуля отпечатков пальцев.

Func_sensor_communication(); – вызов модуля отпечатков пальцев.

Термометр через последовательный монитор

Чтобы отобразить данные на последовательном мониторе, подключите датчик DS18B20 к Arduino, используя перемычки и макет, и не забудьте подключить или припаять резистор 4.7k между контактом 2 и 3 датчика.

Затем скачайте, откройте и загрузите файл .ino, который называется — DS18B20_Serial, ниже.

Если все в порядке, вы должны увидеть измеренную температуру на серийном мониторе Arduino IDE.

#include <OneWire.h>
#include <DallasTemperature.h>
 
// Провод данных подключен к контакту 2 на Arduino
#define ONE_WIRE_BUS 2
 
// Настройка oneWire для связи с любыми устройствами OneWire 
// (не только Maxim/Dallas температурные IC)
OneWire oneWire(ONE_WIRE_BUS);
 
DallasTemperature sensors(&oneWire);
 
void setup(void)
{
  // Старт серийного порта
  Serial.begin(9600);
  Serial.println("Dallas Temperature IC демо");

  // Запуск библиотеки
  sensors.begin();
} 
 
void loop(void)
{
  // запрашиваем sensor.requestTemperatures() для получения глобальной температуры
  // запрос всех устройств на шине
  Serial.print(" Запрашиваем температуру...");
  sensors.requestTemperatures(); // Отправляем команды для получения температуры
  Serial.println("DONE");

  Serial.print("Температура: ");
  Serial.print(sensors.getTempCByIndex(0)); // Почему "byIndex"? 
    // У вас может быть несколько IC на одной шине. 
    // 0 относится к первой IC
    delay(1000);
}

Внутри ATmega328

В основе данного подраздела лежит техническое описание на ATmega328 версии Rev. 8271C – 08/10. Приводимые мной страницы могут немного отличаться от текущей версии.

Для полного понимания кода библиотеке , нам необходимо понимать, что ей нужно сделать с микроконтроллером, чтобы его настроить.

Просмотр технического описания на микроконтроллер показывает нам, как работает двухпроводная (Two Wire) система. Стоит отметить:

Микроконтроллер включает в себя аппаратный модуль TWI, который обрабатывает связь через шину I2C. … Интересно, что это означает, что связь не обрабатывается библиотекой исключительно программно, как вы могли бы подумать! Другими словами, библиотека сама в программе не создает битовый поток. Библиотека взаимодействует с аппаратным компонентом, который выполняет тяжелую работу. Смотрите страницу 222 технического описания.
«AVR TWI работает с байтами и основывается на прерываниях…» (раздел 21.6 на странице 224)

Это ключевой момент; это означает, что
вы настраиваете регистры;
вы позволяете TWI модулю осуществлять связь;
вы можете делать в это время что-то еще; ваш микроконтроллер с тактовой частотой 16 МГц не занят управлением последовательной связью на 100 кГц;
TWI модуль вызывает прерывание, когда заканчивает работу, чтобы уведомить процессор об изменениях состояния (включая успешность операций и/или ошибки).

Однако обратите внимание, что библиотека блокирует ввод/вывод. Это означает, что он переходит в цикл ожидания и ждет завершения связи I2C

Ваше приложение не может ничего делать, пока модуль TWI общается по шине I2C. Обратите внимание, что это может быть не то, чего бы вы хотели: если ваша программа критична ко времени, то ваш 16-мегагерцовый процессор, застрявший в цикле ожидания и ждущий 100-килогерцового потока связи, будет не эффективен. Возможно, вам лучше написать собственный код I2C. В исходном коде avr-libc есть пример в ./doc/examples/twitest/twitest.c (смотрите http://www.nongnu.org/avr-libc/). Вы можете найти версию avr-libc, используемую вашей конкретной IDE Arduino, посмотрев файл versions.txt в каталоге установки Arduino IDE. Это будет где-то в Java/hardware/tools/avr. На Mac полный путь будет следующим /Applications/Arduino.app/Contents/Resources/Java/hardware/tools/avr/versions.txt; путь у вас будет другим, но схожим.

Пример

/* Пример записи и чтения данных в I2C - EEPROM "AT24C32" */

// #include <Wire.h> // заменяем Wire.h на microWire.h
#include <microWire.h>

uint8_t chipAddress = 0x57; // адрес устройства (используйте i2c scaner для определения)
uint16_t cellAddress = 3064; // адрес первой ячейки , куда будем писать и откуда читать
uint8_t data_0 = 115; // данные , которые запишем в EEPROM ( сравнивайте с этим числом при чтении )
uint8_t data_1 = 14;

void setup() {
  Serial.begin(9600);
  Wire.begin();

  /* запись */
  Wire.beginTransmission(chipAddress);  // начинаем передачу с устройством , зовем по адресу
  Wire.write(highByte(cellAddress));    // отправляем старший байт первой адреса ячейки
  Wire.write(lowByte(cellAddress));     // отправляем младший байт первой адреса ячейки
  Wire.write(data_0);                   // отпарвляем байт данных
  Wire.write(data_1);                   // отпарвляем еще байт данных
  Wire.endTransmission();               // завершаем передачу

  delay(50);                            // подождем

  /* чтение */
  Wire.beginTransmission(chipAddress);  // начинаем передачу с устройством , зовем по адресу
  Wire.write(highByte(cellAddress));    // отправляем старший байт адреса  первой ячейки
  Wire.write(lowByte(cellAddress));     // отправляем младший байт адреса  первой ячейки
  Wire.endTransmission();               // завершаем передачу
  Wire.requestFrom(chipAddress , 2);    // запрашиваем свои 2 байта данных
  while (Wire.available()) {            // пока запрошенные данные не кончились
    Serial.println(Wire.read());        // читаем и выводим их
  }
}

void loop() {
}

Русификация LCD 1602 I2C дисплея

Перед загрузкой следующего скетча, необходимо установить библиотеку LCD_1602_RUS.h для русификации дисплея 1602 Ардуино. Архив с библиотекой можно скачать на нашем сайте на странице — Библиотеки для Ардуино. После установки библиотеки из архива загрузите в микроконтроллер небольшой пример с кодом для LCD, который значительно упростит для вас вывод кириллицы на дисплей.

Скетч с библиотекой LCD_1602_RUS.h

#include <Wire.h> // библиотека для управления устройствами по I2C 
#include <LCD_1602_RUS.h> // подключаем библиотеку LCD_1602_RUS

LCD_1602_RUS LCD(0x27,16,2); // присваиваем имя LCD для дисплея

void setup() {
   LCD.init(); // инициализация LCD дисплея
   LCD.backlight(); // включение подсветки дисплея
   
   LCD.setCursor(2,0); // ставим курсор на 3 символ первой строки
   LCD.print("РУСИФИКАЦИЯ!"); // печатаем символ на первой строке
}

void loop() {
 
}

Обращение к устройствам типа 1-Wire

Каждое устройства типа 1-Wire обладает уникальным 64-битным ROM-адресом, который состоит из 8-битного кода, обозначающего семейство, 48-битного серийного кода и 8-битного CRC. CRC используется для проверки целостности данных. К примеру, код ниже проверяет, является ли устройство, к которому обращается скетч, температурным датчиком DS18S20 – путем проверки кода, обозначающего семейство, т.е. «0x10». Чтобы использовать этот скетч с более новым DS18B20, вам нужно будет указать проверку по коду «0x28», а если с DS1822, то по коду «0x22».

Команды к одному устройству

Перед тем, как отправлять команду к одному устройству, ведущее устройство должно выбрать адресата при помощи его уникального ROM-адреса. Если это устройство будет обнаружено, то все последующие команды тоже будут отправлены к нему.

Команды к нескольким устройствам

Вы также можете отправить команду сразу всем ведомым устройствам, воспользовавшись командой 0xCC (она означает «Skip ROM» или «пропустить ROM-адрес»)

Впрочем, перед использованием важно знать, какие эффекты это может повлечь. Иногда это очень удобный метод – к примеру, если дать команду 0xCC, а следом за нею 0x44 (она означает «Convert T» или «выполнить температурную конверсию»), то все устройства в сети начнут выполнять, собственно, температурную конверсию

То есть в данном случае использование 0xCC может сберечь вам немного времени. С другой стороны, если воспользоваться командой 0xBE (она означает «Read Scratchpad» или «прочитать данные из оперативной памяти»), то все девайсы в сети начнут одновременно передавать эти данные ведущему устройству. Также при использовании «Skip ROM» нужно учитывать энергопотребление всех устройств, подключенных к сети (это актуально, к примеру, в случае температурной конверсии).

Питание устройств типа 1-Wire

Питание чипа можно обеспечить двумя способами. Первый (его называют «паразитическим» питанием) – это когда к чипу подключено всего два провода. Второй – это когда к этим двум проводам добавляется еще один, через который, собственно, и осуществляется питание. В ряде случаев второй способ более надежен. Однако новичкам (особенно в ситуациях, когда расстояние между Arduino и чипом составляет не более 6 метров) лучше начать с использования паразитического питания. Код ниже работает с обоими способами.

Паразитическое питание

В этом режиме для питания чипа нужно только два провода – один для передачи данных, а другой для заземления. То есть, согласно даташиту, заземляется как раз линия, которая обычно используется для питания.

Со стороны ведущего устройства к шине 1-Wire должен быть подключен подтягивающий резистор на 4,7 кОм. Когда эта линия будет переключена в состояние HIGH, устройство начнет тянуть ток, чтобы зарядить внутренний конденсатор.

Сила тока, передаваемого таким способом, как правило, невелика, но при температурной конверсии или записи на EEPROM может достигать 1,5 миллиампер. Когда ведомое устройство выполняет одну из этих операций, контроллер шины должен держать шину в состоянии HIGH, пока эта операция не будет выполнена. При температурной конверсии для DS12S20 требуется задержка в 750 миллисекунд, причем контроллер в течение этого времени не может делать ничего – ни давать команды другим устройствам, ни опрашивать ведомое устройство о выполнении команды. В библиотеку OneWire тоже встроена поддержка этой особенности – она позволяет держать шину в состоянии HIGH после записи данных.

Обычное питание (с использованием внешнего источника)

Если вы хотите запитать чип от внешнего источника, для этого потребуется три провода: один для передачи данных, один для заземления и один для, собственно, питания. Для этого способа по-прежнему нужен подтягивающий резистор на 4,7 кОм, подключенный к шине 1-Wire. Поскольку теперь шина свободна для передачи данных, микроконтроллер может постоянно опрашивать девайс на предмет того, как происходит процесс конверсии. Таким образом, запрос на конверсию можно выполнить сразу после того, как устройство отчитается о выполненной операции – в отличие от паразитического питания, когда вам приходится ждать, пока будет выполнена конверсия (продолжительность этой задержки зависит от функции устройства и его разрешения).

Примечание по резисторам

Согласно даташиту ATmega328/168, для этого микроконтроллера нужны резисторы от 1,6 кОм, однако несколько пользователей обнаружили, что для больших сетей лучше использовать резисторы меньшего номинала.

Другими словами, для больших сетей имеет смысл попробовать резисторы поменьше.

Basic Usage

OneWire

Create the OneWire object, using a specific pin. Even though you can connect
many 1 wire devices to the same pin, if you have a large number, smaller groups
each on their own pin can help isolate wiring problems. You can create
multiple OneWire objects, one for each pin.

search

Search for the next device. The addrArray is an 8 byte array. If a device is
found, addrArray is filled with the device’s address and true is returned. If
no more devices are found, false is returned.

reset_search

Begin a new search. The next use of search will begin at the first device.

reset

Reset the 1-wire bus. Usually this is needed before communicating with any device.

select

Select a device based on its address. After a reset, this is needed to
choose which device you will use, and then all communication will be with
that device, until another reset.

skip

Skip the device selection. This only works if you have a single device, but you
can avoid searching and use this to immediatly access your device.

write

Write a byte.

write

Write a byte, and leave power applied to the 1 wire bus.

read

Read a byte.

crc8

Compute a CRC check on an array of data.

Использование

// Дефайны настроек (перед подключением библиотеки)
#define DS_TEMP_TYPE [float / int]          // Тип данных для температуры (точность / экономия flash) (По умолч. float)
#define DS_CHECK_CRC [true / false]         // Проверка подлинности принятых данных (По умолч. true)
#define DS_CRC_USE_TABLE [true / false]     // Использовать таблицу для CRC. Быстрее, но +256 байт flash (<1мкс VS ~6мкс) (По умолч. false)

// Методы
void setAddress(uint8_t *addr);             // установить (сменить) адрес
void setResolution(uint8_t resolution);     // Установить разрешение термометра 9-12 бит
void readAddress(uint8_t *addressArray);    // Прочитать уникальный адрес термометра в массив
void requestTemp(void);                     // Запросить новое преобразование температуры
uint16_t getRaw(void)                       // Прочитать "сырое" значение температуры
[int/float] getTemp(void);                  // Прочитать значение температуры
[int/float] calcRaw(uint16_t data);         // Преобразовать "сырое" значение в температуру
[int/float] - настраивается дефайном. По умолчанию float

// внешние функции
int DS_rawToInt(uint16_t data);             // преобразовать raw данные в температуру int
float DS_rawToFloat(uint16_t data);         // преобразовать raw данные в температуру float

// Время преобразования от точности
точность | время
12 бит   | 750 мс
11 бит   | 375 мс
10 бит   | 187 мс
9 бит    | 93 мс

Объяснение программы для ведомой (Slave) платы Arduino

1. Как и в ведущей плате, первым делом в программе мы должны подключить библиотеку Wire для задействования возможностей протокола I2C и библиотеку для работы с ЖК дисплеем. Также нам необходимо сообщить плате Arduino к каким ее контактам подключен ЖК дисплей.

Arduino

#include<Wire.h>
#include<LiquidCrystal.h>
LiquidCrystal lcd(2, 7, 8, 9, 10, 11);

1
2
3

#include<Wire.h>    
#include<LiquidCrystal.h>      

LiquidCrystallcd(2,7,8,9,10,11);

  1. В функции 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
2

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
2
3
4
5
6
7

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
2
3
4
5
6

voidrequestEvent()

{

intpotvalue=analogRead(A0);

byteSlaveSend=map(potvalue,,1023,,127);

Wire.write(SlaveSend);

}

Для события приема:

Эта функция будет выполняться когда ведущий будет передавать данные ведомому с адресом 8. Эта функция считывает принятые значения от ведущего и сохраняет ее в переменной типа byte.

Arduino

void receiveEvent (int howMany)
{
SlaveReceived = Wire.read();
}

1
2
3
4

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
2
3
4
5
6
7
8
9
10
11
12

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 любых датчиков, работающих по данному протоколу.

Общие сведения:

Многие скетчи (программы) работают с библиотеками. Библиотека облегчает работу с определённым модулем или одним из типов модулей. Например, если Вы хотите вывести текст на LCD дисплей без подключения библиотеки, то Вам нужно передать ему несколько байт команд и данных, что займет несколько строк кода, а главное, что Вам нужно знать тип микроконтроллера под управлением которого работает LCD дисплей, назначение команд которыми он управляется, знать архитектуру его памяти, адреса и назначение регистров, для чего потребуется найти и перечитать его datasheet. В то время как при написании кода с использованием библиотеки (например LiquidCrystal_I2C.h) Вы сможете вывести текст на дисплей вызвав всего одну функцию библиотеки: lcd.print(«my text»);

Перед тем как начать пользоваться методами и функциями библиотеки, её нужно скачать (загрузить на Ваш компьютер), установить (разместить в нужной папке) и подключить (вставить текст «#include » в скетч).

Функции

  • OneWire myWire(pin)
    

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

  • myWire.search(addrArray)
    

    Ищет следующее устройство. Массив addrArray – это массив из 8 байтов. Если устройство обнаружено, addrArray заполняется адресом этого устройства, после чего функция возвращает true. Если больше устройств не найдено, функция возвращает false.

  • myWire.reset_search()
    

    Начинает новый поиск. Следующее использование поиска начнется на первом устройстве.

  • myWire.reset()
    

    Делает сброс шины 1-Wire. Как правило, это нужно перед коммуникацией с каким-либо устройством.

  • myWire.select(addrArray)
    

    Выбирает устройство, чей адрес указан в скобках. Нужна после сброса – чтобы выбрать устройство, которое нужно использовать. Последующая коммуникация будет именно с этим устройством, но до нового сброса.

  • myWire.skip()
    

    Пропускает выбор устройства. Это работает лишь тогда, когда подключено лишь одно устройство, то есть вы можете не использовать поиск, а сразу получить доступ к своему устройству.

  • myWire.write(num)
    

    Записывает байт.

  • myWire.write(num, 1)
    

    Записывает байт и оставляет включенным паразитное питание, подключенное к шине 1-Wire.

  • myWire.read()
    

    Считывает байт.

  • myWire.crc8(dataArray, length)
    

    Рассчитывает проверочный CRC для массива данных.