В этом руководстве мы будем управлять графическим отображением с помощью метода высокоскоростной связи I2C (межинтегральная схема) и SPI (последовательный периферийный интерфейс).

"Оглавление"

Компоненты

  • Raspberry Pi Pico - 1 шт.
  • Макетная плата - 1 шт.
  • Цифровой датчик температуры и влажности (DHT11) - 1 шт.
  • Модуль графического дисплея (SSD1306) - 1 шт. (I2C, 1.3 - 128x64)
  • Провода-перемычки (тип М-М)

В этом уроке мы будем использовать монохромный OLED-дисплей с драйвером SSD1306. Существуют различные модули с разными размерами, разрешениями (1,3 - 128x64, 0,96 - 128x64, 1 - 128x32) и способами связи (I2C, SPI). Обязательно уточняйте размер, разрешение и способ связи при покупке. В предыдущем уроке мы попытались отобразить только температуру с помощью 7-сегментного дисплея (FND), но на этот раз я попытаюсь лучше выразить температуру и влажность, используя графические функции Kaluma.

Как общаться с внешним устройством?

Pico предоставляет десятки контактов для подключения других устройств. Здесь мы подключаем и используем различные датчики, двигатели, светодиоды, графические дисплеи и сетевые модули. Каждый вывод может выводить или принимать только HIGH или LOW вход, так как же Pico взаимодействует с этими различными устройствами? У нас могут возникнуть следующие вопросы:

  • Сколько контактов нужно подключить?
  • Как представлены 0 и 1 данных?
  • Отправить данные на один пин по порядку? Или отправить на несколько контактов одновременно?
  • Использовать один контакт как для передачи, так и для приема данных? Или использовать отдельные пины для передачи и приема соответственно?

На эти вопросы нет единого ответа. Необходимо выбрать подходящий способ связи в соответствии с характеристиками датчика или компонента. Какой метод подходит для датчика температуры? Мы уже просто научились связываться с цифровым датчиком температуры и влажности DHT11 с помощью только одного соединения (кроме VCC и GND). Этот датчик выбрал ответ ниже на поставленные выше вопросы.

  • Подключите один контакт (кроме 3V3 и GND для источника питания). Температура и влажность - это два числа (40 бит), и поскольку данных не так много, достаточно использовать только одно контактное соединение.
  • Если сигнал HIGH длинный (50 мкс или более), это 1, а если он короткий (50 мкс или меньше), это 0. Причина не устанавливать HIGH = 1 и LOW = 0 состоит в том, чтобы различать состояние, в котором данные не передаются / не принимаются (LOW), и 0 данных.
  • Отправляйте данные на один вывод по порядку. Температура и влажность состоят из 40 битов, поэтому, даже если они отправляются последовательно, передача и прием могут быть завершены примерно за несколько миллисекунд.
  • Используйте один контакт как для передачи, так и для приема. После отправки запроса сигналы и данные принимаются.

Так что насчет графического дисплея, который мы будем использовать в этом руководстве? Достаточно ли для связи с одной линией, как датчик DHT11? Всего требуется 8192 бит даже при просмотре в одном цвете с разрешением 128x64, и если связь осуществляется таким же образом, отправка информации о пикселях на экран занимает почти 1 секунду. Кажется, есть необходимость быстро отправлять и получать больше данных. Pico (как и большинство других микроконтроллеров) поддерживает несколько протоколов для более быстрой последовательной связи.

  • I2C (Межинтегральная схема) - использует 2 контакта для связи. Он состоит из одного вывода для синхронизации (SCL - Serial Clock) для управления синхронизацией передачи и приема и другого вывода для передачи данных (SDA - Serial Data).
  • SPI (последовательный периферийный интерфейс) - для связи используется 3 контакта. Один контакт для передачи (MOSI - Master Out Slave In) и один контакт для приема (MISO - Master In Slave Out) используются вместе с линией синхронизации (SCK - Serial Clock).
  • UART (универсальный асинхронный приемник / передатчик) - он использует 2 контакта для связи. Линия синхронизации отсутствует, и используется один контакт для передачи (TX - Transmitter) и один контакт для приема (RX - Receiver). Подробности UART будут объяснены в следующем руководстве.

I2C (межинтегральная схема)

I2C - это протокол для более эффективной связи с использованием двух контактов. Передача и прием данных с помощью одного вывода аналогичны DHT11, но разница в том, что для синхронизации используется отдельный вывод для часов (SCL). Как показано на рисунке ниже, когда тактовый сигнал изменяется с LOW на HIGH, 0 и 1 выражаются в зависимости от того, является ли сигнал данных LOW или HIGH. Следовательно, нет необходимости увеличивать скорость связи для двух устройств, и если вы хотите быстро передавать / принимать, вы можете увеличить тактовую частоту на выводе SCL (конечно, каждое устройство I2C имеет свой предел скорости).

У I2C есть ведущий и ведомый. Обычно микроконтроллер (Pico) становится ведущим, а датчик - ведомым. Мастер управляет связью, генерируя тактовый сигнал. По сути, I2C работает как шина. Это означает, что несколько устройств могут совместно использовать два используемых контакта. Если да, то как различаются устройства? Каждое устройство I2C имеет уникальный адрес (например, адрес SSD1306 - 0x3C). Итак, при общении вы должны сначала указать адрес, а затем отправлять / получать данные.

Чтобы использовать I2C в Kaluma, используйте модуль i2c, как показано ниже. После создания класса I2C данные отправляются / принимаются с помощью функции write() или read(). Поскольку Pico предоставляет всего 2 шины, I2C0 и I2C1, передайте номер шины, который будет использоваться при создании класса I2C в качестве аргумента.

const {I2C} = require('i2c');
let i2c = new I2C(0);
let data1 = new Uint8Array([0x6b, 0x00]);
i2c.write(data, 0x68);
// ...
let data2 = i2c.read(14, 0x68);
// ...
i2c.close();

Достаточно использовать устройства I2C. Если вы хотите узнать больше о том, как это работает, рекомендую изучить документацию.

SPI (последовательный периферийный интерфейс)

Как и I2C, SPI использует отдельные часы для синхронизации. Однако используются отдельные контакты для передачи и приема. Когда данные передаются на подчиненное устройство, используется вывод для MOSI (Master Out Slave In), а при приеме данных в обратном направлении используется вывод для MISO (Master In Slave Out). Часто, когда прием данных не требуется, нет необходимости подключать вывод MISO.

Поскольку SPI также действует как шина, несколько устройств могут использовать три контакта одновременно. Однако отличие от I2C в том, что для различения устройств не используется адрес, а для каждого устройства подключается и используется отдельный вывод CS (Chip Select). Например, если вы подключаете 3 разных устройства к шине SPI с помощью контактов SCK, MISO и MOSI, вам потребуется 3 отдельных контакта CS для каждого устройства. Базовая станция используемого устройства должна быть установлена ​​на HIGH, а базовая станция других устройств должна быть установлена ​​на LOW.

Чтобы использовать SPI в Kaluma, используйте модуль spi, как показано ниже. После создания класса SPI отправляйте / получайте данные с помощью функции send() или recv(). Поскольку Pico предоставляет всего 2 шины: SPI0 и SPI1, передайте номер шины, который будет использоваться при создании класса SPI в качестве аргумента.

const {SPI} = require('spi');
let spi0 = new SPI(0);
let data1 = new Uint8Array([0x6b, 0x00]);
spi0.send(data1);
// ...
let data2 = spi0.recv(10);
// ...
spi0.close();

Для более подробной информации рекомендуется прочитать документацию.

SSD1306 (монохромный OLED)

Теперь давайте более наглядно отобразим температуру и влажность с помощью графического дисплея. Подключите SSD1306 к шине I2C0, а DHT11 к GPIO15, как показано на схеме ниже. Подключение намного проще, чем с 7-сегментным!

Для управления дисплеем необходимо отправить команду на шину I2C0. Эта команда описана в таблице данных SSD1306. Однако совершенно нет необходимости проходить такой сложный и утомительный процесс. Все, что вам нужно сделать, это вызвать API, используя хорошо написанную библиотеку. Сначала создайте проект в среде IDE (или повторно используйте предыдущий проект dht11-test) и добавьте следующие две библиотеки.





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

Все коды можно найти по ссылке ниже
https://kaluma.io/@niklauslee/phycomjs-examples

Глядя на код, после создания экземпляра класса SSD1306 вызывается setup() для инициализации отображения. После завершения инициализации сначала вызовите getContext(), чтобы получить объект графического контекста. Этот графический контекст предоставляет функции для рисования фигур, символов и растровых изображений. Вы должны помнить, что когда вы вызываете функцию, которая рисует фигуру, она записывается во внутренний буфер и не отображается на экране. Не забывайте, что вы должны вызвать display(), чтобы нарисованный буфер изображения появился на экране. Подробные сведения о функциях графического контекста см. В справке.



Шрифт и растровое изображение

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

Сначала перейдите на вкладку Пакеты в среде IDE и найдите «шрифт». Доступно несколько шрифтов, вы можете добавить все, что захотите. Я попробую использовать здесь @niklauslee/font-less-sans.

А давайте выведем на экран изображение в виде термометра. Kaluma IDE предоставляет редактор для рисования простых растровых изображений. На вкладке Explorer среды IDE нажмите кнопку «+» (новый файл) и выберите Bitmap JSON (.bmp.json), чтобы создайте файл для растрового изображения и откройте простой редактор растрового изображения.

Если вы нарисовали растровое изображение в форме термометра, как показано на рисунке выше, теперь давайте поместим новый шрифт и растровое изображение на экран. Шрифт был увеличен в три раза, чтобы лучше было видно температуру, а влажность увеличилась в два раза. Поскольку размер растрового изображения (16x16) немного меньше размера экрана (128x64), давайте увеличим его в 3 раза по горизонтали и вертикали.

Все коды можно найти по ссылке ниже
https://kaluma.io/@niklauslee/phycomjs-examples

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



В этом руководстве мы вкратце узнали о связи I2C и SPI. С его помощью мы подключили графический дисплей SSD1306 для отображения температуры и влажности. Наконец, в следующем руководстве давайте отправим информацию о температуре и влажности через Интернет, чтобы вы могли проверить ее на своем смартфоне или в веб-браузере.



Больше контента на plainenglish.io