Купюроприемник + ардуина
- Войдите на сайт для отправки комментариев
Добрый день!
Ребята нуждаюсь в помощи.
Есть кюпюроприемник ICT P85. Подключен к ардуино в пульсе. Суть протокола банально проста: Когда запихтиваем в кюпюроприемник деньги он замыкает 2 контакта несколько раз. Накидал скетч для подсчета количества замыканий, все работает. Посчитать получилось. Проблема в следующем: Нужно подключить кнопку, при нажатии на укоторую загорается светодиод НО только приусловии что количество денег (замыканий) >=5.
int a = 0;
const int kupura = 2;
int buttonstate = 0;
void setup() {
Serial.begin(9600);
pinMode(kupura, INPUT);
}
void loop() {
buttonstate= digitalRead(kupura);
if (buttonstate == HIGH) {
a++;
delay(250);
Serial.println(a);
}
}
Интуитивно понимаю что нужно использовать do...while, или for но как это правильно написать не понимаю(((
Поскольку в программировании я новичек, как в принципе и в эллектрониек - прошу помощи знающих людей. Натолкните на мысль, особо благодарен буду за пример.
const int buttonPin = ?; const int ledPin = ?; int button = 0; void setup() { pinMode(ledPin, OUTPUT); pinMode(buttonPin, INPUT); } void loop(){ button = digitalRead(buttonPin); if (a>=5 && button == HIGH) { digitalWrite(ledPin, HIGH); } else { digitalWrite(ledPin, LOW); } }Добавляем к вашему коду
Kshyshtov - спасибо!!!
Код который вы мне написали выше работает отлично. Соеденив 2 в 1, так сказать, добился требуемого результата. В итоге сейчас скетч иеет следующий вид:
int a = 0; int button =0; int buttonstate = 0; const int led = 13; const int kupura = 2; const int buttonpin =4; void setup() { Serial.begin(9600); pinMode(led, OUTPUT); pinMode(kupura, INPUT); pinMode(buttonpin, INPUT); } void loop() { buttonstate = digitalRead(kupura); button = digitalRead(buttonpin); if (buttonstate == HIGH) { a++; delay(250); Serial.println(a); } if (a>=5 && button == HIGH) { digitalWrite(led, HIGH); delay(1000); digitalWrite(led, LOW); a=0; Serial.println(a); } else { digitalWrite(led, LOW); } }Но есть одна маленькая загвоздка, если нажать и не отпускать кнопку buttonpin =4; то светодиод продолжает гореть не обращая внимание на код
if (a>=5 && button == HIGH) { digitalWrite(led, HIGH); delay(1000); digitalWrite(led, LOW);Если нажать на кнопку кратко - код отрабатывается нормально. Не пойму в чем проблема. Подскажите куда копать? и на что смотреть?
Спасибо.
Добавляете флаг, который будет менять свое значение (с 0 на 1) при нажатии на кнопку, а питание светодиода будет зависеть от значения этого флага.
Т.е. флаг изначально имеет значение 0. Когда кнопка нажата, флаг принимает значение 1. Светодиод зажигается если a>=5 и флаг равен 1.
Дальше указывем сколько времени будет гореть светодиод, прежде чем флаг вновь примет значение 0.
Kshyshtov cделал все как вы советовали
int a = 0; int button =0; int buttonstate = 0; int f =0; const int led = 13; const int kupura = 2; const int buttonpin =4; void setup() { Serial.begin(9600); pinMode(led, OUTPUT); pinMode(kupura, INPUT); pinMode(buttonpin, INPUT); } void loop() { buttonstate = digitalRead(kupura); button = digitalRead(buttonpin); if (buttonstate == HIGH) { a++; delay(250); Serial.println(a); } if (button == HIGH) { f=1; } else { f=0; } if (a>=5 && f == 1) { digitalWrite(led, HIGH); //f=0; delay(1000); digitalWrite(led, LOW); a=0; Serial.println(a); } else { digitalWrite(led, LOW); } }Все работает отлично:)
Спасибо вам за помощь! Розобрался как работают условия. Сначала немного запутался, но потом понял свою ошибку:)
Следующий этап подключить серводвигатель, дисплей и датчики. Планируется собрать вендинговый аппарат. Буду изучать грабли дальше.
Спасибо!!!
Всегда пожалуйста. Удачи вам ;)
А я пошел разгребаться со своими граблями
ха. кошмарики как и в соседней теме, только здесь еще пристуствует купюроприемник!!
вообще ардуина и купюроприемник совместимы еще хуже, чем ардуина и носос )) уж эту задачу однозначно нужно решать с привлечением прерываний вместо digitalread(), иначе вы будете пропаривать иногда срабатывания датчика из-за наличия функций delay() и Serial.print().
Человек задает конкретный вопрос и получает вполне конкретный ответ. Все остальное - это опыт, полученный в результате проб и ошибок. В противном случае, на всем готовом научиться не возможно. ;)
> Человек задает конкретный вопрос и получает вполне конкретный ответ. Все остальное - это опыт, полученный в результате проб и >ошибок. В противном случае, на всем готовом научиться не возможно. ;)
- где я нахожусь ?
- вы находитесь в воздушном шаре.
хотя это же иго идея была - учиться на купюроприемнике, но должно же быть чувство сострадания в конце концов. я уже не говорю о том, что в его исходном варианте переменная а переполняется.
Не вижу смысла продолжать наш спор. ))) Вы заскучали и вам не с кем поговорить?
Если есть желание, сделайте все за автора темы.
З.ы.: сострадание, конечно, же есть. Именно поэтому мой ответ был таков
Добрый день!
ув. Maverik
Вы писали что в моем скетче переменная переполняется. Обьясние если Вам не тяжело как это - переполняется?
З.ы. Я действительно новичек, и только пытаюсь разобратся. Вместо того что бы писать что "Все фигня, так не делают, это кошмар" и тому подобное, лучше ткните носом на ошибка и пните в напревлении в котором нужно копать. Это гараздо полезней чем разводить демагогии что ТС - лузер. Это касается не только этой темы и меня, но большинства ребят которые задают вопросы на подобных форумах.
int
a = 0;a++;// после достижения переменной значения "32768", следующее "а++" даст результат "минус 32768"
и в мыслях такого не было. обращение было не к Вам, а к более опытным товарищам, которые дают "точные ответы" вроде известного "вы находитесь в воздушном шаре".
В данном случае, переменная "а" сбрасывается в ноль при определенных условиях.
if (a>=5 && f == 1) { digitalWrite(led, HIGH); //f=0; delay(1000); digitalWrite(led, LOW); a=0; Serial.println(a);Если я правильно понимаю суть слова переполнение. Это достижение этих значений переменной --32768 ?
Да спасибо. Я так и думал. Спасибо за ответ.
Ребята! помогите тут, Пожалуйста!!!
http://arduino.ru/forum/obshchii/arduino-optopara#comment-258294