Счетчик при нажатии на кнопку

kaktus
Offline
Зарегистрирован: 31.12.2014

Посчитать количество нажатий на кнопку,
вывести на компьютер

#include <EEPROM.h>

int i;
volatile int stop1 = HIGH;


void setup()
{
   pinMode(2, INPUT);  //кнопка
   //attachInterrupt(0, blink, CHANGE); //прерывание

   Serial.begin(9600);

    i = EEPROM.read(0);
    Serial.println(i); 
}
 
void loop()
{
  //digitalWrite(2, stop1); 
  if (digitalRead(2)==HIGH){  //нажатие кнопки
  EEPROM.write(0, i+1);
  delay(500);
  i = EEPROM.read(0);  
  }
  //detachInterrupt(0);
}

/*void blink()
{
  stop1 =! stop1;
}*/

Однако если удерживать кнопку более 0,5 сек то цикл повторяется и значение нажатие кнопки не соответстввует действительному
Попытался подключить функцию прерывания (без delay) но ничего не вышло цикл не останавливается

Еще трудность возникла что значение i не сохраняется в памяти и пришлось строчку i = EEPROM.read(0); повторить два раза.

kaktus
Offline
Зарегистрирован: 31.12.2014

впрочем i = EEPROM.read(0); в цикле можно не указывать, это ни начто не влияет. а вот если в setup пропустить то даже при написание этой строчки в цикле, на печать выводит значение 0

Coolerr
Offline
Зарегистрирован: 30.06.2014

Писец какая странная конструкция. Вопрос 1.Нафига EEPROM? 2.Что сериал делает в сетапе? 3.Где тут прерывание? 4.Читать http://arduino.ru/forum/programmirovanie/rabota-s-knopkami-v-pomoshch-novichku эту тему не пробовал? Весь код бред какой-то. 

if(кнопка==false)i++;
 Сериал(i);

И про дребезг тоже почитай.

com
Offline
Зарегистрирован: 06.09.2013

eeprom, очевидно, для того, чтобы не потерять количество нажатий при выключении. сериал в сетапе выводит количество нажатий, которое было до предыдущего выключения. прерывания действительно не причем, так они и закоментарены. если разобраться, то никакая не "писец какая странная" конструкция, а вполне обычная.

 

kaktus пишет:

впрочем i = EEPROM.read(0); в цикле можно не указывать, это ни начто не влияет. а вот если в setup пропустить то даже при написание этой строчки в цикле, на печать выводит значение 0

в цикле чтение можно не указывать, заменив

EEPROM.write(0, i+1)

на

EEPROM.write(0, ++i)

 

Deep Sky
Offline
Зарегистрирован: 12.10.2014

вот я убрал delay() и сделал boolean in для триггернего режима и цикл не будет повторятся.

#include <EEPROM.h>

int i;
volatile int stop1 = HIGH;

boolean in = HIGH;
void setup()
{
   pinMode(2, INPUT);  //кнопка
   //attachInterrupt(0, blink, CHANGE); //прерывание

   Serial.begin(9600);

    i = EEPROM.read(0);
    Serial.println(i); 
}
 
void loop()
{
  if (digitalRead(2)==LOW){in = HIGH}
  if (digitalRead(2)==in){
  //digitalWrite(2, stop1); 
  if (digitalRead(2)==HIGH){  //нажатие кнопки
  EEPROM.write(0, i+1);
  i = EEPROM.read(0); 
 in != digitalRead(2); 
  }
  //detachInterrupt(0);
  }
}

/*void blink()
{
  stop1 =! stop1;
}*/