koala, 0xDADA11C7, ReAl
Дякую, друзі, за відповіді.
Але, чим далі в ліс, тим товщі партизани.
Як виявляється, це занадто складно для мене. Брак досвіду. І це тільки маленький крок для застосування ще більшої бібліотеки, яку теж треба було б переробити.
Мабуть треба йти іншим шляхом. Трішки поміркую/поясню, а там може в кого які ідеї виникнуть.
Є бібліотека blynk для потреб IoT, добре працює з ESP8266 (майже те саме по коду що і Arduino). В мене добре виходить програмувати ті ESP8266 під blynk. Але хотілось би мати і підтримку stm32 не в середовищі mbed і arduino, а по людські. Блінкери не планують щось робити в напрямку, що мене влаштував би (не поширена платформа і таке інше). Тому є ідея. Раз blynk добре працює на esp8266, то хай там і працює. А при потребі моцного MCU і більшого функціонала до того esp8266 під'єднувати вже stm32 по uart чи SPI і вже між ними ганяти данні.
Ідея не погана і мене б влаштувало таке рішення.
Стає питання про універсальний "протокол" обміну між esp8266 i stm32. Щоб, коли потрібно додати якогось функціоналу не треба було б перелопачувати код на esp8266.
Вся робота Blynk'у зав'язана на віртуальних пінах (штифтах), їх там 127. До кожного штифта прив'язаний запис у базі твого аккаунту. Можна туди дані надсилати, або отримувати.
Наприклад надіслати данні можна так, де pin це V0 - V127:
// Send string
Blynk.virtualWrite(pin, "abc");
// Send integer
Blynk.virtualWrite(pin, 123);
// Send float
Blynk.virtualWrite(pin, 12.34);
// Send multiple values as an array
Blynk.virtualWrite(pin, "hello", 123, 12.34);
// Send RAW data
Blynk.virtualWriteBinary(pin, buffer, length);
Коли данні віртуального штифта на сервері оновлюються (наприклад на смартфоні натиснув віджет кнопки, чи віджет слайдера, тощо), то викликається функція BLYNK_WRITE, де pin це V0 - V127 до якого прикріплений віджет:
BLYNK_WRITE(pin)
{
int value = param.asInt(); // Get value as integer
// The param can contain multiple values, in such case:
int x = param[0].asInt();
int y = param[1].asInt();
}
Ну в принципі цього достатньо.
Так от з боку esp8266 задача підтримувати зв'язок з wifi, з сервером блінк, приймати і відправляти данні від віртуальних штифтів. Це все працює.
А от як у зв'язці з stm32 бути?
Ось наприклад, на stm32 від сенсора температури отримав значення тієї ж температури і мені потрібно ці данні відправити на віртуальний штифт V0. Ну і хай я на stm32 по uart кидаю рядок, щось на кшталт "V0=25.5", а esp8266 передає це далі на сервер. А коли сталось оновлення на сервері V10 (на смартфоні натиснули віджет кнопки), то щоб esp8266 по uart кинув щось типу "V10=1" чи "V10=0", а stm32 вже увімкнув чи вимкнув світлодіод. Ну це я спрощено для прикладу, щоб було зрозуміло. Можна json забабахать і все таке, чи через коди (які самому видумати). Питання не в цьому.
От як зробити на стороні esp8266 так універсально, щоб коли я додаю на stm32 новий датчик, чи новий виконавчий пристрій міняв код тільки на stm32, а вже esp8266 сама розрулює, код міняти не треба, автоматично знало що куди. Просто шлю до esp8266 команду з новим віртуальним штифтом. Так само і з оновленням віртуальних штифтів з боку сервера.
От з оновленням наче проканає перерахувати всі віртуальні штифти в коді esp8266:
BLYNK_WRITE(V0)
{
int value = param.asInt(); // Get value as integer
// а далі відправка прийнятого value на stm32 і так для всіх V0-V127
}
Хоча не розумію як розрізняти різні типи даних тоді?
А коли треба відправити дані
// Send float
Blynk.virtualWrite(pin, value);
А замість pin підставити потрібний (де pin = V5, а value = 23.54), який отримав esp8266 від stm32.
p.s. ого понаписував. це хтось прочитає?