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   299 / 869
(#) (Felhasználó 120038) válasza jeges hozzászólására (») Dec 6, 2016 /
 
Szia!

Nemértem mi a gond pontosan, reggel van.

50 nap bele sem fér az unsigned long-ba.
50*24*3600*1000=4 320 000 000 ms.

Unsigned long:4,294,967,295 (2^32 - 1) maximum ekkora számot tud tárolni.

Lehet jobban járnál egy olcsó RTC órával, abban pl kalendár is van, meg pl ébresztés, idő lejártának figyelése, stb.
A hozzászólás módosítva: Dec 6, 2016
(#) proba válasza kissi hozzászólására (») Dec 6, 2016 /
 
Erre régen volt egy egyszerű rutin, igaz az egy plusz változó, de így legalább nem függ a port terheléstől.
led = 1-led;
digitalwrite ( ledpin,led);
(#) kissi válasza proba hozzászólására (») Dec 6, 2016 /
 
Aha, ez is jó megoldás !
(#) kissi válasza (Felhasználó 120038) hozzászólására (») Dec 6, 2016 /
 
Idézet:
„50 nap bele sem fér az unsigned long-ba.
50*24*3600*1000=4 320 000 000 ms.”


Igen, csak úgy írják a doksiban, hogy kb. 50 nap ( pontosabban valami 49,7 nap, ahogy írtad ! ) !
(#) (Felhasználó 120038) válasza kissi hozzászólására (») Dec 6, 2016 /
 
Szerintem az RTC éppen erre való, lehet vele feléleszteni arduino-t, interrupt is megy vele, szóval sokkal jobb, mint számolgatni az arduino-val.

Ha nincs RTC akkor pedig az eltelt időt számolni ugyan milis()-el, de külön változóba pl. eltelt perc számlálás, 50 napi perc pedig belefér már a változóba.

ha eltelt idő>= 60 sec akkor eltelt perc=eltelt perc+1 és eltelt idő=0

ha eltelt perc= 50*24*60 akkor tegyen valamit, majd nullázza ki az eltelt percet is, hogy induljon újra a következő 50 nap.
A hozzászólás módosítva: Dec 6, 2016
(#) kissi válasza (Felhasználó 120038) hozzászólására (») Dec 6, 2016 /
 
Igen, ha órát akarsz csinálni, akkor nagyon jó az RTC... De ha pl. valami várakozás kell pl. 170 ms ( mondjuk az alatt tölt meg egy flakont az automata ), akkor az RTC felejtős !
(#) (Felhasználó 120038) válasza (Felhasználó 120038) hozzászólására (») Dec 6, 2016 /
 
A kérdés az, hogy mennyire lesz pontos 50 nap után az arduino-s számolgatás. Millis(1000), szerintem lesz pár milisec csúszás minden másodpercben, viszont 50 nap alatt ez jelentős lehet. RTC 25 ft, vagy mennyi, 250 ft bele az elem.
(#) (Felhasználó 120038) válasza kissi hozzászólására (») Dec 6, 2016 /
 
Igen, az lehet, de 50 nap...
(#) kissi válasza (Felhasználó 120038) hozzászólására (») Dec 6, 2016 /
 
Nem arra kell használni ( egyébként a millis() is lehet pl. kvarc alapú vagy külső órajelgenerátorral ( ez nem biztos, mert nem láttam a doksiját ! ) működtetett és akkor olyan pontos lehet, mint az RTC !) !
A hozzászólás módosítva: Dec 6, 2016
(#) kissi válasza (Felhasználó 120038) hozzászólására (») Dec 6, 2016 /
 
Nincs semmi baj az 50 nappal, ez csak annyi, hogy maximum ennyit tud mérni átfordulás nélkül... de ha számolom az átfordulásokat, akkor akár éveket is !
Abbahagyom, ne off-oljunk tovább !
(#) kapu48 válasza kissi hozzászólására (») Dec 6, 2016 /
 
Ez sajnos nem így van!

Ha megnézed az óra kvarcok jóval kisseb méretűek.
A kisebb felületen kisebb hő tágulás történik, ezáltal kisebb rezonancia eltérések keletkeznek, hőmérsékletváltozás esetén.
Ebből meg következi az óra kvarcok jobb pontossága.
A hozzászólás módosítva: Dec 6, 2016
(#) pjg válasza kapu48 hozzászólására (») Dec 6, 2016 /
 
Akkor ez igaz az SMD méretű, 2x2mm tokozású kvarcokra is?
Nem inkább az lehet, hogy az óra kvarcok alacsonyabb frekvencián működnek és ezért másképpen metszik őket?
A hozzászólás módosítva: Dec 6, 2016
(#) kissi válasza kapu48 hozzászólására (») Dec 6, 2016 /
 
Idézet:
„külső órajelgenerátorral”

Ez sokkal pontosabb is lehet, mint az órakvarc ( csak pénz kérdése !), ill. a működtető kvarc is lehet órakvarc, csak akkor másra nem jut annyi idő ( de az óra pontos lesz!) !
A hozzászólás módosítva: Dec 6, 2016
(#) kapu48 válasza jeges hozzászólására (») Dec 6, 2016 / 1
 
Látom, teljesen tévúton jársz, az millis() túlcsordulás probléma megoldásával!

Én ezt így csinálnám:
  1. unsigned long currentMillis;
  2.   unsigned long lastReadTime; // utolsó olvasási idő
  3.   unsigned long intervallum = 1000; // intervallum
  4.   bool overflowing = 0; //  Tulcsordulas jelzo
  5.   #define butonPin  3  // Most ezzel inditjuk az idözitest
  6.    
  7.  void setup() {
  8.     Serial.begin(9600);
  9.      
  10.  
  11.  }
  12.      
  13.  void loop()
  14.  {
  15.    
  16.     if(digitalRead(butonPin) == 1) //   idozites inditasa valamilyen feltételben
  17.     {
  18.       currentMillis = millis(); // Beolvassuk a jelenlegi idot
  19.       lastReadTime = currentMillis + intervallum; // Ha összeadás tulcsordul? az eredmény kissebb lesz!
  20.       if(lastReadTime < currentMillis) // Ha törtent tulcsordulas
  21.       {
  22.         overflowing = 1; //  Tulcsordulas jelzot beállitjuk
  23.       }
  24.     }
  25.     // ...
  26.    
  27.     // idözites figyeles
  28.     if(lastReadTime > 0)  // ha idözites elvan inditva
  29.     {
  30.       // Ha Tulcsordulas jelzo bevan állitva és millis() > lastReadTime?
  31.       if(overflowing == 1 && millis() > lastReadTime) // Varunk a tulcsordulasra
  32.       {
  33.         //  nem csinálunk semmit
  34.       }else //  Ha millis() tulcsordulasa megtörtént
  35.       {
  36.         overflowing = 0; //  Tulcsordulas jelzot töröljuk
  37.         if(millis() > lastReadTime) // megvarjuk ,hogy leteljen az idö
  38.         {
  39.           // Itt csinálunk valamit az idözitesben...
  40.           // ...
  41.           lastReadTime = 0; // és töröljük az idözites kerestt
  42.        
  43.         }
  44.       }
  45.     } // Itt az idözites figyeles vege
  46.    
  47.     // ...  
  48.      
  49.     // delay(1000); // nem használunk delay-t!!! mert az mindent elront!
  50.    
  51. }
A hozzászólás módosítva: Dec 6, 2016
(#) GPeti1977 válasza pjg hozzászólására (») Dec 6, 2016 /
 
Ezt vettem most, 200Ft és már a kvarc is az IC be van integrálva:
DS3231
(#) kissi válasza kapu48 hozzászólására (») Dec 6, 2016 /
 
Szia!

Szerintem ez jobb megoldás:

if ((later_time - earlier_time ) >=duration ) {action}

Bővebben: Link
(#) kapu48 válasza kissi hozzászólására (») Dec 6, 2016 /
 
Meg kérdőjelezem!

  1. A képleted lefordítva:
  2. Ha minden idődet számításokat végeznek, mint:
  3. if ((később_time - korábbi_time)> = időtartam) {tevékenység}
  4. Majd a borulás nem általában nem jöhet számításba.
  5.  
  6. Próbálkozzunk, vegyünk csak 1 Byte szám ábrázolást! (0 - 255-ig. könnyebb megérteni)
  7.   hexa = decimális
  8.    xf0 = 240            induló érték
  9. +  x14 =  20            ennyit akarunk várni, hozzáadjuk az induláshoz
  10. = x104 = 260            mivel 1 Byte a határ a balszélső 1-es kicsordul marad
  11.    x04 =   4    260 - 256 = 4 Eddig kellene számolni
  12.          
  13.         Ez a képlet:
  14.         if ((később_time - korábbi_time)> = időtartam) {tevékenység}
  15.        
  16. Helyettesítsük be számláló elérte a végét
  17. if ((255 - 240)> = 20) {tevékenység} 255 - 240 = 15 eddig OK
  18. if ((xff - xf0)> = x14) {tevékenység} eddig OK
  19.  
  20. Megtörténik az átfordulás 255 >> 0-ra:
  21. if ((x0 - xf0)> = x14) {tevékenység} x0 - xf0 = xEC  Az már nagyobb mint x14 Teljesül a feltétel!

Pedig még 4 ig kellett volna számolnia!
És mekkora lenne a tévedés nagyobb, 4 Byte-es számoknál?

KO! Az eredményünk nem pontos!
Mivel a 0 elérésénél teljesül a feltétel a túlcsordulás miatt!
A hozzászólás módosítva: Dec 6, 2016
(#) kapu48 válasza kissi hozzászólására (») Dec 6, 2016 /
 
És amivel CrossRoads védekezik:
then the rollover does generally not come into play.

Szerinte + szerintem, hogy ez előforduljon nagyon kicsi az esélye!
De érdekes volt eljátszani a gondolattal
A hozzászólás módosítva: Dec 6, 2016
(#) kissi válasza kapu48 hozzászólására (») Dec 6, 2016 /
 
Igazad van, tényleg nem jó, "benéztem" !
(#) pjg hozzászólása Dec 7, 2016 /
 
Van e valakinek tapasztalata a Si7021-es szenzorral. A kereső nem talál semmit róla itt a fórumon.
(#) Bakman válasza pjg hozzászólására (») Dec 7, 2016 /
 
Nekem jó taasztalatom van vele, de Arduinos példát nem tudok adni. Mi a kérdés?
(#) pjg válasza Bakman hozzászólására (») Dec 7, 2016 /
 
Még semmi. Most jött meg.
(#) kapu48 válasza kapu48 hozzászólására (») Dec 7, 2016 /
 
Akadt 1 klubtag, aki értékelte a ténykedésemet!
Részben az Ő kedvéért legyen itt 1 LED villogtató példa.
Ami nem használ delay-t és ráadásul 5.nap biztos.
  1. // ledBlinkNoDelay.ino
  2.  
  3.  unsigned long currentMillis = 0;
  4.  unsigned long lastReadTime = 0; // utolsó olvasási idő
  5.  unsigned long intervallum = 1000; // intervallum
  6.  bool overflowing = 0; //  Tulcsordulas jelzo
  7.  
  8.  unsigned long currentMillis1 = 0;
  9.  unsigned long lastReadTime1 = 0; // utolsó olvasási idő
  10.  unsigned long intervallum1 = 1500; // intervallum
  11.  bool overflowing1 = 0; //  Tulcsordulas jelzo
  12.  
  13.  unsigned long counter = 0;
  14.  #define BUTTONPIN    3
  15.  #define LEDPIN      13
  16.    
  17.  void setup() {
  18.     Serial.begin(9600);
  19.     pinMode(LEDPIN, OUTPUT);
  20.     // Start LED Blik
  21.    
  22.       currentMillis = millis(); // Beolvassuk a jelenlegi idot
  23.       lastReadTime = currentMillis + intervallum; // Ha összeadás tulcsordul? az eredmény kissebb lesz!
  24.       if(lastReadTime < currentMillis) // Ha törtent tulcsordulas
  25.       {
  26.         overflowing = 1; //  Tulcsordulas jelzot beállitjuk
  27.       }    
  28.  
  29.  }
  30.      
  31.  void loop()
  32.  {
  33.    
  34.  
  35.     // A programuk fut a LED-ek a hatterben Villognak...
  36.     Serial.print(counter); // A monitoron: A számok futása szemlélteti a program futasat a haterben!
  37.     Serial.print(", ");
  38.     //...
  39.     // LED Bekapcsolo idözites figyeles
  40.     if(lastReadTime > 0)  // ha idözites elvan inditva
  41.     {
  42.       // Ha Tulcsordulas jelzo bevan állitva és millis() > lastReadTime?
  43.       if(overflowing == 1 && millis() > lastReadTime) // Varunk a tulcsordulasra
  44.       {
  45.         //  nem csinálunk semmit
  46.       }else //  Ha millis() tulcsordulasa megtörtént
  47.       {
  48.         overflowing = 0; //  Tulcsordulas jelzot töröljuk
  49.         if(millis() > lastReadTime) // megvarjuk ,hogy leteljen az idö
  50.         {
  51.           // Itt csinálunk valamit az idözitesben...
  52.           // ...
  53.           counter++;
  54.           Serial.println(". ");
  55.           Serial.print("LED BE: ");
  56.           digitalWrite(LEDPIN, 0);
  57.           lastReadTime = 0; // és töröljük az idözites kerestt
  58.           // elinditjuk a kikapcolás idözitest
  59.           currentMillis1 = millis(); // Beolvassuk a jelenlegi idot
  60.           lastReadTime1 = currentMillis1 + intervallum1; // Ha összeadás tulcsordul? az eredmény kissebb lesz!
  61.           if(lastReadTime1 < currentMillis1) // Ha törtent tulcsordulas
  62.           {
  63.             overflowing1 = 1; //  Tulcsordulas jelzot beállitjuk
  64.             Serial.println("millis() Tulcsordulas jelzes!");
  65.           }
  66.         }
  67.       }
  68.     } // Itt az idözites figyeles vege
  69.  
  70.     // LED Kikapcsolo idözites figyeles
  71.     if(lastReadTime1 > 0)  // ha idözites elvan inditva
  72.     {
  73.       // Ha Tulcsordulas jelzo bevan állitva és millis() > lastReadTime?
  74.       if(overflowing1 == 1 && millis() > lastReadTime1) // Varunk a tulcsordulasra
  75.       {
  76.         //  nem csinálunk semmit
  77.       }else //  Ha millis() tulcsordulasa megtörtént
  78.       {
  79.         overflowing1 = 0; //  Tulcsordulas jelzot töröljuk
  80.         if(millis() > lastReadTime1) // megvarjuk ,hogy leteljen az idö
  81.         {
  82.           // Itt csinálunk valamit az idözitesben...
  83.           // ...
  84.           counter++;
  85.           Serial.println(". ");
  86.           Serial.print("LED KI: ");
  87.           digitalWrite(LEDPIN, 1);
  88.           lastReadTime1 = 0; // és töröljük az idözites kerestt
  89.           // elinditjuk a Bekapcolás idözitest
  90.           currentMillis = millis(); // Beolvassuk a jelenlegi idot
  91.           lastReadTime = currentMillis + intervallum; // Ha összeadás tulcsordul? az eredmény kissebb lesz!
  92.           if(lastReadTime < currentMillis) // Ha törtent tulcsordulas
  93.           {
  94.             overflowing = 1; //  Tulcsordulas jelzot beállitjuk
  95.             Serial.println("millis() Tulcsordulas jelzes!");
  96.           }
  97.         }
  98.       }
  99.     } // Itt az idözites figyeles vege
  100.    
  101.    
  102.     // ...  
  103.      
  104.     // delay(1000); // nem használunk delay-t!!! mert az mindent elront!
  105.    
  106. }
A hozzászólás módosítva: Dec 7, 2016
(#) simonsen válasza szucsistvan123 hozzászólására (») Dec 8, 2016 /
 
Szia!

Szerintem a Tavír fejlesztette nem kapható máshol.

Üdv!
(#) jeges válasza kapu48 hozzászólására (») Dec 9, 2016 /
 
Ez nem ugy látszik mind ha meg álna a proci vagy kifagyna számlálást kezdi elöröl!?
  1. Aktualis ido: 4294964313. Eltelt ido: 17018
  2. Aktualis ido: 4294965314. Eltelt ido: 18019
  3. Aktualis ido: 4294966315. Eltelt ido: 19020
  4. Aktualis ido: 20. Eltelt ido: 20021
  5. Aktualis ido: 1021. Eltelt ido: 21022
  6. Aktualis ido: 2022. Eltelt ido: 22023
  7. Aktualis ido: 3023. Eltelt ido: 23024
  8. Aktualis ido: 4024. Eltelt ido: 24025
  9. Aktualis ido: 5025. Eltelt ido: 25026
  10. Aktualis ido: 6026. Eltelt ido: 26027

Mi a gond a kodal amit linkeltem?
(#) jeges válasza (Felhasználó 120038) hozzászólására (») Dec 9, 2016 /
 
Van olyan alkalmazás ahol nem igazán van szükség pontos idöre (RTC tagra) elég nekem böven az mcu belsö számláloja is az az fix eltelt idöt számolni 10..20 perc pl ha most hoszabb 5..10sec is nincs gond belöle meg ha csuszik azal sincs ....
(#) kapu48 válasza jeges hozzászólására (») Dec 9, 2016 /
 
A te kódod azt csinálja, hogy:
Beolvassa a millist(),
Majd kiírja az értékét.
Aztán álldogál itt: delay(1000); ennyi ideig nem csinál semmit!
És ezt kezdi elölről.
Ha neked jó?
Nekem semmi bajom a kódoddal!

Bár az egész millis() olvasásnak semmi értelme, ha az időzítést a delay(1000); sor végzi!

És ki mondta itt, hogy kifagy a program a millis() átfordulásakor?
Mi azt mondtuk, hogy olyankor téveszti az időzítést, ha nem figyel rá a program.

Ezzel szemben az én programom, minden kanyarban megnézi, hogy letelt e már a beállított idő?
H még nem? Megy, tovább csinálja a dolgát, nem bénul meg a delay(ban)!
Majd ha ideje van, elvégzi a dolgát.
A hozzászólás módosítva: Dec 9, 2016
(#) atus1981 hozzászólása Dec 9, 2016 /
 
Sziasztok!
Wifivel kapcsolatos kérdésem lenne.
Hogyan lehet megoldani, egy Arduino-t használó atmega328-cal, hogy wifi routerre csatlakozva mérési adatokat küldjön a program? ESP8266 melyik verziója a bevált? Kb 30 méterre van a router és böngészőbe beírva a wifi modul ip címét láthatóvá váljanak a küldött adatok. Nem kész programot kérek, csak iránymutatást, vagy valaki találkozott-e hasonló projekttel és megosztaná velem.
Köszönöm!
(#) proba válasza kapu48 hozzászólására (») Dec 9, 2016 /
 
Azért ha pontosabban megnézed, igyekszik lekezelni az átfordulást, és az átfordulástól függetlenül megy tovább a számlálója. A delay gondolom azért kell, hogy legyen mit mérni a millissel.
(bár lehet benéztem valamit).
A hozzászólás módosítva: Dec 9, 2016
(#) kapu48 válasza proba hozzászólására (») Dec 9, 2016 /
 
(Fel adtam! Reménytelen eset!)
Különben sem fogja észrevenni, ha 5 naponta 1 szer 1000 helyett csak mondjuk 100 lesz a késleltetése!

A hozzászólás módosítva: Dec 9, 2016
Következő: »»   299 / 869
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