Fórum témák

» Több friss téma
Fórum » Arduino
A klónok CH340 Soros-USB illesztőjének drivere (Letöltés)
Lapozás: OK   589 / 852
(#) Massawa válasza Massawa hozzászólására (») Feb 11, 2020 /
 
Na léptem egyet, sajnos a cursor többet. Nem tudom miért megy a cursor tovább:
Valami nem stimmel. Kezdetben a displayen 0 van az elsö kockában. Ha megnyomom a gombot az n 3-ra ugrik és egy háromdigites szám jelenik meg, ami kaotikusan változik ha a fehér gombot nyomogatom. Holott semmi oka sincs az n-nek változnia, sehol sincs erre parancs

Kösz

  1. int n=0;
  2.  
  3. void inputWH() {
  4.   lcd.setCursor(n, 1);
  5.   //lcd.blink_on();
  6.   if (digitalRead(WHITE) < HIGH) { // Read the WHITE button, increment the count by one
  7.     delay(200);
  8.     count = count + 1;
  9.     if (count > 9) {                // count up to 9
  10.       count = 0;
  11.     }
  12.     lcd.setCursor(n, 1);
  13.     lcd.print(count);
  14.   }
  15. }
  16.  
  17. void Lprint() {
  18.   lcd.setCursor(0, 1);
  19.   lcd.print(Turn);
  20.   delay(2000);
  21.   //lcd.blink_off();
  22. }
  23.  
  24.  
  25.  
  26. void loop() {
  27.   Serial.print ("n= ");
  28.   Serial.println (n);
  29.   Serial.print ("Turn = ");
  30.   Serial.println(Turn);
  31.   if (n = 0) {
  32.      inputWH();
  33.      Turn = count * 1000;
  34.      Lprint();
  35.      count = 0;
  36.    
  37.   }
  38.   if (n = 1) {
  39.      inputWH();
  40.      Turn = Turn + (count * 100);
  41.      Lprint();
  42.      count = 0;
  43.    
  44.   }
  45.   if (n = 2) {
  46.       inputWH();
  47.      Turn = Turn + (count * 10);
  48.      Lprint();
  49.      count = 0;
  50.   }
  51.   if (n = 3) {
  52.     inputWH();
  53.      Turn = Turn + count;
  54.      Lprint();
  55.      count = 0;
  56.   }
  57. }
A hozzászólás módosítva: Feb 11, 2020
(#) Frankye hozzászólása Feb 11, 2020 /
 
Üdv ismét a hozzáértő csapatnak!
A múltkori, több feltételű elágazás kérdése - Nektek köszönhetően - sikerrel megoldódott, azonban most egy újabb problémám adódott.
Az volna a cél, hogy létrehozzak egy (pontosabban több) szubrutint a programban, amelyeket többször meg tud hívni a főprogram. Egy változó értékét kell átadni a függvénynek, amelynek értékétől függően a függvény végrehajt egy feladatot, az egyszerűség kedvéért mondjuk egy kimenetet kell alacsony (LOW) értékre állítani, ha az átadott változó értéke valamilyen értékhatárok között van, ellenkező esetben pedig magasra (HIGH).
Akár hogyan próbálom azonban elhelyezni a függvényt, deklarálni a változót, mindig valami hibát ír a fordító.
Amit már kiokoskodtam:
- A void setup () előtt kell megírni a függvényt.
- A változónak globálisnak kell lennie. (Kérdés: hol kell deklarálni? A setupban?)
- A meghívás hogyan történik? (A void (függvénynév) nem működik, hibát ad rá.)
- A függvény végére egy return; kell.
- A függvény hívását a loop ()-ba kell tenni.
- A függvény meghívása előtt a loop ()-ban kell a változó értékét módosítani, a kiértékelés viszont a függvényben történik.
Minden segítséget örömmel fogadok!
(#) tbarath válasza Frankye hozzászólására (») Feb 11, 2020 / 1
 
Bővebben: Link

Szerintem ami hiba:
- void visszatérésű értékhez nem kell return (attól még lehet, de a hívó ezt nem használja).
- a meghívása simán függvénynév();
- a globális változót a saját fv. előtt deklaráld (én a setup előtt szoktam minden globális cuccot deklarálni)

  1. const uint8_t bizgeraltPin = 13;
  2. int valtozo;
  3.  
  4. void setup() {
  5.         pinMode(bizgeraltPin, OUTPUT);
  6. }
  7.  
  8. void fuggveny(){
  9.         if (valtozo < 128){
  10.                 digitalWrite(bizgeraltPin, LOW);}
  11.         else{
  12.                 digitalWrite(bizgeraltPin, HIGH);}
  13. }
  14.  
  15. void loop() {
  16.         valtozo = 10;
  17.         fuggveny();
  18.         delay(500);
  19.         valtozo = 210;
  20.         fuggveny();
  21.         delay(500);
  22. }
(#) bbb válasza Frankye hozzászólására (») Feb 11, 2020 / 1
 
Nem kell a setup() előtt megírnod. Pontosabban mindig az előtt kell megírnod, mielőtt használnád. Ha már a setup-ban használni akarod, akkor kell előtte megírnod, ha nem, akkor ráérsz utána is.

A fv. deklarálása kb. így történik:
  1. visszatérésiértéktípusa fvnév(bemeneti paraméterek){ fvtörzs }

Ezt meghívni pedig ugyan úgy, ahogy a többit is meghívnád, azaz
  1. valtozo=fvnév(paraméterek);
vagy akár csak simán
  1. fnév(paraméterek);

A "void" az csak egy visszatérési érték típus (csak különleges, mert azt mondja, hogy visszatérési érték nélküli fv. következik, s így return se kell a törzsbe), ami lehetne int, char, kiskutyafüle, akármi, meghíváskor már nem kell megint megmondanod.
A példaprogramok között nézelődj, hamar meg fogod érteni!
(#) tbarath válasza Massawa hozzászólására (») Feb 11, 2020 /
 
Ez katyvaszos kicsit, és nem is teljes a kód.
Amit látok, hog az LPrint-tel kiíratod a Turn változót, ami 4 digites. Tehát pozícionálsz, kiírsz, a cursor nyilván a végén lesz. És a loop-ban megintcsak írsz dolgokat, nem csak az LPrinttel. És az inputHW-ban is kiíratsz. És a count-ot folyton nullázod a loop-ban.
Ha kiírsz valamit, akkor a cursor elmászik a kiírt szöveg végére. Ha máshol kellene villognia, akkor kiíratás után oda kellene visszatenni setCursor-ral.
(#) Massawa válasza tbarath hozzászólására (») Feb 11, 2020 /
 
Azt látom, de ha az n nem változik miért nem az elsö digitet változtatja? Direkt leröviditettem a kodot, és csak az maradt benne ami most nem megy. A Turn az a 4 digites szám, de viszont az n az egész kodban nem változik azaz a nulladik helyen kellene a számnak változnia, de változik bárhol a 4 helyen és az n az elsö változás után 3-ra ugrik.
A gondom azt, hogy régebben ASM-ben irtam a kodokat és azok a mai napig müködnek az Arduino nyelvét meg csak tanulgatom.
A fenti kodban csak az lenne a feladat, hogy az elsö száma változzon a 4 digites számnak.
( utánna lenne a kod másik része hogy a 2., 3. meg a 4. helyre ugorjon a cursor és ott ismétlödjön a történet - akár egy kofferzár vagy lakat). . De most még az elsö szám sem akar ugy változni. Na megyek még egy kicsit veszödni, egy szám változása megy, de ez a 4 számjegyü kiirás valami zürt visz a dologba, de nem tudom hol és miért.
A hozzászólás módosítva: Feb 11, 2020
(#) Lamprologus válasza Massawa hozzászólására (») Feb 11, 2020 /
 
Négy számjegyű számot bevinni nyomógombbal ... na ne!!! Ilyenkor szoktam elővenni a Nextiont!
(#) Massawa válasza Lamprologus hozzászólására (») Feb 11, 2020 /
 
Pontosan ezért akarom ugy megirni, hogy a nyomogombbal egyenként viszem be a számokat az ezrest, a százast a tizest meg az egyeseket. Ezért kell csak 0-9-ig számolni. S ha benn a 4 számjegy akkor a Turn változtatja a 4, addig önállo számjegyet egy valos számmá 0-9999ig. Ezt eddig is igy csináltam, mert igy a legegyszerübb. Ezzel nincs semmi gond. Azért kell, hogy a cursor az egyes számjegyek helyén maradjon addig amig nem léptetem a következöre.

Azon az egy 4 jegyü számon kivül még van 3 darab 2 jegyü is......
A hozzászólás módosítva: Feb 11, 2020
(#) mateatek válasza bbb hozzászólására (») Feb 11, 2020 /
 
Lehet, hogy nálam nem kerek valami (Linux), de teljesen mindegy, hogy előtte, vagy utána írom meg. Ha mindent a loop után írok, akkor is ugyanaz, mint ha előtte.
(#) bbb válasza mateatek hozzászólására (») Feb 11, 2020 / 1
 
Sok programnyelvnél teljesen mindegy hol írod meg. Vannak azonban olyanok, amik háklisak rá, hogyha nem találják meg azelőtt a deklarációt, mielőtt használnád (pl. .Net esetében a PowerShell se szereti). Úgy emlékeztem az Arduino is ilyen (amennyi féle programnyelvvel eddig foglalkoztam, nem is csoda, ha megkopnak az ilyen emlékek). Most gyorsan kipróbáltam, az 1.8.10-es verziójú Arduino környezet se foglalkozik vele és mehet bárhova, igazad van.
Lehet, hogy ez egy rossz beidegződés (nálam), de én megszoktam, hogy inkább előbb legyenek, így kevesebb gondom van a nyelvek közti váltogatáskor
(#) nightlife válasza Massawa hozzászólására (») Feb 11, 2020 /
 
Szia, az inputWH() függvényedben lévő változóid deklarálatlanok.
count értéke memóriaszemét, mert egy függvény nem látja a rajta kívül létrehozott változókat (hacsak nem globálisak).

Keress rá a variable scope fogalomra.
(#) djusee válasza Massawa hozzászólására (») Feb 12, 2020 /
 
Szia. Szerintem használd a setCursor függvényt kiírás után. Pl. így
  1. #include <LiquidCrystal_I2C.h>
  2.  
  3. LiquidCrystal_I2C lcd(0x27,20,4);
  4. byte pozicio = 0;
  5. byte szam[3] = {0,0,0};
  6.  
  7. void setup()
  8. {
  9.   lcd.init();
  10.   lcd.blink();
  11.  
  12.  for(; pozicio < 3; pozicio++){
  13.   lcd.setCursor(pozicio,0);
  14.   for(; szam[pozicio] < 10; szam[pozicio]++){
  15.     lcd.print(szam[pozicio]);
  16.     lcd.setCursor(pozicio,0);
  17.     delay(500);
  18.   }//end for szam noveles
  19.  }//end for pozicio
  20. }
  21.  
  22.  
  23. void loop()
  24. {
  25. }


Ezt I2C LCD -hez írtam, sima LiquidCrystal könyvtártól csak a példányosítás és az inicializálás külömbözik.
(#) Massawa válasza djusee hozzászólására (») Feb 12, 2020 /
 
Kösz, én is I2C displayjel dolgozok. Ki fogom probálni, de nem akartam automatikusan a poziciot változtatni, hanem erre van két másik gomb (jobbra balra), hogy bármikor bármelyik számjegyet ujra tudjam irni. Egyelöre, az zavar, hogy nem marad azon a pozicion ahol kellene. Megprobalom kivenni az átalakito sort ( Turn=count*1000, mert valoszinü az zavar.
(#) djusee válasza Massawa hozzászólására (») Feb 12, 2020 /
 
Csak vedd ki belöle for ciklusokat és a gombnyomásokkal változtasd a pozicio és szam változók értékeit és meg is van
(#) Massawa válasza djusee hozzászólására (») Feb 12, 2020 /
 
Pontosan ez történt kivettem a ciklusokat és már megy a bevitel. Érdekes, hogy a lcd.blink() meg az lcd.cursor() is eltolja a poziciot. A második sor elsö poziciojába nem tudok beirni semmit ha elöbb bekapcsolom a fenti funkciot. Nélkülük minden müködik.
Most még azon filozok hogyan csináljak a 4 számjegyböl egy számot. Ha berakom a loopba az összeszámolást, akkor az ezresek mennek, de a százasok stb. már elkezdenek felszámolodni ( azaz minden ciklus egy százassal többet ad) valahogy ki kell venni a ciklusbol, hogy csak egyszer számoljon.
(#) Lamprologus válasza Massawa hozzászólására (») Feb 12, 2020 /
 
Az nem megoldás hogy a kurzor pozíciójától függően 1000, 100, 10, 1-et adsz hozzá a változóhoz és azt iratod ki egyből?
(#) djusee válasza Lamprologus hozzászólására (») Feb 12, 2020 /
 
Az is megoldás lehet, én úgy oldanám meg hogy az egészet egy funkcióba tenném amiben a byte tömböt egy for ciklussal bejárnák visszafelé és hatványoznám. Lehet hogy leírom a kódot, egyszerübb számomra mint a fogalmazás
(#) Massawa válasza Lamprologus hozzászólására (») Feb 12, 2020 /
 
Az menne, csak a cursor nem marad a helyén ha pl a 0.1 pozicioba kiirok egy 2000, akkor már nem tudok 2100-t bevinni, mert ott a konfliktus. Szoval a 4 jegyü számot nem gond most már odairni a displayre, csak az nem szám, hanem 4 karakter. Ha menet közben alakitom át akkor meg minden ciklus az elsö számjegyen kivül hozzáadodik az elözöhöz, holott csak egyszer kellene. Na ezen még gondolkodnom kell ( azt hittem egyszerübb lesz, az ASM-ben is egy kis szenvedés volt).
Talán külön nevet fogod adni a ezreseknek a százasoknak a tizeseknek meg az egyeseknek és a végén összeadom.
Na megyek vissza a géphez...
(#) djusee válasza djusee hozzászólására (») Feb 12, 2020 /
 
Így valahogy.
  1. #include <LiquidCrystal_I2C.h>
  2.  
  3. LiquidCrystal_I2C lcd(0x27,20,4);
  4.  
  5. const byte SZAMHOSSZ = 4;
  6.  
  7. byte pozicio = 0;
  8. byte szam[SZAMHOSSZ] = {4,7,9,2};
  9.  
  10. int egyesit(){
  11.   int osszeg = 0;
  12.   for(int a = SZAMHOSSZ - 1; a >= 0; a--){
  13.     osszeg += szam[a] * powint(10,(SZAMHOSSZ-1) - a);
  14.   }
  15.   return osszeg;
  16. }
  17.  
  18. //integer hatvanyozas
  19. long powint(int factor, unsigned int exponent)
  20. {
  21.    long product = 1;
  22.    while (exponent--)
  23.       product *= factor;
  24.    return product;
  25. }
  26.  
  27. void setup()
  28. {
  29.   lcd.init();
  30.   lcd.print(egyesit());
  31. }
  32.  
  33.  
  34. void loop()
  35. {
  36. }

Így szerintem egyszerübb késöbb változtatni ha pl 5 digitest szeretne vagy nagyobbat(persze a változó túlcsordulásra figyelni kell abban az esetben), a SZAMHOSSZ -t kell növelni, csökkenteni
(#) Massawa válasza Massawa hozzászólására (») Feb 12, 2020 /
 
A számolás már müködik, kivettem a ciklusbol. A cursor még nem ugy, ahogy kellene a karakter helye mellett villog vagy az van aláhuzva. Nem tudom miért.
(#) Massawa válasza djusee hozzászólására (») Feb 12, 2020 /
 
Én ugy csináltam hogy az egyes helyeket megjelöltem:

Ezresek: Turnt=count*1000;
Szazasok: Turnh=count*100;
Tizesek: Turnd=count*10;
Egyesek: Turnu=count;
A végleges szám: Turn=Turnt+Turnh+Turnd+Turnu;
Majd
Lcd.setCursor(0,1);
Lcd.print(Turn);
Ez igy most müködik. Csak még nem jelzi ki hol van a cursor.
(#) djusee válasza Massawa hozzászólására (») Feb 12, 2020 /
 
A kurzort minden kiírás után állítsd vissza a megfelelő pozícióba. 4 gombod van(fel, le, jobbra balra)? Ha gondolod, megírom hogy én hogyan csinálnám. Legjobb mindent függvényekbe szétszedni akkor átláthatóbb marad a kód és az lcd-re írást csak akkor végezni el ha változás történt egyébként a sokszori kiírás végett lehet hogy nem látszódik a kurzor.
(#) djusee válasza djusee hozzászólására (») Feb 12, 2020 /
 
pl.
  1. #include <Wire.h>
  2. #include <LiquidCrystal_I2C.h>
  3.  
  4. LiquidCrystal_I2C lcd(0x27,20,4);
  5.  
  6. ////////konstansok/////////
  7. const byte SZAMHOSSZ = 5;
  8. const byte FEL = 2;
  9. const byte LE = 3;
  10. const byte JOBB = 4;
  11. const byte BAL = 5;
  12.  
  13. ////////valtozok///////////
  14. byte pozicio = 0;
  15. byte szam[SZAMHOSSZ];
  16. boolean valtozas = true; // flag valtozo a kijelzeshez
  17. ////////////////fuggvenyek//////////////////////
  18. int egyesit(){
  19.   int osszeg = 0;
  20.   for(int a = SZAMHOSSZ - 1; a >= 0; a--){
  21.     osszeg += szam[a] * powint(10,(SZAMHOSSZ-1) - a);
  22.   }
  23.   return osszeg;
  24. }
  25.  
  26. //integer hatvanyozas
  27. long powint(int factor, unsigned int exponent)
  28. {
  29.    long product = 1;
  30.    while (exponent--)
  31.       product *= factor;
  32.    return product;
  33. }
  34.  
  35. //lcd iras
  36. void lcdir(){
  37.   if(valtozas){
  38.     valtozas = false;
  39.     lcd.setCursor(pozicio,0);
  40.     lcd.print(szam[pozicio]);
  41.     lcd.setCursor(pozicio,0);
  42.   }//end if valtozas
  43. }
  44.  
  45. //gomb kezeles
  46. void gombOlvas(){
  47.     if(!digitalRead(JOBB)){
  48.     if(pozicio < SZAMHOSSZ-1){
  49.       valtozas = true;// tortenjen kijelzes
  50.       pozicio ++;
  51.       delay(500);//pfujj csunya delay
  52.     }//end if max
  53.   }//end if jobb lenyomva
  54.  
  55.     if(!digitalRead(BAL)){
  56.     if(pozicio > 0){
  57.       valtozas = true;// tortenjen kijelzes
  58.       pozicio --;
  59.       delay(500);//pfujj csunya delay
  60.     }//end if min
  61.   }//end if bal lenyomva
  62.  
  63.     if(!digitalRead(FEL)){
  64.     if(szam[pozicio] < 9){
  65.       valtozas = true;// tortenjen kijelzes
  66.       szam[pozicio] ++;
  67.       delay(500);//pfujj csunya delay
  68.     }//end if max
  69.   }//end if fel lenyomva
  70.  
  71.       if(!digitalRead(LE)){
  72.     if(szam[pozicio] > 0){
  73.       valtozas = true;// tortenjen kijelzes
  74.       szam[pozicio] --;
  75.       delay(500);//pfujj csunya delay
  76.     }//end if min
  77.   }//end if le lenyomva
  78. }
  79. //////////////setup/loop/////////////
  80. void setup()
  81. {
  82.   pinMode(FEL, INPUT_PULLUP);
  83.   pinMode(LE, INPUT_PULLUP);
  84.   pinMode(JOBB, INPUT_PULLUP);
  85.   pinMode(BAL, INPUT_PULLUP);
  86.   lcd.init();
  87.   //az alap 0 kiirasa
  88.   for(byte a = 0; a < SZAMHOSSZ; a++){
  89.     szam[a] = 0;// én balga, ezt kifelejtettem
  90.     lcd.print(0);    
  91.   }
  92.   lcd.setCursor(pozicio,0);
  93.   lcd.blink();
  94. }
  95.  
  96.  
  97. void loop()
  98. {
  99.   gombOlvas();
  100.   lcdir();
  101. }
A hozzászólás módosítva: Feb 12, 2020
(#) Massawa válasza djusee hozzászólására (») Feb 12, 2020 /
 
Kösz már kezdek belejönni, mint kiskutya az ugatásba. Már minden adatot be tudok vinni és meg is jeleniteni immár szám formájában a displayen.
Már csak a kijelzés ( villogás) a gond. Azt még nem tudom oda vinni ahova a számot kellene beirni. Mindig eggyel mellette villog. Na ezen még elgondolkodok. A helyeket egy arrayjel kezelem igy most már az adatbevitel tökéletesen megy. Most még egy kicsit meg kell fésülni a kodot, hogy jol nézzen ki.
Azután majd folytatom, de még kell épiteni egy szenzort a fordulatszám kezelésére. Ahogy a képen látod 5 gombom van. Balra Fel Jobbra Enter és Start/Stop ( LE nincs, azaz csak felfelé számolom a gombnyomást.
Nagyon szépen köszönöm, hogy foglalkozol velem!

IMG_4442.JPG
    
(#) djusee válasza djusee hozzászólására (») Feb 12, 2020 /
 
Persze a delayt ki lehet hagyni, csak a prell végett tettem bele, és a végén amikor egy entert nyomsz akkor az egyesit() függvénnyel létrehozol egy integer számot amit arra használsz amire szeretnéd.
(#) djusee válasza djusee hozzászólására (») Feb 12, 2020 /
 
Módosítottam a hozzászólásomban lévő kódot(setup fügv. for ciklus alatt)mivel elfelejtettem értéket hozzárendelni a szám tömb elemeihez ami esetleges gondokat okozhat(kapkodás)
(#) djusee válasza Massawa hozzászólására (») Feb 12, 2020 /
 
Szivesen . Jól néz ki, tekercselögéphez lessz? Villogás az valószínü a gyors egymásutáni lcd-re írás végett történhet. Fontos hogy feleslegesen ne írd ugyanazokat az adatokat az lcd-re csak ha ténylegesen változott valamely érték.Ezt én egy flag változóval oldom meg mint a fenti kódomban
(#) Massawa válasza djusee hozzászólására (») Feb 12, 2020 /
 
Igen az lesz. Igy néz ki, csak még a kulisszát kell megcsinálni a menetek számolására.

Tekercselö
A hozzászólás módosítva: Feb 12, 2020
(#) benjami válasza djusee hozzászólására (») Feb 12, 2020 /
 
Én csináltam anno karakteres LCD drivert, ami 1-2 milliszekundumonként 1-1 karaktert ír ki a kijelzőre (időzítő megszakításból). Semmi villogás nem tapasztalható. A programban csak egy kijelző karakterszámával megegyező méretű karaktertömbbe (hívhatjuk frame buffernek is) kell írni a megjelenítendő tartalmat, a háttérben teljesen független módon folyamatosan megy a kijelző tartalmának a frissítése. Villogó karaktereket is meg tud jeleníteni. Sajnos arduino változatot nem csináltam, csak natív atmega C és PIC változat készült belőle.
(#) Massawa válasza benjami hozzászólására (») Feb 12, 2020 /
 
Nekem nem a villogással van baj, hanem azzal, hogy a két gombbal jobbra balra lépkedek és azt kellene kijelezni ( ahogy azt megcsináltam ASM-ben). Az Arduinoban meg mindig eggyel mellette villog azaz nem ott ahol változtatom a karaktert hanem mellette. Sajnos sem az lcd.blink_on()-nak sem az lcd.blink()-nak, sem az lcd.cursor()-nak nincs paramétere (legalábbis nem fogad el semmit), azaz nem tudom beirni, hogy villogjon pl a 8,1 kocka.
Na de pillanatnyilag mindegy, majd lehet, hogy még valami eszembe jut.
Amugy szépen müködik.
Most azon filozok ( a tárcsagyártás szünetében egy kávé mellett, hogy hogyan zárjam le a display kezelését, mert most a gombokkal a szálvezetö motort kell a kezdö menetre mozgatni. Valoszinü ehhez valami statemachine-t fogok bevezetni.
Annak 3 fejezete lesz:
1. display
2. a kezdet beállitása
3. A tekercselés.
De azt majd késöbb, addig utánna kell nézni egy korábbi programban azt hogyan csináltam....
A hozzászólás módosítva: Feb 12, 2020
Következő: »»   589 / 852
Bejelentkezés

Belépés

Hirdetés
XDT.hu
Az oldalon sütiket használunk a helyes működéshez. Bővebb információt az adatvédelmi szabályzatban olvashatsz. Megértettem