Nyomógomb használata hogyan

Processing/Wiring (illetve C) nyelvű programozási fogások, tippek. (AVR-Duino, Arduino, EthDuino, Diecimila, Severino, Nano, LilyPad)
dckillman
Biztosítékgyilkos
Hozzászólások: 61
Csatlakozott: 2013. október 7. hétfő, 11:23

Nyomógomb használata hogyan

Hozzászólás Szerző: dckillman »

Sziasztok!

Segítséget kérnek az alábbi gonddal kapcsolatban.

Mikor melyik kapcsolást érdemes megépíteni?

Kép

Végül azt szeretném megoldani hogy a kapcsoló benyomáskor kivillanjon és folyamatosan vílágítson pl a led(beépített 13 pinen) és ha újból megnyomom akkor pedig kialudjon.

Köszönöm a válaszokat előre is

Üdvözlettel
Lelkes újonc
Avatar
Robert
Elektronbűvölő
Hozzászólások: 10213
Csatlakozott: 2005. december 9. péntek, 7:00

Re: Nyomógomb használata hogyan

Hozzászólás Szerző: Robert »

Röviden:
A jobboldali ábra, mert a nyomógomb esetén a GND-re kötés a gyakoribb, mert a chipben _belső felhúzó_ ellenállás van.
Es ha a külső kimarad, akkor is működtethető. De amióta az "A" vegu chipek vannak, a 2 megoldas egyenerteku (belső ellenállás "A" esetben >100kohm).
dckillman
Biztosítékgyilkos
Hozzászólások: 61
Csatlakozott: 2013. október 7. hétfő, 11:23

Re: Nyomógomb használata hogyan

Hozzászólás Szerző: dckillman »

Kód: Egész kijelölése

int inPin=2;
int outPin=13;
int bekapcsolva=0;

void setup(){
pinMode(inPin,INPUT);
pinMode(outPin,OUTPUT);

}

void loop(){
if(digitalRead(inPin)== LOW)
  {
   delay(10);
   if(digitalRead(inPin)==LOW){}
     
     
    digitalWrite(outPin,HIGH);
    bekapcsolva=1;
  
  }
  if(digitalRead(inPin)==LOW && bekapcsolva==1)
  {
  digitalWrite(outPin,LOW);
  }
  

}
miért nem jó?

Köszi a választ

Üdvözlettel
Avatar
Robert
Elektronbűvölő
Hozzászólások: 10213
Csatlakozott: 2005. december 9. péntek, 7:00

Re: Nyomógomb használata hogyan

Hozzászólás Szerző: Robert »

Avatar
SzLacus
Tranzisztorgyógyász
Hozzászólások: 175
Csatlakozott: 2012. május 20. vasárnap, 6:00

Re: Nyomógomb használata hogyan

Hozzászólás Szerző: SzLacus »

Mert nem tudod olyan gyorsan elengedni a gombot, mint kellene. :D De a viccet félre téve működik, csak olyan gyorsan lekapcsolod, hogy észre sem veszed. Gondold csak végig. Először nézed a gomb nyomást, aztán kivárod a prellt, és megint nézed a gombot. Megvan amit akarsz, kapcsolod a ledet, és jelölöd, hogy be van kapcsolva. És itt a rögtön folytatod azzal, hogy megnézed a gomb állapotát. Még mindíg nyomva van, mert ilyen gyorsan nem tudod elengedni, aztán megnézed, hogy be van-e kapcsolva (persze hogy be, hát most kapcsoltad be) és ha ezek igazak, akkor rögtön ki is kapcsolod. Vagyis működik, csak nem azt teszi amit vársz tőle.
dckillman
Biztosítékgyilkos
Hozzászólások: 61
Csatlakozott: 2013. október 7. hétfő, 11:23

Re: Nyomógomb használata hogyan

Hozzászólás Szerző: dckillman »

Milyen kóddal lehet akkor azt a működést elérni amit szeretnék?
(megnyomom a gombot akkor világít,újra megnyomom kialszik)


Köszönöm a választ
Avatar
Robert
Elektronbűvölő
Hozzászólások: 10213
Csatlakozott: 2005. december 9. péntek, 7:00

Re: Nyomógomb használata hogyan

Hozzászólás Szerző: Robert »

Folyamatábratipp?

Pl. a gombnyomás után az elengedést is vizsgálnod kell (prellestül).
dckillman
Biztosítékgyilkos
Hozzászólások: 61
Csatlakozott: 2013. október 7. hétfő, 11:23

Re: Nyomógomb használata hogyan

Hozzászólás Szerző: dckillman »

Valamiért nem egészen értem a dolgot :-(

Ha tudsz konkrétabb segítséget adni azt megköszönöm,magamtól most erre nem fogok rájönni :-)
Avatar
Robert
Elektronbűvölő
Hozzászólások: 10213
Csatlakozott: 2005. december 9. péntek, 7:00

Re: Nyomógomb használata hogyan

Hozzászólás Szerző: Robert »

Kód: Egész kijelölése

1, ha gomb nyomott es perll is elmult:
  led allapotvaltas:
  a led eg, akkor kikapcsol, kulonben bekapcsol
       a gomb elengedett allapot es a prell is elmult, akkor tovabb
mars az elejere
dckillman
Biztosítékgyilkos
Hozzászólások: 61
Csatlakozott: 2013. október 7. hétfő, 11:23

Re: Nyomógomb használata hogyan

Hozzászólás Szerző: dckillman »

Megpróbálom megcsinálni hamarosan.Kicsit zavaros a dolog még mindig, sajnos,de hátha kitisztul.
Egyelőre nem sikerül:

Kód: Egész kijelölése

int inPin=2;
int outPin=13;
int bekapcsolva=0;

void setup(){
pinMode(inPin,INPUT);
pinMode(outPin,OUTPUT);

}

void loop(){
if(digitalRead(inPin)== LOW)
  {
   delay(10);
   if(digitalRead(inPin)==LOW)
   {
     digitalWrite(outPin,HIGH);
     bekapcsolva=1;
   }
  }
  if( digitalRead(inPin)== LOW && bekapcsolva==1)
  {
  delay(10);
    if(digitalRead(inPin)== LOW)
    {
      digitalWrite(outPin,LOW);
    }
  }else{
    digitalWrite(outPin,HIGH);
  }
}
Avatar
SzLacus
Tranzisztorgyógyász
Hozzászólások: 175
Csatlakozott: 2012. május 20. vasárnap, 6:00

Re: Nyomógomb használata hogyan

Hozzászólás Szerző: SzLacus »

Ha ideírunk egy kész megoldást, akkor verni fogod a fejed a falba, hogy nem jöttél rá, pedig milyen kézenfekvő, és legközelebb megint nem fogsz rájönni. De ha a segítségekkel magad találod meg a megoldást, akkor legközelebb kapásból eszedbe jut.
Szóval egy variációban az jó vonulat lehet, hogy a gomb figyelés, és a kapcsolási feltétel létrejöttekor beállítod a jelződet, például azt amit te most "bekapcsolva" változónak neveztél. (Ez egyébként akár boolean is lehetne, jobban utalna a változó "flag" jellegére.) De nem kapcsolod be rögtön a LED-et, hanem akkor kapcsoltatod be, amikor elengedettnek látod a gombot, és a változód azt jelzi, hogy be kéne kapcsolni. Akkor bekapcsolod, és törlöd a kapcsolás jelzőt. Másként fogalmazva, és funkcióját tekintve nem is "bekapcsolva" lenne a boolean értelme, hanem "kapcsolni_kell". Amikor a gombot nyomva találod, akkor beállítod, és amikor elengeded, akkor egy másik program részlet rátalál a feladatra, és kapcsol. Ha bekapcsolva volt akkor ki, és viszont. Így egy helyen lesegeted a kapcsolót, és jelzed a másik programrészletednek, hogy van-e teendő. Csak azt kell még végig gondolnod, hogy melyik résznek hol kell lennie a loopban ahhoz, hogy egy gombnyomás egy kapcsolást eredményezzen.

Azt tartsd szem előtt, hogy a loop folyamatosan körbe-körbe csinálja amit beleírsz, és mindez igen gyorsan történik. Egy gombnyomás ideje alatt több százszor is vérehajtódik a loop, tehát, ha például egy if feltétel a gombnyomáskor folyamatosan fennáll, akkor az minden körben végrehajtódik. Ha csak egyszer kell végrehajtani valamit, akkor gondoskodni kell róla, hogy a folyamatosan fennálló feltétel ellenére csak egyszer foglalkozzunk vele. Például fogalmazhatod úgy a feltételt gombnyomás esetén, hogy ha még nincs beállítva a "flag", akkor beállítom. Így a folyamatos körbefutkosás ellenére csak egyszer lesz beállítva amit állítani akarsz.

Csak hogy lássad a programod hogyan is működik, tegyél bele várakozást a bekapcsolási meg a kikapcsolási pontok közé, és tartsd nyomva a gombot. Meglátod fel fog villanni, és elalszik miközben a gombot nyomod. Ha a világítás közben engeded el akkor égve is marad. És ha a kikapcsoláshoz is megtalálod a helyet, ahol időt kell adnod a gomb elengedésére, akkor kikapcsolni is fog, csak nem teljesen ezt a működést akartad leprogramozni. Ha nagyon részletesen akarod látni, akkor szúrj be minden utasítás után egy Serial.println("utasítás") sort, amivel a soros porton keresztül olvashatod a képernyőn a történéseket. Ha késleltetésekkel lelassítod, akkor lesz időd elolvasni melyik utasításnál tartasz, és a LED-en meg láthatod az eredményét. Ez persze egy folyamatos szövegáradat lesz, amiben meg kell találnod, mi mikor történt. Ha készítesz egy loop számlálót, amit a loop elején mindig növelsz eggyel, és kiíratod a soros portra, akkor rögtön azt is láthatod, hogy mikor kezdődik új kör, és jobban láthatod mi történik. Hajrá, meglesz az a bekapcs-kikapcs.
Avatar
Robert
Elektronbűvölő
Hozzászólások: 10213
Csatlakozott: 2005. december 9. péntek, 7:00

Re: Nyomógomb használata hogyan

Hozzászólás Szerző: Robert »

A Serial print-nek két előnye van:
1, várakozást okoz, így a prell lecsen (9600 bps esetén 1 karakter: 1 msec)
2, változóértékeket és elágazáshelyeket írass ki. Így követed a programodat...
Avatar
irak
Biztosítékgyilkos
Hozzászólások: 73
Csatlakozott: 2005. november 2. szerda, 7:00

Re: Nyomógomb használata hogyan

Hozzászólás Szerző: irak »

Szerintem kicsit túl lett már bonyolítva:D

Azt figyeltesd hogy mikor van felfutó él a lábon, és akkor válts a kimeneten némi várakozással lezárva.

Kód: Egész kijelölése

char inPin=1;
char outPin=2;
char bekapcsolva;

unsigned char in,oldin;

void setup(){
  pinMode(inPin,INPUT);
  pinMode(outPin,OUTPUT);
  oldin=bekapcsolva=0;
}

void loop(){
  in=digitalRead(inPin);
  if(oldin==0&&in==1){
    bekapcsolva^=1;
    digitalWrite(outPin,bekapcsolva);
    delay(100);
    oldin=1;
  }
  if(in==0) oldin=0;
}
Avatar
Robert
Elektronbűvölő
Hozzászólások: 10213
Csatlakozott: 2005. december 9. péntek, 7:00

Re: Nyomógomb használata hogyan

Hozzászólás Szerző: Robert »

Ekkor a prell miatt megőrül a szoftver.... (na jó, várakozással elhúzható).

De ha mást is kell csinálni?:)
Avatar
irak
Biztosítékgyilkos
Hozzászólások: 73
Csatlakozott: 2005. november 2. szerda, 7:00

Re: Nyomógomb használata hogyan

Hozzászólás Szerző: irak »

Mondjuk én inkább timer irq-val csinálnám meg, a főprogramban is luxus a delay szerintem.

De miért is őrül meg?
Felfutó élnél vált a kimenet, kivárja a prell-t, és utána üresen fut a loop (oldin kizárja a többit) amíg le nem szállsz a gombról.
Válasz küldése