Arduino programozás segítség

Processing/Wiring (illetve C) nyelvű programozási fogások, tippek. (AVR-Duino, Arduino, EthDuino, Diecimila, Severino, Nano, LilyPad)
Válasz küldése
Avatar
Verjoz
SzínkódFestő
Hozzászólások: 99
Csatlakozott: 2018. március 13. kedd, 7:18

Arduino programozás segítség

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

Ü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!
Avatar
csegebiga
Chipgyilok
Hozzászólások: 288
Csatlakozott: 2015. március 27. péntek, 21:27

Re: Arduino programozás segítség

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

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.
Avatar
Verjoz
SzínkódFestő
Hozzászólások: 99
Csatlakozott: 2018. március 13. kedd, 7:18

Re: Arduino programozás segítség

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

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...
Avatar
csegebiga
Chipgyilok
Hozzászólások: 288
Csatlakozott: 2015. március 27. péntek, 21:27

Re: Arduino programozás segítség

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

Nem.
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)
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
Avatar
Verjoz
SzínkódFestő
Hozzászólások: 99
Csatlakozott: 2018. március 13. kedd, 7:18

Re: Arduino programozás segítség

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

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*/
Avatar
csegebiga
Chipgyilok
Hozzászólások: 288
Csatlakozott: 2015. március 27. péntek, 21:27

Re: Arduino programozás segítség

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

Előző hszemben mondtam, hogy kerüld a feltételben a '=' használatát
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){
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

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
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

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*/
Nem írtam át a (hibás) feltételvizsgálatokat, ezt az örömöt meghagyom neked!
:)
Avatar
kapu48
Elektronbűvölő
Hozzászólások: 3375
Csatlakozott: 2008. augusztus 29. péntek, 6:00

Re: Arduino programozás segítség

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

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/
Avatar
Verjoz
SzínkódFestő
Hozzászólások: 99
Csatlakozott: 2018. március 13. kedd, 7:18

Re: Arduino programozás segítség

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

Köszönöm a válaszokat?
KÓD gomb?
Hol van ilyen?
Avatar
csegebiga
Chipgyilok
Hozzászólások: 288
Csatlakozott: 2015. március 27. péntek, 21:27

Re: Arduino programozás segítség

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

KÓD gomb?
Hol van ilyen?
ez jó lesz?
codegomb.png
Nincs meg a kellő jogosultságod a hozzászóláshoz csatolt állományok megtekintéséhez.
Avatar
Verjoz
SzínkódFestő
Hozzászólások: 99
Csatlakozott: 2018. március 13. kedd, 7:18

Re: Arduino programozás segítség

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

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.
Avatar
kapu48
Elektronbűvölő
Hozzászólások: 3375
Csatlakozott: 2008. augusztus 29. péntek, 6:00

Re: Arduino programozás segítség

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

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!
Avatar
Verjoz
SzínkódFestő
Hozzászólások: 99
Csatlakozott: 2018. március 13. kedd, 7:18

Re: Arduino programozás segítség

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

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.
Avatar
kapu48
Elektronbűvölő
Hozzászólások: 3375
Csatlakozott: 2008. augusztus 29. péntek, 6:00

Re: Arduino programozás segítség

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

Változó név, abban tárolja a kapott értéket:

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

// defines variables
long duration;	// ídő tartam
int distance;  // távolság
long: https://www.arduino.cc/reference/en/lan ... ypes/long/
Avatar
Verjoz
SzínkódFestő
Hozzászólások: 99
Csatlakozott: 2018. március 13. kedd, 7:18

Re: Arduino programozás segítség

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

É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.
Avatar
Verjoz
SzínkódFestő
Hozzászólások: 99
Csatlakozott: 2018. március 13. kedd, 7:18

Re: Arduino programozás segítség

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

Ú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?
Válasz küldése