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   108 / 850
(#) csatti2 válasza Kovidivi hozzászólására (») Máj 1, 2015 / 1
 
Nem is csak a sebességveszteség volt a gond. Az igazi gond az volt, hogy lebegőpontos számokkal végzett több ezer műveletet és ezek összege volt a végeredmény. Minden lebegőpontos művelet eredendően veszteséges (hibája van). Gyakorlatilag összegzett rengeteg hibát is a végeredménnyel. Ráadásul, olyan módon tette ezt, hogy sok pici értéket adott hozzá egy nagyhoz. Extrém esetben már nem is változik a nagy érték ha elég kicsit adsz hozzá, akkora a hiba! Tehát tisztán a kódja felépítésével 20%-40% hibája lehetett a végeredménynél.
(#) icserny válasza Kera_Will hozzászólására (») Máj 2, 2015 /
 
Idézet:
„De ha csak alap 5 voltról járatod akkor érdemes lenne tekerni hozzá egy trafót ami megemeli a kimeneti feszültséget 30V körülre.”
Nem kell hozzá trafó. A lentebb belinkelt rajzon az induktivitás pont arra való (minden kikapcsoláskor rúg egy nagyot - csak bírja a tranzisztor...).
(#) atus1981 hozzászólása Máj 2, 2015 /
 
Sziasztok!
Ismeretes, hogy az eeprom írási száma véges. Viszont az is írásnak számít, ha az értéke nem változott? Vagyis ha pl. 100 az értéke és ugyanazt a 100-as értéket kéne írnia, akkor az is beleszámít a 100.000 írásba?
Köszi.
(#) csatti2 válasza atus1981 hozzászólására (») Máj 2, 2015 /
 
Természetesen. A te feladatod, hogy ellenőrizd tényleg írni kell-e az adott cellát. Tehát olvasd be a cella tartalmát írás előtt, majd írd ha szükséges (különböző).

A 100000 egyébként a "garantált" írásmennyiség. A tesztek szerint ennél jóval többet is kibír (többszörösét is).
(#) atus1981 válasza csatti2 hozzászólására (») Máj 2, 2015 /
 
  1. void loop() {
  2.  
  3.   int tvalue = analogRead(tempPin);  
  4.   float temp = (tvalue / 1024.0) * 500;
  5.   lcd.setCursor (0,0);
  6.   lcd.print("aktualis:");
  7.   lcd.print (temp);  
  8.   lcd.print((char)223);
  9. lcd.print ("C");
  10.    
  11.   settemp = EEPROM.read(1);
  12. kitemp = settemp / 2;
  13.   delay (500);
  14.  
  15.   if            
  16.     (digitalRead(swtu)== 1 )
  17.   {
  18.     settemp ++  
  19.    
  20.  
  21.       ;
  22.   }
  23.  
  24. else{
  25.  
  26. }
  27.  
  28. if
  29. (digitalRead (swtd) == 1)
  30. {
  31.   (settemp --);
  32.  
  33. }
  34. else {
  35.  
  36. }
  37.  
  38. if (temp < kitemp)
  39. {
  40.   digitalWrite (led, 1);
  41. }
  42. else
  43. {
  44.   digitalWrite (led,0);
  45. }
  46.  
  47.  
  48.  
  49. lcd.setCursor (0,1);
  50. lcd.print ("kivant:");
  51. lcd.print (kitemp);
  52. lcd.print((char)223);
  53. lcd.print ("C");
  54.  
  55. EEPROM.write (1,settemp);
  56.  
  57.  
  58.  
  59. delay (250);
  60.  
  61.  
  62.  
  63. }

Ebben a "környezetben" szeretném megoldani valahogyan.
Gondolom egy feltételt kell írni, de a tudásom itt megakad...
(#) csatti2 válasza atus1981 hozzászólására (») Máj 2, 2015 /
 
Hát igen. Ez a kód tökéletes EEPROM gyilkos. Egyrészt elég lenne csak akkor írni a területet (egyszer), amikor jóváhagyod a hőmérséklet beállítást. Másrészt a gombok kezelését érdemes lenne fel vagy lefutó élkor kezelni (ha már jobban megy, lehet időnkénti impulzussal [ami akár gyorsulhat is ahogy nyomva tartod] is). A fűtés be/ki kapcsolásánál én betennék egy fél fokos hiszterézist is. A kapcsolási hőmérsékletnél teljesen megkergülhet majd a reléd (vagy amit kapcsolgatsz) különben (ahogy billeg ott a hőmérséklet a két érték között).
(#) atus1981 válasza csatti2 hozzászólására (») Máj 2, 2015 /
 
Csináltam egy olyan módosítást, hogy akkor írja csak az eeprom-ot, ha valamelyik gomb le van nyomva.
  1. if            
  2.     (digitalRead(swtu)== 1 )
  3.   {
  4.     (settemp ++);
  5.     EEPROM.write (1,settemp);
  6.    
  7.   }
  8.  
  9. else{
  10.  
  11. }
  12.  
  13. if
  14. (digitalRead (swtd) == 1)
  15. {
  16.   (settemp --);
  17.   EEPROM.write (1,settemp);
  18.  
  19. }
  20. else {
  21.  
  22. }

Hiszterézisre még keresnem kell megoldást.
(#) szarka.p hozzászólása Máj 2, 2015 /
 
Sziasztok.
Lenne egy kérdésem.
Mit jelent a " expected unqualified-id before numeric constant" hiba fordítás közben.
Ha valaki tudna segíteni megköszönném.
(#) zmucha hozzászólása Máj 2, 2015 /
 
Nagyon köszönöm a hozzászólásokat !!!
A csatolt adatlapon nem szerepel, de a leírásban amit a hangszóróhoz kaptam, meg webshopokban, ahol lehet ilyen hangszórót venni, ott 2,5kHz - 60kHz tartomány szerepel, úgy hogy remélem jó lesz.
http://www.conrad.hu/conrad.php?name=Products&pid=710991
Kicsit kínai amit írtál Kera_Will......nem tudom mi az az ellenfázisú vezérlés, meg H-híd.
A lényeg az, hogy az a rajz amit mellékeltem az jó?
Mondjuk te inverterekről meg tranyókról irtál, az meg azon a rajzon nincs.
a közel dupla feszültség, ami majdnem 10V, az elég lehet megszólaltatni akár a pl. 40kHz-s frekvenciát?
Vagy ez úgy van, hogy minél magasabb hangot akarok, annál több feszültség kell hozzá?
A hozzászólás módosítva: Máj 2, 2015
(#) zmucha hozzászólása Máj 2, 2015 /
 
Bővebben: Link

az előző link nem működöt.....
(#) csatti2 válasza atus1981 hozzászólására (») Máj 2, 2015 /
 
Felfutó él még mindig hiányzik. Tárold el a loop végén a gombok állapotát és csak akkor futtasd az if-en belüli kódot, ha a gomb lenyomott állapotban van és az előző ciklusban még nem volt (pici várakozást is illik beiktatni a ciklusba ha lehetséges, hogy a prellezést kiküszöböld).

A hiszterézis szintén egyszerű. Az 1-be billentés feltétele, ha a hőmérséklet kisebb, mint a beállított mínusz a hiszterézis értéke (pl. fél fok). A 0-ba billentésé pedig, ha a hőmérséklet nagyobb mint a beállított plusz a hiszterézis értéke.
(#) atus1981 válasza csatti2 hozzászólására (») Máj 2, 2015 /
 
Hiszterézisre ezt találtam ki:
  1. if ((temp - 0.3 < kitemp) && (kitemp > temp + 0.3))
  2. {
  3.   digitalWrite (led,1);
  4. }
  5. else
  6. {
  7.   digitalWrite (led,0);
  8. }


Viszont csinálok egy "simítást", ami 20 mérés átlagát veszi, a soron következő értéket hozzáadja a 20 méréshez és a utolsót elveszi.

A felfutó él dolgot nem igazán értem
(#) csatti2 válasza atus1981 hozzászólására (») Máj 2, 2015 / 1
 
Nem úgy szokás simítani. Egyszerű ageing algoritmus a legjobb erre a célra (hívják még elsőrendű szűrőnek is).
y(t) = a * x + (1-a) * y(t-1)
ahol y(t): az új szűrt érték
y(t-1): az előző szűrt érték
a: a szűrő konstansa 0 és 1 közötti érték (minél nagyobb annál gyorsabban reagál a szűrő és annál kisebb a simítás)
x: pedig a mért érték (amit szűrni/simítani szeretnél)

A hiszterézised nem jó. Ez akkor fogja csak bekapcsolni a led-et ha a hőmérséklet 0,3 fokra megközelítette a kívánt hőmérsékletet.
(#) atus1981 válasza csatti2 hozzászólására (») Máj 2, 2015 /
 
  1. pinMode (led,1);

Van megadva a setupban.
Így működik nálam.
(#) csatti2 válasza atus1981 hozzászólására (») Máj 2, 2015 /
 
Oké, de ez hogy jön ide? Ezzel csak a pin típusát definiálod (kimenet, bemenet).
(#) csatti2 válasza atus1981 hozzászólására (») Máj 2, 2015 /
 
Bővebben: Link A felfutó és lefutó él látszik itt. Igaz, ez egy Siemens PLC-s cikk, de a lényeg látszik.
(#) atus1981 válasza csatti2 hozzászólására (») Máj 2, 2015 /
 
Azt gondoltam ezért működik, mert te azt írtad, hogy nem működik a bekapcsolás, csak ha 0.3 fokra megközelíti a beállítottat.
Nem tudom miért működhet. Ha jóval messzebb van a beállított érték a mérttől, akkor is bekapcsol...
(#) csatti2 válasza atus1981 hozzászólására (») Máj 2, 2015 /
 
Ja benéztem (késő van már). Egyszerűen csak rosszak a feltételek ebben a formában (nincs hiszterézis).

  1. if (temp + 0.3 < kitemp)
  2. {
  3.   digitalWrite (led,1);
  4. }
  5. if (temp - 0.3 > kitemp)
  6. {
  7.   digitalWrite (led,0);
  8. }
(#) Kera_Will válasza zmucha hozzászólására (») Máj 3, 2015 /
 
Idézet:
„majdnem 10V, az elég lehet megszólaltatni akár a pl. 40kHz-s”

A feszültség amplitudójának semmi köze a frekvenciához ... mindkettő egymástól független jellemzője a váltakozó jeleknek.

Amit írtam azoknak nézzél utána működésüknek. Némi analóg és digitális alap elektronikai ismereteket el kell sajátítani , anélkül eléggé nehéz mozogni a uC világban.
Persze azzal az 1 tekercses elvi rajzzal is működhet a dolog.
Amiben a kritikus eleme az a nagy CB zárófeszültségű tranzisztor aminek el kell viselni a negatív feszültség visszarúgásokat amit a tekercs állít elő.
Így a trafóval talán kézben tarthatóbbak a jelszintek.Persze kicsit több kézi munka kell az elkészítéséhez.
Ellen fázisú vagy ellen ütemű :
Mindig ellenkező irányú jelek kerülnek a terhelésre.
(#) andykaaa válasza csatti2 hozzászólására (») Máj 3, 2015 /
 
Tessek, egy mukodo hysteresis megoldas
  1. int temp = 10;
  2. int tempMert;     // az atkonvertalt kesz homerseklet ertek
  3. int tempHys = 0;  // a hysteresis alkamazva a kesz atkonvertalt homersekletre
  4. int hyst = 2;     // hysteresis
  5. void setup() {
  6. }
  7. void loop() {
  8.   // homerseklet merese es atkonvertalasa itten
  9.   if (tempMert > (tempHys + hyst)) { tempHys = (tempMert - hyst); }
  10.   if (tempMert < (tempHys - hyst)) { tempHys = (tempMert + hyst); }  
  11.   // a "tempHys" erteket hasznalod majd a mukodesi logikaba
  12. if(tempHys > temp) {digitalWrite (led,1);} else {digitalWrite (led,0);} }

Nekem bevalt. A "tempHys" mindig el van maradva a mert ertektol, vagy nem mozdul amig a mert ertek meg nem haladja vagy nem csokken a tempHys +/- hyst erteke fole/ala.
A hozzászólás módosítva: Máj 3, 2015
(#) andykaaa válasza andykaaa hozzászólására (») Máj 3, 2015 /
 
Bocsi "atus1981"-nek kellett azt hiszem, nem neked.
(#) erdeidominik1999 válasza icserny hozzászólására (») Máj 3, 2015 /
 
Köszi, délután leszek arduino közelbe, ki fogom próbálni, de szerintem a szenzor is elég vacak, mert nagyságrendi különbségek vannak a valós és a mért között. Nem tudtok valami jobb ampermérő szenzort?
(#) saua válasza erdeidominik1999 hozzászólására (») Máj 3, 2015 /
 
Szia,
Bővebben: Link nézd meg.
Itt van rá a megoldás is Bővebben: Link
, nekem nagyon jól működik
(#) saua válasza atus1981 hozzászólására (») Máj 3, 2015 /
 
sajnos most nem tudom kipróbálni, de így szerintem működik:

az int settemp -et átírod float settemp -re
és settemp ++ ..... settemp=settemp+0.5
(#) andykaaa válasza andykaaa hozzászólására (») Máj 3, 2015 /
 
Itt ebbe a 10-edik sor utan "else { }" ez irando be, sajni elmaradt.
A hozzászólás módosítva: Máj 3, 2015
(#) atus1981 válasza andykaaa hozzászólására (») Máj 3, 2015 /
 
Jónak tűnik a megoldás, hamarosan kipróbálom.
Köszi!
(#) erdeidominik1999 válasza saua hozzászólására (») Máj 3, 2015 /
 
Hát nem tudom, lehet, hogy én csinálok valamit rosszul, de azzal a kóddal, amit linkeltél, azzal próbáltam, csak a másik hozzászólás szerint azt a számot átírtam, de így is a valóstól nagyon eltérő érték jön ki.
(#) andykaaa válasza erdeidominik1999 hozzászólására (») Máj 3, 2015 /
 
En ugy vettem eszre, vagyis ugy jartam hogy a mert ertek csak akkor lett stabil ha beiktattam egy-egy kis varakozasi idot az olvasasok koze.
(#) kisedison válasza andykaaa hozzászólására (») Máj 4, 2015 /
 
Az ADC-nek valóban kell kis idő mire észhez tér egy mérés után.
(#) csatti2 válasza kisedison hozzászólására (») Máj 4, 2015 /
 
Az ADC-nek akkor van szüksége pici pihenőre, ha multiplexáltok. Amikor ugyanazt a csatornát olvassátok, akkor nincs szükség várakozásra.
Következő: »»   108 / 850
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