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 не требуется, ведь питание уже подаётся по четырехконтактному разъёму интерфейса 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);
Подскажите пожалуйста, а в продаже есть? В магазине у вас не нашел.
Появится в продаже до конца года.