Оператор IF для запуска, даже если требование больше не выполняется

Я сделал мигалку для фар своего гоночного автомобиля. Хотя он работает, когда я держу переключатель нажатым, если я отпускаю переключатель и цепь замыкается, мои требования к операторам IF больше не выполняются, и он перестает мигать.

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

Заранее спасибо.

КОД:

#define trig A3

const int flash = 3; //D3
const float mVc = 4.67; //опорное напряжение
float counts = 0;
float mV = 0;

void setup() {
  Serial.begin(115200);
  pinMode(flash, OUTPUT);
}

void loop() {
  counts = analogRead(trig);
  //количество = 255;
  Serial.println(String(counts));

  mV = (counts*mVc) / 1000;
  Serial.println("Input Voltage: " + String(mV) + "v");

  // задержка (1000);
  
// напряжение необходимо изменить на соответствующее выходному напряжению на автомобиле
  if (counts > 10) {
    analogWrite(flash, 100);
    delay(300);
    analogWrite(flash, 0);
    delay(80);
    analogWrite(flash, 100);
    delay(300);
    analogWrite(flash, 0);
    delay(80);
    analogWrite(flash, 100);
    delay(300);
    analogWrite(flash, 0);
    delay(80);
    analogWrite(flash, 100);
    delay(300);
    analogWrite(flash, 0);
    delay(80);
    analogWrite(flash, 100);
    delay(300);
    analogWrite(flash, 0);
    delay(1000);       
  }
}

ИЗМЕНИТЬ:

TL;DR Не используйте делители напряжения для питания Nano.

При использовании делителя напряжения для питания Nano (знаю, знаю) приведенное ниже решение не решило проблему. Я думал, что это может быть связано с падением напряжения, когда Nano подает 5vo на MOSFET, но я не уверен, почему удерживание переключателя остановит это. Несмотря на это, я переключился на линейный стабилизатор напряжения, а затем он начал мигать, "Ура!" - почти.

При включенном регуляторе код постоянно работал. Я решил распечатать количество запусков и получил число более 35 000, что означает, что флэш-память будет запускаться 5 раз для > 35 000 раз. Хотя мне было любопытно, что произойдет, когда он достигнет нуля, я решил вернуться к своему исходному коду, и... теперь он работает.

Поэтому я думаю, что урок таков: даже если вы можете рассчитать падение напряжения, не подключайте Nano к делителю напряжения.


Я проверил приведенный ниже ответ как решение, хотя он не решил мою проблему, нет никаких причин, по которым он не должен был работать, и он может быть полезен кому-то еще.

, 👍1

Обсуждение

почему вы используете аналоговый ввод-вывод?, @jsotola


1 ответ


Лучший ответ:

0

Вверху можно определить переменную int runcount = 0. Затем измените логику цикла на что-то вроде

if (counts > 10) {
  runcount = 2;
}

if (runcount-- > 0) {
  // кричащий
}

Эффект заключается в том, что пока кнопка нажата и подсчитывает > 10, количество запусков равно двум. Каждый раз, когда мы проверяем количество запусков, оно уменьшается на 1. Пока кнопка нажата, количество запусков сбрасывается до 2. Если вы отпустите кнопку, количество запусков будет равно 1 в начале проверки условия if. Он будет сравнен с 0, условие будет истинным, затем оно будет уменьшено до 0, а секция if будет выполнена в последний раз. Использование числа, отличного от 2, изменит количество дополнительных запусков.

,

Спасибо, я попробую это завтра, и тогда все, что осталось, это «легко» установить его на машину. :), @dav0s