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ő:
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.
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.
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. 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!)
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. 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
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. 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.
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...
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.. 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!
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.
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.
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.
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);
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.
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.