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   485 / 839
(#) vyky válasza KoblogPerGyok hozzászólására (») Okt 30, 2018 /
 
Igen van még egy két funkció amit bele kell venni. Ezeket én is most gondolom át
(#) sargarigo válasza vyky hozzászólására (») Okt 30, 2018 / 1
 
Nos, átdolgoztam a kódodat, itt mellékelem. A "C" kódja az "A" és "B" alapján készült, de szerintem azok sem működnek jól, majd kipróbálod. Ami az elakadásodat illeti, arra a válasz az, hogy elszámolunk 38-ig, megcsináljuk amit kell, aztán számolunk tovább 18-ig, és csak utána nullázuk.

Nem kell variálni a const int és társaival. Ha valami konstans és nem változik, akkor mehet #define sorba. Lehetőleg kerüld az egy betűs változóneveket, mert semmit mondóak. Továbbá kerülendő az angol és magyar elnevezések vegyes használata. Célszerű úgy struktúrálni a kódot, hogy ami ismétlődik az mehet külön eljárásba (függvény aminek nincs visszatérési értéke).
Na elég a fejtágításból, jöjjön a kód:


  1. #include <LiquidCrystal.h>
  2.  
  3. LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
  4. #define encoderA A2   //enkoder 1
  5. #define encoderB A3   //enkoder 2
  6. #define kapcsoloA 6   //1,5-1,5méter kiosztás
  7. #define kapcsoloB 7   //2-2 méter kiosztás
  8. #define kapcsoloC 8   //2-4 méter kiosztás
  9. #define led 10        // pisztolyszelep
  10.  
  11. #define pi 3.14
  12. #define radius 7      //kerék átmérő
  13. #define N 22          //encodr osztása
  14.  
  15. int Pos = 0;
  16.  
  17. int State;  // encoder állapotát tárolja
  18. int LastState;
  19. byte V = 1;
  20. float distance = 0;
  21.  
  22. void setup()
  23. {
  24.   pinMode(kapcsoloA, INPUT_PULLUP); // bemenet, felhúzó ellenállással
  25.   pinMode(kapcsoloB, INPUT_PULLUP);
  26.   pinMode(kapcsoloC, INPUT_PULLUP);
  27.  
  28.   pinMode (led, OUTPUT);  // kimenet
  29.   pinMode (encoderA, INPUT);  // bemenet felhúzó ellenállás nélkül
  30.   pinMode (encoderB, INPUT);
  31.  
  32.   digitalWrite(led, LOW); // led kikapcsolva
  33.  
  34.   // Reads the initial state of the outputA
  35.   LastState = digitalRead(encoderA);  // necoder állapotát elmentjük
  36.  
  37.   lcd.begin(16, 2); // Két soros 16 karakteres lcd
  38.   lcd.print("Festőgép");
  39. }
  40.  
  41.  
  42. void loop()
  43. {
  44.   State = digitalRead(encoderA);
  45.   if (State != LastState)
  46.   {
  47.     if (digitalRead(encoderB) != State)
  48.       Pos ++;
  49.     else
  50.       Pos --;
  51.  
  52.     LastState = State;
  53.   }
  54.  
  55.   if (digitalRead(kapcsoloA) == LOW) {
  56.     uzemmodA();
  57.   }
  58.  
  59.   if (digitalRead(kapcsoloB) == LOW) {
  60.     uzemmodB();
  61.   }
  62.  
  63.   if (digitalRead (kapcsoloC) == LOW) {
  64.     uzemmodC();
  65.   }
  66. }
  67.  
  68. void kiir()
  69. {
  70.   distance = Pos + (2 * pi * radius) / N;
  71.   lcd.setCursor(0, 1);
  72.   lcd.print("ertek");
  73.   lcd.println(distance);
  74.   lcd.println("cm");
  75.   lcd.setCursor(0, 0);
  76.  
  77. }
  78.  
  79. void uzemmodA()
  80. {
  81.   kiir();
  82.   lcd.print("1.5-1.5 meter");
  83.   if (Pos == 8)
  84.   {
  85.     V ^= 1;
  86.     digitalWrite (led, V);
  87.     Pos = 0;
  88.     distance = (distance + 1 );
  89.     LastState = State;
  90.   }
  91. }
  92.  
  93. void uzemmodB()
  94. {
  95.   kiir();
  96.   lcd.print("2-2   meter  ");
  97.   if (Pos == 18)
  98.   {
  99.     V ^= 1;
  100.     digitalWrite (led, V);
  101.     Pos = 0;
  102.     distance = (distance + 1 );
  103.     LastState = State;
  104.   }
  105. }
  106.  
  107. void uzemmodC()
  108. {
  109.   kiir();
  110.   lcd.print("2-4   meter  ");
  111.   if (Pos == 38)  // első 38 lépés
  112.   {
  113.     digitalWrite(led, HIGH);
  114.   }
  115.  
  116.   if (Pos == 38 + 18) // következő 18 lépés
  117.   {
  118.     digitalWrite(led, LOW);
  119.     Pos = 0;
  120.     distance = (distance + 1 );
  121.     LastState = State;
  122.   }
  123. }
(#) vyky válasza sargarigo hozzászólására (») Okt 30, 2018 /
 
Szuper lett,köszönöm.
A fejtágítást nyugodtan adhatod,mert csak így tanulok
(#) sargarigo válasza vyky hozzászólására (») Okt 30, 2018 /
 
Remek!

Azt javaslom, hogy hasonlítsd össze a kódodat az enyémmel, és próbáld meg kitalálni a változtatások okait! Nem mondom hogy az enyém etalon, de kiindulásnak jó lesz. Teszteld, és mehet tovább a fejlesztés!
(#) tbarath válasza vyky hozzászólására (») Okt 30, 2018 / 2
 
Egy apró tanács, mindkettőtöknek.
Én a

  1. if (Pos == 8)

jellegű összehasonlításokat inkább fordítva szoktam felírni, így:

  1. if (8 == Pos)

Mert így ha elgépelem és egy egyenlőségjelet írok, akkor lesz szép syntax error az eredménye, meg is mutatja hogy hol hibás, és a javítás is triviális. Míg az első esetben simán lefordul, de a feltétel mindig true lesz, és bónuszként változó értékét is felülírod, és az ilyen dolgokat a legnehezebb kiszúrni. (Kollegákkal szokott olyan lenni, hogy "Gyere már ide légyszi és nézz rá, egy órája nézem és nem jövök rá, hogy mi a baj". Aztán aki odamegy szűz szemmel, az csak simán rámutat, mert az ő szemét meg kiszúrja, aki pedig elkövette az ilyen hibát az meg már keresi a hibát 1-2 órája. Az ilyen elütések tipikusan ilyen sz***tós hibák...)
A hozzászólás módosítva: Okt 30, 2018
(#) vargham válasza tbarath hozzászólására (») Okt 30, 2018 /
 
Plusz egy dolog: A kódba nem írunk olyat, hogy 8. Angolul magic constant a neve, és érdemes kerülni. Mert mi 8? Nem tudni. Kell adni neki valami beszédes nevet, ami segíti a programozót a kód olvasásában.
Például:
  1. #define UPPER_LIMIT 8u

vagy
  1. constexpr uint8_t cUpperLimit = 8u;

Ez utóbbi jobb is, mert típusa is van a konstansnak.
(#) tbarath válasza vargham hozzászólására (») Okt 30, 2018 /
 
Ez speciel nincs meg, és nem is nagyon értem.
(#) sargarigo hozzászólása Okt 30, 2018 /
 
Srácok! Az előző hozzászólásra nem is reagáltam mert végülis igaza van. Ez utóbbi is igaz. De most kezdőket próbálunk a megértés felé terelgetni. Nem az a fontos hogy tökéletes kódot írjon, hanem hogy értse meg hogy lesz a led kikapcsolva a 18 lépés után. Szvsz.
(#) tbarath válasza sargarigo hozzászólására (») Okt 30, 2018 /
 
Szerintem az _is_ a lényeg.
De ez itt nem egy specifikus, "segítsünk a kezdőknek" topic, hanem általános, pl. pár hónapja épp egy attiny pwm-freki állítgatást beszéltünk meg itt. Amit írtam szerintem nem a tökéletes kódról szól, hanem csak egy hasznos módszer, ami elsőre furcsának tűnik ugyan, de segít elkerülni egy szivatós hibát. Kezdők is használhatják, haladók is, már ha akarják, nehézség nincs benne.
(#) sargarigo válasza tbarath hozzászólására (») Okt 30, 2018 / 1
 
Valóban, de a "constexpr uint8_t cUpperLimit = 8u;" még téged is megfogott, és nekem is idegenül néz ki. Természetesen a segítő szándék az egyetlen ami számít, és köszönet jár érte vargham és számodra is.
Mindössze azt bátorkodtam jelezni, hogy vyky még a void használatával sincs tisztában, éppen most próbál porból és hamuból ismereteket gyűjteni, és festőgépet alkotni. Tiszteletre méltó a szándék és a lelkesedés. Jó dolog amikor valaki lépésről lépésre felfedezi ezt a világot! Nem kellene mindjárt a mélyvízzel összezavarni. Ettől még a közösség nem kezdő, nem akartam senkit sem megbántani a hozzászólásommal. Peace!
(#) tbarath válasza sargarigo hozzászólására (») Okt 30, 2018 /
 
Meg, nem követem az újabb C-* szintaxisokat, a Kernighan-Ritchie nagyjából elég volt eddig nekem, szóval shame on me, ez a constexpr valóban új nekem.
Abban viszontkétségkívül igaza van vargham fórumtársnak, hogy célszerű kerülni az ilyen "if (5 == myVariable){//something;}" típusú dolgokat a kódban, ezeket a konstansokat szép beszédes névvel ki kell tenni a kód elejére. Különösen igaz ez akkor, ha ugyanazt a konstanst több helyen is használunk, akkor sokkal nehezebb a módosítása.
Én se akartam senkit se megbántani, ezek csak javaslatok. Neked pedig kalapemelés jár azért a segítségért, amit itt a kezdőknek nyújtasz.
(#) vyky hozzászólása Okt 31, 2018 /
 
Szép reggelt. Mindenkinek köszönöm a segítséget. Igen sokat kell még tanulnom ezt,de érdekel,és teszem is.Sajnos az angol nem megy,így elég kevés az a forrás ami magyarul elmagyarázza mi,mit csinál.
Még van jó pár funkció amit bele kell írni,de azt megpróbálom magam megírni,persze jövök úgy is ,ha nem megy
Az hogy mit hogy kell,hogy illik,most tanulgatom.
(#) vargham válasza tbarath hozzászólására (») Okt 31, 2018 / 2
 
Idézet:
„ezeket a konstansokat szép beszédes névvel ki kell tenni a kód elejére”

Pontosan ez a lényeg.
A #define az pont úgy működik, mint a search/replace. Vagyis bután kicserél mindent a forráskódban a preprocessor, nem a fordító.
A típusos konstans használata azért jobb, mert ott már a fordító végez ellenőrzést, és már fordítási időben tudja jelezni, ha hülyeséget csinálsz.
Ugyanezért érdemes enum-ot használni felsorolásokhoz int helyett. A számítógépnek mindegy, de a programozónak nem.

  1. //Első példa
  2.  
  3. #define MODE_FIRST 1
  4. #define MODE_PROCESS 2
  5. #define MODE_LAST 3
  6.  
  7. void handleModes(int mode)
  8. {
  9.   switch (mode)
  10.   {
  11.     case MODE_FIRST:
  12.     //Itt csinálsz valamit.
  13.     break;
  14.     case MODE_PROCESS:
  15.     //Itt csinálsz valamit.
  16.     break;
  17.     case MODE_LAST:
  18.     //Itt csinálsz valamit.
  19.     break;
  20.     default:
  21.     //Ajánlott az üres defaultot is beírni, és kommentben jelezni, hogy direkt üres.
  22.     break;
  23.   }
  24.   //És még itt is csinálsz dolgokat.
  25. }

  1. //Második példa
  2.  
  3. enum class Mode
  4. {
  5.   cModeFirst, cModeProcess, cModeLast
  6. };
  7.  
  8. void handleModes(Mode const aMode)
  9. {
  10.   switch (aMode)
  11.   {
  12.     case cModeFirst:
  13.     //Itt csinálsz valamit.
  14.     break;
  15.     case cModeProcess:
  16.     //Itt csinálsz valamit.
  17.     break;
  18.     case cModeLast:
  19.     //Itt csinálsz valamit.
  20.     break;
  21.     default:
  22.     //Ajánlott az üres defaultot is beírni, és kommentben jelezni, hogy direkt üres.
  23.     break;
  24.   }
  25.   //És még itt is csinálsz dolgokat.
  26. }


Az első példában simán meghívhatod a függvényt -1, vagy akár 45327 paraméterrel is. Nem fog szólni a fordító, hogy ez hiba. Hiszen nem szintaktikai, hanem logikai hiba.
A második esetben viszont kizárólag a definiált enumokkal tudod meghívni. Tisztább, biztonságosabb, egyértelműbb. Ha hibázol, már fordítási időben kiderül.

Ugyanezért érdemes a paramétereket kis a betűvel kezdeni (argument), a konstansokat c betűvel, egy osztály tagváltozóját m betűvel. Így a kódban azonnal látszik, hogy egy-egy név milyen hatókörben látható.

Ezek természetesen C++ példák, mert az Arduino is C++ nyelvet használ. C-ben is lehet egyértelmű és biztonságos kódot írni, de C++ nyelven könnyebb.
A hozzászólás módosítva: Okt 31, 2018
(#) sany válasza sargarigo hozzászólására (») Okt 31, 2018 /
 
Azt megkérdezhetném, hogy a V ^= 1; sor mit csinál? Nem találkoztam még ilyen megoldassál.
A hozzászólás módosítva: Okt 31, 2018
(#) sargarigo válasza sany hozzászólására (») Okt 31, 2018 1 / 1
 
Invertálja V értékét. Ha 1 volt nulla lesz, és viszont. Másik megoldás hogy V = 1 - V;. Én inkább ezt szeretem.
A hozzászólás módosítva: Okt 31, 2018
(#) kissi válasza sany hozzászólására (») Okt 31, 2018 / 2
 
Szia!

Ez azt jelenti, mintha ezt írtad volna:
V = V ^ 1;, azaz kizáró vagy kapcsolat és a V között ( nézz utána, ha nem megy kapásból az XOR igazságtáblázata!) és ez azt eredményezi, hogy a 0.bit invertálódik !
(#) Kovidivi válasza sargarigo hozzászólására (») Okt 31, 2018 /
 
Ez teljesen más, mint amit leírtál. Csak akkor igaz, ha a változó értéke 0 vagy 1. Ha nem 1 és nem nulla, akkor már nem tud "invertálódni".
(#) vargham válasza Kovidivi hozzászólására (») Okt 31, 2018 /
 
Az a V nevű változó így nem jó. Azaz könnyű elrontani.
1. Miért nincs hosszabb neve?
2. Miért int? Miért nem bool? Hiszen igaz vagy hamis lehet csak.

A legszebb azonban az lenne, ha az Arduino nem csak félig lenne C++, és a HIGH meg LOW az nem #define lenne, hanem enum class operator overloadinggal, és akkor sokkal elegánsabb és olvashatóbb lehetne a kód...
(#) sargarigo válasza Kovidivi hozzászólására (») Okt 31, 2018 /
 
A kérdező beidézte a kódból, és a kódban tényleg ezt csinálja. Úgyhogy nem teljesen más, hanem jelen esetben tök ugyanaz.
A hozzászólás módosítva: Okt 31, 2018
(#) vyky válasza vargham hozzászólására (») Okt 31, 2018 /
 
Szia.Sajnos sok dologgal még nem vagyok tisztában ,ezt tudom,rajta vagyok,hogy minél előbb pótoljam a hiányosságomat. De pl nem tudom miért jobb a bool mint az unt,szóval ennek is utána nézek.
(#) vargham válasza vyky hozzászólására (») Okt 31, 2018 /
 
(#) vyky válasza vargham hozzászólására (») Okt 31, 2018 /
 
Köszönöm.
(#) atus1981 hozzászólása Okt 31, 2018 /
 
Sziasztok!
Olyan nyomásszabályozó eszközt keresek, amire arduinoval tudok értéket küldeni.
Valaki találkozott már ilyennel? 5 bar-ig elég lenne és tizedenként legyen állítható.
Köszi
(#) vyky válasza atus1981 hozzászólására (») Nov 1, 2018 /
 
Szia sajnos ilyenről ÉN ne hallottam gép,de mihez kell? mert pl van motoros szelep Link
Ezt tudod állítani, szabályozni.
(#) Bakman válasza vyky hozzászólására (») Nov 1, 2018 /
 
A motoros szelep nem nyomásszabályzó.
(#) zosza18 válasza atus1981 hozzászólására (») Nov 1, 2018 /
 
Szia!
A Festo-nak találkoztan és használtunk elektromos nyomásszabályzó szelepjét.
0-10Vdc-vel lehet szabályozni és változatos nyomáshatárokkal lehet kapni.
(#) atus1981 válasza zosza18 hozzászólására (») Nov 1, 2018 /
 
Hali!
Esetleg típust tudsz? Árban hol van?
(#) atus1981 válasza vyky hozzászólására (») Nov 1, 2018 /
 
Hali!
Olyan verzió is jó lehetne, hogy egy nyomásmérő és egy-egy töltő,-ürítő szelep. Csak ugye megbízható mérés és precíz szabályozás lenne a lényeg. Ehhez meg nem filléresek az alkatrészárak, sajnos.
(#) NZotya válasza atus1981 hozzászólására (») Nov 1, 2018 / 1
 
Üdv!
Talán ez segíthet: Github SEN0257 Pressure Sensor .
És itt még el is adják. Valamint ajánlanak hozzá szolenoid szelepet is.
Viszont a felbontása/pontossága nem egyértelmű.
(#) Bakman válasza NZotya hozzászólására (») Nov 1, 2018 / 1
 
0 - 1600 kPa -> 0,5 - 4,5 V
Következő: »»   485 / 839
Bejelentkezés

Belépés

Hirdetés
Lapoda.hu     XDT.hu     HEStore.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