Уроки Arduino. Общение по Serial, парсинг данных, протоколы связи
Vložit
- čas přidán 3. 08. 2024
- В этом уроке разберём основные алгоритмы парсинга данных и общения по Serial/COM/UART. Научимся создавать свои протоколы связи и управлять чем угодно при помощи текстовых команд.
► Огромный стартовый набор GyverKIT: kit.alexgyver.ru/
► Скетчи из урока: github.com/AlexGyver/tutorials/
► Библиотека Parser: github.com/GyverLibs/GParser
► Библиотека AsyncStream: github.com/GyverLibs/AsyncStream
► Уроки Arduino на сайте: alexgyver.ru/lessons/
► Модули и датчики с Али: alexgyver.ru/arduino_shop/
► Страница "Заметок Ардуинщика": alexgyver.ru/arduino_lessons/
00:00 - Начало
02:03 - Встроенные функции парсинга
03:28 - Управляем яркостью светодиода
03:50 - Протоколы передачи данных
05:31 - Делаем простейший протокол
06:28 - Подключаем RGB светодиод
07:09 - Работаем с readBytes
08:58 - Парсим N значений, strtok
09:40 - Парсим N чисел
10:29 - Парсим разнородные данные, Parser.h
12:25 - Пишем протокол для ледов и серво
13:25 - Ардуина управляет Ардуиной
13:57 - Ускоряем readBytes, костыли
Теги: #arduino #уроки #ардуино #alexgyver
●●●●●●●●●●●●●●●●●●●●
► Основной канал: / alexgyvershow
► Поддержать автора alexgyver.ru/support_alex/
► Официальный сайт: alexgyver.ru/
► Почта: alex@alexgyver.ru - Věda a technologie
15:13 ошибка, вместо логического "И" там бинарный, странно, что не вылезло при тестировании.
спасибо! Исправлю в примерах
@@ArduNotes я в последнее время предпочитаю альтернативную форму записи - and гораздо тяжелее перепутать с bitand, чем & vs &&. Или можно для бинарного использовать старую форму, а для логического новую.
@@ArduNotes Zinkin Mitya
Интересно в условии стоит millis .т.е. таймают по условию должен быть миллисекундах, а вывод Serial.print показывает в микросекунда. Как? Как я понимаю минимальная задержка будет 10 миллисекунд.
@@MiaminZD Вывод показывает сколько микросекунд исполнялся код на 39-40 строке, а вызываться он будет не чаще, чем раз в 10 миллисекунд
Спасибо огромное! Без этого не работало. Этот комментарий должен быть вверху.
Второе название канала - "ценнейшая находка для ардуинщика".
Высший пилотаж, объяснить сложное просто. Спасибо!😊
Ты мои мысли прям читаешь) Перелопатил по этой теме уже все что можно
О, как раз актуально! :)
Решено много вопросов в голове. Однозначно лайк за таких видос.
Омск опять смотрит! Лайк за видео!
Приветствую Александр.
Ой как просится парсинг на гайвер-контрол тепличный, аж в немоготу ))) Спасибо за добротные уроки ардуинщика!
Алекс, сделай разбор кода какого-нибудь своего проекта. Видео с светомузыкой на гиперкубе было топовым, очень классно и понятно ты все объяснил. Я потом, используя тот алгоритм, переписал старую твою светомузыку и выглядит это прекрасно. Я это к тому, чтоб ты рассказал про какой-то код на каком-то более конкретном примере
Блин, быстрее бы следующее видео, у меня как раз сейчас стоит вопрос передачи данных в приложение на компьютере.
Мне тоже нужно
Присоединяюсь! Например такая задача: массив данных (фрейм буфер) отправлять на процессинг и там отрисовывать, чтоб в маленький экран не вглядываться. Тут нужно будет как то синхронизироваться. Вроде бы получилось, но что делать если буфер содержит те же данные что для синхронизации используются?
У тебя ж com порт есть. Открывай его с компа и читай
Я вот в этом ничего не понимаю, но очень внимательно посмотрел. Думаю нужно несколько раз пересмотреть
Спасибо! Именно то, чего не хватало))
Класс, игрался со связью по serial между 8266 и ардуино пару лет назад. Спаял делитель так как платы на разное напряжение и... Забросил) самое время достать снова всю эту шляпу и поиграться снова. Спасибо за все тонкости и за асинхронность. Жму волосатую руку.
Давно хотел научиться передавать команды на ардуино или esp по блютуз и вай фай. Спасибо. Жду следущий урок
Ооо, то что надо, спасибо большое! У меня контроллер моноколеса периодически шлет массив с циферками, с ними мне как раз нужно будет работать в ардуине.
Высший класс! только начал изучать с++
Очень интересно!Хоть и не понятно много чего
Спасибо большое за ценный урок! Очень важная информация!
Благодарю, доступно, подробно, а главное интересно.
*Л. а. й. к.*
Спасибо за видео и советы Поучительный материал
Ой, на 8:50 - потенциальная запись за пределы массива.
(если придёт пакет в 30 байт, то мы запишем NULL в 31й элемент массива)
Алекс, спасибо за урок, буду благодарен если разберешь общение ардуино с сервером
Изумительно! Спасибо большое! :)
Спасибо! То, что надо!
Спасибо, Алекс!
очень полезный видос! Спасибо!
Вооооооооот я уже начинаю разбираться в кодах! А это сулит новые свершения. БлагоДарю тебе Гувер за твои старания, ты и сам от этого получаешь неистовое удовольствие!)
Ой спасибо, братик, какраз к дипломной работе подоспел!!!!
Круто и простопонятно, ещё ещё требуют наши мозги
Как то, года 3 назад. Просил такой видос, дождался)))
Такая же херня
аааа круто, скорей бы новый урок
Я 4 года ждал это видео
Пасибо за уроки, чуваки
Спасибо, Alex🤝
Я в свое время написал для VBA приложений JSON парсер для хранения данных и обмена между приложениями в текстовом формате, получилось достаточно просто и эффективно, но для для ресурсов микроконтроллера лучшее решение применение команд: ключ, значеие.
очень бы хотелось увидеть уроки про переход от ардуин к голым мк. минимальную обвязку чипа, подключение к компу и т.д.
огромный гайд выйдет через пару недель
@@ArduNotes когда
Сколько небольших производств заработало благодаря Гайверу, самому в этом всём разобраться очень сложно)
Спасибо, очень интересный урок получился. Может быть добавить еще пример, как две ардуинки могут управлять друг-другом, чтобы обмен информацией шел между ними в разном направлении, можно наверное интересный проект сделать.
Алекс, за уроки респект, многим будет полезно)
Хочу предложить ещё один вариант, более простой с точки зрения наглядности и простоты реализации, при этом такой же по вычислительной сложности
Я у себя на стмках использую структуры, которые побайтово передаю. Можно даже битовые поля юзать для состояний светодиодов и прочих булевых штук
При этом можно как делать одну структуру для разных команд - первое поле означает саму команду, второе поле означает значение команды, можно так же несколько полей делать спокойно (ну или хотя бы писать, сколько их, в первом байте)
И для команд, имхо, гораздо удобнее запихать всё в enum, тогда читаемость кода возрастает, проще писать и отлаживать, а для проца enum это тот же инт, просто "с названиями"
Либо второй вариант со структурами - передавать структуру состояния, в которой задавать все параметры сразу, просто подряд
Единственная проблема, которая может возникнуть, это разных способ хранения структур (маловероятно), битовых полей (очень вероятно), если такие используются. У разных платформ (ПК - Ардуина) может быть разный порядок следования битов в битовых полях, тогда будет проблема
Но для связи ардуинка-ардуинка, есп-есп или стм-стм, вариант прямо супер рабочий и ультра удобный, советую присмотреться))
Пы.Сы.: да, коммент на двух видосах, потому что здесь он ещё актуальнее))
передача байтовым потоком - тема для отдельного урока
Супер тема !!!
Актуально, спасибо.
красававчег очень актуально и подробно обьяснено
Хорошее видео. Лайк.
Лайк за Терминатора )
кренеть, вот теперь начнётся жара...
Урок ценный но уже тяжел для понимания начинающим.
В 0:12 после рабочего дня это было так жоска, будто я снова на первой субботней паре по квантам)))
Но все равно спасибо, тема важная.
Ничего не понял, но очень познавательно.
kruto raskazal, vsio ponetna
Мощщщно! =)
Вот конечно еще бы вы медленнее все рассказывали. Но всё равно вы очень крутой спасибо вам огромное.
Вот бы ещё по uart мульти-точке урок. Чтобы решение коллизий попинать
Класс!
Годнота!
Респект!
Шикарный канал, почему рекламмы нет
у нас только JLCPCB на рекламе, остальное не подходит по тематике =)
Респект
Лучший канал по абдуринке!
Абдуринка - это выступления ВВП по ТВ :)
Англоязычный ютюб смотри, там это давно уже все есть. И проекты покруче
@@krutoyinfo ссылку на аналогичный урок пожалуйста
@@krutoyinfo Дайте ссылку плз.
Неопределённое поведение в уроке. Найс! (Сарказм.)
Чтобы упростить процесс приема пакета - все эти таймауты - можно же использовать структуру TLV
ru.m.wikipedia.org/wiki/Tag-length-value
Часть пакета tag/type и length имеет фиксированную длину, а длина пэйлоада будет известна из поля length, в итоге мы точно знаем когда надо начинать парсить, а таймаут оставить для определения битости пакетов
Когда то давно изучал c, сейчас пишу только на python, и вдруг натыкаюсь на этот видос, аж мурашки по коже побежали как вспомнил обязательное присвоение типа переменной и указатели, ууфф.
Зато скорость роботы кода выше в разы
когда нибудь программисты совсем деградируют)
в десятки и сотни
Для пользователя вариант "название пробел аргумент пробел аргумент..." куда приятнее (просто разделители иные). Можно функции мутить int argc, char* argv[] и ещё char answer[] для записи в эту строку ответа. Удобно. Предпочитаю именно этот метод, т.к. лень ещё прогу делать с крутилками и жмакалками
Но вот между устройствами только структуры, только хардкор.
между устройствами да, структуры) в другом уроке будем разбирать
@@ArduNotes , в догонку к методу:
Можно несколько вариантов для ключа использовать
case 'r':
Print("big r")
case 'R':
Код на r
Break
Расскажи как паркинг можно сделать на прерываниях на примере разбора данных от GPS. Это было бы здорово.
Еще хотелось бы видео по сетевым каким то протоколам тот же изернет+интернет и работе с радиопередачей данных вифи/лора/блютуз и другие - т.е. что то в этом направлении.
Это требует много времени и стоит денег
инторнетный протокол слишком сложный для 8 битного контроллера и жрет много ресурсов
есть готовые библиотеки для этого и там тот же принцип как и тут, парсить все равно придется
а как передавать данные - зависит от конкретной библиотеки
Json мне нравится)
а ёлочка?
нет блин xml
Тоже ждешь финальную серию руки терминатора?
Александр, тема древняя, но все же хотя б мельком покажи как связать espшку и голосовое управление. отвечаю, люди высоко оценят 👍
Спасибо большое за уроки. А нет таких же библиотек для udp? Или может будет урок именно по upd esp32. Нашел пару уроков, но там передают одно состояние кнопки и все. Так какой же это парсинг.
Подкину идею, счётчик ёмкости аккумов с логгированием на ПК, графики, ограничение по току, напряжению 🙂
Отличное видео, давай тольно на СИ...
А оно на чем, на бейсике или питоне?..
Здравствуйте Алексей можно пожалуйста отдельный урок по esp8266, заранее спасибо)))
Его зовут Александр))
super
Добрый день, подскажите будет обзор на параллельную работу ардуино, (по двум проводам соединяются от 2 и более), аналогия с ARINC 629.
расскажи о средствах обеспечения помехозащищенности) алгоритмы что делать если пакет не пришел до конца, пакет пришел битый (с искажениями) и т.д. о CRC, протоколах подтверждения от устройства об успешном получении пакета и т.д.
а уроки с esp и сетью будут?)
да
esp 8266 - интересный модуль, в теории у него много возможностей но самая известная и пожалуй классическая- естественно деуатентификатор. Поэтому хотелось бы узнать что то ещё чтобы разнообразить работу с данным модулем
А ESP 32 будут?
@@MrDent-tp4ke деуатентификатор? Это что же такое "естественное", "классическое" и "самое известное", что о нём даже Гугл не слыхивал?
Поясните это на понятном языке, пожалуйста.
Сделай web для теплицы!
Очень полезный урок.
Подскажите что лучше использовать чтобы парсить ответы от SIM800.
Уперся в то, что.... чем больше добавляют условий и обработку запросов, то строка (at) приходящая от SIM800 уменьшается...
while (SIM800.available() > 0) {
at += char(SIM800.read());
}
if (at.indexOf("ATD" + phon + ";") > -1)
{
*******
} else if (at.indexOf("+CLIP:") > -1
{
*******
}
👍
А я использую json формат, передаю данные через lora, вроде тоже неплохо работает.
void loop() {
// асинхронное чтение через AsyncStream
if (Serial.available()) {
char str[30];
int amount = Serial.readBytesUntil(';', str, 30);
str[amount] = NULL;
int data[10]; //буфер интов
int count = 0;//счетчик интов
char* offset = str;//указатель для работы
while (true) {
data[count++] = atoi(offset);//пишем число в буфер
offset = strchr(offset,','); //поиск след запятой
if (offset) offset++; //если это не null -продолжаем
else break; //иначе покидаем цикл
}
for (int i = 0; i < count; i++) Serial.println(data[i]);
}
}
ВАЖНО! (тем кто как я не понимает ничего в Ардуино и коде подсказка).
В строчке if (Serial.available() > 1){
заменить 1 на 0 что бы было if (Serial.available() > 0){
Тогда всё будет работать нормально.
А ещё такой затык. Не хотел работать один из цифровых пинов нормально. Работал только после значения за 200. Но когда поменял пин, всё заработало как надо. Так что имейте ввиду. Может кому то будет полезно.
очень простые уроки, возьмем строку, это делается так {прошло 3 секунды видео} вот так легко и просто мы получили межгалактический зведолет с возможностью генерации субатомных частиц
Гайвер крут! Что еще сказать. Вот интересно, будет ли это также работать на ESP8266 ?
конечно
Просьба пояснить момент 15:09 в видео. Получается, что теперь мы парсим, только если в буфере что - либо изменилось? А до этого парсили только если serial.avaliable?
В примере чтения строки с записью нуля в конце - ошибка же :) переполнение стека при получении 30 символов! (czcams.com/video/Ul03Vkg9A40/video.html) Нужно или буфер выделять с запасом на 0 в конце, или в метод чтения передавать макс длину на 1 меньше.
В библиотеке Gyveroled в файле ExtFont для esp8266 надо include заменить на просто иначе не компилируется
странно, у людей компилилось. Мб у тебя яверсия ядра старая?
Да, у всех esp свои файлы работы с памятью и т.д. Это нужно учитывать и подключать нужные библиотеки с помощью макросов.
Ждём урока по FreeRTOS!!!!!!!
не имеет смысла на AVR
@@ArduNotes почему, я лично реалезовал пару проектов на нем? Согласен что на АВР это не очень эфективно, но тем не менее возможность разделить на потоки различные не ресурсоемкие процедуры на потоки иногда очень удобно
@@Shef-Il согласен, но все-таки обычные ардуинки лучше не использовать для таких проектов. FREERTOS может быть полезен на esp, тем более на 32 он уже "предустановлен".
@@Shef-Il зачем, если есть миллис и на крайний случай прерывания таймера
@@MAD_ALEX не в обиду, но если вы спрашиваете "зачем" и вспоминаете про "милис" вы явно очень начинающий, ведь это тоже самое что спросить"зачем вы летите в Египет, ведь солнце светит и на Урале"
Теоретически можем использовать, что б метеостанция скидивала график смени всех датчиков?
Хе вспомнил прошивку марлин и отправку gcode на принтер, ведь там все так же
Сделай видео,как с приложения.
давай ещё код Хэмминга на ардуйне =)
будет, я свою реализацию замутил
Уроки про стринги я вам показывал )))
опробовал вариант Вариант 3 (однобуквенный, без задержки) прекрасно но только с положительными числами при подачи минусового числа выход 0 можно это както исправить уже мозги кипят
Ты гений, || умный
Я первый, ахахаха, впервые такое пишу ))
Fermata в помощь нуждающимся
Привет.
Я хочу сделать голосовую интеллект для телевизора, чтоб использовать место пульта.
Как собрать плату для данного задач. Сделайте пожалуйста видеоролик по этой направления.
Спасибо заранее
Ну управлять светодиодами конечно прикольно, но можно ли сделать информационное табло из ардуинки, Ethernet шильда и двухстрочного дисплея, чтобы показывало температуру на улице и автобусы на ближайших остановках перед входной дверью?
что угодно можно. На простых примерах это должно было быть понятно
Здравствуйте. Если мне нужно отправить на телефон показатели датчиков, например температуру воздуха, через Bluetooth, какой конструктор лучше использовать для создания приложения в телефоне?
Подскажите, пожалуйста, parseint обрабатывает числа со знаком "минус"?