60 nap alatt Arduino #10 - Prell

A "60 nap alatt Arduino" tanfolyam házi feladatai és közvetlen témái
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ásSzerző: normen » 2012. augusztus 31. péntek, 9:51

gyulus2md írta: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.



Tovább tudod optimalizálni még a méretet, ha a K értékének vizsgálatát elhagyod.

Mivel eldöntötted, hogy a negálást használod K értékének módosításához, és tudjuk, hogy HIGH konstant értéke 1, illetve LOW konstans értéke 0, ezért a kód így tovább egyszerűsíthető:

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

/* 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);
      digitalWrite(7,k);
      k = !k; 
    } 
  }



Üdv.
NorMen

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

prell

HozzászólásSzerző: gyulus2md » 2012. augusztus 31. péntek, 10:09

NorMen

Teljesen igazad van. a program írásakor ez eszembe jutott nekem. A programot így is megírtam, csak mivel konstansnak a LOW és HIGH
vettem - és gondolva, hogy csak ez használható- változtattam meg
a program folyamatot. Ha kitudtam volna próbálni - hardware hiány -
akkor biztos, hogy így - ahogy javasoltad - hagytam volna.

Szevasz

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ásSzerző: normen » 2012. augusztus 31. péntek, 10:18

gyulus2md írta:NorMen

Teljesen igazad van. a program írásakor ez eszembe jutott nekem. A programot így is megírtam, csak mivel konstansnak a LOW és HIGH
vettem - és gondolva, hogy csak ez használható- változtattam meg
a program folyamatot. Ha kitudtam volna próbálni - hardware hiány -
akkor biztos, hogy így - ahogy javasoltad - hagytam volna.

Szevasz


Még nekem is úton van az Arduino UNO panelem... :)
Szóval én sem próbáltam ki (bár Simulino-val szoktam szórakozni, de azért a szimulatárok nem minden esetben működnek a valóságnak megfelelően).

Az viszont tény, hogy a compiler fordításkor a konstansok helyére az értékét helyettesíti be. Tehát teljesen mindegy, hogy HIGH szót vagy 1-et írsz, a bájtkódban úgyis 0x01 lesz értékként. Ilyen szempontból a konstansoknak leginkább a forráskód átláthatóságának szempontjából van szerepe.

Üdv.
NorMen

Avatar
ati27
Újonc
Újonc
Hozzászólások: 9
Csatlakozott: 2012. szeptember 3. hétfő, 6:00

HozzászólásSzerző: ati27 » 2012. szeptember 27. csütörtök, 10:46

Szóval kicsit megcsusztam a leckékkel..No akkor a 9-es jön.. Na mondom gyorsan összedobom a kapcsolást.. Ugye nem bonyolult, még talán nekem teljesen kezdönek sem.. Erre mire megtalátam azt a 4,7k ellenállást az 50+ fajta közül az volt több mint fél óra. :D Majd mire kideritettem a kapcsolo melyik lábi között kapcsol.. Aztán sikerült eltévednem a lyukpanelen is.. Na végül összeállt! De forditva müködött. Azaz a led akkor vilägitott amikor nem volt nyomva a gomb, és akkor aludt el, amikor megnyomtam. Jobban megnézve, nem lehetséges, hogy ezzel a kapcsolással és progival igy kell müködni?? Mivel ebben az esetben ugye 5v kerül a bemenetre, azaz mindig lesz jel. És a kapcsoló megnyomásakor lesz a bemeneten ”alacsony” jelszint. Két eset lehetséges: A progiban ”megnegálni” a kimenetet, vagy felcserélni az 5+ és a gnd-t. Na én az utóbbit csináltam, és latszólag helyesen müködött! Persze majd 3 órámba került, közel voltam hogy feladjam, de a végén nagyon örültem a sikernek! (ha egyáltalán jól csináltam!)

Avatar
glezmen
Bitmanipulátor
Hozzászólások: 139
Csatlakozott: 2012. augusztus 9. csütörtök, 6:00
Tartózkodási hely: Noszlop
Kapcsolat:

HozzászólásSzerző: glezmen » 2012. szeptember 27. csütörtök, 11:19

ati27 írta:Szóval kicsit megcsusztam a leckékkel..No akkor a 9-es jön.. Na mondom gyorsan összedobom a kapcsolást.. Ugye nem bonyolult, még talán nekem teljesen kezdönek sem.. Erre mire megtalátam azt a 4,7k ellenállást az 50+ fajta közül az volt több mint fél óra. :D Majd mire kideritettem a kapcsolo melyik lábi között kapcsol.. Aztán sikerült eltévednem a lyukpanelen is.. Na végül összeállt! De forditva müködött. Azaz a led akkor vilägitott amikor nem volt nyomva a gomb, és akkor aludt el, amikor megnyomtam. Jobban megnézve, nem lehetséges, hogy ezzel a kapcsolással és progival igy kell müködni?? Mivel ebben az esetben ugye 5v kerül a bemenetre, azaz mindig lesz jel. És a kapcsoló megnyomásakor lesz a bemeneten ”alacsony” jelszint. Két eset lehetséges: A progiban ”megnegálni” a kimenetet, vagy felcserélni az 5+ és a gnd-t. Na én az utóbbit csináltam, és latszólag helyesen müködött! Persze majd 3 órámba került, közel voltam hogy feladjam, de a végén nagyon örültem a sikernek! (ha egyáltalán jól csináltam!)


irasd ki a soros portra hogy eppen mit olvasol be a kapcsolora kotott portrol, akkor egybol kiderul :)

ha lehuzoellenallast hasznalsz (vagyis a foldet kotod a kapcsolora a 4.7K-s ellenallassal, es a masik labara a +5V-ot) akkor benyomaskor lesz HIGH, egyebkent LOW
ha meg felhuzoellenallast, ahogy a leckeben is szerepelt, akkor forditva

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

HozzászólásSzerző: normen » 2012. szeptember 27. csütörtök, 12:33

ati27 írta:Szóval kicsit megcsusztam a leckékkel..No akkor a 9-es jön.. Na mondom gyorsan összedobom a kapcsolást.. Ugye nem bonyolult, még talán nekem teljesen kezdönek sem.. Erre mire megtalátam azt a 4,7k ellenállást az 50+ fajta közül az volt több mint fél óra. :D Majd mire kideritettem a kapcsolo melyik lábi között kapcsol.. Aztán sikerült eltévednem a lyukpanelen is.. Na végül összeállt! De forditva müködött. Azaz a led akkor vilägitott amikor nem volt nyomva a gomb, és akkor aludt el, amikor megnyomtam. Jobban megnézve, nem lehetséges, hogy ezzel a kapcsolással és progival igy kell müködni?? Mivel ebben az esetben ugye 5v kerül a bemenetre, azaz mindig lesz jel. És a kapcsoló megnyomásakor lesz a bemeneten ”alacsony” jelszint. Két eset lehetséges: A progiban ”megnegálni” a kimenetet, vagy felcserélni az 5+ és a gnd-t. Na én az utóbbit csináltam, és latszólag helyesen müködött! Persze majd 3 órámba került, közel voltam hogy feladjam, de a végén nagyon örültem a sikernek! (ha egyáltalán jól csináltam!)


Szia!

A lecke így szólt:

Í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. Így nyitott kapcsoló esetén az Arduino bemeneten 5 V feszültséget mérhetünk a fenti kapcsolás alkalmazásával!


A példa kódból pedig egyértelmű, hogy a kapcsoló lábán mért állapotot írjuk a led kimenetre:
digitalWrite(7, digitalRead(6));


Tehát a leckében írt példától pontosan azt kell várnunk, hogy alaphelyzetben világít a led, gombnyomásra pedig egy pillanatra kialszik.

Üdv.
NorMen

Avatar
Robert
Elektronbűvölő
Hozzászólások: 9904
Csatlakozott: 2005. december 9. péntek, 7:00
Tartózkodási hely: Budapest
Kapcsolat:

HozzászólásSzerző: Robert » 2012. szeptember 27. csütörtök, 13:55

Nem egy pillanatra alszik ki a LED. Nem kondi van ott :)


Kerdes milyen jelszinted van: A D13 akkor vilagit, ha a kimeneti jeled H szint. A nyomógombot ha így H-ba viszed, csak akkor vilagitasz. ha GNDre, akkor a LED kialszik.
Es kozte a prell allapot...

Remelem nem ertem felre a kerdest...

Avatar
ati27
Újonc
Újonc
Hozzászólások: 9
Csatlakozott: 2012. szeptember 3. hétfő, 6:00

HozzászólásSzerző: ati27 » 2012. szeptember 27. csütörtök, 15:55

normen írta:
Tehát a leckében írt példától pontosan azt kell várnunk, hogy alaphelyzetben világít a led, gombnyomásra pedig egy pillanatra kialszik.

Üdv.
NorMen


Teljesen igazad van.. De :) Idézem:

" A gyakorlat

Az áramkörök induláskor minden lábukon bemenetek. Azonban erre soha nem alapozhatunk, így minden esetben nekünk kell megmondani, hogy egy lábat bemenetként vagy kimenetként akarunk használni. Erre a LED-villogónál már megismert utasítást használhatjuk. Ha egyszerűen egy nyomógombbal szeretnénk egy LED-et kigyújtani, azt könnyen megtehetjük:

Szóval bennem ez ragadt meg, és eyt vártam! Ennek ellenére örültem a "hibának" mert tornázott az agyam rendesen.. :D Ilyenekböl tanul az ember, mert ha frank´n elsöre sikerül, akkor "ok, ez is megvan" Mint irtam full kezdö vagyok az ügyben és sok dolog "kinai" De ha nem így lenne, akkor nem jelentkeztem volna a tanfolyamra.. Ma este "prellezek"! Már várom! :D

Avatar
ati27
Újonc
Újonc
Hozzászólások: 9
Csatlakozott: 2012. szeptember 3. hétfő, 6:00

HozzászólásSzerző: ati27 » 2012. szeptember 27. csütörtök, 15:59

Bocs2x ment el.. :D

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

HozzászólásSzerző: normen » 2012. szeptember 28. péntek, 20:56

Robert írta:Nem egy pillanatra alszik ki a LED. Nem kondi van ott :)


Pontosabban addig alszik ki, amíg nyomva tartod a gombot... Következő ciklusban, mikor a gomb felengedett, akkor már ismét 0-at olvas a 6-os lábon.

Perlegés jelenségét itt hanyagoljuk, ez még csak a 9. lecke (Szabad szemmel itt amúgy sem látható, vagy vak vagyok :))

Keszon
Újonc
Újonc
Hozzászólások: 2
Csatlakozott: 2014. február 20. csütörtök, 21:23

Re: 60 nap alatt Arduino #10 - Prell

HozzászólásSzerző: Keszon » 2014. február 23. vasárnap, 15:07

Üdv!

A kedves kollégák hozzászólásaiból okulva és felhasználva azokat a következő két kis programot okoskodtam ki.
Persze az igazsághoz az is hozzátartozik, hogy nem egészen ezt akartam. :)

Az első:

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

digitalWrite(5, HIGH);
delay(100);


}
else
{
digitalWrite(7, LOW);
delay(100);

digitalWrite(5, LOW);
delay(100);

}
k = !k;

}
}
}



A második:


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

digitalWrite(7,HIGH);
digitalWrite(5,LOW);

}
else
{
digitalWrite(7,LOW) ;
digitalWrite(5,HIGH);
}
k = !k;


}
}
}




Az eredeti elképzelésem az lett volna, hogy egy két ledből álló futófényt kapcsolok ki/be.
A vége felé már szerintem nem álltam messze az igazságból, de egyenlőre megmaradtam ennél a két akár még használható verziónál.

betonbokor
Újonc
Újonc
Hozzászólások: 7
Csatlakozott: 2014. március 18. kedd, 10:27

Re: 60 nap alatt Arduino #10 - Prell

HozzászólásSzerző: betonbokor » 2014. március 19. szerda, 19:16

Sziasztok!
Nekem egy speciálisabb gombnyomásra lenne szükségem.
Konkrétan a megnyomás után induljon pl. egy 5mp-es időzítés, függetlenül attól hogy lenyomva vagy elengedve maradt a nyomógomb.
Ebben kérnék segítséget és ha lehet a fapadosabb módon minden egyszerűsítés és rövidítés nélkül hogy megértsem a folyamatot.

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

Re: 60 nap alatt Arduino #10 - Prell

HozzászólásSzerző: SzLacus » 2014. március 19. szerda, 21:10

Van egy millis() nevű függvény, ami mint a neve is mutatja, a milliszekundumokban mérve mutatja az idő előrehaladtát. Amikor bekapcsolod, (reseteled) a szekezetet akkor indul nulláról és egyre csak növekszik az értéke. Arról, hogy ez átfordul majd egy idő múlva, most feledkezzünk meg. A referenciák között megtalálod, hogy milyen hosszú szám (hány bájt) a millis(). Nos a feladat megoldása sokféle és bonyolult, meg ennél egyszerűbb is lehet pl. timerrel, de neked egyszerű, és alapmegoldás kell még, hát írok egy elvet, amit te le tudsz programozni pár sorban.
Első lépés, hogy a setupban lértehozol egy változót, amiben azt az időpontot fogod tartani, amikor a lednek ki kell majd kapcsolnia.

Aztán a loopban lesed, hogy nyomva van-e a gombod.
Ha nyomva találod, akkor a lekapcsolási idő változódnak a pillanatmyi millis() plusz 5000 értéket adod, mert ötezer millisec múlva akarod lekapcsolni.
Aztán bekapcsolod a ledet.
Aztán már csak azt lesed, hogy a pillnatnyi idő nagyobb-e mint a lekapcsolási idő. Ha igen, akkor lekapcsolod a ledet.

Amit eddig leírtam, az egyszerű, de vannak nyomorai. Ez ugyanis még úgy működik, hogy amikor forogsz a loop-ban, akkor újra és újra nyomva találod a gymbot, mindaddig, amíg el nem engeded. Tehát minden kanyarban észreveszed a nyomott gombot, és 5000-el előre állítod a kikapcsolási időt, de nem ezt szeretnéd. Ezért felveszel még egy változót, célszerűen egy booleant, amit arra használsz, hogy észrevedd, az időt már elindítottad, nem kell újta előbbre tolni.
Mit is kell tenned? amikor észrevetted, hogy a gomb nyomva van, és előre állítottad az időt, akkor beállítod ezt a jelzőt, és a gombnyomás figyelést módosítod, hogy csak akkor érdekeljen a nyomott gomb, ha ez a jelző nem áll.
Ekkor ráfekhetsz a gombra, a led világítani kezd, majd 5 sec múlva kialszik. Viszont többet nem tudod majd bekapcsolni. Hopp, miért is?
Mert a jelződ azt mondja, nem kell az időt előre állítani mert a gombnyomás most nem érdekel. Törölnöd kell a jelzést, de mikor? Attól függ mit akarsz elérni. Ha akkor törlöd, amikor a gombot elengeded, jól fog működni, és ha a világítás időtartama alatt nyomod újra a gombot, akkor további 5 sec világítást fogsz kiváltani, hiszen ha nyomsz egyet, akkor 5sec, ez a szabály. Másik lehetőség, hogy akkor törlöd a jelzőt, amikor a ledet is kioltod. Ekkor a világítási idő alatt hiába nyomogatod nem történik semmi. Ha kialudt, újta nyomhatod, újra világít 5sec-et.
Kb ennyi, talán semmi buktatót nem felejtettem ki. És csak az "if", meg a millis() kell hozzá a gomb olvasásáon, meg kimenet íráson kívül.
Menni fog, gyötörd egy kicsit és sikerül.

betonbokor
Újonc
Újonc
Hozzászólások: 7
Csatlakozott: 2014. március 18. kedd, 10:27

Re: 60 nap alatt Arduino #10 - Prell

HozzászólásSzerző: betonbokor » 2014. március 21. péntek, 9:09

Szia!
Köszönöm a válaszod!
Megpróbáltam egy kicsit más oldalról megközelíteni, kérlek írj véleményt róla mit lehetne még finomítani.


const int buttonPin = 2;// the number of the pushbutton pin

const int ledPin = 13; // the number of the LED pin

// variables will change:

int buttonState = 0; // variable for reading the pushbutton status
static unsigned long gombido = 5000;



void setup() {
// initialize the LED pin as an output:
pinMode(ledPin, OUTPUT);
// initialize the pushbutton pin as an input:
pinMode(buttonPin, INPUT);
}

void loop(){
// read the state of the pushbutton value:
buttonState = digitalRead(buttonPin);

// check if the pushbutton is pressed.
// if it is, the buttonState is HIGH:
if (buttonState == HIGH && gombido > millis() - 5000) {

// turn LED on:
digitalWrite(ledPin, HIGH);
}
else if (gombido < millis() - 5000){
// turn LED off:
digitalWrite(ledPin, LOW);

if (buttonState == LOW) gombido = millis();
}
}

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

Re: 60 nap alatt Arduino #10 - Prell

HozzászólásSzerző: SzLacus » 2014. március 21. péntek, 15:22

Ha azt teszi a programod amit vársz tőle, akkor jó. Azt teszi? Úgy működik? Akkor lehet tovább fejleszteni. Például lehessen leoltani.
Csak néhány praktikum.
A gomb állapotát két állapottal tudod jellemezni. Akkor felesleges egy int nagyságú helyet felhasználni rá, elég neki a boolean.
A beolvasást (digitalRead) magát is beírhatod az if függvény feltétel részébe, nem kell neki egy változó, amit aztán tovább vizsgálsz.
Azzal is eldöntheted, hogy a gomb nyomva van-e, ha a beolvasott értéket, vagy a negáltját adod az if feltételéül.
De hogy kicsit érthetőbb legyen, nézzük mindezt egy kiragadott sorodon megmutatva.

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

if (buttonState == LOW)

Ugyan azt jelenti, mit

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

if (!digitalRead(buttonPin))

De ennek is csak akkor van jelentőssége, ha áttekinthető, olvasható, logikailag jobban követhetővé válik tőle a programod. Mert egy program soha nincs készen, mindíg akad valami ötlete az embernek, hogy mit csináltasson még meg a szerkezettel, és akkor meg kéne érteni a korábbi, már rég elfeledett gondolatok alapján megírt kódot. Ebben segítenek a kommentek.


Vissza: “60 nap alatt Arduino - Házi feladatok”

Ki van itt

Jelenlévő fórumozók: nincs regisztrált felhasználó valamint 1 vendég