Comments 35
long
duration; // Объявление переменной duration типа long, которая будет хранить длительность эхо-сигнала от датчика
Ну, комментарии от Кэпа можно и не писать.
"комплекс ардуинщика" (в начале) - это опечатка или новое слово в психиатрии? :)
Домашка-тудушка:
Выяснить "накладные расходы" на выполнение digitalwrite/read и выполнение деления пополам;
По документации HC-SR04 - выяснить максимальную частоту отправки зондирующих импульсов;
Разобраться, как снизить "накладные расходы" на отправку данных к ПК;
Выяснить необходимость "delay(100)";
Математически показать минимальную и максимальную дистанции работы (пренебрегая затуханием сигнала) и разрешение по дальности.
Выяснить "накладные расходы" на выполнение digitalwrite/read и выполнение деления пополам
А умножение на 0.0344 нам бесплатно досталось? ;) Как для этого проекта - важна только точность измерения. Судя по по тому что дёргается функция из API - там аппаратный таймер (я надеюсь).
Как эту программу не оптимизируй, хоть на ассемблере перепиши - она все равно влезет в память ардуины ;)
Начнём с простых вещей - с двойки, которую видел в кошмаре Бендер. А там уж и до точечных чисел доберёмся.
Ооо. Ну тут для меня уже начинается темный лес. Но я постараюсь в этом разобраться
Вам тут намекают, что ардуиновские функции медленные и лучше писать на ассемблере. Не ведитесь ;) Они сделаны умными людьми и достаточно быстрые.
Грамотно переписав их на Си - можно получить значимый прирост в скорости работы и/или плотности кода.
Грамотно переписав их на Си
Хе-хе. Как вы думаете, на каком языке они написаны? ;)
Все знают, что они написаны на Си. Но - неграмотно.
(Пожимает плечами)
Все знают, где лежат исходники Arduino core. Но форкнуть и переписать грамотно, почему то, нет желающих.
А что там неграмотного? Например.
Понятно, что если ногами дрыгать через регистры, а писать код на ассемблере, то дрыгать можно быстрее. И в байтоложество тоже можно упороться, да Удобство работы оно не бесплатное.
Тут вообще-то такая задача обсуждается, для которой ЛЮБЫЕ тормоза - это потеря точности. Вот конкретно тут идея упарываться в скорость совершенно не выглядит плохой.
Что-то можно победить калибровками, но в целом "пишите как можно быстрее - тормозить будет само".
так то оно да. только 1 мкс это 0.7мм, в этой физической модели. такое разрешение этот датчик не думаю что сможет выдать.
Упарываться в такты процессора имеет смысл, например, в светодиодной ленте. И в либах для rgb светодиодов критичные функции на ассемблере, интерфейс на плюсах, вызывается все это из обычного ардуиновского скетча, ичсх работает как надо.
Вся ошибка из-за тормозов будет очевидно суммироваться с ошибкой датчика....
Следите за руками. На какой частоте работает тот ультразвуковой датчик? Какая у него рабочая длина волны? Стоит ли от него ожидать точности большей чем длина волны? Лишние микросекунды от оверхедов в digitalWrite ничего не испортят.
Можно конечно и в даташите посмотреть.. ;)
Точности много не бывает, бывает только мало.
Риторику "и так сойдёт" понимаю, но извинить не могу :(.
Прикладная задача для этого сетапа неясна, поэтому любые разговоры "в цифрах" бесполезны. Полезно понимать чем и где жертвуешь и как можно по-другому. Потому как если не понимаешь, то когда точность понадобится ты ее обеспечить не сможешь. Ты даже никогда не поймешь что не так и почему точности нету.
А говнокодить или нет в конкретном случае - вопрос к ТЗ в общем-то...
Точности много не бывает
Ещё как бывает. Если датчик выдает погрешность в 5% - глупо показывать 6 цифр после запятой, несмотря на то что double вам достался бесплатно вместе с компилятором.
говнокодить
Говнокод - это то сложно читать и изменять. Не тот случай ;) Тут даже начинающему всё понятно. А вот битово-регистроваяи магия - это и есть тот самый говнокод.
Вы что-то не то нам сообщаете. Причем тут что показывают, в данном случае вся дополнительная погрешность суммируется с той что уже была у датчика. И в целом не важно какая она - станет хуже, лучше не станет.
И есть куча случаев, когда при точности 1% имеет смысл показывать хоть пятый хоть десятый знак. Лишь бы повторяемость была...
Delay - зло, надо отвыкать)
Ещё в большинстве плат есть вотчдог, для долго работающих устройств не повредит:
include <avr/wdt.h> // Библиотека Watchdog таймера - в начале кода
wdt_enable (WDTO_8S); // Включаем watchdog, время 8с (максимальное) - в setup
wdt_reset(); // Обнуляем таймер вотчдога - регулярно в бесконечном цикле
Ну, путь в тысячу миль начинается с первого шага.
Упорства в развитии и успехов
Ожидал увидеть результаты по точности и повторяемости измерений, диапазонам итд итп. Про калибровку может чего.
Вместо этого "узнал" что если крутить подстроечный резистор меняется яркость.
Разочарован :(
У меня такой на бочке стоит ,насос включает и выключает для наполнения водой ,в коде я не силен ,Дипсек всё написал 🤗
Мой первый проект по электронике: Дальномер на базе Arduino