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   423 / 853
(#) Panhard válasza zoz11 hozzászólására (») Feb 2, 2018 /
 
  1. void setup(){
  2. pinMode(4,OUTPUT);
  3. pinMode(5,OUTPUT);
  4. }
  5.  
  6. void loop()
  7. {
  8. delay(500);
  9. digitalWrite(4,HIGH);
  10. delay(1000);
  11. digitalWrite(5,HIGH);
  12. delay(1200);
  13. digitalWrite(4,LOW);
  14. digitalWrite(5,LOW);
  15.  
  16.  while(1);
  17.  
  18. }
(#) vargham válasza zoz11 hozzászólására (») Feb 2, 2018 /
 
  1. void setup() {
  2. pinMode(4,OUTPUT);
  3. pinMode(5,OUTPUT);
  4.  
  5. delay(500);
  6. digitalWrite(4,HIGH);
  7. delay(1000);
  8. digitalWrite(5,HIGH);
  9. delay(1200);
  10. digitalWrite(4,LOW);
  11. digitalWrite(5,LOW);
  12. }
  13.  
  14. void loop()
  15. {
  16. }
(#) kapu48 válasza zoz11 hozzászólására (») Feb 2, 2018 /
 
A leg egyszerűbb 1 végtelen ciklusba belefutni, pl.:
  1. while (1)  {};
(#) kapu48 válasza wbt hozzászólására (») Feb 2, 2018 /
 
Nem vehető ki az írásodból, hogy melyik alkalmazásról van szó?
Ha a Blink.ino?
Akkor szerintem ezt kellene 3-ra állítani a 4. sorban:
  1. // How many leds in your strip?
  2. #define NUM_LEDS 1
(#) kapu48 válasza kapu48 hozzászólására (») Feb 2, 2018 /
 
És a tömbb feltöltésnél jöhet amit akartatok:
  1. void loop() {
  2.   // Turn the LED on, then pause
  3.   leds[0] = CRGB::Red;
  4.   leds[1] = CRGB::Red;
  5.   leds[2] = CRGB::Red;
  6.   FastLED.show();
  7.   delay(500);
  8.   // Now turn the LED off, then pause
  9.   leds[0] = CRGB::Black;
  10.   leds[1] = CRGB::Black;
  11.   leds[2] = CRGB::Black;
  12.   FastLED.show();
  13.   delay(500);
  14. }
A hozzászólás módosítva: Feb 2, 2018
(#) wbt válasza kapu48 hozzászólására (») Feb 2, 2018 /
 
A linken egy 10 csatornás spektrumanalizátor villogó van. Elméletileg komplett és működik. A cimbora viszont 10LED/ch helyett 30-at szeretne hajtani. Mivel kevés a RAM, így azt javasoltam (mivel a felbontás, ha 10 marad, nem baj), hogy a LED-ekre byte-ot kivivő rutint hívjuk meg háromszor (vagy másoljuk be még kétszer, Flash van elég). Csak ezt meg kellene találni ugye, ha valaki használja és ismeri a FastLED könyvtárat, valószínű hamarabb kitúrja, hol van ez. Persze én is dolgoztam addig, IDE 1.8.5 felrak, FastLED 3.1.8 letölt, fordít. Jönnek az üzenetek:
"C:\Program Files\Arduino\libraries\FastLED-3.1.8/FastLED.h:17:21: note: #pragma message: FastLED version 3.001.008 pragma message "FastLED version 3.001.008"
"warning: iteration 10 invokes undefined behavior [-Waggressive-loop-optimizations] for(unsigned char x = grenzen[i]; x < grenzen[i+1];x++){"
"containing loop for(unsigned char i = 0; i < 11; i++){"
No meg hogy elég kevés a memória. Most írtam neki, hogy nála egyáltalán működik-e a letöltött program, mert nálam nincs kimenő jel. Tehát ilyen a vak vezet világtalant dolog
(#) kapu48 válasza wbt hozzászólására (») Feb 2, 2018 /
 
A fentebb írtakon kívül.

Nem igazán értem az elképzeléseteket?
Mert ha van x10*y10-es mátrixotok!
Hogyan akartok rá kitenni x10*y30-as ábrát?
(#) zoz11 válasza kapu48 hozzászólására (») Feb 2, 2018 /
 
Nagyon szépen köszönöm. A setup részre nem is gondoltam, hogy oda írjam.
Esetleg egy olyan kérdésem, hogy ugyan ezt a példát hogyan lehet ugy megoldani, hogy ne delay legyen benne?
Szeretnék vele közbe egy kapcsolónak az állapotát is figyeltetni, és ha pl az a kapcsoló ad egy magas jelet, akkor kezdjen el világítani az összes led.
Az időzítés az 5perc, 10perc, 12perc, és ugye addig áll a program.
(#) wbt válasza kapu48 hozzászólására (») Feb 2, 2018 /
 
Úgy, hogy 30 LED hosszú szalagot tesz a 10-es helyére. Ennyi RGB adat tárolására már nincs elég hely, ezért neki jó az is, ha 3-LEDenként kapcsol (3 egymás utáni lesz az eredeti 1 pixel).
Na, erre gondoltam a favágó módszert, hogy amikor egy LED RGB értéke kimegy, akkor ugyan azzal (ugyan abból a tömbhelyről) még 2x kiviszem. Közben itt szenvedek, sajnos nincs kimeneti vezérlőjelem, pedig a Te által írt kisprogramon kívül csak a FastLED lib van bent. Szóval van itt baj épp elég.
(#) Kera_Will válasza zoz11 hozzászólására (») Feb 2, 2018 /
 
Akkor már oda a loopba is kell írni , feltétel vizsgálatokkal gomb állapotát figyelni.
Az már nem lesz ilyen egyszerű.
(#) vargham válasza zoz11 hozzászólására (») Feb 2, 2018 /
 
(#) tbarath válasza zoz11 hozzászólására (») Feb 2, 2018 /
 
1 változóval, amit hasonlítasz valamihez,
Itt a millis fv-t használom, ami milliszekundumot ad vissza, és a lenti egy 5 másodperces időzítés
  1. unsigned long t1;
  2. ...
  3. t1 = millis() +5000;
  4. while (millis < t1){
  5.   // addig nem futunk tovabb
  6.   // de a kapcsolot azert figyelhetjuk
  7.   if (HIGH == digitalRead(switchPin){
  8.   //bekapcsolom a ledeket
  9.   }
  10. }
A hozzászólás módosítva: Feb 2, 2018
(#) zoz11 válasza tbarath hozzászólására (») Feb 2, 2018 /
 
A csatolt programrészt, hogyan tudnám megoldani delay nélkül? Nem jövök rá egyszerűen. Folyamatosan köreb-körbe kellene neki menni.

  1. void setup(){
  2.     pinMode(4,OUTPUT);
  3.     pinMode(5,OUTPUT);
  4.     }
  5.      
  6.     void loop()
  7.     {
  8.     delay(500);
  9.     digitalWrite(4,HIGH);
  10.     delay(10000);
  11.     digitalWrite(4,LOW);
  12.     delay(5000);
  13.     digitalWrite(5,HIGH);
  14.     delay(8000);
  15.     digitalWrite(5,LOW);
  16.     }
.
(#) tbarath válasza zoz11 hozzászólására (») Feb 2, 2018 /
 
Úgy ahogy írtam.

  1. unsigned long t1;
  2.  
  3. ...
  4. void loop(){
  5.         t1 = millis() +500;
  6.         while (millis < t1){
  7.         }
  8.         digitalWrite(4,HIGH);
  9.         t1 = millis() +10000;
  10.         while (millis < t1){
  11.         }
  12.         digitalWrite(4,LOW);
  13. ...
  14. }
A hozzászólás módosítva: Feb 2, 2018
(#) kapu48 válasza zoz11 hozzászólására (») Feb 2, 2018 /
 
Szerintem, Inkább igy:
  1. // NoDelay.ino
  2. unsigned long t1[4];
  3.  
  4. void setup(){
  5.     pinMode(4,OUTPUT);
  6.     pinMode(5,OUTPUT);
  7.  
  8.     t1[0] = millis() +500;  // indul az első delay
  9.     t1[1] = 0;
  10.     t1[2] = 0;
  11.     t1[3] = 0;
  12.     }
  13.      
  14.     void loop()
  15.     {
  16.     //delay(500);
  17.     if(t1[0]> 0 && t1[0]< millis()){
  18.       digitalWrite(4,HIGH);
  19.      
  20.       t1[0] = 0;  // töröl az első delay
  21.       t1[1] = millis() +10000;  // indul a 2. delay
  22.     }  
  23.     //delay(10000);
  24.     if(t1[1]> 0 && t1[1]< millis()){
  25.       digitalWrite(4,LOW);
  26.      
  27.       t1[1] = 0;  // töröl az 2. delay
  28.       t1[2] = millis() +5000;  // indul a 3. delay
  29.     }    
  30.   // az elv megvan, innen folytasd te!
  31.     //delay(5000);
  32.     digitalWrite(5,HIGH);
  33.     //delay(8000);
  34.     digitalWrite(5,LOW);
  35.     }
(#) zoz11 válasza tbarath hozzászólására (») Feb 2, 2018 /
 
Próbálom, már minden féle formába, de nem hajlandó semmit se csinálni, már végig próbáltam vele minden variációt, ami eszembe jutott.
(#) zoz11 válasza kapu48 hozzászólására (») Feb 2, 2018 /
 
Megpróbálom, köszönöm!
(#) zoz11 válasza kapu48 hozzászólására (») Feb 2, 2018 /
 
Primán működik, kezdem érten.

Azt mivel érem el, hogy ezt a ismételje folyamatosan?
(#) kapu48 válasza zoz11 hozzászólására (») Feb 2, 2018 /
 
Az utolsó feltételnél elölröl indítod:
  1. ...
  2.     t1[0] = millis() +500;  // indul az első delay
  3.     //t1[1] = 0;
  4.     //t1[2] = 0;
  5.     t1[3] = 0;
  6. ...
(#) tbarath válasza zoz11 hozzászólására (») Feb 2, 2018 /
 
  1. unsigned long t1;
  2.  
  3. void setup() {
  4.   pinMode(LED_BUILTIN, OUTPUT);
  5. }
  6.  
  7. void loop(){
  8.   t1 = millis() +500;
  9.   digitalWrite(LED_BUILTIN, LOW);
  10.   while (millis() < t1) {
  11.   }
  12.   t1 = millis() +1500;
  13.   digitalWrite(LED_BUILTIN, HIGH);
  14.   while (millis() < t1){
  15.   }
  16. }


Ez a kód nálam szépen villogtatja a ledet (Uno).
Arra kell figyelni (és ezt el is rontottam), hogy ha millis() helyett millis-t írsz, akkor nem szól a compiler. de nem fog működni. A millis az nem tudom micsoda amúgy, de ha println-nel ki akarom iratni akkor ambigous...
(#) kapu48 válasza tbarath hozzászólására (») Feb 2, 2018 /
 
A cél az volt, hogy ne álljon a program sehol!

Akkor mivel jobb, hogy delay helyet
while (millis() < t1) { itt ál?
}


Bővebben: Link
A hozzászólás módosítva: Feb 2, 2018
(#) zoz11 válasza kapu48 hozzászólására (») Feb 2, 2018 /
 
Most ez a program vége. És itt most megáll, azt kellene elérnem, hogy kezdje előröl ezt a folyamatot, vagyis ami a void loop() részbe van.
  1. if(t1[3]> 0 && t1[3]< millis()){
  2.   digitalWrite(5,LOW);
  3.   t1[3] = 0;
  4. }
  5. }
A hozzászólás módosítva: Feb 2, 2018
(#) kapu48 válasza zoz11 hozzászólására (») Feb 2, 2018 /
 
+ Ami a setupban van:
  1. if(t1[3]> 0 && t1[3]< millis()){
  2.   digitalWrite(5,LOW);
  3.   t1[3] = 0;
  4.   t1[0] = millis() +500;  // indul az első delay
  5. }
  6. }
A hozzászólás módosítva: Feb 2, 2018
(#) tbarath válasza kapu48 hozzászólására (») Feb 2, 2018 /
 
Nem az volt a cél, hogy ne álljon sehol, hanem hogy ne legyen benne delay, hogy tudja vizsgálni közben egy kapcsoló állapotát.

Jelenleg egyik módszer se csinál semmit a delay helyett, csak fut egy ciklusban és közben vizsgálja az időt, az már részletkérdés hogy a loop-on fut végig amíg le nem telik az idő, vagy egy while-ban. A ciklusba is be tudja tenni a vizsgálatait amit akar csinálni (gombnyomás), de egy külön fv-be kirakva is hívogatja, és akkor ez lesz a delay helyett:
  1. while (millis() < t1) {
  2.     vizsgaldagombot();
  3.   }


Vagy írhat egy saját, "reszponzív" delay-t is:
  1. unsigned long t1;
  2.  
  3. void setup() {
  4.   pinMode(LED_BUILTIN, OUTPUT);
  5.   Serial.begin(9600);
  6. }
  7.  
  8. void loop(){
  9.   //Serial.println(millis);
  10.   digitalWrite(LED_BUILTIN, LOW);
  11.   varjalkicsit(500);
  12.   digitalWrite(LED_BUILTIN, HIGH);
  13.   varjalkicsit(1500);
  14. }
  15.  
  16. void varjalkicsit(unsigned int ms){
  17.   t1 = millis() +ms;
  18.   while (millis() < t1) {
  19.     vizsgaldagombot();
  20.   }
  21. }
  22.  
  23. void vizsgaldagombot(){
  24.  
  25. }


De interrupt-ot is használhat, nem túl régen volt arról itt szó.
A hozzászólás módosítva: Feb 2, 2018
(#) kapu48 válasza tbarath hozzászólására (») Feb 2, 2018 /
 
Amit én javasolta tetszőlegesen több szálon időzített progrm.
  1. ... utolsó szál
  2.   if(t1[3]> 0 && t1[3]< millis()){
  3.     digitalWrite(5,LOW);
  4.    itt is bővítheti bármivel!
  5.     t1[3] = 0;
  6.     t1[0] = millis() +500;  // indul az első delay
  7.   }
  8.  
  9.  // Itt még bármit csinálhat. Nem várakozik sehol
  10. ...
  11. gomb nyomásra akár elölröl indithatja a szálakat.
  12.  
  13. }
A hozzászólás módosítva: Feb 2, 2018
(#) tbarath válasza kapu48 hozzászólására (») Feb 2, 2018 /
 
Hidd el, értem a kódodat.
Mindketten más javasoltunk, mindkettő működik, mindkettőnek van előnye és hátránya is, feladatfüggő hogy melyiket érdemes használni. Majd eldönti hogy melyiket akarja, illetve szerintem már eldöntötte.
(#) kapu48 válasza tbarath hozzászólására (») Feb 2, 2018 /
 
OK!

Tulajdonképpen az első példát azért hagytam félbe, hogy gondolkozzon kicsit.
Így közben meg érti az elvet.
Az lenne a lényeg! Nem a végtelenül le egyszerűsített példa kód.
A hozzászólás módosítva: Feb 2, 2018
(#) zoz11 válasza kapu48 hozzászólására (») Feb 2, 2018 /
 
Ohhhh, ééérteeem, Megküzdök vele, de kezd össze állni a kép.
(#) tbarath válasza kapu48 hozzászólására (») Feb 3, 2018 /
 
Persze, halat és ne hálót, én is így gondolom. Én is azért írtam alternatívát, mert ötletet adhat, elgondolkodtathat.

Az egyik kis intenzitással tervezett, "talán nekiállok már egyszer tényleg" proginál én is a tiedhez hasonló kódot írok, pontosabban csak írogatok. Az cooperative multitask jellegű lesz, azaz az egyes funkciók szépen eltárolják hogy mikor kell legközelebb futniuk (pl. millis() +100), és ha legközelebb futni kezdenek akkor ezt vizsgálva vagy elkezdenek futni, vagy adják vissza a vezérlést, ami a következő ilyen funkcióra kerül át.
A hozzászólás módosítva: Feb 3, 2018
(#) vargham válasza tbarath hozzászólására (») Feb 3, 2018 /
 
Pont egy ilyen kooperatív megoldást linkeltem az imént. Megnéztétek?
Következő: »»   423 / 853
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