Arduino IDE
Подключение по UART
Первый пример, который мы разберем — передача данных на дисплей в режиме реального времени. В качестве контроллера используем плату Arduino Uno R3 или аналог.
Программу напишем с использованием библиотеки RobotClass_Photon_Arduino.
Используем проект из главы «Первый эксперимент». В настройках проекта включим передачу команд через UART1, указав скорость 115200:
Загружаем файл данных .bin на ПК, затем сохраняем на SD карту и вставляем в дисплей. Теперь Фотон готов к приёму данных через UART1.
Подключаем дисплей Фотон к Arduino Uno по стандартной схеме для аппаратного UART:
Фотон | 5V | Gnd | TX | RX |
Arduino Uno | +5V | Gnd | 0 (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
Каждое устройство, подключенное к шине 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);