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   493 / 854
(#) kapu48 válasza tbarath hozzászólására (») Nov 19, 2018 /
 
Szerintem igy valahogy:
  1. if ((millis() - lastDebounceTime) > debounceDelay) {  // késleltetve olvas
  2.    
  3.           for int i = 0; i < 8; i++; { // legalább 8-szor probálkozunk
  4.             if (mySwitch.available()) {
  5.               received = mySwitch.getReceivedValue();
  6.                 if (5247489 == received){
  7.                         ledState != ledState;
  8.                         //power != power;
  9.                         //whatever you wanna do
  10.                         digitalWrite(led, ledState);
  11.                         lastDebounceTime = millis();
  12.                         if (ledState){
  13.                                 Serial.println("HIGH ");}
  14.                         else {
  15.                                 Serial.println("LOW ");}
  16.                     break; // kilép a forbol, ha értékelhető a received          
  17.                 }
  18.           }
  19.         }
  20.         mySwitch.resetAvailable();
  21.         lastDebounceTime = millis(); // beállit uj idöpontot
  22.   }
(#) KoblogPerGyok válasza kapu48 hozzászólására (») Nov 19, 2018 /
 
Ha ez sem megy, akkor:

if (5247489L == received){


Hátha valami másképpen kell az IDE-nek jelezni, hogy az ott egy long integer.

És a másik hozzászólónak is:

https://www.arduino.cc/reference/en/language/variables/constants/in...tants/

Hátha....
(#) Kovidivi válasza tbarath hozzászólására (») Nov 19, 2018 /
 
Próbáltam én már mindent, ha signed long long-ot használok, nem megy az osztás. Ez egyébként az uint64-gyel egyenértékű, 64bites int változó. Nincs vele gond, csak nem használható...
A hozzászólás módosítva: Nov 19, 2018
(#) KoblogPerGyok válasza KoblogPerGyok hozzászólására (») Nov 19, 2018 /
 
Szerintem az adatok küldésekor ez:

(mySwitch.available()) {

sokáig igaz, mert nem csak az adatokat küldi, hanem a protokollt, meg egyebet is küld.
(#) kapu48 válasza KoblogPerGyok hozzászólására (») Nov 19, 2018 /
 
Előző hozzászólásában be linkelte mit olvas be: Bővebben: Link

Inkább az lehet probléma, hogy itt elakad:
if (mySwitch.available()) { // Ha nem nyomja a gombot és nem érkezik semmi jel?
(#) tbarath válasza kapu48 hozzászólására (») Nov 19, 2018 /
 
Hát a fene tudja, de... Szóval nem ismerem ezt a libet, de a próbakódból nekem az jött le, hogy a resetAva() mindenképp kell akkor, ha egyszer true-van jött vissza az available(). Szóval ez a kód szerintem ezért nem jó.

Más: annak a for ciklusnak nem nagyon látom ott az értelmét. Ha van mit kiolvasni és nem vagy a debounce miatt tiltott időben, akkor azt kiolvassa mindkét kód, a lastDebounceTime pedig csak elfogadott kód esetén kerül beállításra, szóval ebben sincs igazán különbség. Ami különbség az az, hogy az enyém eldobja a debounce időn belül míg a tiéd gyűjti a queue-ba fölöslegesen, szerintem fölöslegesen, sőt, károsan, mert ugye pont azért lenne debounce hogy a duplán jövő jelet elkerüljük. Már ha van queue, de szerintem kéne lennie.
A hozzászólás módosítva: Nov 19, 2018
(#) KoblogPerGyok válasza kapu48 hozzászólására (») Nov 19, 2018 /
 
Igen, de az IDE-nek kell forszírozni a konstans érték megadásánál, hogy az long. Azért van benne L-a szám után. Szerintem az a feltétel minden esetben igaz volt.

if (5247489L == received){ //Ha nincs benne az L akkor hibásan értelmezi.

Ki kellene próbálni.
(#) tbarath válasza KoblogPerGyok hozzászólására (») Nov 19, 2018 /
 
Gondolom olyankor lesz 0 a getReceivedValue() értéke.
(#) KoblogPerGyok válasza tbarath hozzászólására (») Nov 19, 2018 /
 
igen, de a belő if átengedi. Az blokkolná a nullákat, de nem teszi, mert nem jó a konstans megadása. Legalábbis szerintem. Puding próbája az evés.
(#) kapu48 válasza tbarath hozzászólására (») Nov 19, 2018 /
 
Igaz, könnyebb lenne megérteni, ha itt lenne az asztalomon a távcsi!
(#) tbarath válasza Kovidivi hozzászólására (») Nov 19, 2018 /
 
Oh, no. Ha a signed long long az előjeles 64 bites int-et jelenti, akkor az nem uint64_t-vel egyenértékű, hanem int64_t-vel.

De mit találtam: Bővebben: Link
Itt a #3-as komment. Lehet h ezt keresed...
(#) tbarath válasza kapu48 hozzászólására (») Nov 19, 2018 /
 
Kétségkívü megvan a bája a távgyógyításnak
(#) KoblogPerGyok válasza tbarath hozzászólására (») Nov 19, 2018 /
 
Értem amit mondasz!

Szerintem is ekkor 0, mert hibásan értelmezi, a küldött adat meg 0. Valóban erre gondolok amire te!
(#) KoblogPerGyok válasza KoblogPerGyok hozzászólására (») Nov 19, 2018 /
 
Ráadásul ez miatt:

  1. unsigned long received;



sima L nem is elég az if-ben. UL kell.

  1. if (5247489UL == received)
(#) Kovidivi válasza tbarath hozzászólására (») Nov 19, 2018 /
 
Mivel minden szám belefér a long-ba, ezért a serial.print-nek se okoz gondot a kiírás. Egyébként programhiba miatt találtam a hibára, és csak utána debuggoltam ki serial.print-tel. De volt, amikor átkasztoltam signed long-gá a signed long long-ot, mivel belefér, és ezt írattam ki.
A hozzászólás módosítva: Nov 19, 2018
(#) misi93 válasza tbarath hozzászólására (») Nov 20, 2018 /
 
Igen én is így raktam bele. Sajnos valamiért ez sem az igazi ha megnyomom a gombot (folyamatosan) akkor folyamatosan tolja soros porton a HIGH szót . Valahogy resetelni kéne a received tartalmát de úgy sem jó :/ Azon agyaltam, hogy valamely számlálót beiktatni, hogy mondjuk leszámol 3-4 jelet X időn belül akkor értékelje ki (billentsen be egy bitet).
Persze én itt elmondtam mind szép és jó csak ezt megvalósítani nem tudom (illetve próbálkozok )

(Véletlenül sem azt szeretném, hogy megírja helyettem a programot bárki félre ne értsd!!!)
Próbálkozni szabad úgyhogy még van agy kis időm ma is )
(#) misi93 válasza kapu48 hozzászólására (») Nov 20, 2018 /
 
Várjatok, mert lemaradtam.
Most olvasgatom a HSZ-eket.
(fel kell ám fognom mi történik és meg szeretném érteni is nem csak bemásolni a kódot )
Ha jól értem és a hozzászólásokból értem?! akkor a for ciklus leszámol 8 "ciklust és a 9-dik ciklusban kiolvassa?
(#) misi93 válasza tbarath hozzászólására (») Nov 20, 2018 /
 
Megpróbálom leírni ami eddig történt / működést.
EZ a verzió ha megnyomtam a power gombot akkor utána soros porton folyamatosan küldte a HIGH jelet mindaddig míg egy másik gombot meg nem nyomtam.
Ez után beleraktam azt, hogy minden ciklus végén resetelje (mySwitch.resetAvailable(); ).
Ahogy beleraktam a resetet, akkor már csak akkor küldte a HIGH jelet soros porton mikor nyomtam vagy nyomva tartottam a gombot (jelen esetben ismét ugye a power gombot).

Amit küldtem képet ( ezt ) ezzel azt szerettem volna bemutatni, hogyha folyamatosan nyomom a gombot akkor ennyi "ciklusonként"?! jön a kód.
Ekkor minden ciklusban resetelődik a received változó azt hiszem .
Viszont ha az " if (mySwitch.available()) {" függvénybe beleteszem a debounce?! részt ( ezt:
  1. //Serial.println(power);
  2.     int reading = power;
  3.     if (reading != lastButtonState) {
  4.     // reset the debouncing timer
  5.     lastDebounceTime = millis();
  6.     }
  7.   if ((millis() - lastDebounceTime) > debounceDelay) {
  8.     // whatever the reading is at, it's been there for longer than the debounce
  9.     // delay, so take it as the actual current state:
  10.  
  11.     // if the button state has changed:
  12.     if (reading != buttonState) {
  13.       buttonState = reading;
  14.  
  15.       // only toggle the LED if the new button state is HIGH
  16.       if (buttonState == HIGH) {
  17.         ledState = !ledState;
  18.         Serial.print("off ");
  19.       }
  20.     }
  21.   }
  22.   // set the LED:
  23.   digitalWrite(led, ledState);
  24.  
  25.   // save the reading. Next time through the loop, it'll be the lastButtonState:
  26.   lastButtonState = reading;

Akkor csak abban az esetben fut le ha valamelyik gombot megnyomom.

Remélem érthetően írtam le és nem vezettelek félre titeket. A segítségeket köszönöm szépen!

Ui.: Kipróbáltam az utolsó verziót a for ciklusosat az arduino IDE hisztizett a break; sorral.
gondoltam rossz helyen van zárojelet váltottam beszúrtam már mindenhova is, de mindig hisztizett a IDE szoftver ezért kitöröltem (lehet nem kellett volna, a lényeg ez is azt csinálja, hogy ha nyomom a gombot írja a HIGH szót ha nem nyomom akkor nem írja .
For helyett inkább nem lenne jobb a while ciklus? mindjárt kipróbálom
(#) misi93 válasza misi93 hozzászólására (») Nov 20, 2018 /
 
While ciklus szerintem nem jó h@lyeséget írhattam

Az RC switch könyvtár egyik példaprogramja elvileg ez mindent megjelenít nem tudom ez segít-e valamit, vagy lehet ezt kellett volna már jóval előbb is
(#) tbarath válasza misi93 hozzászólására (») Nov 20, 2018 /
 
"hogy beleraktam a resetet, akkor már csak akkor küldte a HIGH jelet soros porton mikor nyomtam vagy nyomva tartottam a gombot (jelen esetben ismét ugye a power gombot)."

És ez a cél, nem?

"Amit küldtem képet ( ezt ) ezzel azt szerettem volna bemutatni, hogyha folyamatosan nyomom a gombot akkor ennyi "ciklusonként"?! jön a kód.
Ekkor minden ciklusban resetelődik a received változó azt hiszem ."

Szerintem nem baj ha jön szemét, csak gondosan el kell dobni, nem kell vele foglalkozni. Mondjuk hasznos lenne mélyebben elmerülni a lib available() és resetAva() függvényeiben, vagy legalábbis a leírásában, mert gondolom valahol le van írva az, hogy hogyan működik, ha máshol nem akkor a kódban. De nekem erre most nincs időm...
(#) misi93 válasza tbarath hozzászólására (») Nov 20, 2018 /
 
Idézet:
„És ez a cél, nem?”

Nem teljesen, mert ahogy nyomom a gombot folyamatosan küldi a HIGH jelet.
Ahogy szeretném hogy működjön:
Megnyomom vagy nyomva tartom a power gombot (vagy egy gombot a távirányítón) akkor egyszer küldje mondjuk a high jelet, majd ha ismételten megnyomom, vagy nyomva tartom ugyanazt a gombot a távirányítón akkor pedig resetelje azt (mondjuk LOW jelet küldjön).
Itt most nem vált a ledstate jel / bit / függvény (nem tudom hogyan hívják).
Kitaláltam most, hogy lehet, hogy "mySwitch.getReceivedDelay()," ezzel a jellel kéne valamit kezdeni ezt visszakerestem és amit az előző HSZ-ba küldtem képet ott milisec-ben van megadva, gondolom ennyi idő kell, hogy teljesen feldolgozza?! a kapott kódot.
Ha ezzel nem tudok mit kezdeni akkor megpróbálkozok megfejteni amit írtál:
Idézet:
„hasznos lenne mélyebben elmerülni a lib available() és resetAva() függvényeiben, vagy legalábbis a leírásában, mert gondolom valahol le van írva az, hogy hogyan működik, ha máshol nem akkor a kódban.”

Köszönöm a segítséget!
A hozzászólás módosítva: Nov 20, 2018
(#) tbarath válasza misi93 hozzászólására (») Nov 20, 2018 /
 
Aham. Akkor ez?
  1. receivedLast = 0;
  2. if ( mySwitch.available() ){
  3.         received = mySwitch.getReceivedValue();
  4.         if ( millis() > lastDebounceTime + debounceDelay ) {
  5.                 if ( receivedLast != received ){
  6.                         if ( 5247489 == received ){
  7.                                 if ( HIGH == ledState ){
  8.                                         ledState = LOW;}
  9.                                 else{
  10.                                         ledState = HIGH;}
  11.                                 digitalWrite(led, ledState);
  12.                                 lastDebounceTime = millis();
  13.                                 if (ledState){
  14.                                         Serial.println("HIGH ");}
  15.                                 else {
  16.                                         Serial.println("LOW ");}
  17.                         }
  18.                         receivedLast = received;
  19.                 }
  20.         }
  21.         mySwitch.resetAvailable();
  22. }


Bocs hogy a saját kódomat pimpelgetem, de a tiedet baromira nem értem. Van benne reading, received, power, a fene tudja mi, amikor csak annyi lenne a lényeg, hogy egy válozót kellene változtatni.
(#) tbarath válasza tbarath hozzászólására (») Nov 20, 2018 /
 
No és akkor elkezdtem szórakozni, ilyen rádiós izé hiányában simán csak egy digit pint használva nyomógombnak (beépített pullup bekapcsolva, low-ra húzva gombnyomás). Az alábbi kód nem prelleg, akármilyen hosszan is nyomom egy kapcsolásnak veszi, és erre aktuális állapotnak megfelelően ki- vagy bekapcsol.

  1. #define led 13
  2. #define btn 10
  3. #define gombnyom LOW
  4. #define debounceDelay 150
  5.  
  6. uint8_t ledState;
  7. uint8_t received;
  8. uint8_t receivedLast;
  9. uint32_t lastDebounceTime;
  10.  
  11. void setup() {
  12.   pinMode(led, OUTPUT);
  13.   pinMode(btn, INPUT_PULLUP);
  14.   digitalWrite(led, LOW);
  15.   Serial.begin(9600);
  16.   Serial.println("E!");
  17.   receivedLast = HIGH;
  18.   lastDebounceTime = 0;
  19. }
  20.  
  21. void loop() {
  22.   //if ( mySwitch.available() ){
  23.   if ( 1 ) {
  24.     //received = mySwitch.getReceivedValue();
  25.     received = digitalRead(btn);
  26.     if ( millis() > lastDebounceTime + debounceDelay ) {
  27.       if ( receivedLast != received ) {
  28.         //if ( 5247489 == received ){
  29.         if ( gombnyom == received ) {
  30.           if ( HIGH == ledState ) {
  31.             ledState = LOW;}
  32.           else {
  33.             ledState = HIGH;}
  34.           digitalWrite(led, ledState);    
  35.           if (ledState) {
  36.             Serial.println("HIGH ");}
  37.           else {
  38.             Serial.println("LOW ");}
  39.         }
  40.       }
  41.       if (receivedLast != received){
  42.         receivedLast = received;
  43.         lastDebounceTime = millis();
  44.       }
  45.       //mySwitch.resetAvailable();
  46.     }
  47.   }
  48. }
(#) tbarath válasza tbarath hozzászólására (») Nov 20, 2018 /
 
Még annyi, hogy ha jön egy junk jeled (ami a 0 gondolom, akkor azt valahol nagyon kívül el kellene dobni, közvetlen a readValue() után
(#) misi93 válasza tbarath hozzászólására (») Nov 20, 2018 /
 
Nos kipróbáltam (ezt ) nem teljesen értem a működést, mert minden ciklus elején reseteli a receivedLast jelet a végén meg a received-et írja bele szerintem ezért csinálja azt, hogy ha folyamatosan nyomom a gombot folyamatosan HIGH-LOW küldözgeti , próbáltam bele mókolni, de nem tudtam megoldani sehogy.
Aztán jött ez a kód ez viszont majdnem jó volt, csak az a baj, hogy 0-k is jönnek ugye amit írtál ezt valahogy nem tudtam megoldani sehogyan ezt sem, de rájöttem /rávilágítottatok, hogy a millis és a debounce delay-el kell szórakozni.
Félre söpörtem mindent (na jó nem, mert ez az utolsó kód volt az alapja).
Agyaltam, hogy ha folyamatosan jönne egy jel amíg nyomom és elmenne, ha már nincs nyomva a gomb akkor össze lehetne applikálni a programot.
Hozzá is kezdtem és a végeredmény kb 3 órával később :
  1. if (mySwitch.available()) {
  2.           received = mySwitch.getReceivedValue();    
  3.           //Serial.print("Received ");
  4.           //Serial.println( mySwitch.getReceivedValue() );
  5.             if (received == 5247489){
  6.                    Serial.println ("HIGH");
  7.                    power = HIGH;
  8.                    lastDebounceTime = millis();
  9.                    }
  10.           mySwitch.resetAvailable();
  11.           }
  12.     if ((millis() - lastDebounceTime) > debounceDelay  && power == HIGH){
  13.          //received = 0;
  14.          power = LOW;
  15.          ledState = !ledState;
  16.          digitalWrite(led, ledState);
  17.          Serial.println (ledState);
  18.          }


Azt hiszem így működik köszönöm szépen a segítséget!!
Szerintem fogok még itt kérdezni Karácsony előtt hisz ez a projektem csak egy kis darabkája (egy gomb) a következő rész amikor a +- gombokat több program váltásához, vagy fényerő állításhoz fogom felhasználni, de ehhez segítséget még nem kérek majd ha elakadok
A hozzászólás módosítva: Nov 20, 2018
(#) tbarath válasza misi93 hozzászólására (») Nov 21, 2018 /
 
Hajrá, csak így tovább! Csak csináld, ne add fel, csináld, agyalj rajta, és ha valami nem tiszta akkor kérdezz!
És örülök hogy tudtam segíteni
(#) berkesandor hozzászólása Nov 22, 2018 /
 
SIM800-al tudok követelenül hívni sim kártya telefonkönyvéből, vagy előbb kiolvasom a névjegyet, kivágom a számot, és azt tárcsázom?
(#) berkesandor válasza berkesandor hozzászólására (») Nov 22, 2018 /
 
  1. ATD>1;
(#) Kovidivi hozzászólása Nov 23, 2018 /
 
Helló.
Összeraktam Conway's Game of life nevű "játékát" Arduinora. Elég csak feltölteni egy Uno-ra vagy Nano-ra, bekapcsolni a soros portot (115200-ra állítani), kicsit átméretezni az ablakot, és máris látszik a sejtek élete. 12mp-ként újrainicializálja a térképet.
Úgy tervezem, hogy egy LCD-re implementálom, ott 16x80 pixelem van.
Egy hiba viszont biztosan van a "hanyszomszed" függvényben, mert a bal alsó sarokban rosszul számol valamiért. Ha valaki meglátja a hibát, megköszönném!
A játék így néz ki más platformon: Bővebben: Link
  1. void setup()
  2. {
  3.   Serial.begin(115200);
  4.   Serial.println("www.kovidivi.infora.hu\n2018");
  5.   Serial.println("Conway's - Game of life - for Arduino\n\n");
  6.   delay(5000);
  7.   random_seed_keres();
  8. }
  9.  
  10.  
  11. #define HATARX 16 // LCD-nél 80 lesz majd.
  12. #define HATARY 16 // int korlátozza 16 elemre   0-15-ig!
  13. unsigned int terkep[HATARX];
  14. unsigned int terkep_uj[HATARX];
  15. int szomszedok[HATARX][HATARY];
  16.  
  17.  
  18. unsigned int mag=58746; // véletlenszerű szám
  19. void random_seed_keres()
  20. {
  21.     randomSeed(mag);
  22. }
  23.  
  24.  
  25. unsigned long ujrainditas=0;
  26. unsigned int period=12000; // ms , ennyi időnként törli a térképet, és új sejteket helyet le rá.
  27. void loop()
  28. {
  29.   if ((ujrainditas==0)||(ujrainditas+period<millis()))
  30.   {
  31.     ujrainditas=millis();
  32.     mag+=5612;  // a véletlen generátornak adunk új magot. int a változó, át fog fordulni.
  33.     random_seed_keres();
  34.     terkep_feltolt();
  35.   }
  36.   char szomszedos_kijelzes=0;   // 0, vagy 1-re átírható nyugodtan.
  37.   if (szomszedos_kijelzes)
  38.   {
  39.      szomszedkeres_tombbe();         // ezzel lehet elleorizni, hogy jól szamolom-e a szomszedokat.
  40.      terkep_kirajzol_szomszeddal();  // ezzel lehet elleorizni, hogy jól szamolom-e a szomszedokat.
  41.   }
  42.   else  terkep_kirajzol();
  43.   szabalyok();
  44.   delay(200);
  45. }
  46.  
  47.  
  48.  
  49. void terkep_feltolt()
  50. {
  51.   for (int x=0;x<HATARX;x++)
  52.   {
  53.     terkep[x]=random(0,65536);
  54.   }
  55. }
  56.  
  57. void terkep_kirajzol()
  58. {
  59.   char temp;
  60.   for (int x=0;x<HATARX;x++)
  61.   {
  62.     for (int j=0;j<HATARY;j++)
  63.     {
  64.     if (terkep[x]&(1<<j)) temp='#'; else temp=' ';
  65.     Serial.print(temp);
  66.     }
  67.     Serial.println();
  68.   }
  69.   Serial.println("--------------------\n");
  70. }
  71.  
  72.  
  73. void terkep_kirajzol_szomszeddal()
  74. {
  75.   char temp;
  76.   for (int x=0;x<HATARX;x++)
  77.   {
  78.     for (int j=0;j<HATARY;j++)
  79.     {
  80.     if (terkep[x]&(1<<j)) temp='#'; else temp=' ';
  81.     Serial.print(temp);    
  82.     }
  83.     Serial.print("     ");
  84.     for (int h=0;h<HATARY;h++)
  85.     {
  86.       Serial.print(szomszedok[x][h]);
  87.     }
  88.     Serial.println();
  89.   }
  90.   Serial.println("#############################\n");
  91. }
  92.  
  93.  
  94. void szomszedkeres_tombbe()
  95. {
  96.   for (int x=0;x<HATARX;x++)
  97.   {
  98.     for (int y=0;y<HATARY;y++)
  99.     {
  100.       szomszedok[x][y]=hanyszomszed(x,y);
  101.     }
  102.   }
  103. }
  104.  
  105.  
  106. void szabalyok()
  107. {
  108.   for (int x=0;x<HATARX;x++)
  109.   {
  110.     for (int y=0;y<HATARY;y++)
  111.     {
  112.             //Serial.print(x);Serial.print(';');Serial.println(y);
  113.             if (
  114.                   (terkep[x]&(1<<y))
  115.                   &&
  116.                   ((hanyszomszed(x,y)==2)||(hanyszomszed(x,y)==3))
  117.                 )
  118.               {
  119.                 // túlél
  120.                 terkep_uj[x]|=(1<<y);  
  121.               }
  122.             if (!(terkep[x]&(1<<y))&&((hanyszomszed(x,y)==3)))
  123.             {
  124.               // újjászületik
  125.               terkep_uj[x]|=(1<<y);
  126.             }
  127.     }
  128.   }
  129.   for (int x=0;x<HATARX;x++)
  130.   {
  131.       terkep[x]=terkep_uj[x];
  132.   }
  133.   for (int x=0;x<HATARX;x++)
  134.   {
  135.       terkep_uj[x]=0;
  136.   }
  137. }
  138.  
  139.  
  140. unsigned char hanyszomszed(unsigned char x,unsigned char y)
  141. {
  142.   // ez a fv. csak a környezetben levő szomszédokat számolja meg! max. visszatérési érték 8 lehet.
  143.   signed char xx,yy;
  144.   char szomszed;
  145.   szomszed=0;
  146.   for (int xx=x-1;xx<=(x+1);xx++)
  147.   {
  148.     for (int yy=y-1;yy<=(y+1);yy++)
  149.     {
  150.       if ((xx<0)||(xx>HATARX)||(yy<0)||(yy>HATARY)) continue; // folytatjuk a következő for-ral.
  151.       else if ((xx==x)&&(yy==y)) continue;   // nem számoljuk a középső elemet!
  152.       else if (terkep[xx]&(1<<yy)) szomszed++;
  153.     }
  154.   }
  155.   return szomszed;
  156. }
A hozzászólás módosítva: Nov 23, 2018
(#) Kovidivi válasza Kovidivi hozzászólására (») Nov 23, 2018 /
 
A 150. sort ki kell cserélni erre:
if ((xx<0)||(xx>=HATARX)||(yy<0)||(yy>=HATARY)) continue; // folytatjuk a következő for-ral.
És tökéletesen fog működni!
Egész cukin néz ki! Főleg ahogy animálódnak a sejtek, mozognak.

  1. void setup()
  2. {
  3.   //Serial.begin(1000000);
  4.   Serial.begin(115200);
  5.   Serial.println("www.kovidivi.infora.hu\n2018");
  6.   Serial.println("Conway's - Game of life - for Arduino\n\n");
  7.   delay(5000);
  8.   random_seed_keres();
  9. }
  10.  
  11.  
  12. #define HATARX 16 // LCD-nél 80 lesz majd. 0-7-ig
  13. #define HATARY 16 // int korlátozza 16 elemre   0-15-ig!
  14. unsigned int terkep[HATARX];
  15. unsigned int terkep_uj[HATARX];
  16. int szomszedok[HATARX][HATARY];
  17.  
  18.  
  19. unsigned int mag=58746; // véletlenszerű szám
  20. void random_seed_keres()
  21. {
  22.     randomSeed(mag);
  23. }
  24.  
  25.  
  26. unsigned long ujrainditas=0;
  27. unsigned int period=12000; // ms , ennyi időnként törli a térképet, és új sejteket helyet le rá.
  28. void loop()
  29. {
  30.   if ((ujrainditas==0)||(ujrainditas+period<millis()))
  31.   {
  32.     ujrainditas=millis();
  33.     mag+=5612;  // a véletlen generátornak adunk új magot. int a változó, át fog fordulni.
  34.     random_seed_keres();
  35.     terkep_feltolt();
  36.   }
  37.   char szomszedos_kijelzes=0;   // 0, vagy 1-re átírható nyugodtan.
  38.   if (szomszedos_kijelzes)
  39.   {
  40.      szomszedkeres_tombbe();         // ezzel lehet elleorizni, hogy jól szamolom-e a szomszedokat.
  41.      terkep_kirajzol_szomszeddal();  // ezzel lehet elleorizni, hogy jól szamolom-e a szomszedokat.
  42.   }
  43.   else  terkep_kirajzol();
  44.   szabalyok();
  45.   delay(200);
  46. }
  47.  
  48.  
  49.  
  50. void terkep_feltolt()
  51. {
  52.   for (int x=0;x<HATARX;x++)
  53.   {
  54.     terkep[x]=random(0,65536);
  55.   }
  56. }
  57.  
  58. void terkep_kirajzol()
  59. {
  60.   char temp;
  61.   Serial.println("------------------");
  62.   for (int x=0;x<HATARX;x++)
  63.   {
  64.     Serial.print('|');
  65.     for (int j=0;j<HATARY;j++)
  66.     {
  67.     if (terkep[x]&(1<<j)) temp='#'; else temp=' ';
  68.     Serial.print(temp);
  69.     }
  70.     Serial.println('|');
  71.   }
  72.   Serial.println("------------------\n");
  73. }
  74.  
  75.  
  76. void terkep_kirajzol_szomszeddal()
  77. {
  78.   char temp;
  79.   for (int x=0;x<HATARX;x++)
  80.   {
  81.     for (int j=0;j<HATARY;j++)
  82.     {
  83.     if (terkep[x]&(1<<j)) temp='#'; else temp=' ';
  84.     Serial.print(temp);    
  85.     }
  86.     Serial.print("     ");
  87.     for (int h=0;h<HATARY;h++)
  88.     {
  89.       Serial.print(szomszedok[x][h]);
  90.     }
  91.     Serial.println();
  92.   }
  93.   Serial.println("#############################\n");
  94. }
  95.  
  96.  
  97. void szomszedkeres_tombbe()
  98. {
  99.   for (int x=0;x<HATARX;x++)
  100.   {
  101.     for (int y=0;y<HATARY;y++)
  102.     {
  103.       szomszedok[x][y]=hanyszomszed(x,y);
  104.     }
  105.   }
  106. }
  107.  
  108.  
  109. void szabalyok()
  110. {
  111.   for (int x=0;x<HATARX;x++)
  112.   {
  113.     for (int y=0;y<HATARY;y++)
  114.     {
  115.             //Serial.print(x);Serial.print(';');Serial.println(y);
  116.             if (
  117.                   (terkep[x]&(1<<y))
  118.                   &&
  119.                   ((hanyszomszed(x,y)==2)||(hanyszomszed(x,y)==3))
  120.                 )
  121.               {
  122.                 // túlél
  123.                 terkep_uj[x]|=(1<<y);  
  124.               }
  125.             if (!(terkep[x]&(1<<y))&&((hanyszomszed(x,y)==3)))
  126.             {
  127.               // újjászületik
  128.               terkep_uj[x]|=(1<<y);
  129.             }
  130.     }
  131.   }
  132.   for (int x=0;x<HATARX;x++)
  133.   {
  134.       terkep[x]=terkep_uj[x];
  135.   }
  136.   for (int x=0;x<HATARX;x++)
  137.   {
  138.       terkep_uj[x]=0;
  139.   }
  140. }
  141.  
  142.  
  143. unsigned char hanyszomszed(unsigned char x,unsigned char y)
  144. {
  145.   // ez a fv. csak a környezetben levő szomszédokat számolja meg! max. visszatérési érték 8 lehet.
  146.   signed char xx,yy;
  147.   char szomszed;
  148.   szomszed=0;
  149.   for (int xx=x-1;xx<=(x+1);xx++)
  150.   {
  151.     for (int yy=y-1;yy<=(y+1);yy++)
  152.     {
  153.       if ((xx<0)||(xx>=HATARX)||(yy<0)||(yy>=HATARY)) continue; // folytatjuk a következő for-ral.
  154.       else if ((xx==x)&&(yy==y)) continue;   // nem számoljuk a középső elemet!
  155.       else if (terkep[xx]&(1<<yy)) szomszed++;
  156.     }
  157.   }
  158.   return szomszed;
  159. }
A hozzászólás módosítva: Nov 23, 2018
Következő: »»   493 / 854
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