Arduino Nano feszültségmérés + kijelzés

Processing/Wiring (illetve C) nyelvű programozási fogások, tippek. (AVR-Duino, Arduino, EthDuino, Diecimila, Severino, Nano, LilyPad)
Válasz küldése
Adamyno
DrótVégénSzéndarab
Hozzászólások: 35
Csatlakozott: 2015. április 16. csütörtök, 19:29

Arduino Nano feszültségmérés + kijelzés

Hozzászólás Szerző: Adamyno »

Nem olyan nagy dolog, tudom, de néhány érdekességet tapasztaltam, amire nem találok magyarázatot és megoldást.

Úgy próbáltam a programot megírni, hogy amikor van szabadideje a processzornak, akkor meghívja a feszultseg() eljárást, és ekkor megméri a feszültséget az A0 lábon és ha az az előző méréshez képest 0.1V- al változott, akkor egy, a feszültségszint változását jelző változót 1-re állít, egyébként 0-ra.
Ez azért kell, mert a képernyőre írás és rajzolás sok erőforrást vesz el, csak akkor változzon az érték a kijelzőn ha 0,1 Volt a különbség.
Hiába állítom ezt be, próbapanelen mérek és stabilan a 3,3V vagy 5.0V feszültségre kötöm, akkor is másodpercenként akár 10x is változhat a kiírt érték, ami század Volt pontossággal van kiírva és csak 1-1 század Volt a változás, mégis kiírja. Miért?
Aztán tettem bele túlmintavételezést, 10x vesz mintát az analóg portról, ezt átlagolja. Így sem változott semmi. Próbáltam az if ciklusban feltételként megadni a kiszámított float típusú feszültség érték+0.1 és -0.1 értékét, először azt hittem az a baj, hogy pontatlan a számolás. Ezért megváltoztattam int típusra és nem a számított feszültség értéket használom feltételként, hanem a nyers szenzor adatokat (0-1023). Így sem változott semmi.

Lényegében a feszvaltozott változóm úgy tűnik, mintha mindig 1 lenne, ezért mindig kiírja az aktuális értéket a kijelző.

Mi lehet a baj?

Kód: Egész kijelölése

void feszultseg () {  // Feszültség mérése
  int freal[10];
  int analog0 = A0;
  int fmind =  0;
  for (int i = 0; i < 10; i++){
    freal[i] = analogRead(analog0);
  }
  for (int i = 0; i < 10; i++) {
    fmind = (fmind) + freal[i];
  }
  int fatl = (fmind)/10;
  fesz = (fatl)*0.0048828125;
  if ((((fatl)+21) > fatl) || (((fatl)-21) < fatl)) feszvaltozott = 1;
  else feszvaltozott = 0;
Avatar
kapu48
Elektronbűvölő
Hozzászólások: 3375
Csatlakozott: 2008. augusztus 29. péntek, 6:00

Re: Arduino Nano feszültségmérés + kijelzés

Hozzászólás Szerző: kapu48 »

Gonolkozzál kicsit!
Ez mindig igaz eredményt ad:

Kód: Egész kijelölése

if ((((fatl)+21) > fatl) || (((fatl)-21) < fatl)) 
Adamyno
DrótVégénSzéndarab
Hozzászólások: 35
Csatlakozott: 2015. április 16. csütörtök, 19:29

Re: Arduino Nano feszültségmérés + kijelzés

Hozzászólás Szerző: Adamyno »

Sejtettem, hogy valahol itt lesz a gond. Na megpróbálom :)
Köszi!
Avatar
kapu48
Elektronbűvölő
Hozzászólások: 3375
Csatlakozott: 2008. augusztus 29. péntek, 6:00

Re: Arduino Nano feszültségmérés + kijelzés

Hozzászólás Szerző: kapu48 »

Az előző mérés értékét el mented, és azzal hasonlítod össze az új érték+/- 21.
Adamyno
DrótVégénSzéndarab
Hozzászólások: 35
Csatlakozott: 2015. április 16. csütörtök, 19:29

Re: Arduino Nano feszültségmérés + kijelzés

Hozzászólás Szerző: Adamyno »

Így jó lett:

Kód: Egész kijelölése

void feszultseg () {  // Feszültség mérése
  int freal[3];
  int analog0 = A0;
  int fmind =  0;
  int fatlregi = fatl;
  for (int i = 0; i < 3; i++){
    freal[i] = analogRead(analog0);
  }
  for (int i = 0; i < 3; i++) {
    fmind = (fmind) + freal[i];
  }
  fatl = (fmind)/3;
  fesz = (fatl)*0.0048828125;
  if (( fatl > (fatlregi)+21 ) || ( fatl < (fatlregi)-21 )) feszvaltozott = 1;
  else feszvaltozott = 0;
}
Az fatl változót próbáltam lokálisan deklarálni, hogy ne fogyassza a memóriát ha nem kell, de sehogy sem megy sajnos csak ha lokális.
De legalább működik!

Köszi a segítséget!
Avatar
kapu48
Elektronbűvölő
Hozzászólások: 3375
Csatlakozott: 2008. augusztus 29. péntek, 6:00

Re: Arduino Nano feszültségmérés + kijelzés

Hozzászólás Szerző: kapu48 »

Kicsit optimalizáltam:

Kód: Egész kijelölése

void feszultseg () {  // Feszültség mérése
  int freal;
 
  int fmind =  0;
  int fatlregi = fatl;
  for (int i = 0; i < 4; i++){
    freal = analogRead(A0);
    fmind +=  freal;
  }
 
  fatl = fmind >> 2; // fmind/4
  
  if (( fatl > (fatlregi)+21 ) || ( fatl < (fatlregi)-21 )){
      fesz = (fatl)*0.0048828125;
      feszvaltozott = 1;}
    else {
      fatl = fatlregi;  // Így nem mászhat el lassan az értéked
      feszvaltozott = 0;}   // <<< Ezt a törlést át raknám a ki írás rutinba, miután már megtörtén a frissítés!
}
8)
Adamyno
DrótVégénSzéndarab
Hozzászólások: 35
Csatlakozott: 2015. április 16. csütörtök, 19:29

Re: Arduino Nano feszültségmérés + kijelzés

Hozzászólás Szerző: Adamyno »

Ezt a sort nem értem:

Kód: Egész kijelölése

fatl = fmind >> 2; // fmind/4
Holnap kipróbálom!

Köszi!
Avatar
kapu48
Elektronbűvölő
Hozzászólások: 3375
Csatlakozott: 2008. augusztus 29. péntek, 6:00

Re: Arduino Nano feszültségmérés + kijelzés

Hozzászólás Szerző: kapu48 »

Az AVR-ben nincsen matamatikai proceszor, ezért az szorzás, osztás müveleteket jobb elkerülni.
Ezért 1*ű Osztás 2 négyzetével:
bitshift right (>>)
http://www.arduino.cc/en/Reference/Bitshift
Adamyno
DrótVégénSzéndarab
Hozzászólások: 35
Csatlakozott: 2015. április 16. csütörtök, 19:29

Re: Arduino Nano feszültségmérés + kijelzés

Hozzászólás Szerző: Adamyno »

Jó lett!
Köszi mégegyszer!
Válasz küldése