Ú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;