60 nap alatt Arduino #10 - Prell

A "60 nap alatt Arduino" tanfolyam házi feladatai és közvetlen témái
Avatar
richard
Újonc
Újonc
Hozzászólások: 1
Csatlakozott: 2009. március 30. hétfő, 6:00

60 nap alatt Arduino #10 - Prell

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

Helló! Bocsi nem az előző hozzászóláshoz írnék választ, egy új kérdés merült fel bennem csak nem akartam új témát nyitni.

Nyomógomb kezeléssel kapcsolatosan az előző e-mailban az alábbi résszel kapcsolatosan vannak bizonytalanságaim:

Prell: Legegyszerűbb, ha megvizsgáljuk a gombnyomás megtörténtét, majd a prellegés végeztével ellenőrizzük, hogy a gomb megnyomott állapotban van-e. Ha mindkét - egymás utáni - feltétel igaz, akkor biztosak lehetünk a gomb megnyomott állapotában. Ezt programban egyszerűen megvalósíthatjuk:

if (digitalRead(pin) == HIGH) {
delay (5);
if (digitalRead(pin) == HIGH) {
utasítások;
}
}

http://tavir.hu/tavir/files/download/2/nyomogomb.jpg

na most előző ismeretekből, ha a gomb meg van nyomva akkor 0(LOW) jelzést ad, avr lábát lehúzza GND-re. Illetve találtam ennek a fordított állapotát(erre vonatkozhat a kód rész) is de akkor a Pull-up ellenállás gondolom mindenképp kikapcsolva van!

A kód rész szerint ha a gomb nincs megnyomva várakozik(5) majd belép a 2. if-be majd az utasításba.

valaki remélem letisztázza, hogy akkor melyik tematika szerint fogjuk használni a kapcsolót. (eddigi "fejlesztéseim" során a kapcsoló kapcsolt állapota 0(LOW) volt).

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

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

Ops. Itt némi pontatlanság van akkor.
A nyomógombot két féleképp köthetem be:

+5V -- gomb -- láb -- ellenállás -- GND
Itt a megnyomott állapotban a láb HIGH állapotban van.

GND -- gomb -- láb -- ellenállás -- +5V
Itt a megnyomott állapotban a láb LOW állapotban van.

Igy a megnyomott állapotot kell vizsgálni...
Avatar
glezmen
Bitmanipulátor
Hozzászólások: 139
Csatlakozott: 2012. augusztus 9. csütörtök, 6:00

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

talan ide passzol a kerdesem...
szoval megjott a #9 lecke, es a nyomogomb
ezzel kapcsolatban tobb kerdes is felmerult a total amator fejemben:

1) az addig ok, hogy kossem be a kapcsolo ket veget, de melyik kettot? :S a kezdocsomagban levo ket kapcsolonak osszesen annyi laba van mint egy poknak :D szoval a negy lab kozul melyiket hova kossem? vagy mindegy, ha megnyomom akkor 'minden mindennel' ossze lesz zarva?

2) a bemeneti labak milyen jelszintet tudnak kezelni? ha 0-5V, akkor nem csinalhatom meg azt, hogy siman rakotom a kapcsolot az 5V es az input lab koze, ellenallas es egyebek nelkul?
Avatar
Robert
Elektronbűvölő
Hozzászólások: 10191
Csatlakozott: 2005. december 9. péntek, 7:00

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

A kapcsoló 2-2 lába össze van kötve belül:)


"Ha nem látszana a kép, akkor: a kapcsoló egyik fele a GND-re, a másik fele az Arduino egyik lábára megy. És innen egy opcionális 4.7 kohm ellenállás megy az +5 V-ra. A LED pedig a standard soros ellenálláson át van bekötve.

Így a kapcsoló zárt állapotában a bemeneti lábon 0 V, míg nyitott állapot esetén - ellenállás nélkül - közel lebegő állapotban van. A valóság azonban, hogy nyitott állapotban antennaként a környezeti zajt összeszedi és meghatározhatatlan potenciálra kerül a kivezetés. Ezt kivédendő a chipen belüli belső ellenállást bekapcsoljuk, vagy külső felhúzó-ellenállást használunk."


Bemeneti láb meneti szintje (-0.7V...+5.7V).
Gondold végig a kérdés második felét _valós_ HW esetén.
Kérdés: a levegőben lógó dróton milyen feszültség mérhető? :P
Avatar
glezmen
Bitmanipulátor
Hozzászólások: 139
Csatlakozott: 2012. augusztus 9. csütörtök, 6:00

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

Robert írta:A kapcsoló 2-2 lába össze van kötve belül:)
es melyik ketto? :D azt akkor ertem hogy parban vannak, de melyik melyikkel?
van ugye egy hosszukasabb meg egy rovidebb oldala, nekem az tunne talan logikusnak, hogy a rovidebb oldalakon levo kapcsolok vannak egymassal osszekotve, bar aztan ki tudja :D
Gondold végig a kérdés második felét _valós_ HW esetén.
Kérdés: a levegőben lógó dróton milyen feszültség mérhető? :P
hat gondolom semmilyen, vagyis 0, nem? :oops:
pont ezert gondoltam arra, hogy ha az 5V-ot rakotom a bemenetre a kapcsoloval, akkor ott 5V lesz, ha meg nyitva van a kapcsolo, akkor nincs is aramkor, igy feszultseg sem, tehat 0

tuti hogy valahol hiba van a gondolatmenetemben, de hol? :D
Avatar
Robert
Elektronbűvölő
Hozzászólások: 10191
Csatlakozott: 2005. december 9. péntek, 7:00

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

A 0 az a GND - az ideális rendszerben.
AZ NEM MÉRHETŐ.

Ha nyitva a kapcsoiló, akkor lebeg!
Ha van egy multimétered. Tedd mV mérésbe.
Egyik felét kössed GNDre.
Másikat fogd meg (antenna leszel). Kis feszültség van rajtad így már. Ez a CMOS nagy bemenő ellenállása során 2-3V is lehet!
A logikai 0 szint: 0-1.2V, Logikai 1: 3.0..5V.
A köztes az értelmezhetetlen!

Hangkártya bemenet megmarkolása 50Hz zúgás. A minek számít?


A 0 nemegyenlő a GND-vel!
A nálad a 0 - a bizonytalan bármit jelenti....
Avatar
glezmen
Bitmanipulátor
Hozzászólások: 139
Csatlakozott: 2012. augusztus 9. csütörtök, 6:00

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

megvan :)
Kép[/img]
Avatar
glezmen
Bitmanipulátor
Hozzászólások: 139
Csatlakozott: 2012. augusztus 9. csütörtök, 6:00

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

Robert írta:A 0 az a GND - az ideális rendszerben.
AZ NEM MÉRHETŐ.

Ha nyitva a kapcsoiló, akkor lebeg!
Ha van egy multimétered. Tedd mV mérésbe.
Egyik felét kössed GNDre.
Másikat fogd meg (antenna leszel). Kis feszültség van rajtad így már. Ez a CMOS nagy bemenő ellenállása során 2-3V is lehet!
A logikai 0 szint: 0-1.2V, Logikai 1: 3.0..5V.
A köztes az értelmezhetetlen!

Hangkártya bemenet megmarkolása 50Hz zúgás. A minek számít?


A 0 nemegyenlő a GND-vel!
A nálad a 0 - a bizonytalan bármit jelenti....
igy mar ertem, koszi, es egyben azt is megtudtam mi az a 'lebeges'
Avatar
gyulus2md
Újonc
Újonc
Hozzászólások: 12
Csatlakozott: 2008. október 29. szerda, 6:00

prell

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

Szevasztok!

A 10. feladatban közölt program a LED-et kapcsolja ki-be minden gombnyomásra.
iÍrtam egy programrészt ami - szerintem - ugyanezt csinálja. Ki kellene próbálni. Előre is köszi.

/* Nyomogomb - antiprell - IF
 Demonstracios program
 60 nap alatt arduino tanfolyam része
 */

void setup(){
  pinMode(6, INPUT); // Input switch
  pinMode(7, OUTPUT); // Output LED
  digitalWrite(6, HIGH); //Pull-up
}
int k=1;
void loop() {
  if (digitalRead(6) == LOW) {
    delay (5);
    if (digitalRead(6) == LOW) {
      delay(900);
      if ( k==1 )
      {
        digitalWrite(7,HIGH);
      }
      else
      {
        digitalWrite(7,LOW) ;
      }  
      k != k; 
    } 
  }


Avatar
normen
DrótVégénSzéndarab
Hozzászólások: 26
Csatlakozott: 2012. május 27. vasárnap, 6:00

Re: prell

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

gyulus2md írta:Szevasztok!

A 10. feladatban közölt program a LED-et kapcsolja ki-be minden gombnyomásra.
iÍrtam egy programrészt ami - szerintem - ugyanezt csinálja. Ki kellene próbálni. Előre is köszi.

/* Nyomogomb - antiprell - IF
 Demonstracios program
 60 nap alatt arduino tanfolyam része
 */

void setup(){
  pinMode(6, INPUT); // Input switch
  pinMode(7, OUTPUT); // Output LED
  digitalWrite(6, HIGH); //Pull-up
}
int k=1;
void loop() {
  if (digitalRead(6) == LOW) {
    delay (5);
    if (digitalRead(6) == LOW) {
      delay(900);
      if ( k==1 )
      {
        digitalWrite(7,HIGH);
      }
      else
      {
        digitalWrite(7,LOW) ;
      }  
      k != k; 
    } 
  }


Szia!

Ránézésre nem rossz a kód, viszont "k" változó negálásával van egy kis probléma:

Az általad írt:

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

k != k;
egy logikai összehasonlítás (k nem egyenlő k-val?). Így a kódodban k értéke sosem fog változni.
Tehát " !=" egy logikai operátor, melyeknek feltételvizsgálatkor (feltételes elágazásban, vagy ciklus kilépés/bentmaradás vizsgálatkor) van értelme.

Negálásra C-ben a kövtkező módszerek/operátorok alkalmazhatók:

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

k = !k; //k legyen egyenlő k negált értékével
k = -k; //k legyen egyenlő k negatív értékével
k *= -1; //k-t szorozzuk -1-gyel
k = 0-k; //0-ból kivonjuk k-t
Üdv.
NorMen
[/code]
[/b][/code]
Avatar
glezmen
Bitmanipulátor
Hozzászólások: 139
Csatlakozott: 2012. augusztus 9. csütörtök, 6:00

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

illetve ebben az esetben a jo megoldas: k = 1 - k;
(mivel kimondottan k == 1 -re ellenoriz)
Avatar
normen
DrótVégénSzéndarab
Hozzászólások: 26
Csatlakozott: 2012. május 27. vasárnap, 6:00

Re: prell

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

normen írta: Negálásra C-ben a kövtkező módszerek/operátorok alkalmazhatók:

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

k = !k; //k legyen egyenlő k negált értékével
k = -k; //k legyen egyenlő k negatív értékével
k *= -1; //k-t szorozzuk -1-gyel
k = 0-k; //0-ból kivonjuk k-t
Gyorsan javítom magam, mielőtt más tenné azt meg :)
Szóval negálásra csak a

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

  k = !k;
művelet használható (negálás művelet kimenete 0 vagy 1).

De mivel a kódban szereplő if elágazás feltételében azt vizsgáljuk, hogy k értéke 1, ezért bármelyik fentebb írt ( nem negáló) művelet is alkalmazható.


Üdv.
NorMen[/b]
Avatar
gyulus2md
Újonc
Újonc
Hozzászólások: 12
Csatlakozott: 2008. október 29. szerda, 6:00

prell

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

Szevasztok! normen, glezmen!

Igen, teljesen igazatok van. Összehasonlító műveletet végeztem az értékadás helyett. Ezért köszönöm a figyelem felhívást. C- nyelvet nem ismerve, rosszul néztem ki az utasítást az -arduino-referenc- ből.

k = !k - negálást tartom jobbnak.

73!

gyulus2md
Avatar
gyulus2md
Újonc
Újonc
Hozzászólások: 12
Csatlakozott: 2008. október 29. szerda, 6:00

prell

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

Szevasztok!

A programot javítottam.
Még így is több mint 30 byte a megtakarítás a külön ki-be kapcsoláshoz.
/* Nyomogomb - antiprell - IF
 Demonstracios program
 60 nap alatt arduino tanfolyam része
 */

void setup(){
  pinMode(6, INPUT); // Input switch
  pinMode(7, OUTPUT); // Output LED
  digitalWrite(6, HIGH); //Pull-up
}
int k=1;
void loop() {
  if (digitalRead(6) == LOW) {
    delay (5);
    if (digitalRead(6) == LOW) {
      delay(900);
      if ( k==1 )
      {
        digitalWrite(7,HIGH);
      }
      else
      {
        digitalWrite(7,LOW) ;
      }  
      k = !k; 
    } 
  }

Avatar
normen
DrótVégénSzéndarab
Hozzászólások: 26
Csatlakozott: 2012. május 27. vasárnap, 6:00

Re: prell

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

gyulus2md írta:Szevasztok! normen, glezmen!

Igen, teljesen igazatok van. Összehasonlító műveletet végeztem az értékadás helyett. Ezért köszönöm a figyelem felhívást. C- nyelvet nem ismerve, rosszul néztem ki az utasítást az -arduino-referenc- ből.

k = !k - negálást tartom jobbnak.

73!

gyulus2md
Ha a negálást választod, akkor szebben nézne ki az if feltétel így:

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

if (k) { //k értéke nem nulla
....
} else { //k értéke 0 
....
}
C-ben (és sok más programnyelvben) feltételvizsgállatkor minden nem 0 érték IGAZ-at, 0 érték pedig HAMIS-at jelent.

De ez már tényleg csak szépségkérdés, amúgy teljesen jól működik a kód...
Válasz küldése