Библиотека Arduino TFT и UTFT

Я пытаюсь протестировать модуль 3.2″inch TFT LCD (с контроллером SSD1289 и совместимым контроллером сенсорной панели ADS7843) с библиотекой UTFT .

Эта библиотека поддерживает TFT (перечисленные в PDF) и Arduino Леонардо .

После подключения в соответствии с описанием и запуска тестового приложения из этой библиотеки ничего не происходит. Я имею в виду, что часть TFT работает, но она светло-голубая, и нет никаких графиков из примера кода.

  1. Как проверить ревизию TFT (REBA или REVB)?
  2. Как мне его подключить? Я не уверен в нижеприведенных связях. TFT — > Леонардо

  3. Как мне инициализировать эту библиотеку и заставить ее работать?

Я попробовал с:

Я всегда получаю одни и те же эффекты, светло-голубой экран и никаких графиков из примера кода.

arduinoMarcin Kasiński     30 мая 2013 в 07:12

2 ответа

  • Использование 2.4″ MCUFriend TFT ЖК-дисплея с Arduino

    Я надеюсь, что кто-то знаком с 2.4-дюймовым TFT-ЖК-дисплеем от MCUFriend. У меня возникли проблемы с использованием этой платы с моим Arduino Uno, и я надеялся, что кто-то может помочь. Проблема, с которой я сталкиваюсь, заключается в том, что все эти цветные линии рисуются на экране после сброса…

  • Заставить кнопку сделать что-то на сенсорном экране Arduino TFT

    Итак, у меня есть Arduino MEGA2560 и сенсорный экран TFT shield. Я использовал один из примеров, чтобы сделать 2 кнопки для отображения на экране, просто используя drawRect() . Но как заставить эти 2 коробки что-то делать, когда я нажимаю на них? Я знаю координаты этих двух коробок, так как же мне…

используйте контроллер SSD1289 :

как описано в примерах библиотеки UTFT:

ekim     02 августа 2017 в 18:25

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

Сигнал LED_A такой же, как и LED_BL (A= анод подсветки LEDs, BL=Подсветка, я думаю). RD-это сигнал «read»-вы никогда не будете читать с LCD, поэтому его нужно подтянуть до цифрового максимума-похоже, что для Леонардо это будет 5 В, если предположить, что другие цифровые контакты 5 В.

Я бы рекомендовал «REVB», что на самом деле означает 8-битный режим. Итак, если вы подключили его, как рекомендовано в файле UTFT «UTFT_Requirements.pdf», вы должны использовать:

UTFT myGLCD(ELEE32_REVB,A5,A4,A3,A2);

Обязательно подключите DB0-DB7, как описано зеленым цветом на странице 4.

Надеюсь, это поможет!

bobwki     03 июня 2013 в 15:32 воспроизведение видео на tft ЖК-экране, подключенном к arduino uno, с камеры, которая также подключена к тому же arduino uno

Можно ли воспроизводить живое видео на tft-ЖК-экране, подключенном к arduino uno, с камеры, которая также подключена к тому же arduino uno? Если это невозможно с arduino uno, возможно ли это с…

Arduino: можно импортировать библиотеку в ino, но не в C++

Я пытаюсь использовать библиотеку UTFT в Arduino. Если я работаю с одним файлом .ino и включаю туда библиотеку, то все работает нормально, вот так: example.ino #include UTFT…

Последовательная связь Xbee и Arduino

У меня есть LCD, подключенный к Arduino, который отображает изображения, и изображение отображается на серийном номере, если к нему прикоснуться. Я хочу отправить данные, записанные на…

Использование 2.4″ MCUFriend TFT ЖК-дисплея с Arduino

Я надеюсь, что кто-то знаком с 2.4-дюймовым TFT-ЖК-дисплеем от MCUFriend. У меня возникли проблемы с использованием этой платы с моим Arduino Uno, и я надеялся, что кто-то может помочь. Проблема, с…

Заставить кнопку сделать что-то на сенсорном экране Arduino TFT

Итак, у меня есть Arduino MEGA2560 и сенсорный экран TFT shield. Я использовал один из примеров, чтобы сделать 2 кнопки для отображения на экране, просто используя drawRect() . Но как заставить эти…

2.4-дюймовый TFT LCD SPFD5408 с Arduino Uno-touch не работает

Я могу получить все образцы для компиляции по этой ссылке: http://www.instructables.com/код/How-to-use-24-inch-TFT-LCD-SPFD5408-with-Arduino-U По какой-то причине часть сенсорного экрана не работает…

ESP8266 Arduino 2.2 TFT ILI9341

Недавно я получил один TFT LCD от aliexpress, который поддерживает SPI и использует ILI9341. Это тот самый. ТТТ ILI9341 У меня есть плата ESP8266 EspressoLite 1, и я использую ESP8266 Arduino. (…

Как начать работу с ARM STM32 и GUI на дисплее TFT

Я только что купил их себе : STM32 ARM Cortex-M3 STM32F107VCT6 Development Board + 3.2 TFT LCD ULINK2 USB JTAG Emulator support MDK4.54 ARM7 Cortex Keil Debug Adapter Я хочу сделать простое…

Проблемы наследования в arduino c++

У меня возникли проблемы с унаследованными методами в определениях классов в среде Arduino. У меня есть базовый класс portal , который наследуется от класса gauge , а затем meter наследуется от…

В чем разница между драйвером TFT LCD и контроллером TFT LCD

я выбрал два дисплея 1) https:/ / www.buydisplay.com / по умолчанию/lcd-5-ssd1963-tft-module-touch-screen-display-800×480-mcu-arduino 2) https://www.buydisplay.com/по…

Описание

Данный дисплей представляет из себя ЖК монитор с диагональю 3,5 дюйма. Основная задача дисплея — работа с простой графикой (рисование фигур, текста, линий), однако, также предусмотрен вывод на дисплей полноцветных фотографий и анимации. Данный дисплей выполнен в форм-факторе шилда для контроллеров линеек UNO, Mega, Leonardo, Due, что представляет дополнительное удобство в подключении.

На плате также расположен разъём для размещения SD-карт памяти, таким образом данный дисплей совмещает в себе три устройства — экран, шилд и модуль карт памяти.

Технические характеристики

  • Рабочее напряжение: 5 В
  • Потребляемый ток: 300 мА
  • Диагональ: 3,5'
  • Разрешение: 320 х 480
  • Тип карты памяти: microSD
  • Максимальный объём карты памяти: 32 Гб
  • Модель контроллера экрана: ILI9481 (8 бит)

Физические размеры

  • Модуль с дисплеем и выводами (Д х Ш х В): 86 х 56 х 14 (мм)

Плюсы использования

  • Удобство подключения к контроллерам в качестве шилда
  • Наличие разъёма для подключения карт памяти

Минусы использования

  • Невозможность подключения к маленьким контроллерам напрямую

Библиотеки для работы с дисплеем

  • Скачать Графическое ядро
  • Скачать библиотеку для работы с дисплеем

Пример подключения и использования

Пример: В примере иллюстрируются основные возможности по выводу информации на дисплей с использованием контроллера Smart UNO. Дисплей подключается к контроллеру в качестве шилда.

Для этого нам понадобится:

Что нужно: Кол-во, шт
Контроллер 1
Дисплей 1

Пример кода:

#include     // Ядро графической библиотеки #include  // Специфика аппаратного обеспечения #include    // Специфика работы с разными чипами   // Ассоциируем шестнадцатиричные значения цветов в удобочитаемый вид #define BLACK   0x0000 // черный #define BLUE    0x001F // синий #define RED     0xF800 // красный #define GREEN   0x07E0 // зелёный #define CYAN    0x07FF // голубой #define MAGENTA 0xF81F // малиновый #define YELLOW  0xFFE0 // жёлтый #define WHITE   0xFFFF // белый   MCUFRIEND_kbv tft; //инициализация объекта дисплея   void setup(void) {     tft.reset(); //сброс дисплея     uint16_t identifier = tft.readID(); //чтение идентификатора чипа   tft.begin(identifier); //инициализация дисплея   tft.invertDisplay(true); //установка чёрной подсветки для ILI9481 }   void loop(void) { for(uint8_t rotation= ; rotation<</span>4; rotation++) { //попеременно установка поворота дисплея       tft.setRotation(rotation); //установить поворот       //Заливка дисплея цветами     tft.fillScreen(BLACK); //черным     tft.fillScreen(RED); //красным     tft.fillScreen(GREEN); //зелёным     tft.fillScreen(BLUE); //синим     tft.fillScreen(BLACK); //снова черным       //Написание текста     tft.setCursor( ,  ); //установить курсор в позицию 0,0 (левый верхний угол)     tft.setTextColor(WHITE); //установка цвета текста (белый)      tft.setTextSize(1); //установка размера текста     tft.println("Hello World!"); //вывести надпись       //Вывод числовых значений     tft.setTextColor(YELLOW); //установить цвет текста     tft.setTextSize(2); //установить размер текста     tft.println(1234.56); //вывести число       //Вывод шестнадцатиричного значения     tft.setTextColor(RED); //цвет текста (красный)         tft.setTextSize(3); //размер текста     tft.println(0x9876BEEF, HEX); //вывод значения     tft.println(); //вывод пустой строки       //Надписи разным шрифтом      tft.setTextColor(GREEN); //установка цвета текста     tft.setTextSize(5); //размер текста     tft.println("Display"); //надпись     tft.setTextSize(3); //размер текста     tft.println("SmartElements"); //надпись     tft.setTextColor(BLUE); //цвет текста     tft.setTextSize(3); //размер текста     tft.println("Visit our"); //надпись     tft.setTextColor(BLUE); //цвет текста     tft.setTextSize(2); //размер текста     tft.println("ofificial store:"); //надпись     tft.setTextColor(CYAN); //цвет текста     tft.setTextSize(2); //размер текста     tft.println("smartelements.ru"); //надпись       delay(5000); //задержка 5 секунд       //Начертить линию     tft.fillScreen(BLACK); //дисплей залить черным //           х1     у1   х2    у2  цвет     tft.drawLine( ,  ,  , 100, GREEN); //нарисовать линию от точки 1 и точки 2, цвет     tft.drawLine( , 100, 100, 100, RED); //нарисовать линию от точки 1 и точки 2, цвет     tft.drawLine(100, 100, 100,  , BLUE); //нарисовать линию от точки 1 и точки 2, цвет     tft.drawLine(100,  ,  ,  , MAGENTA); //нарисовать линию от точки 1 и точки 2, цвет       delay(5000); //задержка 5 секунд       //Быстрые линии (на всю длину или высоту)     tft.fillScreen(BLACK); //дисплей залить черным //5 горизонтальных линий int w = tft.width();     tft.drawFastHLine( ,  , w, GREEN);     tft.drawFastHLine( , 5, w, GREEN);     tft.drawFastHLine( , 10, w, GREEN);     tft.drawFastHLine( , 15, w, GREEN);     tft.drawFastHLine( , 20, w, GREEN);       //5 вертикальных линий int h = tft.height();     tft.drawFastVLine( ,  , h, RED);     tft.drawFastVLine(5,  , h, RED);     tft.drawFastVLine(10,  , h, RED);     tft.drawFastVLine(15,  , h, RED);     tft.drawFastVLine(20,  , h, RED);       delay(5000); //задержка 5 секунд       //Рисование квадрата     tft.fillScreen(BLACK); //дисплей залить черным     tft.drawRect( ,  , 100, 100, YELLOW); //пустой квадрат из точки (0, 0) со сторонами 100 пикселей     tft.fillRect( , 120, 100, 200, CYAN); //заполненный прямоугольник из точки (0, 120) со сторонами по Х - 100, по У - 200       delay(5000); //задержка 5 секунд       //Рисование кругов     tft.fillScreen(BLACK); //дисплей залить черным     tft.fillCircle(100, 100, 50, BLUE); //залитый круг радиусом 50 пикселей из точки (100, 100)     tft.drawCircle(100, 100, 100, WHITE); //пустой круг радиусом 100 пикселей из точки (100, 100)       delay(5000); //задержка 5 секунд       //Рисование треугольников     tft.fillScreen(BLACK); //дисплей залить черным     tft.fillTriangle( //нарисовать заполненный треугольник 100 ,  , // верхняя точка 50, 100, // нижняя левая 150, 100, // нижняя правая         tft.color565(65, 122, 23)); //залить цветом по схеме RGB     tft.drawTriangle( 100,  , // верхняя точка  , 100, // нижняя левая 200, 100, // нижняя правая         tft.color565( ,  , 255)); //залить цветом по схеме RGB       delay(5000); //задержка 5 секунд     } }

Главная Программирование AVR AVR Урок 34. Дисплей TFT 240×320 8bit. Часть 1

&nbsp

&nbsp

&nbsp

Урок 34

Часть 1

Сегодня мы вернёмся к Atmega8, так как что-то у меня случилось с моей Atmega328. Но для наших задач нам вполне подойдёт и восьмая серия.

Сегодня мы попробуем подключить к нашему контроллеру дисплей уже графический цветной разрешением 320 на 240 точек, управляемый по восьмибитному параллельному интерфейсу, Дисплей выполнен с помощью модуля и управляется контроллером ILI9341.

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

Вот перечень режимов подключения

image

Включить тот или иной режим удаётся благодаря упралению уровнем на ножках IM3:IM0.

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

Судя по технической документации, контроллер ILI9341 может управлять 262000 разновидностями цветов.

Вот схема подключения дисплея к контроллеру

image

А вот так схема выглядит на практике

Мы видим также простенький стабилизатор, висящий на проводках, состоящий из микросхемы и конденсатора. Данный стабилизатор служит для подачи питания 3,3 вольта на модуль дисплея, так как такое напряжение для него также требуется. Некоторую информацию, возвращённую из контроллера дисплея мы будем отслеживать с помощью символьного дисплея 20х4, подключенного по интерфейсу i2c, который также мы видим на картинке.

А вот так выглядит модуль дисплея снизу

Мы видим ещё на борту данного модуля картоприёмник для карты Micro SD, которая подключается по интерфейсу SPI.

Также мы видим, что все контакты у дисплея подписаны, поэтому с подключением, я думаю сложностей не возникнет.

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

LCD_RST – ножка для перезагрузки дисплея;

LCD_CS – Chip Select (выбор), активный уровень низкий;

LCD_RS – данные/команда, для передачи данных высокий уровень, для передачи команды – низкий;

LCD_WR – включение режима записи, активный уровень низкий;

LCD_RD – включение режима чтения, активный уровень низкий;

GND – общий провод;

5V – питание 5 вольт;

3V3 – питание 3,3 вольта;

LCD_D0:LCD_D7 – параллельная 8-разрядная шина данных.

Управление контроллером дисплея происходит посредством команд или другими словами отправкой в определённый регистр определённых величин. В технической документации очень подробно расписаны все регистры, причём есть и краткий перечень команд регистров, а есть и подробный для каждой команды. Техническая документация на контроллер ILI9341 прикреплена внизу данной страницы. Сначала мы отправляем адрес регистра, а затем шлём параметры команды. Причём количество параметров в различных командах также различается, что накладывает некоторые трудности для создания универсальной функции отправки команды. Но ничего, что-нибудь придумаем.

У нас создан проект TFT9341. Проект вполне стандартный, подключены к нему наши библиотек, написанные на прошлых занятиях – это twi и lcdtwi.

Также мы создадим и подключим к проекту ещё 2 файла для библиотеки уже непосредственно нашего нового дисплея – это файлы ili9341.h и ili9341.c.

Вот так выглядит главный заголовочный файл main.h

#ifndef

MAIN_H_

#define

MAIN_H_

#define

F_CPU

16000000UL

#include

#include

#include

#include

#include

#include

#include

#include

«twi.h»

#include

«lcdtwi.h»

#include

«ili9341.h»

#endif

/* MAIN_H_ */

В файле ili9341.h подключим

#ifndef

ILI9341_H_

#define

ILI9341_H_

#include

#include

#include

«main.h»

#include

«twi.h»

#include

«lcdtwi.h»

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

В файле ili9341.c подключим заголовочный файл и напишем каркас для функции инициализации дисплея

#include

«ili9341.h»

//————————————————————–

void

TFT9341_ini

(

void

)

{

}

Не забываем на данную функцию добавить прототип в хедер-файле, а также напишем некоторые макроподстановки, которые нам потребуются в процессе работы с дисплеем

#include

«lcdtwi.h»

#define

swap

(a,b)

{

int16_t

t=a;a=b;b=t;}

#define

DATA_DDR

DDRD

#define

DATA_PORT

PORTD

#define

DATA_PIN

PIND

#define

COMMAND_DDR

DDRB

#define

COMMAND_PORT

PORTB

#define

LCD_CS

2

//Chip Select

#define

LCD_CD

1

//Command/Data

#define

LCD_WR

3

//LCD Write

#define

LCD_RD

4

//LCD Read

#define

LCD_RESET

//LCD Reset

#define

RESET_IDLE

COMMAND_PORT

|=(1<<</font>

LCD_RESET

)

#define

CS_IDLE

COMMAND_PORT

|=(1<<</font>

LCD_CS

)

#define

WR_IDLE

COMMAND_PORT

|=(1<<</font>

LCD_WR

)

#define

RD_IDLE

COMMAND_PORT

|=(1<<</font>

LCD_RD

)

#define

RESET_ACTIVE

COMMAND_PORT

&=~(1<<</font>

LCD_RESET

)

#define

CS_ACTIVE

COMMAND_PORT

&=~(1<<</font>

LCD_CS

)

#define

WR_ACTIVE

COMMAND_PORT

&=~(1<<</font>

LCD_WR

)

#define

RD_ACTIVE

COMMAND_PORT

&=~(1<<</font>

LCD_RD

)

#define

CD_COMMAND

COMMAND_PORT

&=~(1<<</font>

LCD_CD

)

#define

CD_DATA

COMMAND_PORT

|=(1<<</font>

LCD_CD

)

#define

BLACK

0x0000

#define

BLUE

0x001F

#define

RED

0x0F800

#define

GREEN

0x07E0

#define

CYAN

0x07FF

#define

MAGENTA

0xF81F

#define

YELLOW

0xFFE0

#define

WHITE

0xFFFF

#define

setReadDir

()

DATA_DDR

=0x00

#define

setWriteDir

()

DATA_DDR

=0xFF

#define

WR_STROBE

{

WR_ACTIVE

;

WR_IDLE

;}

void

TFT9341_ini

(

void

);

#endif

/* ILI9341_H_ */

Я думаю, назначение каждого макроса объяснять нет смысла, так как всё ясно из наименований. Но если вдруг кому-то что-то непонятно, то посмотрите видеоурок, кликнув по картинке внизу страницы, там объяснение более подробное.

В следующей части нашего занятия мы попытаемся написать ещё некоторые важные функции для работы с контроллером дисплея, а также считать его идентификатор, что позволит нам убедиться, что мы работаем именно с таким контроллером.

Техническая документация на контроллер дисплея ILI9341

Программатор и символьный дисплей LCD 20×4 можно приобрести здесь:

Программатор (продавец надёжный) USBASP USBISP 2.0

Дисплей LCD 20×4

Смотреть ВИДЕОУРОК (нажмите на картинку)

Главная » Arduino » Дисплей 3.5 480х320 драйвер ILI9486 16бит для Arduino MEGA Модель: LCD_3.5_480x320_Arduino_Mega Наличие: Есть в наличии Цена: 355 грн *Цена и наличие актуальны на 03.07.2021 Количество:     — или —   в закладки сравнение   Отзывов: 0  |  Написать отзыв

Описание: Качественный модуль LCD дисплея 3.5″ для самоделок на Arduino или собственных на микропроцессорах STM32, AVR, 8051. Модуль содержит сам экран с подсветкой и плату. На плате также имеется слот для SD-карты, интерфейс карты выведен на общую панель. Идеально подходит для установки без переделок на плату Arduino Mega (модуль просто вставляется сверху) Есть возможность купить комплект с Мегой и установленным демо-скетчем, который демонстрирует все возможности экрана. Дисплей управляется драйвером ILI9486 фирмы «ILITEK» c параллельным 16 бит управлением. Все выводы проходят через буферы, поэтому управление может быть как с 3,3В так и с 5В логикой. Коды инициализации и управления есть в постоянно обновляемой библиотеке UTFT для Arduino (нужно выбрать ILI9486). Внимание: этот модуль НЕ СОДЕРЖИТ ТАЧ-СКРИН! Характеристики: Диагональ дисплея: 3.5″ Кол-во пикселей: 480х320 Тип экрана: TFT Тип подсветки: 6 ультраярких светодиодов Контроллер: ILI9486 Тип управления: параллельное 16бит Напряжение питания: 5В Потребляемый ток: 80…110мА Уровни входных напряжений: 3,3 и 5В Кол-во выводов: 36 (2х18) Тип выводов: «папа» Размеры платы: 96.6 х 60.3мм

Ссылка на pdf контроллера: ILI9486

Написать отзыв

Ваше Имя: Ваш отзыв: Внимание: HTML не поддерживается! Используйте обычный текст. Оценка: Плохо           Хорошо Введите код, указанный на картинке: Панельный термометр-гигрометр с внутренним датчиком90 грн Набор жал для паяльника тип 900M-T, 10шт 185 грн Ожидается Клипс измерительный, 10шт 105 грн Arduino Leonardo R3 235 грн

Добавлено 11 октября 2017 в 19:45
  • Описание библиотеки Wire
  • Примечание
  • Описание методов
    • begin()
    • requestFrom()
    • beginTransmission()
    • endTransmission()
    • write()
    • available()
    • read()
    • setClock()
    • onReceive()
    • onRequest()

Описание библиотеки Wire

Данная библиотека позволяет вам взаимодействовать с I2C / TWI устройствами. На платах Arduino с компоновкой R3 (распиновка 1.0) SDA (линия данных) и SCL (линия тактового сигнала) находятся на выводах около вывода AREF. Arduino Due имеет два I2C / TWI интерфейса: SDA1 и SCL1 находятся около вывода AREF, а дополнительные линии находятся на выводах 20 и 21.

В таблице ниже показано, где расположены TWI выводы на разных платах Arduino.

Расположение выводов I2C/TWI на платах Arduino
Плата I2C/TWI выводы
Uno, Ethernet A4 (SDA), A5 (SCL)
Mega2560 20 (SDA), 21 (SCL)
Leonardo 2 (SDA), 3 (SCL)
Due 20 (SDA), 21 (SCL), SDA1, SCL1

Начиная с 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()

Wire.begin(address)

Параметры

address: 7-битный адрес ведомого устройства (необязательно); если не задан, плата подключается к шине как мастер.

Возвращаемое значение

Нет.

Пример

Примеры для ведомого устройства смотрите в примерах к методам onReceive() и onRequest(). Примеры для ведущего устройства смотрите в примерах к остальным методам. .

Wire.requestFrom()

Описание

Используется мастером для запроса байтов от ведомого устройства. Эти байты могут быть получены с помощью методов available() и read().

Для совместимости с определенными I2C устройствами, начиная с Arduino 1.0.1, requestFrom() принимает аргумент логического типа данных, меняющий его поведение.

Если этот аргумент равен true, то requestFrom() после запроса посылает сообщение STOP, освобождая шину I2C.

Если этот аргумент равен false, то requestFrom() после запроса посылает сообщение RESTART. Шина не освобождается, что мешает другому устройству-мастеру влезть между сообщениями. Это позволяет одному ведущему устройству посылать несколько запросов, пока оно контролирует шину.

По умолчанию этот аргумент равен true.

Синтаксис

Wire.requestFrom(address, quantity)

Wire.requestFrom(address, quantity, stop)

Параметры
  • address: 7-битный адрес устройства, у которого запрашиваются байты;
  • quantity: количество запрашиваемых байтов;
  • stop : boolean. true посылает сообщение STOP после запроса. false посылает сообщение RESTART после запроса, сохраняя соединение активным.
Возвращаемое значение

byte: количество байтов, возвращенных от ведомого устройства.

Пример

Смотрите пример к методу read().

Wire.beginTransmission()

Описание

Начинает передачу на ведомое I2C устройство с заданным адресом. После него последовательность байтов для передачи ставится в очередь с помощью функции write(), и их передача с помощью вызова endTransmission().

Синтаксис

Wire.beginTransmission(address)

Параметры

address: 7-битный адрес устройства, на которое необходимо передать данные.

Возвращаемое значение

Нет.

Пример

Смотрите пример к методу write().

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     byte val = 0;    void setup()  {    Wire.begin(); // подключиться к шине i2c  }    void loop()  {    Wire.beginTransmission(44); // передача на устройство #44 (0x2c)                                // адрес устройства задан в техническом описании    Wire.write(val);            // отправить байт значения      Wire.endTransmission();     // остановить передачу      val++;        // увеличить значение    if(val == 64) // если дошли до 64-го значения (max)    {      val = 0;    // начать с начала    }    delay(500);  }

Wire.available()

Описание

Возвращает количество байтов, доступных для получения с помощью read(). Этот метод должен вызываться на ведущем устройстве после вызова requestFrom() или на ведомом устройстве внутри обработчика onReceive().

Синтаксис

Wire.available()

Параметры

Нет.

Возвращаемое значение

Количество байтов, доступных для чтения.

Пример

Смотрите пример к методу read().

Wire.read()

Описание

Считывает байт, который был передан от ведомого устройства к ведущему после вызова requestFrom(), или который был передан от ведущего устройства к ведомому.

Синтаксис

Wire.read()

Параметры

Нет.

Возвращаемое значение

byte: очередной принятый байт.

Пример
#include     byte val = 0;    void setup()  {    Wire.begin();        // подключиться к шине i2c (адрес для мастера не обязателен)    Serial.begin(9600);  // настроить последовательный порт для вывода  }    void loop()  {    Wire.requestFrom(2, 6);    // запросить 6 байтов от ведомого устройства #2      while(Wire.available())    // ведомое устройство может послать меньше, чем запрошено    {       char c = Wire.read();    // принять байт как символ      Serial.print(c);         // напечатать символ    }      delay(500);  }

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)

Возвращаемое значение

Нет.

Пример

Код для платы Arduino, работающей в качестве ведомого устройства:

#include     void setup()   {    Wire.begin(8);                // подключиться к i2c шине с адресом #8    Wire.onReceive(receiveEvent); // зарегистрировать обработчик события    Serial.begin(9600);           // настроить последовательный порт для вывода  }    void loop()   {    delay(100);  }    //   функция, которая будет выполняться всякий раз, когда от мастера принимаются данные  //   данная функция регистрируется как обработчик события, смотрите setup()  void receiveEvent(int howMany)   {    while (1 < Wire.available()) // пройтись по всем до последнего    {       char c = Wire.read();    // принять байт как символ      Serial.print(c);         // напечатать символ    }    int x = Wire.read();    // принять байт как целое число    Serial.println(x);      // напечатать число  }

Wire.onRequest()

Описание

Регистрирует функцию, которая будет вызываться, когда мастер запрашивает данные от ведомого устройства.

Синтаксис

Wire.onRequest(handler)

Параметры

handler: функция, которая должна будет вызываться, она не принимает параметров и ничего не возвращает, т.е.:

void myHandler()

Возвращаемое значение

Нет.

Пример

Код для платы Arduino, работающей в качестве ведомого устройства:

#include     void setup()   {    Wire.begin(8);                // подключиться к i2c шине с адресом #8    Wire.onRequest(requestEvent); // зарегистрировать обработчик события  }    void loop()   {    delay(100);  }    //   функция, которая будет выполняться всякий раз, когда мастером будут  // запрошены данные  //   данная функция регистрируется как обработчик события, смотрите setup()  void requestEvent()   {    Wire.write("hello "); // ответить сообщением  }

Теги

ArduinoI2CTWIWireПрограммирование

Оцените статью
Рейтинг автора
5
Материал подготовил
Илья Коршунов
Наш эксперт
Написано статей
134
А как считаете Вы?
Напишите в комментариях, что вы думаете – согласны
ли со статьей или есть что добавить?
Добавить комментарий