Немного заброшенного кода на растерзание "Сенсорное открытие багажника".

Привет всем!

Я новичок в программировании и делаю свои первые шаги на платформе Arduino. Читаю книги Виктора Петина + смотрю различные видеоуроки YouTube. Решил поделиться опытом.

Когда-то было дурацкое и в тоже время дичайшее желание сделать на своей Калине открывание багажника при помощи сенсорной кнопки.

В видео ниже представлен общий пример.

Но просто прикоснуться нужного метса на авто и потянуть багажник для меня было недостаточно. Я хотел сделать всё гибко и под себя и вот каким путём я на тот момент пошел...

На большинстве автосигнализаций при постановке на охрану, снятии с охраны и т.д. мигают поворотники. Почему бы нам не использовать мигание поворотников как сигналы, Ардуинка через твёрдотельное реле будет получать эти самые сигналы:

1) Машинку поставили на охрану, поворотники мигнули 1 раз, режим "LOCK" — сигналы с сенсорной кнопки не учитываются, багажник не открыть.

2) Машинку открыли, поворотники мигнули 2 раза, режим "UNLOCK" — идём и спокойно открываем багажник.

3) Сработала охрана, вы сломались и включили аварийку, используете поворотники при перестроениях? Т.е. все те моменты когда поворотники мигают три раза и более . В этом случае ардуинка переходит в режим ожидания "WAIT". Как только сигналы с поворотников перестают поступать, Ардуинка восстанавливает тот режим, который был до "WAIT".

4) Сняли аккумулятор? Как только восстанавливается питание на Ардуинку и пока не сработает один из двух режимов "LOCK" или "UNLOCK" — ни какой реакции на сенсорную кнопку не будет.

Более подробно как всё будет работать написано в коде https://github.com/Beijo2908/My в "Недоделка".

Вопрос к знатокам - правильно ли я использовал условия от переполнения счетчика?

Немного заброшенного кода на растерзание "Сенсорное открытие багажника". Arduino, Программирование, Первый опыт, Опыт, Новичок на Пикабу, Новичок, Видео

Arduino & Pi

1.4K постов20.6K подписчик

Добавить пост

Правила сообщества

В нашем сообществе запрещается:

• Добавлять посты не относящиеся к тематике сообщества, либо не несущие какой-либо полезной нагрузки (флуд)

• Задавать очевидные вопросы в виде постов, не воспользовавшись перед этим поиском

• Выкладывать код прямо в посте - используйте для этого сервисы ideone.com, gist.github.com или схожие ресурсы (pastebin запрещен)

• Рассуждать на темы политики

• Нарушать установленные правила Пикабу

Вы смотрите срез комментариев. Показать все
Автор поста оценил этот комментарий

да блядь. да блин. ну нельзя использовать millis() в таких целях!

millis() - функция целочисленная, и ОНА НЕ ВОЗВРАЩАЕТ ВРЕМЯ, а возвращает КОЛИЧЕСТВО ТАКТОВ, ПРОШЕДШИХ С МОМЕНТА ВКЛЮЧЕНИЯ ПО МОДУЛЮ 2^32! читайте документацию внимательно, а не "по-диагонали".

p.s. Через 49,5 дней, любой цикл, в котором есть сравнение (вроде if(next_time>millis()) начинает не работать... Типичная ошибка переполнения, которой diy насрать (какая самоделка на ардуине работает непрерывно более 1-2-3х, ну хорошо, суток; только чур не "в теории", а на практике?), но если делать нечто "долгоиграющее", то такой пиздец однажды приподносит такой сюрприз... который при отладке невозможно поймать!

p.p.s. если так нужно millis() использовать - используйте самописный врапер, в котором результатом будет либо аналог int64, либо обрабатывается случай переполнения счётчика...

раскрыть ветку (10)
1
Автор поста оценил этот комментарий
Нашёл тему обсуждения переполнения millis() на стороннем сайте и взял для себя от туда немного опыта. Да, вы указали что if(next_time>millis()) это ошибка, я с вами полностью согласен. Но если делать через вычитание...
if(millis() - unsigned long > 2000){
***
}
unsigned long = millis();
В таком случае счётчик ни когда не переполнится. Для меня это был сюрприз) Это всё из-за уроков Гайвера)
раскрыть ветку (2)
Автор поста оценил этот комментарий

кстати, unsigned long увеличит время проявления косяка с переполнением до ~99,5 дней )

Автор поста оценил этот комментарий

для понимания работы таймера рекомендую посмотреть Arduino\hardware\arduino\avr\cores\arduino\wiring.c.

кстати, с моей колокольни я вижу, как фееричненько реализован таймер... хотя, наверное, я избаловался нормальными камнями, где такие костыли - редкость...

и, кстати - чем чаще дёргаешь millis(), тем больше шансов "дрейфа" показаний. увы, за всё нужно платить )

Автор поста оценил этот комментарий

Не понял. Millis() возвращает количество тактов или количество  миллисекунд?

раскрыть ветку (6)
Автор поста оценил этот комментарий

Millis() возвращает количество дёрганий таймера TIM0 (или TIMER0), прошедшее с момента инициализации программы. Причём время изменяется дискретно (смотреть дефайны MILLIS_INC/FRACT_INC)

раскрыть ветку (5)
Автор поста оценил этот комментарий

то есть, если в программу влепить delay("полтора года"), то через полтора года millis() вернет всего 1? через три года - 2?  Я не умничаю, просто пытаюсь понять, в описании к millis() кроме этого "which returns the number of milliseconds since the Arduino board began running the current program" не нахожу.

раскрыть ветку (4)
Автор поста оценил этот комментарий

"This number will overflow (go back to zero), after approximately 50 days."

Если влепить ("полтора года") то через полтора года ... ничего не произойдёт. программа тупо не сможет достичь нужного числа, из-за переполнения счётчика.

Если нужно "полтора года", то рекомендую пользовать внешние часы, где можно будильником задать произвольную дату ))

раскрыть ветку (3)
Автор поста оценил этот комментарий

это как раз понятно, хотя формулировка шикарная, конечно.  Но где про циклы указано я не нашел, всегда в миллисекундах работала у меня эта функция. А для таймеров обычно 50 дней достаточно.

раскрыть ветку (2)
Автор поста оценил этот комментарий

при отсутствии информации, всегда полезно обратится к "первоисточнику" - в данном случае к исходникам ядра ардуины ))

раскрыть ветку (1)
Автор поста оценил этот комментарий

это да, но, боюсь, сходу кишка. А разбираться особо надобности нет. Но при удобном случае обращу внимание, спасибо!

Вы смотрите срез комментариев. Чтобы написать комментарий, перейдите к общему списку