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   170 / 863
(#) saua válasza erdeidominik1999 hozzászólására (») Dec 1, 2015 /
 
Ezt a kódot nem lehetne módosítani? Ha jól sejtem a működését, mikor az arduinó megkapja a "Led1" karaktersorozatot megváltoztatja a 6-os pin állapotát és ha HIGH akkor küldi a "Led1 bekapcsolva" stringet...csak azt kellene megoldani, hogy ha a gombbal változtatom meg a 6-os pin állapotát akkor is ugyanazt a stringet küldje. Ezt nem sikerül megoldani.
(#) icserny válasza saua hozzászólására (») Dec 2, 2015 /
 
Idézet:
„ha a gombbal változtatom meg a 6-os pin állapotát akkor is ugyanazt a stringet küldje.”
A webserver a gombnyomásra nem küldhet semmit, hanem csak akkor küldhet, amikor lekérdezés történik. Ezért kell vagy automatikus frissítés, vagy Ajax, hogy a böngésző periodikusan lekérdezze az állapotot.
(#) saua válasza icserny hozzászólására (») Dec 2, 2015 /
 
Köszönöm a segítséget, beszúrtam a 63. sor után a client.println("Refresh: 1"); sort. De most meg az a gond, hogy 1 mádodpercenként kapcsolgatja a LED -et.
A hozzászólás módosítva: Dec 2, 2015
(#) icserny válasza saua hozzászólására (») Dec 2, 2015 /
 
Idézet:
„Eredetileg egy LED-et lehet ki/be kapcsolni neten keresztül a ”Led1” utasítással.”
Ez a ki/bekapcsolási mód nem volt jó ötlet. Inkább válaszd külön a bekapcsoló és a kikapcsoló parancsot!
(#) pisti hozzászólása Dec 2, 2015 /
 
Sziasztok!
Az Arduino Uno-val ismerkedem és sok-sok oldalt néztem és feltűnt, hogy a digitális kimeneteknek az 0, 1, 2 pontjait nem használják. Mi ennek a magyarázata?
(#) csabeszq válasza pisti hozzászólására (») Dec 2, 2015 /
 
A 0 és 1 pineket valóban nem illik használni, mert azok az UART RX/TX lábai. Ha rákötsz az RX-et 1-be rakod, utána már nem programozhatod a chipet. A TX-nél pontosan ugyanez a helyzet, tönkre vágod a számítógép felé menő kommunikációt.

A 0, 1 lábakat akkor használd, ha tisztában vagy vele, hogy mi az UART és a mellékhatásaival.

Hogy a 2-es láb miért nem szimpatikus nekik, nem tudom.
(#) pisti hozzászólása Dec 3, 2015 /
 
Köszönöm a 0 éa az 1-es lábakra adott választ.
A 3×4-es billentyűzetről bevitt számot akarom megjeleníteni egy hétszegmenses kijelzőn. Külön-külön minden működik. Billentyűről beolvasott érték megjelenik a serialmonitoron, egy változót léptetve 0-tól 9-ig pedig működteti a kijelzőt. A kettő összefűzése nem hozza az eredményt. Hogyan tudnám a Serial.println(key); változó értékét az if szerkezetbe kezelni?
Köszönöm!
(#) pisti hozzászólása Dec 3, 2015 / 1
 
Kész működik.

A 3x4 es mátriról bevitt érték megjelenik a hétszegmenses kijelzőn.
  1. #include <Keypad.h>
  2. int BE;
  3. const int A=2;
  4. const int B=3;
  5. const int C=4;
  6. const int D=5;
  7. const byte ROWS = 4; //four rows
  8. const byte COLS = 3; //three columns
  9. char key;
  10. char keys[ROWS][COLS] = {
  11.   {'1','2','3'},
  12.   {'4','5','6'},
  13.   {'7','8','9'},
  14.   {'*','0','#'}
  15. };
  16. byte rowPins[ROWS] = {9, 8, 7, 6}; //connect to the row pinouts of the keypad
  17. byte colPins[COLS] = {12, 11, 10}; //connect to the column pinouts of the keypad
  18.  
  19. Keypad keypad = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS );
  20.  
  21. void setup() {
  22.   pinMode(A, OUTPUT);
  23.   pinMode(B, OUTPUT);
  24.   pinMode(C, OUTPUT);
  25.   pinMode(D, OUTPUT);
  26.   Serial.begin(9600);
  27.   }
  28.  
  29. void loop() {
  30.   key = keypad.getKey();
  31.   if (key != NO_KEY){
  32.     Serial.println(key);
  33.     BE=key;
  34.     BE=BE-48;    // ahhoz hogy jó működjön kell a -48 miért miért
  35.     to_BCD();
  36.     }  
  37. }
  38.  
  39. void to_BCD()
  40. {
  41.     if (BE == 0 ) //write 0000
  42.     {
  43.       digitalWrite(A, LOW);
  44.       digitalWrite(B, LOW);
  45.       digitalWrite(C, LOW);
  46.       digitalWrite(D, LOW);
  47.     }
  48.      
  49.     if (BE == 1 ) //write 0001
  50.     {
  51.       digitalWrite(A, HIGH);
  52.       digitalWrite(B, LOW);
  53.       digitalWrite(C, LOW);
  54.       digitalWrite(D, LOW);
  55.     }
  56.      
  57.     if (BE == 2 ) //write 0010
  58.     {
  59.       digitalWrite(A, LOW);
  60.       digitalWrite(B, HIGH);
  61.       digitalWrite(C, LOW);
  62.       digitalWrite(D, LOW);
  63.     }
  64.      
  65.     if (BE == 3 ) //write 0011
  66.     {
  67.       digitalWrite(A, HIGH);
  68.       digitalWrite(B, HIGH);
  69.       digitalWrite(C, LOW);
  70.       digitalWrite(D, LOW);
  71.     }
  72.      
  73.     if (BE == 4 ) //write 0100
  74.     {
  75.       digitalWrite(A, LOW);
  76.       digitalWrite(B, LOW);
  77.       digitalWrite(C, HIGH);
  78.       digitalWrite(D, LOW);
  79.     }
  80.      
  81.     if (BE == 5 ) //write 0101
  82.     {
  83.       digitalWrite(A, HIGH);
  84.       digitalWrite(B, LOW);
  85.       digitalWrite(C, HIGH);
  86.       digitalWrite(D, LOW);
  87.     }
  88.      
  89.     if (BE == 6 ) //write 0110
  90.     {
  91.       digitalWrite(A, LOW);
  92.       digitalWrite(B, HIGH);
  93.       digitalWrite(C, HIGH);
  94.       digitalWrite(D, LOW);
  95.     }
  96.      
  97.     if (BE ==7 ) //write 0111
  98.     {
  99.       digitalWrite(A, HIGH);
  100.       digitalWrite(B, HIGH);
  101.       digitalWrite(C, HIGH);
  102.       digitalWrite(D, LOW);
  103.     }
  104.      
  105.     if (BE == 8 ) //write 1000
  106.     {
  107.       digitalWrite(A, LOW);
  108.       digitalWrite(B, LOW);
  109.       digitalWrite(C, LOW);
  110.       digitalWrite(D, HIGH);
  111.     }
  112.      
  113.     if (BE == 9 ) //write 1001
  114.     {
  115.       digitalWrite(A, HIGH);
  116.       digitalWrite(B, LOW);
  117.       digitalWrite(C, LOW);
  118.       digitalWrite(D, HIGH);
  119.     }
  120. }
A hozzászólás módosítva: Dec 3, 2015
(#) erdeidominik1999 hozzászólása Dec 3, 2015 /
 
Sziasztok! Azt hogyan tudnám megcsinálni, hogy SD.begin()-nél amíg tölti, addig pontokat írassak lcd-re, mert ha nem tudja betölteni, akkor amennyi a timeout-ja, addig próbálkozik, és addig nem tudok semmi műveletet végezni. Mert ntp-mnél ott egyszerő volt, mert ott az volt, ugye, amíg vár a válaszra, hogy
  1. while(millis()-valami<1500){}
és ott csak a while-be kelett raknom. Előre is köszi!
(#) Qju válasza pisti hozzászólására (») Dec 3, 2015 /
 
Gratulálok! Megy az látod.

"// ahhoz hogy jó működjön kell a -48 miért miért"

Ascii Table - ASCII character codes

A "0" az a 48. karakter a 4 bites BCD kódod esetén pedig a 0 az "0000" az 1 az"0001"
A hozzászólás módosítva: Dec 3, 2015
(#) siletto hozzászólása Dec 4, 2015 /
 
Üdv!
Valaki használt már nRF24L01+ adóvevő modult.
Van itthon pár éve kettő, egyszer összeraktam az alap progival, de nem játszottam tovább vele.
Most szeretném használni, de elvesztem a beállításaiban, nekem túl sokat tud. Csak simán számokat és stringeket szeretnék oda-vissza üldözgetni rajta, de már beállítani se sikeról a sok payload hossz, meg címzés, meg csatorna meg mindenféle miatt.

Van erre valami érthető módszer? Sok helyen írják a könyvtárak készítői, hogy azért írták meg, mert a többi bonyolult volt, mégse egyszerűbb az övék se
(#) ALI hozzászólása Dec 5, 2015 /
 
Sziasztok.
Egy kis segítséget kérnék.
Olyat szeretnék csinálni,hogy írok több különböző programot és egy gomba választom ki melyik fusson.
Pl: 1 gomb 1-es program,2 gomb 2-es program.
Nem tudom hogy lehet szét választani a programokat, hogy ne keveredjek bele nagyon.
(#) siletto válasza ALI hozzászólására (») Dec 5, 2015 2 /
 
Úgy, hogy csatolsz egy Interrupt függvényt mindegyik gombra.
Az interruptba egy WHILE ciklust ami a végtelenségbe ismétlődik, és ezen belül írod meg a programod.
Annyi, hogy amíg benne vagy egy interrupt függvényben, nem tudom hogy a többi gombot érzékeli-e. De ha igen, nyert ügyed van, mert csak lenyomsz egy másik gombot, és indul a másik progi a végtelenbe, és így tovább
(#) csatti2 válasza ALI hozzászólására (») Dec 5, 2015 /
 
Tedd külön cpp és h fájlokba a különböző "programjaid" (pl. prog1.cpp és prog1.h, prog2.cpp és prog2.h). Hivatkozz a h fájlokra a főprogramban (#include). A loop-ban pedig case/select -el hívd meg a kívánt programot (függvény). Így minden "program" külön fájlban van, nem keverednek össze a dolgok.
A h (header) fájlok tartalmazzák a függvények és kívülről is elérhető változók/struktúrák stb. deklarációját. A cpp fájl pedig a már általad megszokott programot. Nézz példákat a neten.
(#) ALI válasza csatti2 hozzászólására (») Dec 5, 2015 /
 
Úgy nem lehet meg csinálni?
Hogy Pl: void program1, void program2 ............
És a gombokkal meg hívom valamelyiket.
(#) csatti2 válasza ALI hozzászólására (») Dec 5, 2015 /
 
Eddig nem használtál külön függvényeket...?
Persze, hogy meg lehet. Amit én írtam, ott is külön függvények lennének, csak ráadásul feladattól függően más és más fájlban (beleértve a szükséges változókat és segédfüggvényeket is).
(#) ALI válasza csatti2 hozzászólására (») Dec 5, 2015 /
 
Eddig még nem használtam még elég kezdő vagyok.
(#) siletto válasza ALI hozzászólására (») Dec 5, 2015 1 /
 
Nem.
Ehhez alapjaiban kell elkezdeni és megérteni, hogy működik a számítógép programozás.
A műveletek sorosan hajtódnak végre mindenképp, a programozó csak azzal tud operálni, hogy ezeket a sorokat próbálja látszólag párhuzamossá alakítani.Erre van a void loop(){}.
A mikrokontroller ezt a ciklust nézi végig, és aszerint sorban végrehajtja az utasításokat.
Amit a fentebbi hozzászólások is javasolnak, azok szerintem mind jók arra, amit te akarsz, és pont azt csinálják, amit le is írtál.

Olyat egyszerűen nem lehet, hogy programot választasz, csak annyit, hogy úgy trükközöl, hogy az egyetlen soros lefutású programod úgy látszódjon, mintha több kisebb lenne.

Nem igazán vagyok szakértő, lehet most hülyeséget írok, de ha tényleg ilyet szeretnél, ahhoz külön végrehajtó egységek kellenek, vagy hasonló
Pl. egy "vezér" arduino, amin egy gombnyomás érzékelő fut, és a gombnyomás alapján áramot ad egy második,harmadik,negyedik alárendelt arduinonak.


Megoldható tudtommal programozható logikai áramkörökkel is, FPGA-val mondjuk, de azért a logikai kapuk építgetése és a parancs kiadás között van néhány nagyságrend nehézség.
A hozzászólás módosítva: Dec 5, 2015
(#) ALI válasza siletto hozzászólására (») Dec 5, 2015 /
 
Igazából meg tudom úgy írni a programot, hogy melyik gomb lenyomásakor mit csináljon csak az átláthatóság végett szét akarom választani a program részeket több kisebb programra.
(#) andykaaa válasza ALI hozzászólására (») Dec 5, 2015 / 1
 
Szerintem ha eltarolod ket darab boolean -ba a gombok lenyomasanak ertekeit (ugy hogy az eggyik nullazza le a masikat) es utana a különböző ket progi reszletet aszerint futtatod hogy melyik boolean valtozo igaz vagy hamis, mar kell is hogy mukodjon. Kozbe minden lefutas előtt lekerdezi a nyomogomb erteket is. Csupa if fugvennyel is megoldhato.
A hozzászólás módosítva: Dec 5, 2015
(#) ALI hozzászólása Dec 6, 2015 /
 
Pont ezt a sok if függvényt akarom elkerülni vele.
(#) kissi válasza ALI hozzászólására (») Dec 6, 2015 /
 
Akkor használj switch-case szerkezetet !
(#) andykaaa válasza ALI hozzászólására (») Dec 6, 2015 /
 
Nem is kell sok. Csak negyszer kell lird hogy "if" , ha jol szamolom.
Ha ez sok, akkor ....
A hozzászólás módosítva: Dec 6, 2015
(#) andykaaa hozzászólása Dec 6, 2015 /
 
  1. #define button1 3
  2. #define button2 4
  3. boolean progi_1 = 0;
  4. boolean progi_2 = 0;
  5.  
  6. void setup() {
  7.   pinMode(button1, INPUT);
  8.     digitalWrite(button1, LOW);
  9.   pinMode(button2, INPUT);
  10.     digitalWrite(button2, LOW);    }
  11.  
  12. void loop() {
  13.       if(button1 == 1) { progi_1 = 1; progi_2 = 0; }
  14.  else if(button1 == 2) { progi_1 = 0; progi_2 = 1; } else { }
  15.  
  16.       if(progi_1 = 1) { /* progi 1 */ }
  17.  else if(progi_2 = 1) { /* progi 2 */ } else { }            }

Szerintem igy nezne ki az alap vezerles. A nyomogombokat kell meg biztositani, prell mentesiteni.
Hol van itt a sok fuggveny ?
A hozzászólás módosítva: Dec 6, 2015
(#) szili83 hozzászólása Dec 6, 2015 /
 
Vettem egy 4 soros LCD-t, I2C buszosat.
A régi kijelzőnél minden OK volt, a setup részben kiírt szöveg mindig ott maradt. I2C-nél pedig csak a hőmérséklet mérés megy....
Ennek mi az oka? Illetve mit tehetek ellene? Úgy veszem észre, a régi adatok kiírása nem megy, mintha mindig az írná ki, ami az utolsó frissítéskor van. tehát ha frissít, és nincsenek benne a régi adatok, akkor törli.

  1. #include <Wire.h>
  2. #include <LiquidCrystal_I2C.h>
  3. #include <Sensirion.h>
  4. LiquidCrystal_I2C lcd(0x27,20,4); // set the LCD address to 0x27 for a 16 chars and 2 line display
  5.  
  6. boolean ledstate = true; //LED állapot figyelése
  7. float temperature;
  8. float humidity;
  9. float dewpoint;
  10. Sensirion tempSensor = Sensirion(dataPin, clockPin);
  11. int seconds = 5; //start seconds
  12. int minutes = 0; //start min
  13.  
  14.  
  15. void setup() {
  16. lcd.init(); // initialize the lcd
  17. lcd.backlight();
  18. lcd.setCursor(0, 0); //
  19. lcd.print("Gomb:"); //
  20. lcd.setCursor(6, 0); //
  21. lcd.print("KI"); // alapértelmezettként ki van kapcsolva
  22. pinMode(NYOMOGOMB, INPUT); //PIN6 nyomogomb bemenet
  23. pinMode(LED, OUTPUT); //PIN13 LED meghajtás
  24. digitalWrite((LED), LOW); //LED kikapcsolva alapértelmezettként
  25. }
  26.  
  27.  
  28. void loop()
  29. {
  30. if ((digitalRead(LED) == LOW) && (digitalRead(NYOMOGOMB) == LOW) && (ledstate))
  31. {
  32. lcd.init();
  33. ledstate = false;
  34. delay(50); // prell elkerülése
  35. digitalWrite((LED), HIGH);
  36. lcd.setCursor(6, 0); //
  37. lcd.print("BE"); // Bekapcsolás kiírás
  38. }
  39. if ((digitalRead(LED) == HIGH) && (digitalRead(NYOMOGOMB) == LOW) && (ledstate))
  40. {
  41. lcd.init();
  42. ledstate = false;
  43. delay(50);
  44. digitalWrite((LED), LOW);
  45. lcd.setCursor(6, 0);
  46. lcd.print("KI");
  47. }
  48. if ((digitalRead(NYOMOGOMB) == HIGH) && (!ledstate))
  49. {
  50. ledstate = true;
  51. }
  52.  
  53.  
  54. if (digitalRead(LED) == HIGH)
  55. {
  56. tempSensor.measure(&temperature, &humidity, &dewpoint);
  57. lcd.init();
  58. lcd.setCursor(0, 1);
  59. lcd.print("T:");
  60. lcd.setCursor(2, 1);
  61. lcd.print(temperature);
  62. lcd.setCursor(6, 1);
  63. lcd.print("C H:");
  64. lcd.setCursor(11, 1);
  65. lcd.print(humidity);
  66. lcd.setCursor(15, 1);
  67. lcd.print("%");
  68. delay(500);
  69. }
  70. if (digitalRead(LED) == LOW)
  71. {
  72. lcd.init();
  73. lcd.setCursor(0, 1);
  74. lcd.print(" ");
  75. }
  76. }
(#) andykaaa válasza andykaaa hozzászólására (») Dec 6, 2015 /
 
A 14-edik sor hibas, ez kell oda
„ else if(button2 == 1) { progi_1 = 0; progi_2 = 1; } else { } ”
(#) kapu48 válasza szili83 hozzászólására (») Dec 6, 2015 / 1
 
Az "lcd.init(); // initialize the lcd" csak egyszer kel a Setupban!

A loop-ban már nem kel ujra initializálni!

Oda lcd.clear leht alkalmazni.
(#) csatti2 válasza andykaaa hozzászólására (») Dec 6, 2015 /
 
Ne bonyolítsuk felesleges változókkal. Ha 8 feladat van, akkor 8 boolean-t használsz és félmillió sor kódot, hogy állítgasd?
  1. #define B1 3
  2. #define B2 4
  3.  
  4. void(*task)();
  5.  
  6. void empty() {
  7.   // semmi, még nincs feladat kiválasztva
  8. }
  9.  
  10. void task1() {
  11.   // feladat 1
  12. }
  13.  
  14. void task2() {
  15.   // feladat 2
  16. }
  17.  
  18. void setup() {
  19.   task = empty;
  20.   pinMode(B1, INPUT);
  21.   pinMode(B2, INPUT);
  22. }
  23.  
  24. void loop() {
  25.   // a gomb figyelést én mondjuk PCINT megszakítás mögé tenném...
  26.   if (digitalRead(B1) == HIGH) task = task1;
  27.   if (digitalRead(B2) == HIGH) task = task2;
  28.   task();
  29. }
(#) erdeidominik1999 hozzászólása Dec 6, 2015 /
 
Sziasztok! Eddig ha lcd menüt csináltam, ezt a kódot használtam mindig:
  1. selectMenu(currentMenuItem); //választ gomb
  2.  
  3. currentMenuItem--;displayMenu(currentMenuItem); //fel gomb
  4.  
  5. currentMenuItem++;displayMenu(currentMenuItem); //le gomb
  6.  
  7. void displayMenu(int x){
  8.      switch (x) {
  9.       case 1:
  10.  
  11.         lcd.setCursor(0,0);
  12.         lcd.print ("->Id\007 be\002llit\002s ");
  13.         lcd.setCursor(0,1);
  14.         lcd.print ("  Z\003na iktat\002s  ");
  15.         break;
  16.       case 2:
  17.  
  18.         lcd.setCursor(0,0);
  19.         lcd.print ("  Id\007 be\002llit\002s");
  20.         lcd.setCursor(0,1);
  21.         lcd.print ("->Z\003na iktat\002s  ");
  22.         break;
  23.        case 3:
  24.  
  25.         lcd.setCursor(0,0);
  26.         lcd.print ("  Z\003na iktat\002s  ");
  27.         lcd.setCursor(0,1);
  28.         lcd.print ("->Szir\001n\002z\002s id\007");
  29.         break;
  30.      }
  31.  
  32. void selectMenu(int x) {
  33.    switch (x) {
  34.       case 1:
  35.         menu1=true;
  36.         lcd.clear();
  37.         break;
  38.        
  39.       case 2:
  40.         menu2=true;
  41.         lcd.clear();
  42.         break;
  43.        
  44.       case 3:
  45.         menu3=true;
  46.         lcd.clear();
  47.         break;
  48.  
  49. }


Viszont ezzel ugye az a gond, hogy ha nem fentről megyek lefelé, hanem lentről vissza, akkor rögtön ugrik a képernyő, és nem indul el előszőr az aktuális listán felfelé (2004-es nél már nagyon nem jól néz ki). Nincs véletlenül valakinek valami jó ötlete menüre? Előre is köszi!
A hozzászólás módosítva: Dec 6, 2015
(#) andykaaa válasza csatti2 hozzászólására (») Dec 6, 2015 /
 
Meg jobb megoldas, egyszerubb , de valahogy a nyomogombokkal azert nem vagyok kibekulve. Allando HIGH allast lesnek azok, vagy mukodik csak egyszeri megnyomasra ???
Na es ha tobb progid van mind ketto ? akkor kell tovabb a B3, B4, .. ?
A hozzászólás módosítva: Dec 6, 2015
Következő: »»   170 / 863
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