Arduino programozás segítség
Arduino programozás segítség
Üdv mindenkinek!
Egy kis segítségre lenne szükségem.
Tanulgatom az Arduino programozást.
Időhiány végett eléggé lassan halad.
Még az elején járok a tananyag megismerésével noha a leckéket javát már megkaptam.
A probléma az lenne hogy:
Nyomogombos led kapcsolás....
Azt akarom megvalósítani hogy ha egyszer megnyomom a gombot a LED kivilágítson és úgy is maradjon, addig amíg mégegyszer meg megnyomom a gombot.
Tehát a nyomogomb úgy viselkedjen mint egy billenő kapcsoló.
Összeállítottam az áramkört megírtam az általam kigondolt program kódot, de valami nem ok.
Működik valamilyen szinten de gondol egyet és van úgy hogy többször meg kell nyomni a gombot hogy be vagy ki kapcsoljon.
A programom:
int gomb=0 //gomb allapotvaltozoja
void setup(){
pinMode(6,INPUT);/* gomb ide kotve 5v rol ellenalason keresztul a 6 os pinre kozvetlenul ellenallas utan a gomb bekotve GND re*/
pinMode(7,OUTPUT);//led szokasos modon bekotve
digitarWrite(6,HIGH);
}
void loop(){
if(gomb=0){digitalWrite(7,LOW);}//ha a gomb meg nem volt megnyomva akkor nincs magasban a kimenet
while(digitalRead(6)==LOW){gomb++;}// megnyomtam a gombot a valtozohoz hoz adjon egyet
if(digitalRead (6)==HIGH && gomb>0){
digitalWrite(7,HIGH);}// a gombot mar nem nyomom de a valtozo nagyobb mint nulla akkor a LED vilagit
while(digitalRead(6)==LOW && gomb>0){
gomb=0;}// ujra megnyomom a gombot nullazom a valtozot
Kérlek benneteket hogy oktató jelleggel magyarázzàtok el mit csesztem el.
Előre is köszönöm a segítséget!
Egy kis segítségre lenne szükségem.
Tanulgatom az Arduino programozást.
Időhiány végett eléggé lassan halad.
Még az elején járok a tananyag megismerésével noha a leckéket javát már megkaptam.
A probléma az lenne hogy:
Nyomogombos led kapcsolás....
Azt akarom megvalósítani hogy ha egyszer megnyomom a gombot a LED kivilágítson és úgy is maradjon, addig amíg mégegyszer meg megnyomom a gombot.
Tehát a nyomogomb úgy viselkedjen mint egy billenő kapcsoló.
Összeállítottam az áramkört megírtam az általam kigondolt program kódot, de valami nem ok.
Működik valamilyen szinten de gondol egyet és van úgy hogy többször meg kell nyomni a gombot hogy be vagy ki kapcsoljon.
A programom:
int gomb=0 //gomb allapotvaltozoja
void setup(){
pinMode(6,INPUT);/* gomb ide kotve 5v rol ellenalason keresztul a 6 os pinre kozvetlenul ellenallas utan a gomb bekotve GND re*/
pinMode(7,OUTPUT);//led szokasos modon bekotve
digitarWrite(6,HIGH);
}
void loop(){
if(gomb=0){digitalWrite(7,LOW);}//ha a gomb meg nem volt megnyomva akkor nincs magasban a kimenet
while(digitalRead(6)==LOW){gomb++;}// megnyomtam a gombot a valtozohoz hoz adjon egyet
if(digitalRead (6)==HIGH && gomb>0){
digitalWrite(7,HIGH);}// a gombot mar nem nyomom de a valtozo nagyobb mint nulla akkor a LED vilagit
while(digitalRead(6)==LOW && gomb>0){
gomb=0;}// ujra megnyomom a gombot nullazom a valtozot
Kérlek benneteket hogy oktató jelleggel magyarázzàtok el mit csesztem el.
Előre is köszönöm a segítséget!
Re: Arduino programozás segítség
Egy '=' hiányzik a berakott kódban.
if(gomb=0){ helyett
if(gomb==0){ kellene.
Tegyél bele egy kis lustaságot mert jelenleg másodpercenként több ezerszer bekikapcsolja magát a program.
Lásd: pergésmentesítés, prellegés, bemenet lustítása hw és sw oldalról
Egy delay 330; sor kb 3 észlelés per sec-re lassítja a programod.
if(gomb=0){ helyett
if(gomb==0){ kellene.
Tegyél bele egy kis lustaságot mert jelenleg másodpercenként több ezerszer bekikapcsolja magát a program.
Lásd: pergésmentesítés, prellegés, bemenet lustítása hw és sw oldalról
Egy delay 330; sor kb 3 észlelés per sec-re lassítja a programod.
Re: Arduino programozás segítség
Köszönöm a segítséget!
Amit rontottam "=" jel az azt jelenti hogy ha egy jellel van akkor hozzarendelem a nullát. Ha kettővel akkor értéke lesz a nulla?
Valahogy a leírásokba nem igazán értem az operátorokat...
Amit rontottam "=" jel az azt jelenti hogy ha egy jellel van akkor hozzarendelem a nullát. Ha kettővel akkor értéke lesz a nulla?
Valahogy a leírásokba nem igazán értem az operátorokat...
Re: Arduino programozás segítség
Nem.
A feltételben == jelenti az egyenlőségvizsgálatot.
A többi helyen jól csináltad
Arduino referenciában olvashatsz, hogy miért ajánlott kerülni a sima =-t
az x=0 egy értékadás, aminek a visszatérő értéke mindig true lesz, ha sikerült az rtékadás (nem volt hiba)
az x==0 megvizsgálja a feltételt, és x értékétől függően ad értéket
A feltételben == jelenti az egyenlőségvizsgálatot.
A többi helyen jól csináltad
Kód: Egész kijelölése
Comparison Operators:
x == y (x is equal to y)
x != y (x is not equal to y)
x < y (x is less than y)
x > y (x is greater than y)
x <= y (x is less than or equal to y)
x >= y (x is greater than or equal to y)
az x=0 egy értékadás, aminek a visszatérő értéke mindig true lesz, ha sikerült az rtékadás (nem volt hiba)
az x==0 megvizsgálja a feltételt, és x értékétől függően ad értéket
Re: Arduino programozás segítség
Köszönöm!
Lenne ismét egy kis fennakadás az alábbi programmal.
Nyomogomra indul el a programfutas.
Ez működik is..... Ha megint megnyomom meg is áll.... És onnan indul el ahol a poti áll.
A hiba az utolsó részben van ahol a két LED együtt villog. Nyomogomra nem reagál......
Ha más funkciót hívok (if)akkor az előző feltétel is belevillog.
Lehet rossz az egész kód?
Nem mintha nagy értelme lenne a kodomnak. Csak próbálok gyakorolgatni. És nem farasztani akarok senkit a hülyeségemmel de sajna másképp nem megy.
A kód:
int poti=3;//analog input
int valt=0;//poti erteket ide teszi
int gomb=0;//gomb alapot memo
void setup() {
pinMode(9,OUTPUT);//led
pinMode(10,OUTPUT);//led
pinMode(6,INPUT);//gomb
digitalWrite(6,HIGH);
}
void loop(){
if(gomb==0 && digitalRead(6)==LOW){
gomb=gomb+1;
delay(200);}//amikor megnyomom a gombot akkor indul el a progam
if(gomb==1 && digitalRead(6)==LOW){
gomb=0;
delay(200);}//kikapcsolom a prog.futast
if(gomb==0){digitalWrite(9,LOW);
digitalWrite(10,LOW);}//nincs gombnyomas nincs ledvilagitas
else if(valt=analogRead(poti)/4<100)//beolvasom a poti erteket
{
digitalWrite(9,HIGH);
delay(100);
digitalWrite(9,LOW);
delay(100);
}//ha feletelbe igaz akkor ez fut le
else{digitalWrite(10,HIGH);
delay(50);
digitalWrite(10,LOW);
delay(50);}//ha nem akkor meg ez
while(valt=analogRead(poti)/4<50&&gomb==1){
digitalWrite(10,HIGH);
digitalWrite(9,HIGH);
delay(250);
digitalWrite(10,LOW);
digitalWrite(9,LOW);
delay(250);}
/*megint beolvasom a potit es akkor ez fut ha igaz*/
Lenne ismét egy kis fennakadás az alábbi programmal.
Nyomogomra indul el a programfutas.
Ez működik is..... Ha megint megnyomom meg is áll.... És onnan indul el ahol a poti áll.
A hiba az utolsó részben van ahol a két LED együtt villog. Nyomogomra nem reagál......
Ha más funkciót hívok (if)akkor az előző feltétel is belevillog.
Lehet rossz az egész kód?
Nem mintha nagy értelme lenne a kodomnak. Csak próbálok gyakorolgatni. És nem farasztani akarok senkit a hülyeségemmel de sajna másképp nem megy.
A kód:
int poti=3;//analog input
int valt=0;//poti erteket ide teszi
int gomb=0;//gomb alapot memo
void setup() {
pinMode(9,OUTPUT);//led
pinMode(10,OUTPUT);//led
pinMode(6,INPUT);//gomb
digitalWrite(6,HIGH);
}
void loop(){
if(gomb==0 && digitalRead(6)==LOW){
gomb=gomb+1;
delay(200);}//amikor megnyomom a gombot akkor indul el a progam
if(gomb==1 && digitalRead(6)==LOW){
gomb=0;
delay(200);}//kikapcsolom a prog.futast
if(gomb==0){digitalWrite(9,LOW);
digitalWrite(10,LOW);}//nincs gombnyomas nincs ledvilagitas
else if(valt=analogRead(poti)/4<100)//beolvasom a poti erteket
{
digitalWrite(9,HIGH);
delay(100);
digitalWrite(9,LOW);
delay(100);
}//ha feletelbe igaz akkor ez fut le
else{digitalWrite(10,HIGH);
delay(50);
digitalWrite(10,LOW);
delay(50);}//ha nem akkor meg ez
while(valt=analogRead(poti)/4<50&&gomb==1){
digitalWrite(10,HIGH);
digitalWrite(9,HIGH);
delay(250);
digitalWrite(10,LOW);
digitalWrite(9,LOW);
delay(250);}
/*megint beolvasom a potit es akkor ez fut ha igaz*/
Re: Arduino programozás segítség
Előző hszemben mondtam, hogy kerüld a feltételben a '=' használatát
erre most két helyen is beraktad.
(Write Only User?!?)
Ez mindkét esetben konstans true, sosem vizsgálja a poti valódi értékét.
az IF mindig lefut, a while sosem ér véget
használj külön sort a beolvasásra a feltétel előtt, és a cikluson bell is, hogy ki tudjon lépni a program belőle
végül egy javaslat:
használd a code gombot a kód bemásolása előtt!
olvashatóbb a kód, és a struktúrája sem vész el.
programod így nézne ki a code gomb esetén
Nem írtam át a (hibás) feltételvizsgálatokat, ezt az örömöt meghagyom neked!
erre most két helyen is beraktad.
(Write Only User?!?)
Kód: Egész kijelölése
else if(valt=analogRead(poti)/4<100)//beolvasom a poti erteket
...
while(valt=analogRead(poti)/4<50&&gomb==1){
az IF mindig lefut, a while sosem ér véget
használj külön sort a beolvasásra a feltétel előtt, és a cikluson bell is, hogy ki tudjon lépni a program belőle
Kód: Egész kijelölése
poti beolvas
ifes érték vizsgálat...
Kód: Egész kijelölése
poti beolvas
while érték kisebb 60
teszi a dolgát,
poti beolvas
ciklus vége
használd a code gombot a kód bemásolása előtt!
olvashatóbb a kód, és a struktúrája sem vész el.
programod így nézne ki a code gomb esetén
Kód: Egész kijelölése
int poti=3;//analog input
int valt=0;//poti erteket ide teszi
int gomb=0;//gomb alapot memo
void setup() {
pinMode(9,OUTPUT);//led
pinMode(10,OUTPUT);//led
pinMode(6,INPUT);//gomb
digitalWrite(6,HIGH);
}
void loop(){
if(gomb==0 && digitalRead(6)==LOW){
gomb=gomb+1;
delay(200);
}//amikor megnyomom a gombot akkor indul el a progam
if(gomb==1 && digitalRead(6)==LOW){
gomb=0;
delay(200);
}//kikapcsolom a prog.futast
if(gomb==0){
digitalWrite(9,LOW);
digitalWrite(10,LOW);
}//nincs gombnyomas nincs ledvilagitas
else if(valt=analogRead(poti)/4<100)//beolvasom a poti erteket
{
digitalWrite(9,HIGH);
delay(100);
digitalWrite(9,LOW);
delay(100);
}//ha feletelbe igaz akkor ez fut le
else{
digitalWrite(10,HIGH);
delay(50);
digitalWrite(10,LOW);
delay(50);
}//ha nem akkor meg ez
while(valt=analogRead(poti)/4<50&&gomb==1){
digitalWrite(10,HIGH);
digitalWrite(9,HIGH);
delay(250);
digitalWrite(10,LOW);
digitalWrite(9,LOW);
delay(250);
}
/*megint beolvasom a potit es akkor ez fut ha igaz*/
Re: Arduino programozás segítség
Irány mutatónak még ez is fontos: Defining Logical Levels: true and false (Boolean Constants)
https://www.arduino.cc/reference/en/lan ... constants/
https://www.arduino.cc/reference/en/lan ... constants/
Re: Arduino programozás segítség
Köszönöm a válaszokat?
KÓD gomb?
Hol van ilyen?
KÓD gomb?
Hol van ilyen?
Re: Arduino programozás segítség
ez jó lesz?KÓD gomb?
Hol van ilyen?
Nincs meg a kellő jogosultságod a hozzászóláshoz csatolt állományok megtekintéséhez.
Re: Arduino programozás segítség
OMG!!!
Meg van! Telefonról nyomulok és itt a teljes szerkesztot be kell kapcsolni...
Köszönöm!
Kérdés:
A pulseIn eredményét hogy tudom felhasználni?
Pl:
bemeneti HIGH jel hosszát megmérem és ehhez az eredményhez hozzá adok X értéket. A két érték összege kimeneti High állapotban jelenik meg...
Arduino.cc oldalon lévő példa nekem sokat nem mond.
Meg van! Telefonról nyomulok és itt a teljes szerkesztot be kell kapcsolni...
Köszönöm!
Kérdés:
A pulseIn eredményét hogy tudom felhasználni?
Pl:
bemeneti HIGH jel hosszát megmérem és ehhez az eredményhez hozzá adok X értéket. A két érték összege kimeneti High állapotban jelenik meg...
Arduino.cc oldalon lévő példa nekem sokat nem mond.
Re: Arduino programozás segítség
Bátran enged el a fantáziádat, pl. egy ilyen project, hogy tetszik: Ultrasonic Sensor
https://www.youtube.com/watch?v=ZejQOX69K5M
https://howtomechatronics.com/tutorials ... r-hc-sr04/
A felhozott témába bele fér!
https://www.youtube.com/watch?v=ZejQOX69K5M
https://howtomechatronics.com/tutorials ... r-hc-sr04/
A felhozott témába bele fér!
Re: Arduino programozás segítség
Igen érdekes és hasznos ötlet.
Még választ is ad a kérdésemre.
De itt is megjelent a kódban az a szó amit az arduino.cc oldalon sem értettem hogy"duration".
Az meg micsoda.
Még választ is ad a kérdésemre.
De itt is megjelent a kódban az a szó amit az arduino.cc oldalon sem értettem hogy"duration".
Az meg micsoda.
Re: Arduino programozás segítség
Változó név, abban tárolja a kapott értéket:
long: https://www.arduino.cc/reference/en/lan ... ypes/long/
Kód: Egész kijelölése
// defines variables
long duration; // ídő tartam
int distance; // távolság
Re: Arduino programozás segítség
Értem! Vagyis figyelmetlen voltam és tulkombinaltam. De mi van akkor ha én nem
long valtozo=0;
hanem
int változó=0;
vagy
byte valtozo=0;
használok.
Az odáig ok hogy nagyobb méretű számokat tárolhatók a long ban.
De idomeres esetében az int is -32E től 32E ig tárol. Az is igen soknak tűnik nekem.
Jó azt is kapizsgalom hogy programinditas től mér a számláló. Vagyis ha változóhoz van rendelve akkor probléma ha hamar tulcsordul.
Csak a konkrét példanal nem értem hogy miért longot használ. Vagy miért is használ egyáltalán.
Nagyon hiányos a tudásom ezért tanulók és tesztelték gyakorol..... Csak az a baj mire úgy érzem hogy valamit megértek rádöbbennek arra hogy kibaszottul nem értem.
long valtozo=0;
hanem
int változó=0;
vagy
byte valtozo=0;
használok.
Az odáig ok hogy nagyobb méretű számokat tárolhatók a long ban.
De idomeres esetében az int is -32E től 32E ig tárol. Az is igen soknak tűnik nekem.
Jó azt is kapizsgalom hogy programinditas től mér a számláló. Vagyis ha változóhoz van rendelve akkor probléma ha hamar tulcsordul.
Csak a konkrét példanal nem értem hogy miért longot használ. Vagy miért is használ egyáltalán.
Nagyon hiányos a tudásom ezért tanulók és tesztelték gyakorol..... Csak az a baj mire úgy érzem hogy valamit megértek rádöbbennek arra hogy kibaszottul nem értem.
Re: Arduino programozás segítség
Újabb problémába ütköztem.
Az óra projekt!
Az alapötletem az volt hogy
elindította az idomeres egy változóhoz hozzarendelem.
int valt=0;
valt=millis()/1000;
ezután megfigyelem a változó értékét és léptetek.
(na itt dőlt meg az elmeletem)
int mp=0;
if(valt==60){mp++;}
a probléma az hogy a valt csak értéke csak egyszer lesz 60.
Utánna megpróbáltam
if(valt==60){valt=0;}
de nem sikerült nullazom! Miért?
Olyasmit selytek hogy a millis hez lesz köze. Talán mert millis()/1000= egy másodperc. Akkor ha a valt ot kinullazom a nullát ad után a millis értékét újra felveszi.
Tehát ha
millis()/1000==60;
és én itt a valt ot a fenti if el nullazom utánna
A valt értéke 0 lesz mindaddig amíg a program oda nem ér a valt=millis()/1000; sorhoz.
Akkor ezt az elméletet kilottem.
Akkor gondoltam arra hogy byte al próbálom meg mert az 256 onkent tulcsordul. De ugyebár ez a szám maradék nélkül 60 al nem osztható.
De azért megnéztem hogy lép e.
Ha
valt= millis()/100;
hogy egytizede másodpercben mérjek.
Akkor 2,56 másodperc alatt csordul túl a byte.
Akkor
if(valt==256){mp++;}
tudom hogy nem 2,56 másodperc egyenlő egy másodperc el.Csak a leptetesre voltam kíváncsi.
Lépni lép csak hol lassan hol gyorsabban... Na puff.
De az egészből a kérdésem csak az lenne hogy a millis t tudom e nullazom újraindítás vagy tulcsordulason kívül?
Az óra projekt!
Az alapötletem az volt hogy
elindította az idomeres egy változóhoz hozzarendelem.
int valt=0;
valt=millis()/1000;
ezután megfigyelem a változó értékét és léptetek.
(na itt dőlt meg az elmeletem)
int mp=0;
if(valt==60){mp++;}
a probléma az hogy a valt csak értéke csak egyszer lesz 60.
Utánna megpróbáltam
if(valt==60){valt=0;}
de nem sikerült nullazom! Miért?
Olyasmit selytek hogy a millis hez lesz köze. Talán mert millis()/1000= egy másodperc. Akkor ha a valt ot kinullazom a nullát ad után a millis értékét újra felveszi.
Tehát ha
millis()/1000==60;
és én itt a valt ot a fenti if el nullazom utánna
A valt értéke 0 lesz mindaddig amíg a program oda nem ér a valt=millis()/1000; sorhoz.
Akkor ezt az elméletet kilottem.
Akkor gondoltam arra hogy byte al próbálom meg mert az 256 onkent tulcsordul. De ugyebár ez a szám maradék nélkül 60 al nem osztható.
De azért megnéztem hogy lép e.
Ha
valt= millis()/100;
hogy egytizede másodpercben mérjek.
Akkor 2,56 másodperc alatt csordul túl a byte.
Akkor
if(valt==256){mp++;}
tudom hogy nem 2,56 másodperc egyenlő egy másodperc el.Csak a leptetesre voltam kíváncsi.
Lépni lép csak hol lassan hol gyorsabban... Na puff.
De az egészből a kérdésem csak az lenne hogy a millis t tudom e nullazom újraindítás vagy tulcsordulason kívül?