Сбросить переменную каждую 1 секунду на Arduino.

Я хочу сбросить эту переменную счетчика, которую я создал, каждые 1 секунду, но я не хочу нарушать работу оператора if.

Вот код:

int button=A0;
int val;
int count=0;
int presss;


void setup() {
  pinMode(button,INPUT);
  Serial.begin(9600);
}


void loop() {
  val=analogRead(button);
  if(val>1000){
   presss=count++;
   delay(200);
 }
  Serial.println(presss);
  delay(1000);
 }

, 👍0


3 ответа


2

Я бы сделал это следующим образом:

  • Используйте переменную, объявленную как: unsigned long time_passed;

  • В раздел setup() я бы добавил строку time_passed = millis();

  • В раздел цикла() я бы добавил условие if:

if(millis()-time_passed > 1000) { time_passed = millis(); нажимает = 0;

Я думаю, что в вашем примере это все еще не работает должным образом, я рекомендую внести два изменения в ваш код:

  • у вас реализована задержка 1000, что означает, что время цикла вашего цикла составляет минимум 1000 мс, это означает, что вы никогда не сможете сосчитать больше 1, поскольку ваш счетчик сбрасывается в каждом цикле.

  • Я не могу понять, как должен работать presss = count++;. Для правильного подсчета я бы предложил сделать это так: presss = presss + 1;

  • Примечание: макс. значение вашего счетчика будет равно 5, поскольку задержка в операторе if позволит максимум 5 обнаружений вашей кнопки в течение 1000 мс

,

0

Вы можете сделать что-то вроде этого:

void loop() {
  for (int i = 0; i < 5; i++) {
    val = analogRead(button);
    if (val > 1000) count++;
    delay(200);
  }
  Serial.println(count);
  count = 0;   
 }

При этом кнопка будет выбрана пять раз и подсчитано, сколько раз значение превышает 1000, с задержкой 200 мс между каждым чтением. Это дает ок. 1 с.

Но это может быть не та логика, которую вы ищете.

Удачи!

,

0

Если я понял проект, вы хотите посчитать, сколько нажатий кнопок вы сделали за одну секунду, поэтому я немного скорректировал ваш код. Если вы не хотите, чтобы ваша программа что-то делала через определенное время, но не хотите, чтобы она ждала, не используйте delay(ms), используйте millis() вместо этого (см. https://www.arduino.cc/reference/en/language/ функции/время/миллисы/ )

int button=A0;
int val;
int presss=0;

int millisBegin = 0;
int millisNow;
int millisBorder = 1000;

void setup() 
{
  pinMode(button,INPUT);
  Serial.begin(9600);
}


void loop() 
{
  val=digitalRead(button);

  if(val==HIGH)
  {
    presss++;     //Если кнопка нажата, будет считаться +1

    while(val==HIGH)
    {
      val=digitalRead(button); //Он будет ждать, пока вы не отпустите кнопку здесь
    }
  }

  Serial.println(presss);

  millisNow = millis();

  if(millisNow-millisBegin >= millisBorder)
  {
    presss = 0;
    millisBegin = millisNow;
    Serial.println("~1 second passed");
  }
}

Я проверил это, и у меня это сработало (я изменил if(val>1000) на if(val==HIGH), иначе он не всегда мог бы обнаружить нажатие кнопки

,