Счетчик при нажатии на кнопку
- Войдите на сайт для отправки комментариев
Чт, 01/01/2015 - 06:51
Посчитать количество нажатий на кнопку,
вывести на компьютер
#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); повторить два раза.
впрочем i = EEPROM.read(0); в цикле можно не указывать, это ни начто не влияет. а вот если в setup пропустить то даже при написание этой строчки в цикле, на печать выводит значение 0
Писец какая странная конструкция. Вопрос 1.Нафига EEPROM? 2.Что сериал делает в сетапе? 3.Где тут прерывание? 4.Читать http://arduino.ru/forum/programmirovanie/rabota-s-knopkami-v-pomoshch-novichku эту тему не пробовал? Весь код бред какой-то.
И про дребезг тоже почитай.
eeprom, очевидно, для того, чтобы не потерять количество нажатий при выключении. сериал в сетапе выводит количество нажатий, которое было до предыдущего выключения. прерывания действительно не причем, так они и закоментарены. если разобраться, то никакая не "писец какая странная" конструкция, а вполне обычная.
впрочем i = EEPROM.read(0); в цикле можно не указывать, это ни начто не влияет. а вот если в setup пропустить то даже при написание этой строчки в цикле, на печать выводит значение 0
в цикле чтение можно не указывать, заменив
на
вот я убрал 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; }*/