Подскажите пожалуйста новичку
- Войдите на сайт для отправки комментариев
Втр, 10/05/2016 - 22:27
void check_start() |
088 |
{ |
089 |
if (digitalRead(start_in) == 0 && left_start_try == 0) // 1 is command for start - 1 значит импульс старта пришел с дистанционного управления <--- тут определяется полярность импульса запуска |
090 |
{ |
091 |
left_start_try = 3; // указываем что нужно попытаться трижды запустить движок |
092 |
} |
093 |
094 |
|
095 |
if ( left_start_try > 0 ) |
096 |
{ |
097 |
digitalWrite(engine_out, HIGH); //включаем зажигание |
098 |
digitalWrite(secpower_out, HIGH); //включаем печку фары итд |
099 |
delay(3000); // останавливаем код на 3 секунды чтобы бензонасос набрал давление, все датчики включились |
Добрый день. Есть устройство которое при определённом событии отправляет импульс на ардуину и запускается скетч. Но проблема в том, что при подаче питания устройство так же кратковременно выдаёт этот импульс. Как отстроить скетч от этого срабатывания? Кусочек скетча с командой от устройства (строка 089) приложил.
Поставить в setup() задержку, пока внешний сигнал устаканится - delay(xxx).
Я не совсем верно написал коммент. Сигнал от внешнего устройства не запускает скетч, а так сказать задаёт определённое событие в скетче, а setup запускается при подаче питания на Ардуину - питание у устройства и Ардуины разные. Что бы не было путаницы валожу весь скетч...
И кто-то будет Ваш скетч изучать, да ещё залитый текстом, а не как положено? :) Описывайте суть проблемы: что за чем запускается, что куда чего даёт и что из этого лишнее. Если у Вас дуня постоянно включена и кушает АКБ, то дело Ваше. :)
Если у Вас что-то там включается при уже включенной дуне и появляется паразитный сигнал, то:
а) схема неверно сделана;
б) устройство кривое;
г) потребуется отслеживать отдельно включение того устройства и и не верить ему некторое время.
Суть проблемы: Есть GSM устройство, которое даёт импульс положительной полярности в Ардуину при поступлении СМС. Но косяк устройства в том, что при подаче на него питания оно тоже кратковременно подаёт этот импульс. Собственно вырезку из скетча я давал в первом сообщении:
void
check_start()
088
{
089
if
(digitalRead(start_in) == 0 && left_start_try == 0)
// 1 is command for start - 1 значит импульс старта пришел с дистанционного управления <--- тут определяется полярность импульса запуска
090
{
091
left_start_try = 3;
// указываем что нужно попытаться трижды запустить движок
092
}
093
094
095
if
( left_start_try > 0 )
096
{
097
digitalWrite(engine_out, HIGH);
//включаем зажигание
098
digitalWrite(secpower_out, HIGH);
//включаем печку фары итд
099
delay(3000);
// останавливаем код на 3 секунды чтобы бензонасос набрал давление, все датчики включились
digitalRead(start_in) - это и есть сигнал от устройства.
Вопрос собственно в том, можно ли прописать длительность этого сигнала, допустим 2с, что бы сигналы меньшей длительности игнорировались?
Логика работы конечного автомата слишком сильно разнесена по функциям и не очевидна. Код не офрмлен как положено и поэтому труден для всоприятия. Пока нашел что режим у вас устанавливается в зависимости от состояния ручника, но движок заводится ПРЕДВАРИТЕЛЬНО .. так точно надо?
Вам тоже советую прочитать Паронджанов В.Д. "Занимательная информатика", взять можно тут drakon.su, как и программки к языку. Псоле чего не полениться и выписать полноценную ДРАКОН-схему вашего конечного автомата. Найти и поправить ошибки станет возможно "левой задней пяткой", как мне кажется. Книжка веселая и доходчивая, легко осваивается детьми в возрасте 9-10лет за пару дней, впрочем как и "ИС ДРАКОН" с указанного сайта. У него есть месяц бесплатного пользования - вам вполне достаточно, а понравится - можете и оплатить автору его 300-500руб "пенсионных". Он того вполне заслуживает. :)
Давайте обстрагируемся от этого скетча. Возьмём простой пример. Есть кнопка, при замыкании которой срабатывает реле.
Например такой скетч:
int button = 2;
int rel = 8;
void setup() {
pinMode(rel, OUTPUT);
pinMode(button, INPUT);
}
void loop(){
if (digitalRead(button) == HIGH) {
digitalWrite(rel, HIGH);
}
else {
digitalWrite(rel, LOW);
}
}
Вопрос: как выполнить условие, что бы реле работало, только при фиксации кнопки более 1 секунды?
У Калапуция, как бы к нему не относиться, есть прекрасный код для кнопки, Он привязан в шапке форума.
...
Если короче, то так: при обнаружении Вашего сигнала, Вы не кидаетесь, как ошпаренный выполнять команду, а ЗАПОМИНАЕТЕ время прихода сигнала и ВЗВОДИТЕ ФЛАГ ожидания.
При следующем вызове, а мы понимаем, что loop() вызывается постоянно, раз-за-разом, Вы проверяете смостояние волшебного Вашего сигнала, если прошло некое разумное (на Ваше усмотрение, 10-200 мс) время, а сигнал все еще поступает, то Вы приходите к важному в Вашей жизни решению - это не на...балово, а сигнал, внезапно, НАСТОЯЩИЙ!!! Вот тут уж не отвертишься - ноги в руки и быстро выполнять код, что-там-у-Вас, запуск двигателя?
Я понятно объяснил? Если нет - прочтите, как Калапуций написал свой "титановый велосипед для тактовой кнопки" - это хороший пример, чтобы разобраться в вопросе.
Да я уже нашёл эту тему, правда пока не очень соображу как это внедрить в мой код... чтобы отсчёт времени начинался не от старта программы, а от нажатия кнопки...
в процедуре чек-старт() завести static переменную типа такой: first_sig_detect_time ("запомненное время"), При первом появлении сигнала (если эта переменная равна 0 И что-там-у-Вас в ифе в первом посте) просто запомнить в ней millis(); При следующем, если "текущее_время" - "запомненное" БОЛЬШЕ "проверочного" И "сигнал есть" - то начать работать, Иначе, если сигнала нет, то сбросить в 0 "запомненное время".
На первый взгляд, более ничего в коде менять не стоит.
У Калапуция, как бы к нему не относиться, есть прекрасный код для кнопки, Он привязан в шапке форума.
есть у Клапауция...
класс титановый велосипед для тактовой кнопки.
класс титановый велосипед для delay без delay().
Все кому сейчас под 50 читали Лема, совок тогда общий на всех был.
Я нарочно коверкаю твой ник, так смешнее. Кому нужно - поймет, кто не понял - ну и пусть.
Да в общем нормально, но есть ли понимание того, что все запустится ТОЛЬКО если в течении 2000 мс держать сигнал поднятым? 2000 не дохрена ли? Просто спросил.
Я думаю 1с будет достаточно, просто в цыфры особо не вдавался, пока занимался формой). А можно вынести
static
const
unsigned
int
retention = 2000;
// длительность отслеживания нажатия и удержания.
07
static
int
first_sig_detect_time = 0;
// длительность отслеживания нажатия и удержания.
в начало скетча, где перечисляются все принятые переменные?
Читайте Евгения.П, а не его оппонентов ;) и НЕ ИСПОЛЬЗУЙТЕ глобальные переменные без четко понимаемой необходимости.
Если эта переменная нужна только в этой функции, то пусть она только там и будет. Если ее значение нужно сохранять от вызова-к-вызову, то она должна быть "static". Это вопрос изначальной культуры програмирования. При маленьких скетчах на один файл - значения не имеет, но как привычка - можно выработать хорошую, а можно дурную.
Привыкайте мыслить объектно, а не всей кучей программы в целом. Чек-старт - это отдельный объект, в нем варится некая кухня, которая другим объектам АБСОЛЮТНО не нужна, так и пусть будет им не видна. Даже когда Вы пишите на "чистом", процедурном Си, мыслить объектно - все равно правильнее, не обязательно оформлять в стиле С++.
Если алгоритм сложнее включения лампочек на лестнице, то не всегда легко представить его работу целиком, всего. Поэтому мы делим его на независимые объекты. В Вашем случае - отдельный объект "брелок" он может передавать (возможно и принимать) сообщения и иметь внутреннее состояние. Есть объект "двигатель", объект "система запуска". У каждого есть свои состояния и возможность передавать и принимать сообщения. Часы, в смысле реальное время - это тоже объект, и от него Вы получаете сообщения функцией millis().
.....
Короче "Остапа понесло", простите. Холиваров на форуме начитался и не выдержал.
--------
По теме: можно и перенести, сами решайте. Глобальные переменные - зло, но в рамках наших "програмок" для ардуино - похеру.
Оппоненты ЕвгенияП нигде не рекомендуют совать всё подряд в общие глобалы и разбирать велосипеды. Тем не менее, сами по себе, глобалы не являются ни добром ни злом. Собственно безаппеляционность этого предрассудка "глобалы - зло" и есть "обучение плохому" .. все зависит исключительно от применения: "по делу или по предрассудку".
В данном конкретном случае, Клапауций - безусловно прав. Нет никакой надобности разбирать велосипед. Потом неожиданно, может выйти боком. Желание автора вынести в "общую кучу настроек решается проще: сделайте в своей общей куче #define MAX_RETENTION 2000 или сколько вам хочется и воткните его в оператор присваивания. Делов-то.
Возможно при включении устройства сигнал меньшей длины, например 50 мс, а когда нормальный сигнал, то допустим 500 мс, тогда можно на этом свойстве и узнавать. В общем делайте миниосциллограф на ардуино =)