Купюроприемник + ардуина

joni_vg
Offline
Зарегистрирован: 29.06.2012

Добрый день!

Ребята нуждаюсь в помощи. 

Есть кюпюроприемник 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 но как это правильно написать не понимаю(((

Поскольку в программировании я новичек, как в принципе и в эллектрониек - прошу помощи знающих людей. Натолкните на мысль, особо благодарен буду за пример. 

Kshyshtov
Offline
Зарегистрирован: 02.09.2013
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);
}
}

Добавляем к вашему коду

 

joni_vg
Offline
Зарегистрирован: 29.06.2012

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);

Если нажать на кнопку кратко - код отрабатывается нормально. Не пойму в чем проблема. Подскажите куда копать? и на что смотреть?

Спасибо.

Kshyshtov
Offline
Зарегистрирован: 02.09.2013

Добавляете флаг, который будет менять свое значение (с 0 на 1) при нажатии на кнопку, а питание светодиода будет зависеть от значения этого флага.  

Т.е. флаг изначально имеет значение 0. Когда кнопка нажата, флаг принимает значение 1. Светодиод зажигается если a>=5 и флаг равен 1.  
Дальше указывем сколько времени будет гореть светодиод, прежде чем флаг вновь примет значение 0.
 

joni_vg
Offline
Зарегистрирован: 29.06.2012

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);
    }
  }

Все работает отлично:) 

Спасибо вам за помощь! Розобрался как работают условия. Сначала немного запутался, но потом понял свою ошибку:)

Следующий этап подключить серводвигатель, дисплей и датчики. Планируется собрать вендинговый аппарат. Буду изучать грабли дальше. 

Спасибо!!!

Kshyshtov
Offline
Зарегистрирован: 02.09.2013

Всегда пожалуйста. Удачи вам ;) 
А я пошел разгребаться со своими граблями

Maverik
Offline
Зарегистрирован: 12.09.2012

ха. кошмарики как и в соседней теме, только здесь еще пристуствует купюроприемник!!

вообще ардуина и купюроприемник совместимы еще хуже, чем ардуина и носос ))  уж эту задачу однозначно нужно решать с привлечением прерываний вместо digitalread(), иначе вы будете пропаривать иногда срабатывания датчика из-за наличия функций delay() и Serial.print().  

Kshyshtov
Offline
Зарегистрирован: 02.09.2013

Человек задает конкретный вопрос и получает вполне конкретный ответ. Все остальное - это опыт, полученный в результате проб и ошибок. В противном случае, на всем готовом научиться не возможно. ;)

Maverik
Offline
Зарегистрирован: 12.09.2012

> Человек задает конкретный вопрос и получает вполне конкретный ответ. Все остальное - это опыт, полученный в результате проб и  >ошибок. В противном случае, на всем готовом научиться не возможно. ;)

- где я нахожусь ?

- вы находитесь в воздушном шаре.  

хотя это же иго идея была - учиться на купюроприемнике, но должно же быть чувство сострадания в конце концов. я уже не говорю о том, что в его исходном варианте переменная а переполняется.

 

Kshyshtov
Offline
Зарегистрирован: 02.09.2013

Не вижу смысла продолжать наш спор. ))) Вы заскучали и вам не с кем поговорить? 
Если есть желание, сделайте все за автора темы. 

З.ы.: сострадание, конечно, же есть. Именно поэтому мой ответ был таков

joni_vg
Offline
Зарегистрирован: 29.06.2012

Добрый день! 

ув. Maverik

 Вы писали что в моем скетче переменная переполняется. Обьясние если Вам не тяжело как это - переполняется?

 

З.ы. Я действительно новичек, и только пытаюсь разобратся. Вместо того что бы писать что "Все фигня, так не делают, это кошмар" и тому подобное, лучше ткните носом на ошибка и пните в напревлении в котором нужно копать. Это гараздо полезней чем разводить демагогии что ТС - лузер. Это касается не только этой темы и меня, но большинства ребят которые задают вопросы на подобных форумах.  

Maverik
Offline
Зарегистрирован: 12.09.2012

int a = 0; a++; 

// после достижения переменной значения "32768", следующее "а++" даст результат "минус 32768"

Вместо того что бы писать что "Все фигня, так не делают, это кошмар" и тому подобное, 

и в мыслях такого не было. обращение было не к Вам, а к более опытным товарищам, которые дают "точные ответы" вроде известного "вы находитесь в воздушном шаре".

 

 

 

joni_vg
Offline
Зарегистрирован: 29.06.2012

В данном случае, переменная "а" сбрасывается в ноль при определенных условиях.

if (a>=5 && f == 1) {
      digitalWrite(led, HIGH);
      //f=0;
      delay(1000);
      digitalWrite(led, LOW);
      a=0;
      Serial.println(a);

Если я правильно понимаю суть слова  переполнение.  Это достижение этих значений переменной --32768   ?

joni_vg
Offline
Зарегистрирован: 29.06.2012

Да спасибо. Я так и думал. Спасибо за ответ.

umka71
Offline
Зарегистрирован: 04.02.2017

Ребята! помогите тут, Пожалуйста!!!

http://arduino.ru/forum/obshchii/arduino-optopara#comment-258294