Содержание
Я пытаюсь протестировать модуль 3.2″inch TFT LCD (с контроллером SSD1289 и совместимым контроллером сенсорной панели ADS7843) с библиотекой UTFT .
Эта библиотека поддерживает TFT (перечисленные в PDF) и Arduino Леонардо .
После подключения в соответствии с описанием и запуска тестового приложения из этой библиотеки ничего не происходит. Я имею в виду, что часть TFT работает, но она светло-голубая, и нет никаких графиков из примера кода.
- Как проверить ревизию TFT (REBA или REVB)?
-
Как мне его подключить? Я не уверен в нижеприведенных связях. TFT – > Леонардо
-
Как мне инициализировать эту библиотеку и заставить ее работать?
Я попробовал с:
Я всегда получаю одни и те же эффекты, светло-голубой экран и никаких графиков из примера кода.
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
 
 
 
Урок 34
Часть 1
Сегодня мы вернёмся к Atmega8, так как что-то у меня случилось с моей Atmega328. Но для наших задач нам вполне подойдёт и восьмая серия.
Сегодня мы попробуем подключить к нашему контроллеру дисплей уже графический цветной разрешением 320 на 240 точек, управляемый по восьмибитному параллельному интерфейсу, Дисплей выполнен с помощью модуля и управляется контроллером ILI9341.
Вообще, у данного контроллера дисплея существует несколько режимов подключения к управляющему микроконтроллеру, в том числе есть и SPI, но мне попался дисплей именно с прараллельным способом подключения, о чём я нисколько не жалею. С таким интерфейсом также немало дисплеев, но что обидно, очень мало информации по реализации кода для дисплеев именно с таким интерфейсом. Поэтому наша задача – данный информационный пробел устранить на корню.
Вот перечень режимов подключения
Включить тот или иной режим удаётся благодаря упралению уровнем на ножках IM3:IM0.
Наш режим, которым мы будем пользоваться – самый первый. Чтобы его включить, нужно на всех данных ножках инициировать низкоуровневой сигнал.
Судя по технической документации, контроллер ILI9341 может управлять 262000 разновидностями цветов.
Вот схема подключения дисплея к контроллеру
А вот так схема выглядит на практике
Мы видим также простенький стабилизатор, висящий на проводках, состоящий из микросхемы и конденсатора. Данный стабилизатор служит для подачи питания 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 грн
- Описание библиотеки 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 выводы |
---|---|
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Программирование
ли со статьей или есть что добавить?