Сбросить переменную каждую 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);
}
@Chinar, 👍0
3 ответа
Я бы сделал это следующим образом:
Используйте переменную, объявленную как:
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 мс
Вы можете сделать что-то вроде этого:
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 с.
Но это может быть не та логика, которую вы ищете.
Удачи!
Если я понял проект, вы хотите посчитать, сколько нажатий кнопок вы сделали за одну секунду, поэтому я немного скорректировал ваш код. Если вы не хотите, чтобы ваша программа что-то делала через определенное время, но не хотите, чтобы она ждала, не используйте 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)
, иначе он не всегда мог бы обнаружить нажатие кнопки
- Сохранение файла .txt на SD-карту и чтение данных каждого содержимого в файл txt, а затем сохранение его в переменной
- Объявленная переменная внутри void setup не видится в void loop
- Хранить переменную?
- Глобальный или локальный
- Использование переменной для индексации массива
- Использование одной и той же переменной между операторами if в loop()
- Функция управления сервоприводами
- Глобальная переменная меняет свое значение при повторном запуске цикла