Использование тумблера для запуска части скетча

Во-первых, я новичок в этом. Я только что заказал свою первую книгу по кодированию Arduino и работаю над несколькими простыми приложениями, используя DS3231 (с функцией считывания температуры), ЖК-дисплей, модуль карты MicroSD и т. д. Моя плата — Uno R3. В настоящее время мне нужен скетч для запуска части программы, которая содержит цикл для сбора данных и запускает его при включении тумблера. Итак, переключатель включается, и часть программы запускается, переключатель отключается, и эта часть завершается. Причина, по которой мне нужен переключатель с постоянным включением/выключением, заключается в проблеме с перегрузками и вибрацией. Мгновенное нажатие кнопки не будет надежным. В конечном итоге все компоненты будут в любительской ракете большой мощности для запуска программы управления креном. Если вы можете помочь, я очень ценю вашу помощь.

, 👍0

Обсуждение

кнопочный переключатель и тумблер с электрической точки зрения одинаковы..... тумблер имеет механическое устройство, которое удерживает переключатель в закрытом положении при его активации .......... нажатие кнопки или поворот тумблер или скручивание двух проводов вместе — это одно и то же, что касается Arduino., @jsotola

Я нашел пример, когда во время калибровки удерживалась кнопка. Как вы, вероятно, знаете, существует множество примеров использования переключателя мгновенного действия, но мало примеров использования переключателя. Я ценю предложение использовать операторы if-else для достижения этой цели. Я жду получения нескольких резисторов и винтовых переключателей, которые я использую в ракетной технике для проверки схемы. Меня интересует, как предотвратить потенциальный отскок при замыкании винтового переключателя. Это может произойти потому, что эти переключатели имеют некоторый люфт, пока переключатель не затянут., @RED

я не уверен, что вы поняли мой комментарий... с электрической точки зрения нет никакой разницы между кнопкой и тумблером... нет причин, по которым вам следует различать примеры в Интернете.. ..... просто используйте библиотеку debounce в своем эскизе, @jsotola


2 ответа


3

Есть разные способы добиться одного и того же.

Условием является флаг или порт чтения.

if(digitalRead(inPin))
     {
     // Здесь ваш первый код.
     }
else 
     {
     // второй код
     }

Контакты переключателя подпрыгивают при размыкании или замыкании. Возможно, вы захотите это рассмотреть. Обычно он стабилен в течение 10 миллисекунд. В зависимости от того, что вы делаете, это может иметь или не иметь значение.

,

0

Вам нужно кое-что. Вверху вашего скетча, перед setup()

byte togglePin = x; // от 2 до 19 с помощью Uno. Провод для подключения контакта к Gnd в закрытом состоянии.

В настройке()

 pinMode (togglePin, INPUT_PULLUP);

В цикле()

if (digitalRead(togglePin) == LOW){
// переключатель замкнут, делаем что-то или прекращаем что-то делать
// возможно, также установим флаг, например
toggleState = 0;
}
else {
// переключиться, прекратить что-то делать или начать что-то делать
toggleState = 1;
}

Флаг можно использовать в другом месте вашего кода

if (someOtherCondition && toggleState == 0){
// запускаем таймер или двигатель или что-то в этом роде
}
if (someOtherCondition && toggleState == 1){
// выключаем таймер или двигатель или что-то в этом роде
}
,

Спасибо! Я собираюсь попробовать это. RE предыдущие комментарии, извините, если было какое-то недопонимание. Просто хотел убедиться, что люди понимают, что я не использую мгновенный переключатель, например, включение и выключение светодиода. Мне нужно включить систему, запустить программу, а затем подождать, пока я включу винтовой переключатель, чтобы запустить датчик и программу управления. Это будет сделано только один раз за рейс., @RED

Вместо этого вы можете использовать while (digitalRead()==Low) в setup(). Он будет читать булавку до тех пор, пока условие не станет ложным., @CrossRoads

Оператор if-else работает отлично; Спасибо еще раз за помощь. Чтобы набраться опыта, я также использовал переменную toggleState. Мне просто нужно было добавить определение как int в начале программы. Как вы думаете, (digitalRead()==Low) будет быстрее или будет вести себя иначе? Кроме того, мне любопытно, замедляют ли комментарии (т. е. //) выполнение программы или компиляция игнорирует эти комментарии?, @RED

Комментарии ничего не делают, компилятор их удаляет. «Как вы думаете, (digitalRead()==Low) будет быстрее или будет вести себя иначе?» Тогда что?, @CrossRoads

Я подумал, что, хотя может быть несколько способов добиться одного и того же поведения, некоторые процедуры могут быть быстрее. Я имею в виду более быстрое восприятие, а не только машинное время. Хотя я уверен, что более медленные процедуры добавят время, если будут повторяться много раз. В любом случае, я только что получил свою первую книгу по созданию эскизов Arduino и начал ее читать. Надеюсь, через неделю я узнаю больше. Но, без сомнения, у меня все равно будут вопросы. Это отличный ресурс!, @RED

Конечно, это правда. Вы можете манипулировать портами, чтобы быстрее читать и записывать биты, но вы теряете все проверки, которые программное обеспечение Arduino выполняет за вас в фоновом режиме. Например, я мог бы сделать (if (PIND && 0b00000100) == 0b00000100){ } vs if (digitalRead(D2) == HIGH){ }, чтобы проверить, находится ли вывод в состоянии High, или PORTB = PINB | 0b00000100; vs digitalWrite (D10, ВЫСОКИЙ); установить пин (сделать его высоким), но для многих вещей возможная экономия в 1-2мкс не ощутима. Однажды мне пришлось обновить 45 сдвиговых регистров с частотой 20 кГц, и мне нужна была вся доступная скорость. Я использовал осциллограф, чтобы подтвердить время., @CrossRoads