Монетоприёмник сперва

mehub

★✩✩✩✩✩✩
12 Дек 2020
30
10
Задумал проект в перспективе. Пока сделал монето-приёмник. Его работа основана на том, что монетка толкает вверх металлическую планку. А та в свою очередь через шарнирную передачу проворачивает ручку потенциометра. Причём, чем больше монета, тем на бОльший угол поворачивается ось потенциометра. Скетч прикрепляю и видео. Помогите переписать скетч так, чтобы при улавливании абсолютного значения поворота оси потенциометра- светодиод (это - пока) продолжал гореть до нового опускания монеты. Видео находится- здесь https://vkvideo.ru/video148258623_456239140
 

Старик Похабыч

★★★★★★★
14 Авг 2019
4,274
1,303
Москва
Так может все таки delay(500) убрать стоит из loop ?
Если это надо что бы светодиод горел какое то время, то надо изменить именно этот подход. Например по выполнению условия на определенный диаметр зажечь нужный светодиод, сделать паузу, выключить светодиод. Так еще будет нормально, при условии что монеты не будут пихать одну за другой.

Код в нормальном виде:

C++:
int a=0;//хранится значение сигнала с потенциометра

void setup() {pinMode (A2,INPUT);// вход движка потенциометра
pinMode(5,OUTPUT);//показывает, что попал 1 рубль
pinMode(6,OUTPUT);//показывает, что попал 2 рубля

pinMode(7,OUTPUT);//показывает, что попал 5 рублей

pinMode(8,OUTPUT);//показывает, что попал 10 рублей






}

void loop() {
  delay(500);
a=analogRead(A2);//читает значение с потенциометра

if(abs(a)>8&&abs(a)<14){
  digitalWrite(5,HIGH);
  digitalWrite(6,LOW);
  digitalWrite(7,LOW);
  digitalWrite(8,LOW);}//если сигнал с потенциометра от 8 до 14, то проскочил 1 рубль и загорелся светодиод с D5
else if(abs(a)>21&&abs(a)<27){
digitalWrite(5,LOW);
  digitalWrite(6,HIGH);
  digitalWrite(7,LOW);
  digitalWrite(8,LOW);}//если сигнал с потенциометра от 21 до 27, то проскочило 2 рубля и загорелся светодиод с D6

  else if(abs(a)>29&&abs(a)<34){
    digitalWrite(5,LOW);
  digitalWrite(6,LOW);
  digitalWrite(7,HIGH);
  digitalWrite(8,LOW);}//если сигнал с потенциометра от 29 до 34, то проскочило 5 рубль и загорелся светодиод с D7

  else if(abs(a)>13&&abs(a)<18){
    digitalWrite(5,LOW);
  digitalWrite(6,LOW);
  digitalWrite(7,LOW);
  digitalWrite(8,HIGH);}//если сигнал с потенциометра от 13 до 18, то проскочило 10 рублей и загорелся светодиод с D8

  else{digitalWrite(5,LOW);
  digitalWrite(6,LOW);
  digitalWrite(7,LOW);
  digitalWrite(8,LOW);}//иначе ничего не горит

  // put your main code here, to run repeatedly:

}
 
Изменено:

mehub

★✩✩✩✩✩✩
12 Дек 2020
30
10
Delay удалил. Внедрить концевик (кнопку), при замыкании которой начать измерение сигнала с потенциометра. Подключу, допустим, к D0. А потом задать программе, чтобы измерение абсолютного значения с потенциометра происходило, например, 500 миллисекунд. Потом значение на светодиод определённой монеты пусть горит несколько секунд. Такое написать бы, но не соображу сейчас. Подскажите команды..
 
Изменено:

Старик Похабыч

★★★★★★★
14 Авг 2019
4,274
1,303
Москва
D0 не самый удачный контакт, т.к. D0 D1 это Serial|, что иногда оч. удобно использовать для отладки.
А так вот для каждого условия:
C++:
if(abs(a)>8&&abs(a)<14){
  digitalWrite(5,HIGH);
  digitalWrite(6,LOW);
  digitalWrite(7,LOW);
  digitalWrite(8,LOW);}//если сигнал с потенциометра от 8 до 14, то проскочил 1 рубль и загорелся светодиод с D5
переписать на такое:

C++:
if(abs(a)>8&&abs(a)<14){
  digitalWrite(5,HIGH);
  delay(500);
  digitalWrite(5,LOW);}//если сигнал с потенциометра от 8 до 14, то проскочил 1 рубль и загорелся светодиод с D5