Arduino IDE

Подключение по UART

Первый пример, который мы разберем — передача данных на дисплей в режиме реального времени. В качестве контроллера используем плату Arduino Uno R3 или аналог.

Программу напишем с использованием библиотеки RobotClass_Photon_Arduino.

Используем проект из главы «Первый эксперимент». В настройках проекта включим передачу команд через UART1, указав скорость 115200:

Управление через UART. Дисплей Фотон от RobotClass

Загружаем файл данных .bin на ПК, затем сохраняем на SD карту и вставляем в дисплей. Теперь Фотон готов к приёму данных через UART1.

Подключаем дисплей Фотон к Arduino Uno по стандартной схеме для аппаратного UART:

Фотон5VGndTXRX
Arduino Uno+5VGnd0 (RX)1 (TX)

Программа для UART: счетчик

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

Начнём с подключения библиотеки RobotClass_Photon. Затем создадим объект photon.

#include "RobotClass_Photon.h"

RobotClass_Photon photon = RobotClass_Photon();

Для управления каким-то конкретным элементом в интерфейсе Фотона, необходимо зарегистрировать его в самом начале программы. Делается это с помощью функции registerElement:

PhElement& phtxt = photon.registerElement(0, 1, EL_TEXT);

У функции три аргумента:

  • индекс страницы, на которой он расположен;
  • индекс элемента внутри страницы;
  • тип элемента.

В нашем случае мы будем работать с элементом 1 на странице 0. Тип элемента — EL_TEXT. Для других элементов идентификаторы будут иные:

  • EL_TEXT — текст;
  • EL_BUTTON — кнопка;
  • EL_BAR — шкала;
  • EL_GAUGE — радиус;
  • EL_SWITCH — переключатель;
  • EL_IMAGE — изображение.

Внутри стандартной функции setup вызываем функцию begin, в которую необходимо передать используемый интерфейс передачи команд.

Например, если мы планируем работать по аппаратному последовательному порту — укажем &Serial, предварительно запустив его функцией begin. Можно указать и какой-то другой интерфейс, например Serial1, Serial2 (если это позволяет контроллер), либо программный интерфейс из стандартной библиотеки SoftwareSerial.

Serial.begin(115200);
photon.begin(&Serial);

Изменение значения любого элемента в интерфейсе осуществляется с помощью функции setValue. В нашем случае в неё следует передать только один аргумент — переменную целого типа counter.

Полный текст программы:

#include "RobotClass_Photon.h"

RobotClass_Photon photon = RobotClass_Photon();
PhElement& phtxt = photon.registerElement(0, 1, EL_TEXT);

byte counter = 0;

void setup () {
    Serial.begin(115200);
    photon.begin(&Serial);
}

void loop () {
    phtxt.setValue(counter);
    counter++;
    delay(100);
}

Загружаем программу на Arduino и подаём питание. Отдельно питать модуль Фотон от USB не требуется, ведь питание уже подаётся по 4-контактному разъёму интерфейса UART.

После подачи питания на месте второго текста будет отображаться текущее значение счетчика.

Программа для UART: разные типы данных

Изменение значения любого элемента в интерфейсе осуществляется с помощью функции setValue. Функция принимает целые значения: byte (int8_t), int (int16_t), long (int32_t); вещественные типа float; символьные строки char*.

Для демонстрации разных вариантов вызова функции setValue напишем такую программу:

#include "RobotClass_Photon.h"

RobotClass_Photon photon = RobotClass_Photon();
PhElement& phtxt = photon.registerElement(0, 1, EL_TEXT);

void setup () {
    Serial.begin(115200);
    photon.begin(&Serial);
}

void loop () {
    phtxt.setValue(128);
    delay(1000);
    phtxt.setValue(128.33);
    delay(1000);
    phtxt.setValue("Привет!");
    delay(1000);
    char buf[64];
    sprintf(buf, "%d кг", 33);
    phtxt.setValue(buf);
    delay(1000);
}

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

Программа для UART: счетчик с кнопкой

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

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

В начале программы регистрируем уже два элемента: Текст и Кнопку. Причем, при регистрации кнопки укажем четвертый аргумент — ENABLE_TOUCH. Этот аргумент означает, что мы планируем детектировать нажатие этой кнопки.

Element& phbtn = photon.registerElement(0, 1, EL_BUTTON, ENABLE_TOUCH);

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

void callbackBtn(){
    char str[3];
    sprintf(str, "%02d", counter);
    if( phtxt.setValue( str )){
        counter++;
    }
}

Эту функцию регистрируем в обработчике событий при помощи другой полезной функции — attachPush:

phbtn.attachPush( callbackBtn );

И последнее. В тело стандартной функции loop добавляем вызов обработчика событий:

photon.handle();

И вся программа целиком:

#include "RobotClass_Photon.h"

byte counter = 0;

RobotClass_Photon photon = RobotClass_Photon();
PhElement& phtxt = photon.registerElement(0, 0, EL_TEXT);
PhElement& phbtn = photon.registerElement(0, 1, EL_BUTTON, ENABLE_TOUCH);

void callbackBtn(){
    char str[3];
    sprintf(str, "%02d", counter);
    if( phtxt.setValue( str )){
        counter++;
    }
}

void setup () {
    phbtn.attachPush( callbackBtn );
    Serial.begin(115200);
    photon.begin(&Serial);
}

void loop () {
    photon.handle();
}

Загружаем программу на Arduino Uno, подаём питание и нажимаем на кнопку. При каждом нажатии счетчик будет увеличиваться на единицу.

Подключение по I2C (QIIC)

На обратной стороне дисплея Фотон имеется разъём SH1.0 с меткой QIIC, который служит для подключения к шине I2C (подробнее о QIIC). При подключении через разъём QIIC понадобится специальный кабель QIIC. Если у контроллера нет разъёма QIIC, то можно использовать соответствующий переходник.

Используем проект интерфейса с двумя текстовыми элементами, из главы «Первый эксперимент» или создадим новый. В настройках проекта отключим оба UART и включим вместо них I2C интерфейс.

Управление через I2C QIIC. Дисплей Фотон от RobotClass

Адрес I2C

Каждое устройство, подключенное к шине I2C, имеет свой уникальный адрес. По умолчанию дисплей Фотон имеет адрес 0x25. Именно этот адрес мы будем использовать для управления дисплеем с помощью контроллера.

Сменить адрес можно в настройках проекта.

Подтяжка I2C

Для правильной работы шины I2C необходимо, чтобы линии SDA и SCL были подтянуты к питанию с помощью резистора соответствующего номинала. Эту подтяжку нужно сделать только в одной точке на всей линии I2C.

Рядом с разъёмом QIIC имеется тройная перемычка I2C-PU. Чтобы организовать подтяжку именно на стороне дисплея, следует замкнуть все три контакта этой перемычки.

Программа для I2C: счётчик

Основная часть программы останется такой же, как и при подключении по UART. Изменится только инициализация дисплея в функции setup. Вместо последовательного интерфейса Serial используем Wire.

#include "RobotClass_Photon.h"

RobotClass_Photon photon = RobotClass_Photon();
PhElement& phtxt = photon.registerElement(0, 0, EL_TEXT);

byte counter = 0;

void setup () {
    Wire.begin();
    photon.begin(&Wire);
}

void loop () {
    phtxt.setValue(counter);
    counter++;
    delay(100);
}

Загружаем программу на Arduino и подаём питание. Отдельно питать модуль Фотон от USB не требуется, питание подаётся через разъём QIIC.

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

photon.begin(&Wire, 0x33);

Изменено: