Re: Устройство на Ardiuno для контроля пересечения барьера.
Добавлено: Вт июн 23, 2026 04:38:20
Ну наконец-то в третьем релизе автор избавился от бесполезного трехкратного чтения входов. Хотя, убрав одну ошибку, наворотил ошибок других. Эх, "40 лет программирования" - 40 лет писания багов.
В третьем релизе предыдущая бесполезность заменена другой бесполезностью:
Типа "если принято три вспышки светика, то..." Но это всё равно не имеет смысла, поскольку не отделяет истинный прием светика от ложного. Эти три импульса наберутся при любом раскладе. Чтобы отсеять ложные импульсы, помимо инкремента должен быть и декремент.
Правильность определения импульса здесь следует определять по обоим фронтам, сравнивая полученную длительность импульса с ожидаемым диапазоном, и на этом основании и выносить решение о том, принят ли реальный импульс или это была помеха.
В противном случае, вот эти вот три фронта - это пустая трата времени и кода. Любая серия коротких помех за интервал времени между вызовами ReadSignals() наберет эти ваши три импульса, и они будут неотличимы от реального сигнала.
А то, что сейчас "на столе" работает нормально, означает лишь то, что таких случайных помех сейчас нет.
Я ж говорю - ошибки в коде могут оставаться незамеченными и не портить работу в определенных условиях.
По стилю кодописания - по-прежнему жуть жуткая. В языке С принято каждую новую команду записывать с новой строки. Это убирает неоднозначность чтения, как в показанном блоке, когда команда imp1=0 фактически выполняется за пределами блока if-else.
Про ошибки с англ.названиями уже неоднократно говорил. "Вперед" - это не DIR, а forward. "Возможное пересечение вперед" - это "possible forward". Фраза "do back" переводится как "делай наоборот". Слово "channel" пишется именно так, через "h". "Rate" - это "скорость, темп". "Режим" - это "mode".
"Fire" - это "огонь" или "стрельба". А "свет" - это "light". А то из текста получается, что первый вошедший в сортир будет застрелен
В третьем релизе предыдущая бесполезность заменена другой бесполезностью:
Код: Выделить всё
void cannal_1() {
imp1++;
}
void ReadSignals() {
if (imp1<3) sign1=1; else sign1=0; imp1=0;
Правильность определения импульса здесь следует определять по обоим фронтам, сравнивая полученную длительность импульса с ожидаемым диапазоном, и на этом основании и выносить решение о том, принят ли реальный импульс или это была помеха.
В противном случае, вот эти вот три фронта - это пустая трата времени и кода. Любая серия коротких помех за интервал времени между вызовами ReadSignals() наберет эти ваши три импульса, и они будут неотличимы от реального сигнала.
А то, что сейчас "на столе" работает нормально, означает лишь то, что таких случайных помех сейчас нет.
Я ж говорю - ошибки в коде могут оставаться незамеченными и не портить работу в определенных условиях.
По стилю кодописания - по-прежнему жуть жуткая. В языке С принято каждую новую команду записывать с новой строки. Это убирает неоднозначность чтения, как в показанном блоке, когда команда imp1=0 фактически выполняется за пределами блока if-else.
Про ошибки с англ.названиями уже неоднократно говорил. "Вперед" - это не DIR, а forward. "Возможное пересечение вперед" - это "possible forward". Фраза "do back" переводится как "делай наоборот". Слово "channel" пишется именно так, через "h". "Rate" - это "скорость, темп". "Режим" - это "mode".
"Fire" - это "огонь" или "стрельба". А "свет" - это "light". А то из текста получается, что первый вошедший в сортир будет застрелен