Comments 58
Если вам это не интересно, зачем надо было открывать?
к сожалению не знаком с вашими творениями. есть от них польза?
Разок пришлось писать контроллер китайской светодиодной матрицы на Arduino pro mini (24x12 светодиодов. По сути — 3 отдельные панели светодиодов, R, G, B соответственно):
Если адресовать через DigitalWrite() — 8-10 FPS.
Если адресовать через SPI (Один цвет) — 30-50 FPS.
Переписал всё на регистры — 400+ FPS…
… Потом, интереса ради, повторил всё на STM32/HAL/3xSPI+DMA… Получил over9000 FPS…
Недели хватит?
Ну, а минусующие дегенераты … Что ж поделать? На быдлохабре чуть ли не 99% пользователей — быдло тупое, которое вообще ни публикаций, ни комментариев не оставляет, но любит поминусовать. Эффект толпы, однако.
Ну, а минусующие дегенераты … Что ж поделать? На быдлохабре чуть ли не 99% пользователей — быдло тупое, которое вообще ни публикаций, ни комментариев не оставляет, но любит поминусовать. Эффект толпы, однако.
Где ваша шпага, сударь?
В очередной раз флудите в комментариях, переходя на оскорбления, а сами даже ни про что ни написали. Ни одной статьи!
Сдаётся мне сударь, вы пустозвон
Если бы хал был сделан грамотно на С++ (шаблоны и все дела), оверхеда никакого бы не было. Но «индусы» грамотно не умеют. В итоге получилось опять Г вроде SPL.
А между тем, у ST есть отличные сниппеты для STM32F0. Для меня — загадка, почему, вместо того, чтобы выложить сниппеты под все серии, они стали клепать ненужное Г! Ещё и куб этот придумали, чтобы даже полный идиот мог код сгенерировать. Вот только в сгенерированном коде столько ошибок, что народ не перестает плакаться на форумах!
Ну, в принципе, чем больше идиотов вокруг, тем меньше конкуренция на рынке труда.
А я думал GitHub для таких вещей есть
хотите статью из одной ссылки?
русским по белому написано сверху: исходный код.
зачем вы потратили своё время не понимаю.
Можно было бы вставить код в одну из своих статей и призвать тех, кто хочет его увидеть
Для меня хабр источник информации, мне важно, чтобы он оставался незагаженым.
К сожалению, подобная статья является как раз обратным примером, вот и соответствующая реакция.
Значит в изначальной статье допустили ошибку не разместив там исходники. А сейчас какого то черта вместо нормальной статьи — бАнальный репозиторий. С тем же успехом и результатом можно было создать новую статью с одной лишь ссылкой на гит. Но вместо этого какой то доширак для чтения — просто добавь воды…
Понимаете, вас попросили поделиться кодом, а не создавать целую статью из кода. Код отдельно, метаданные отдельно. Хабр для статей, гитхаб, гитлаб, сорсфордж и иже с ними для кода. Даже если не пользуетесь гитом, достаточно было расшарить зип архив на гуглодиске и прикрепить ссылку к одной из статей. А так вы просто засоряете хабр тем, чего здесь быть не должно ( полный листинг кода)
Ссылку можно в существующий пост добавить, либо оставить комментарием.
Видимо в ленте со свежими новостями совсем туго, раз пришлось какой-то несчастный листинг открыть.
Комментарии, рейтинг и карма просто орут — так делать не хорошо. А вы из себя стпоите Пикассо «я писатель я так вижу ». Прислушайтесь к своей аудитории, если действительно ради них выкладывали.
(кстати, ЕМНИП, даже у самой глупой аврки, использующейся в абдурине, есть аппаратный UART; ну и зачем тратить ресурсы на софтовый ногодрыг?)
Честно говоря, страшно смотреть на «код» ардуинщиков. Он чем-то напоминает попытку вырезания гланд через задницу «врачом»-детсадовцем.
не понял зачем помнить что такое 0x02, 0x03, 0x06, 0x30, 0x41, 0xB3?
есть описание протокола, там всё расписано.
закомменченный код в основном доп функции. например считывание карт RFID. или вывод всех типов ошибок.
форматирование да хромает. сорян
я вобще не видел работающего алгоритма CCNET в открытом доступе.
раз люди обращаются, значит тоже у них проблема.
if(keydown && key<20) keydown=0;
if(key>300 && key<315 && !keydown) setRele(6); //ключ
if(key>330 && key<400 && !keydown) setRele(0);//стоп
if(!keydown && rele==0 && (EEPROM.read(10)>0 || EEPROM.read(11)>0))
{
if(key>920 && key<980) setRele(1);
if(key>810 && key<870) setRele(2);
if(key>720 && key<780) setRele(3);
if(key>600 && key<640) setRele(4);
if(key>420 && key<480) setRele(5);
}
20, 300, 315… 640, 420, 480 — что это? количество попугаев?
setRele(1), setRele(2), setRele(3) — какие то реле видимо.но за что отвечают?
SYNC: 1 byte код [02H]
ADR: 1 byte адрес купюроприёмника
LNG: 1 byte* длина данных
CMD: 1 byte команда
DATA 0 to 250 bytes Данные
CRC: 2 bytes контрольная сумма
У 30-рублевого STM32F030 есть 2 UART'а. Если взять МК за 60 рублей, то будет уже до четырех UART'ов. А за 150 рублей можно и еще больше получить… Не говоря уже о другой периферии, а также DMA.
1. Выпиливайте все закомментированные куски кода, когда выкладываете исходник для публикации.
2. Зачем делать инициализацию перемменых «char rOld=0;», а потом в setup переинициализировать «rOld=EEPROM.read(9);»?
3. Из АЦП читается мгновенное значение «int key = analogRead (5);» и по мгновенному значению «key» сразу переключаете реле. Поэтому понятно, почему Вы ранее в своей статье писали «для исключения дребезга реле, числа в условиях подбираются опытным путём». Пример одной из Ваших границ из кода, которую Вы подбирали,: «if(key>920 && key<980) setRele(1);». Что составляет ~6% от динамического диапазона АЦП. Аналогично по другим границам.
Поясню. У Вас в схеме, т.к. не видел и могу лишь только предполагать, что в Вашем девайсе есть компоненты с изменяемым потреблением, реле, светодиоды и прочее. А так же т.к. Вы используете Arduino Uno R3, то фильтрация по опорному напряжению для АЦП никакое. У вас скачет питание, работаете с мгновенными значениями. Вот Вы и получаете танцы с бубном при настройке. Так же будете шаманить, когда будете делать второй комплект оборудования.
Решение. Оптимально сделать свой контролер. Но можно и доработать Arduino Uno R3, поставить отдельный фильтр на питание АЦП VAref, а лучше отдельный линейный стабилизатор. Ввести программный фильтр на АЦП: либо усреднять, это проще для понимания, либо добавить хотябы КИХ фильтр первого порядка, например:
#define ALFA 16
float key_filt, key_filt1;
key_filt = key_filt1 + ( key_filt - key_filt1 ) / ALFA;
key_filt1 = key_filt;
key = (int)key_filt;
где ALFA – определяет полосу фильтра.
Кнопки работают через делитель напряжения на резисторах. На всех ящиках одинаковые резисторы. Подбирать только один раз надо. Особых проблем с этим не было.
Arduino давно поменяли на Orange Pi
Подбирать только один раз надо. Особых проблем с этим не было.
Пока не было
Вам правильно выше описали, что значения АЦП надо фильтровать или усреднять.
Для примера:
Вы считываете значение кнопки — а в этот момент дядя Вася в соседнем боксе варит самопальной сваркой. В ваш диапазон можете и не попасть, просто потому что значения будут прыгать из за наводок.
А завтра вам завезут другие резисторы с другой погрешностью — и может так случится что вы не попадете в диапазон.
А еще контакт кнопки может окислится — у вас же мойка и влажно — сопротивление уйдет и уплывут значения АЦП.
тут это совсем не важно. статья в основном про CCNet
в оранже кнопки по другому подключены
они в железном ящике. ок, учтём.
тут это совсем не важно.
Не сочтите что докапываемся по мелочам, но вопросы, относящиеся к метрологии, не так банальны как Вам могут показаться.
На пальцах поясню. Наверняка используете резисторы 5%, как правило у них ткс в зависимости от типа 50-200ppm. Т.к. Ваше железо работает в ящике на улице, то летом может быть +50, а зимой -20, т.е. общая дельта ~70град. Т.е. изменение сопротивления для 5%-резистора может быть в %% 0,35-1,4 при изменении температуры, т.е. с учетом разброса по номиналу сопротивления в 5% общее изменение с учетом климатики работы оборудования 5,35-6,4%. Как видите, легко по погрешности только уже по сопротивлению вываливаетесь из настроенных параметров границы срабатывания.
Да, на это можно и закрыть глаза на 1, 2… прототипах.
статья в основном про CCNet
А Вы не боитесь, что возможно переполнение стека при обращении к sendCCNET, т.к. используете вложенные вызовы?
Как легким движением руки автомойку превратить в хабрапомойку… Используя ардуину.
Arduino на автомойке ч.2.5 (исходный код, без картинок)