Přidat otázku mezi oblíbenéZasílat nové odpovědi e-mailem Arduino - zapni / vypni jedním tlačítkem

Zdravím všechny,

řeším problém s programem pro Arduino Uno. Potřeboval bych pomocí jednoho tlačíka (12) zapnout výstup (13) a zase vypnout pomocí stejného tlačítka (12), kterým jsem zapnul výstup (13). Pokoušel jsem se "něco" ubastlit, ale problém je v tom, že když tlačítko držím stisknuté, tak výstup je sepnutý a když ho pustím, tak vypne výstup. Mohl by mi někdo poradit, co s tím - případně navrhnout změny? Díky...

int start = 12;
int rele = 13;
int buttonState = 0;

void setup() {
  pinMode(rele, OUTPUT);
  pinMode(start, INPUT);
  digitalWrite(start, HIGH);
}

void loop() {
    buttonState = digitalRead(start);
    if (buttonState == HIGH) {
        digitalWrite(rele, LOW);
    } else {
        digitalWrite(rele, HIGH);
    }
}
Jsou zobrazeny jen nové odpovědi. Zobrazit všechny
Předmět Autor Datum
Například takhle: #define CUDLIK 12 #define RELE 13 static int zapnuto=0; static int predchozistav;…
mia 02.06.2015 23:14
mia
nemas to debouncovane (t.j. bude to robit nezmysly)
MM.. 03.06.2015 01:56
MM..
Debouncované to sice nemám, ale nesmysly to nedělá, to už bych na těch svých aplikacích poznal :-)
mia 03.06.2015 15:22
mia
Tak mas mozno HW debouncing na tom pine apod, alebo nejaky superspinac. Lebo normalny spinac urobi k…
MM.. 03.06.2015 17:09
MM..
Druhá možnost je skrytý debouncing, kdy kromě výše popsané kostry ještě při tom stisku dělá něco dal… nový
gilhad 03.06.2015 19:55
gilhad
No to bude možná ono, protože digitalRead() si provádí milión kontrol, než se dostane k fyzickému vs… nový
mia 04.06.2015 00:34
mia
To urcite netrva 10ms, ale skor radovo jednotky us, to nestaci. Mas tam bud kondenzator alebo pin na… nový
MM.. 04.06.2015 10:02
MM..
Cau tvoje zadani jsem pochopil tak, ze stiskem tlacitka se vystup zapne a zustane zapnuty dokud ho d… poslední
Hellraiser 03.07.2015 16:18
Hellraiser

Například takhle:

#define CUDLIK 12
#define RELE 13

static int zapnuto=0;
static int predchozistav;

void stisk() {
  int stav=digitalRead(CUDLIK);
  if(stav) {predchozistav=stav; return;}  //není nic stisknuto
  if(stav==predchozistav) return;  //čudlík je stále stisknutý
  predchozistav=stav;  //čudlík je poprvé stisknutý
  if(zapnuto) {zapnuto=0;}
  else {zapnuto=1;}
}

void setup() {
  pinMode(CUDLIK, INPUT);
  digitalWrite(CUDLIK, HIGH);
  pinMode(RELE, OUTPUT);
  digitalWrite(RELE, zapnuto);  //na vysvětlenou: 0=LOW, 1=HIGH
}

void loop() {
  stisk();
  digitalWrite(RELE, zapnuto);
}

Tak mas mozno HW debouncing na tom pine apod, alebo nejaky superspinac. Lebo normalny spinac urobi kludne aj 100 pulzov takze pri kazdom zmacknuti by si to 50x vypol a zapol, a ostalo by to na nahodnom stave.
Ked robis takto nejake HW vyrobky, tak to potom neni nic moc ;)

Druhá možnost je skrytý debouncing, kdy kromě výše popsané kostry ještě při tom stisku dělá něco dalšího (co já vím, třeba posílá něco přez SoftwareSerial, nebo wifinu, nebo tak), co samo o sobě způsobí nějaké to zdržení, čímž se ten debouncing provede, aniž by jako takový byl zmíněn či míněn ...

No to bude možná ono, protože digitalRead() si provádí milión kontrol, než se dostane k fyzickému vstupu. Pokud bych operoval pomocí PORT/PIN/DDR, tak ten debouncing budu muset udělat.

Cau tvoje zadani jsem pochopil tak, ze stiskem tlacitka se vystup zapne a zustane zapnuty dokud ho dalsim stiskem nevypnes a potom zustane vystup vypnuty.
Tvuj program ale dela pouze obraceni hodnoty vstupu 12 na vystup 13.
Je urcite vice zpusobu jak to maso uvarit, ale podle me je nejjednodussi zpusob ulozit do promenny buttonState zmenu hodnoty vstupu 12 a vystup 13 se pak rovna hodnote buttonState. Asi by to chtelo dat tam i nejakou tu pauzu pro debouncing.
Celkem to chodi ale urcite to bude chtit dopilovat.

int start = 12;
int rele = 13;
int buttonState = 0;

void setup() {
  pinMode(rele, OUTPUT);
  pinMode(start, INPUT);
  digitalWrite(start, HIGH);
}

void loop() {
 if (digitalRead(start) == HIGH )
    {
        buttonState = buttonState + 1 ;
    } 
 delay (100) ;
    if (buttonState > 1)
    {
       buttonState = 0 ;
    }
    if (buttonState == 1) {
      digitalWrite(rele, HIGH);
    }
    else
    { digitalWrite(rele,LOW);
}
    delay (100) ; 
}

Zpět do poradny Odpovědět na původní otázku Nahoru