светодиоды и дребезг кнопки?

aleksey19ru
Offline
Зарегистрирован: 23.06.2016

написал код, но при нажатии кнопки светодиоды начинают включаться через 3-8с поразному бывает.

я так понимаю это из за дребезга, поискал как убрать дребезг, нашел только такое:

нажал кнопку светодиоды загораются поочереди, отпускаю горят, нажал потухли, или бывает так

нажал загораются отпустил потухли, еще нажал горят отпустил горят, но дребезга нет срабатывает мгновенно.

я планирую ураплять контактами так чтобы замкнуты зажигаются разомкнут потухли.

может что то добавить или сразу делать SR debouncer на дополнительной микре?

 

 

const int but = 2;
const int led1 = 3;
const int led2 = 4;
const int led3 = 5;
const int led4 = 6;
const int led5 = 7;
const int led6 = 8;
const int led7 = 9;
const int led8 = 10;
const int led9 = 11;
const int led10 = 12;
int buttonState = 0;

void setup() {
pinMode(led1, OUTPUT);
pinMode(led2, OUTPUT);
pinMode(led3, OUTPUT);
pinMode(led4, OUTPUT);
pinMode(led5, OUTPUT);
pinMode(led6, OUTPUT);
pinMode(led7, OUTPUT);
pinMode(led8, OUTPUT);
pinMode(led9, OUTPUT);
pinMode(led10, OUTPUT);
pinMode(but, INPUT);
}
void loop() {
buttonState = digitalRead(but);

if (buttonState == HIGH) {
digitalWrite(led1, HIGH);
delay(1000);
digitalWrite(led2, HIGH);
delay(1000);
digitalWrite(led3, HIGH);
delay(1000);
digitalWrite(led4, HIGH);
delay(1000);
digitalWrite(led5, HIGH);
delay(1000);
digitalWrite(led6, HIGH);
delay(1000);
digitalWrite(led7, HIGH);
delay(1000);
digitalWrite(led8, HIGH);
delay(1000);
digitalWrite(led9, HIGH);
delay(1000);
digitalWrite(led10, HIGH);
delay(5000);
}
else {

digitalWrite(led10, LOW);
delay(1000);
digitalWrite(led9, LOW);
delay(1000);
digitalWrite(led8, LOW);
delay(1000);
digitalWrite(led7, LOW);
delay(1000);
digitalWrite(led6, LOW);
delay(1000);
digitalWrite(led5, LOW);
delay(1000);
digitalWrite(led4, LOW);
delay(1000);
digitalWrite(led3, LOW);
delay(1000);
digitalWrite(led2, LOW);
delay(1000);
digitalWrite(led1, LOW);

}
}

keefa
Offline
Зарегистрирован: 19.06.2015

напишите алгоритм, что и как должно работать.

В вашем скетче loop крутится один раз в 9 секунд. Пока не нажата кнопка, у вас срабатывает условие else - и пока он его не выполнит (9 секунд), программа ничего не будет делать, и не будет реагировать на нажатие кнопки. так же и условие if, как только если вдруг так сошлись звезды, поймала нажатие, то тоже будет зажигать по одному диоду в секунду в течении 9 сек, Хоть отпускайте кнопку хоть унажимайтесь. 

toxikaciya
Offline
Зарегистрирован: 11.04.2016

Добавьте перед условием проверку предыдущего состояния кнопки.

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

Попробуй этот код

const int btnPin = 2;
const int led1Pin = 3;
const int led2Pin = 4;
const int led3Pin = 5;
const int led4Pin = 6;
const int led5Pin = 7;
const int led6Pin = 8;
const int led7Pin = 9;
const int led8Pin = 10;
const int led9Pin = 11;
const int led10Pin = 12;

void setup() {
pinMode(btnPin , INPUT);
pinMode(led1Pin, OUTPUT);
pinMode(led2Pin, OUTPUT);
pinMode(led3Pin, OUTPUT);
pinMode(led4Pin, OUTPUT);
pinMode(led5Pin, OUTPUT);
pinMode(led6Pin, OUTPUT);
pinMode(led7Pin, OUTPUT);
pinMode(led8Pin, OUTPUT);
pinMode(led9Pin, OUTPUT);
pinMode(led10Pin, OUTPUT);
}
void loop() {
label_0:delay(300);
       if (digitalRead(btnPin) == LOW) goto label_0;
            digitalWrite(led1Pin, HIGH);
label_1:delay(300);
       if (digitalRead(btnPin) == LOW){
            digitalWrite(led1Pin, LOW); 
            goto label_0;};
        digitalWrite(led2Pin, HIGH);
label_2:delay(300);
       if (digitalRead(btnPin) == LOW){
            digitalWrite(led2Pin, LOW); 
            goto label_1;};
        digitalWrite(led3Pin, HIGH);  
label_3:delay(300);
       if (digitalRead(btnPin) == LOW){
            digitalWrite(led3Pin, LOW); 
            goto label_2;};
        digitalWrite(led4Pin, HIGH);
label_4:delay(300);
       if (digitalRead(btnPin) == LOW){
            digitalWrite(led4Pin, LOW); 
            goto label_3;};
        digitalWrite(led5Pin, HIGH);      
label_5:delay(300);
       if (digitalRead(btnPin) == LOW){
            digitalWrite(led5Pin, LOW);
            goto label_4;};
         digitalWrite(led6Pin, HIGH);
label_6:delay(300);
       if (digitalRead(btnPin) == LOW){
            digitalWrite(led6Pin, LOW);
            goto label_5;};
         digitalWrite(led7Pin, HIGH);
label_7:delay(300);
       if (digitalRead(btnPin) == LOW){
            digitalWrite(led7Pin, LOW);
            goto label_6;};
         digitalWrite(led8Pin, HIGH);
label_8:delay(300);
       if (digitalRead(btnPin) == LOW){
            digitalWrite(led8Pin, LOW); 
            goto label_7;};
         digitalWrite(led9Pin, HIGH);
label_9:delay(300);
       if (digitalRead(btnPin) == LOW){
            digitalWrite(led9Pin, LOW); 
            goto label_8;};
         digitalWrite(led10Pin, HIGH);
label_10:delay(300);
       if (digitalRead(btnPin) == LOW){
          digitalWrite(led10Pin, LOW);
          goto label_9;};
       goto label_10;
}

 

aleksey19ru
Offline
Зарегистрирован: 23.06.2016

супер имменно то что нужно! огромное спасибо!

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Настоящие программисты! :)

DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

ЕвгенийП пишет:

Настоящие программисты! :)

А то :) Всё чаще и чаще тут такое.

p.masyukov
p.masyukov аватар
Offline
Зарегистрирован: 14.11.2015

Китайский код ------

Попробуйте убрать пол кода и поставить пару массивов и пару циклов.

И будет вам не 200 строк, а 10-15

и пару коментов - для будущих участников форума, вдруг кому пригодится.

Библиотека не моя - так просто к примеру https://uscr.ru/drebezg-kontaktov-i-sposoby-podavleniya-drebezga/

Но этот код будет зависать не "delay"

 

#include "Bounce.h";
#define btnPin  2
#define ledPinStart  3
#define ledPinEnd 12
#define ledTime 1000

Bounce bouncer = Bounce(2,5);

void setup() {
    pinMode(btnPin , INPUT_PULLUP);
    for(int i = ledPinStart; i <= ledPinEnd; i++)  pinMode(i, OUTPUT);
}

void loop() {
    if ( bouncer.update() ) {
        if ( bouncer.read() == HIGH) { 
            if (led==oldled) led=!led;
        } else {
            oldled=led;
        }
     }
    
    for(int i = ledPinStart; i <= ledPinEnd; i++) {
        if(led) {
            digitalWrite(i, HIGH); delay(ledTime);
        }
    }
    for(int i = ledPinEnd; i >= ledPinStart; i--) {
        if(led) {
            digitalWrite(i, LOW); delay(ledTime);
        }
    }      
}

Сразу оговорюсь не проверял - мог где и опечататься... .

keefa
Offline
Зарегистрирован: 19.06.2015

DIYMan пишет:

ЕвгенийП пишет:

Настоящие программисты! :)

А то :) Всё чаще и чаще тут такое.

Это нормально. Человек учится, ошибается. С этого же все начинается. Это потом приходит понимание как все оптимизировать и как "более правильно". Почему написал "более правильно", потому что "ПРАВИЛЬНО" нет такого понимания в программировании. Сколько программистов, столько и "правильно". А на этом этапе, главное, что бы работало, и уже это заставит человека продолжать изучать тему...

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

keefa пишет:
Это нормально. Человек учится, ошибается. ...
Не понял повода для выволочки. Разве кто-то говорит, что не нормально? И вообще, что "что-то не так". Про настоящих программистов я написал вполне серьёзно, если Вы увидели в этом стёб - это Ваша проблема. Может Вы просто не знаете, смысла выражения "настоящие программисты"? Дык, почитайте классику профессии :)

keefa
Offline
Зарегистрирован: 19.06.2015

ЕвгенийП пишет:

keefa пишет:
Это нормально. Человек учится, ошибается. ...
Не понял повода для выволочки. Разве кто-то говорит, что не нормально? И вообще, что "что-то не так". Про настоящих программистов я написал вполне серьёзно, если Вы увидели в этом стёб - это Ваша проблема. Может Вы просто не знаете, смысла выражения "настоящие программисты"? Дык, почитайте классику профессии :)

Спасибо, почитаю, на самом деле не знаю  смысла "настоящие программисты ". Думаю бедет интересно. Вспомнил как сам (я) писал первые скетчи мигания несколькими диодами с кучей delay(1000).

aleksey19ru
Offline
Зарегистрирован: 23.06.2016

Я извеняюсь! хотел добавить в скеч фоторезистор и чет второй вечер не могу его привязать.

в свой скеч привязал сразу, а в скуч с label-ами не получаеся(

aleksey19ru
Offline
Зарегистрирован: 23.06.2016
Тут работает
const int but = 2;
const int led1 = 3;
const int led2 = 4;
const int led3 = 5;
const int led4 = 6;
const int led5 = 7;
const int led6 = 8;
const int led7 = 9;
const int led8 = 10;
const int led9 = 11;
const int led10 = 12;
const int led11 = 13;
int buttonState = 0;
int s = 0;
void setup() {
  pinMode(led1, OUTPUT);
  pinMode(led2, OUTPUT);
  pinMode(led3, OUTPUT);
  pinMode(led4, OUTPUT);
  pinMode(led5, OUTPUT);
  pinMode(led6, OUTPUT);
  pinMode(led7, OUTPUT);
  pinMode(led8, OUTPUT);
  pinMode(led9, OUTPUT);
  pinMode(led10, OUTPUT);
  pinMode(led11, OUTPUT);
  pinMode(but, INPUT);
}
void loop() {
   int val = analogRead(s);
  buttonState = digitalRead(but);
  
  if (buttonState == HIGH && val < 300){
    
    digitalWrite(led1, HIGH);
    delay(300);
    digitalWrite(led2, HIGH);
    delay(300);
    digitalWrite(led3, HIGH);
    delay(300);
    digitalWrite(led4, HIGH);
    delay(300);
    digitalWrite(led5, HIGH);
    delay(300);
    digitalWrite(led6, HIGH);
    delay(300);
    digitalWrite(led7, HIGH);
    delay(300);
    digitalWrite(led8, HIGH);
    delay(300);
    digitalWrite(led9, HIGH);
    delay(300);
    digitalWrite(led10, HIGH);
    delay(300);
    digitalWrite(led11, HIGH);
    delay(1000);
  }
  else {
  
     digitalWrite(led11,LOW);
    delay(300);
    digitalWrite(led10, LOW);
    delay(300);
    digitalWrite(led9, LOW);
    delay(300);
    digitalWrite(led8, LOW);
    delay(300);
    digitalWrite(led7, LOW);
    delay(300);
    digitalWrite(led6, LOW);
    delay(300);
    digitalWrite(led5, LOW);
    delay(300);
    digitalWrite(led4, LOW);
    delay(300);
    digitalWrite(led3, LOW);
    delay(300);
    digitalWrite(led2, LOW);
    delay(300);
    digitalWrite(led1, LOW);
  }    
}

 

aleksey19ru
Offline
Зарегистрирован: 23.06.2016

а сюда уже как не вертел(((

 void loop() {
int val = analogRead(photores);
 label_0:delay(100);
                
         if (digitalRead(btnPin) == LOW ) goto label_0;
              digitalWrite(led1Pin, HIGH);
         
            
  label_1:delay(100);
         if (digitalRead(btnPin) == LOW){
              digitalWrite(led1Pin, LOW);
              goto label_0;};
          digitalWrite(led2Pin, HIGH);
  label_2:delay(100);
         if (digitalRead(btnPin) == LOW){
              digitalWrite(led2Pin, LOW);
              goto label_1;};
          digitalWrite(led3Pin, HIGH); 
  label_3:delay(100);
         if (digitalRead(btnPin) == LOW){
              digitalWrite(led3Pin, LOW);
              goto label_2;};
          digitalWrite(led4Pin, HIGH);
  label_4:delay(100);
         if (digitalRead(btnPin) == LOW){
              digitalWrite(led4Pin, LOW);
              goto label_3;};
          digitalWrite(led5Pin, HIGH);     
  label_5:delay(100);
         if (digitalRead(btnPin) == LOW){
              digitalWrite(led5Pin, LOW);
              goto label_4;};
           digitalWrite(led6Pin, HIGH);
  label_6:delay(100);
         if (digitalRead(btnPin) == LOW){
              digitalWrite(led6Pin, LOW);
              goto label_5;};
           digitalWrite(led7Pin, HIGH);
  label_7:delay(100);
         if (digitalRead(btnPin) == LOW){
              digitalWrite(led7Pin, LOW);
              goto label_6;};
           digitalWrite(led8Pin, HIGH);
  label_8:delay(100);
         if (digitalRead(btnPin) == LOW){
              digitalWrite(led8Pin, LOW);
              goto label_7;};
           digitalWrite(led9Pin, HIGH);

  label_9:delay(100);
         if (digitalRead(btnPin) == LOW){
             digitalWrite(led9Pin, LOW);
              goto label_8;};
           digitalWrite(led10Pin, HIGH);
  label_10:delay(100);
         if (digitalRead(btnPin) == LOW){
            digitalWrite(led10Pin, LOW);         
            goto label_9;};
            delay(2000);
         goto label_10;
 
  
  }

 

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

И не получится.  На каждую задачу своя структура программы. Именно для той , я посчитал lebel лучше всего подойдет. А сейчас не знаю зачем вам фотодиод и что должно получится в результате.

aleksey19ru
Offline
Зарегистрирован: 23.06.2016

Брат попросил сделать одсветку в огороде, так чтобы поочереди фонарики загорались когда выходишь, вот и планируется что замкнутся контакты или разомкнутся от датчика движения, и подумал что неплохо было бы чтобы днем все это не срабатывало, вот и решил фоторезистор засунуть.)

можно конечно отдельно это сделать в железе

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

 

Разверни и попробуй запусти. Там на датчике движения .

http://arduino.ru/forum/programmirovanie/problemy-s-svedeniem-dvukh-sket...

Пнд, 18/07/2016 - 22:38

#5

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

aleksey19ru пишет:

решил фоторезистор засунуть.)

Фототранзистор в разы дешевле. Засовывается также, как и резистор, т.е. "как два пальца". Он немного шумнее резистора, но для данного приложения его точности и возможностей - выше головы хватит. Я, например, для подобных задач везде пихаю копеечный L-3DP3C и он отлично работает. Подумайте.

DrProg
Offline
Зарегистрирован: 07.08.2015

От этих простыней китайских пошла кровь из глаз...