Ардуин лічбавы ўваход вагаецца з суседнімі штыфтамі

Я выкарыстоўваю лічбавыя кантакты (2,3,4,5), каб гуляць міді ноты і выключацца 3PDT выключальнікі з звесці 10k рэзістара паміж уваходным кантактам і зазямленне.

Аднак пры націску на кнопку 2 выпадковым чынам пры розным часовым інтэрвале часам паказвае высокі кантактны 3 на маніторы. (Пасля прачытання форумаў тут я зразумеў, што гэта можа быць звязана з вялікімі камутатарамі, якія я выкарыстоўваю, дзе фізічныя кантактныя пласціны могуць быць прычынай для гэтага). У мяне ёсць нават змененыя драты і ізаляваць іх адзін ад аднаго, каб выключыць шум ад правадоў. Я праверыў усе злучэнні і прыпаяныя да борта шпількі Arduino з найлепшымі навыкамі, якія ў мяне ёсць і трэкі ўсё ясна.

Тое ж справа адбываецца паміж іншымі кнопкамі, як, але яго не заўсёды. Аднак пасля чытання аб DEBOUNCE я ўнёс змены ў код наступным чынам, цяпер я атрымаў памылку толькі адзін раз пасля таго, што я бачыў яго няма. Можа хто-то ёсць зірнуць на код і парады мне, калі я прызначылі функцыю Debounce з некалькімі камутатарамі правільна, і калі няма, то гэта павінна быць, як я пачатковец з кадоўкай Так як я выкарыстоўваю перамыкач 3PDT я дадаў рэжым перамыкача ..

#include 

int buttonPin[] = {2, 3, 4, 5};
byte mode[] = {0, 0 , 0 ,0};
boolean currentState = LOW;
boolean lastState = LOW;
int buttonPinM[] = {6, 7, 8, 9};
byte mode1[] = {0, 0, 0, 0};

boolean currentState1 = LOW;
boolean lastState1 = LOW;

long lastDebounceTime = 0;
long debounceDelay = 50;

void setup (){
    MIDI.begin(MIDI_CHANNEL_OMNI);

    int i;
    for (i = 0; i < 4; i++) {
        pinMode(buttonPin[i], INPUT);
    }
    int j;
    for (j = 0; j < 4; j++) {
        pinMode(buttonPinM[j], INPUT);
    }

    {
        int i;
        for (i = 0; i < 4; i++);
    }
    {
        int j;
        for (j = 0; j < 4; j++);
    }
}

// This will track which pin/mode we're using

int j = 0;
int i = 0;

void loop() {
    {  
        currentState = digitalRead(buttonPin[i]);

        if ( (millis() - lastDebounceTime) > debounceDelay) {
            switch (mode[i]) {
                case 0:
                    if (currentState == HIGH) {
                        MIDI.sendNoteOff (i+55, 0, 1);
                        mode[i] = 1;
                        lastDebounceTime = millis();
                    }
                    break;
                case 1:
                    if (currentState == HIGH)
                        mode[i] = 2;
                    break;
                case 2:
                    if (currentState == LOW) {
                        MIDI.sendNoteOn (i+55, 127, 1);
                        mode[i] = 3;
                        lastDebounceTime = millis();
                    }
                    break;
                case 3:
                    if (currentState == LOW)
                        mode[i] = 0;
                    break;
            }
        }
        lastState = currentState;
        if (++i > 3)
            i = 0;  
    }
    {
        currentState1 = digitalRead(buttonPinM[j]);
        if ( (millis() - lastDebounceTime) > debounceDelay) {
            switch (mode1[j]) {
                case 0:
                    if (currentState1 == HIGH ) {
                        MIDI.sendNoteOn (j+61, 127, 1);
                        mode1[j] = 1;
                        lastDebounceTime = millis();
                    }
                    break;
                case 1:
                    if (currentState1 == HIGH)
                        mode1[j] = 2;
                    break;
                case 2:
                    if (currentState1 == LOW) {
                        MIDI.sendNoteOff (j+61, 0, 1);
                        mode1[j] = 3;
                        lastDebounceTime = millis();
                    }
                    break;
                case 3:
                    if (currentState1 == LOW)
                        mode1[j] = 0;
                break;
            }
        }
        lastState1 = currentState1;
        if (++j > 3)
            j = 0;   
    }
}
0
@ Frarugi87 я перасякаў праверыў усе, што і змяніла друкаваную плату, а таксама. Як вы думаеце, яго код ??
дададзена аўтар JJM Driessen, крыніца
@NickGammon ўнеслі змены.
дададзена аўтар JJM Driessen, крыніца
Калі ласка, <�я> змяніць свой пост і фарматаваць код з дапамогай фарматавання кода ўцэнкі (чатыры вядучых прабелаў). Для атрымання даведкі см Markdown дапамогі . Вы павінны быць у стане зрабіць гэта, выбраўшы код і націснуўшы клавішу Ctrl + K , каб ваш браўзэр зрабіць гэта для вас.
дададзена аўтар Nick Gammon, крыніца
Ваш код вельмі цяжка чытаць. IDE мае функцыю аўтаматычнага фарматавання. Калі ласка, выкарыстоўвайце яго і паўторна прадставіць свой код. Таксама, калі ласка, ўключаюць у сябе (вобраз) вашай праводкі. Апісання праводкі рэдка фактычнай сітуацыі справядлівасці.
дададзена аўтар Nick Gammon, крыніца
Звычайна, калі што-то «вагаецца», гэта азначае, што ён не меў фіксаванае стан: гэта звычайна пры выкарыстанні кнопкі без падцягвання/расчыняюцца. Але калі ў вас ёсць двайны кідок (xxDT) перамыкач і звязаных як VCC і землі да сваіх тэрміналаў, ну, можа быць, гэта проста дрэнны кантакт ...
дададзена аўтар Tom Collins, крыніца

1 адказы

Праводка тут, так як гэта даволі доўга, але гэта не поўны адказ, усяго толькі некалькі думак і магчымае паляпшэнне.

Такім чынам, ёсць некалькі рэчаў у вашым кодзе я не разумею:

<�Моцны> 1: у наладах()

{
    int i;
    for (i = 0; i < 4; i++);
}
{
    int j;
    for (j = 0; j < 4; j++);
}

Што гэта за?

<�Моцнага> 2: бразгат

Вы не выконваеце яго правільна, па меншай меры, не для мяне. Вы чытаеце кнопку кожны 50мс, без бразгату. Добра, вы не ўбачыце «падскоквае», але ёсць лепшыя рашэнні (гл ніжэй).

<�Моцныя> 3: рэжымы 1 і 3 </моцны>

Яны цалкам бескарысныя. Што яны?

<�Моцныя> 4: шпількі 6,7,8,9 </моцныя>

Што яны?

<�Моцны> 5: пераменная laststate

Што гэта? Вы ніколі не выкарыстоўваць яго

<�Моцны> 6: абнаўленне адной кнопкі за завесы </моцны>

Ці трэба гэта? Я маю на ўвазе, вы проста абнавіць адну кнопку на пятлі замест ўсіх з іх для кожнага цыклу.

In the end

Добра, зараз мае прапановы, акрамя навучання водступу кода (у адваротным выпадку гэта немагчыма прачытаць): Я заўсёды выкарыстоўваю клас bounce2 бразгат кнопкі, так як ён змяшчае ўсе ўнутры і .. Ну, гэта добра працуе. Ён можа таксама выявіць рост і падзенне краю кнопкі, што вам трэба, калі я правільна інтэрпрэтаваць ваш код.

Яшчэ адна рэч: затрымка бразгату можа быць зніжана (нават проста 5мс):

#include 
#include 

int buttonPin[] = {2, 3, 4, 5};
int buttonPinM[] = {6, 7, 8, 9};

Bounce debouncers[4];
Bounce debouncersM[4];

int debounceDelay = 50;//Usually is lower - even 5ms is fine
uint8_t i = 0;

void setup ()
{
    MIDI.begin(MIDI_CHANNEL_OMNI);

    for (i = 0; i < 4; i++)
    {
        pinMode(buttonPin[i], INPUT);
        debouncers[i].attach(buttonPin[i]);
        debouncers[i].interval(debounceDelay);

        pinMode(buttonPinM[i], INPUT);
        debouncersM[i].attach(buttonPinM[i]);
        debouncersM[i].interval(debounceDelay);
    }
}

void loop ()
{
    for (i = 0; i < 4; i++)
    {
        debouncers[i].update();
        debouncersM[i].update();
    }

    for (i = 0; i < 4; i++)
    {
        if (debouncers[i].rose())//button i switched from 0 to 1
            MIDI.sendNoteOff(i+55, 0, 1);
        if (debouncers[i].fell())//button i switched from 1 to 0
            MIDI.sendNoteOn (i+55, 127, 1);
        if (debouncersM[i].rose())//button i switched from 0 to 1
            MIDI.sendNoteOn (i+61, 127, 1);
        if (debouncersM[i].fell())//button i switched from 1 to 0
            MIDI.sendNoteOff(i+61, 0, 1);
    }
}
0
дададзена
Дзякуючы @ frarugi87 1.In усталявальнага рэжым INT I і J з'яўляецца для 2-х груп перамыкачоў (4 выключальніка кожных) і мае розныя функцыі ў гэтым кодзе Адна групы перамыкачоў адпраўкі каманды NoteOn, калі ўваход высокі і іншая група будзе пасылаць NoteOff каманды, калі ўваход High. 2.Я можа быць цалкам няправільна з маёй противодребезговой логікі з гэтым кодам 3. рэжым 1 і 3 вы маеце на ўвазе выпадак 1 і 3 справа ??? Так як сво 3PDT дзе перамыкач фізічна блакуе стан перамыкача, я думаў, яго лепш зрабіць так, але я паспрабую ваш код і абнаўлення, калі ён працуе з маім выключальнікам
дададзена аўтар JJM Driessen, крыніца
@ Fraugi87 я зразумеў, што вы сказалі, і гэта мае сэнс. Дзякуй за ваш хуткі адказ. Я зраблю некаторыя выпрабаванні і вярнуцца як мага хутчэй !!!
дададзена аўтар JJM Driessen, крыніца
@ Fraugi87 Я паспрабаваў ваш код і яго працуе выдатна. Я не зрабіў якіх-небудзь змяненняў толькі ваш код і ён працуе. Раней вы згадалі яго ня поўнае рашэнне. Ёсць яшчэ імправізаваць ??
дададзена аўтар JJM Driessen, крыніца
Мой код працуе як добра, але толькі часам лічбавыя кантакты чытае іншы нумар. Можа быць, вы маеце рацыю з нагоды :-) бразгату
дададзена аўтар JJM Driessen, крыніца
@Ashish добра, у вас заўсёды ёсць толькі два станы. Вы можаце выкарыстоўваць аўтаматычнае ўключэнне пры заходзе на пасадку, але выпадкі 1 і 3 бескарысныя, так як вы выходзіце з гэтага рэжыму (я назваў іх рэжымы з зменнай Рэжым вызначае выпадак) адразу ж (ўмова тое ж самае як і папярэдні). Ва ўсякім выпадку я прапаную вам якая адлюстроўвае падыход: прасцей, хутчэй і менш схільны памылак
дададзена аўтар Tom Collins, крыніца
@Ashish Я сказаў, што гэта не было поўным, таму што я не разумею, дзе гэтая праблема была, і таму мае былі толькі «агульныя» саветы. Калі гэта працуе, гэта становіцца рэальным рашэннем, але зноў-такі я не разумею, чаму гэта працуе, і ваша няма;) Можа быць, менавіта з-за няправільны бразгат, але ўсё роўна ... Адзінае паляпшэнне вы можаце зрабіць гэта, каб выдаліць падзел паміж два набору кнопак, але гэта не практычнае паляпшэнне, толькі больш чытэльным рашэнне ..
дададзена аўтар Tom Collins, крыніца