Mam prośbę o pomoc w zrozumieniu prowadzonych obliczeń zużycia energii w kodzie poniżej. Zrobiłem testy pomiarów zużycia energii przy wykorzystaniu czujnika acs712 wersja 20A podłączonego do Arduino Leonardo.
Niestety nie do końca rozumiem metodę obliczeń, którą częściowo znalazłem w sieci i to co finalnie poskładałem. Proszę o wyjaśnienie przebiegu kodu z perspektywy wykonywanych działań pomiarowych.
Zakładam, że w pętli for prowadzony jest pomiar odczytów z wejścia analogowego. Pomiar jest prowadzony w dłuższej perspektywie czasowej, dane są odczytywane z częstotliwością 1 ms, a następnie są przypisywane są do zmiennej AggregateReadingInTime.
Proszę o potwierdzenie czy działanie to robione jest że względu na, potrzebę wyeliminowania znacznych odchyleń dla wartości prowadzonych odczytów? Rozumiem, że bez zebrania w czasie 1000 ms kilkuset odczytów i późniejszego „uśrednienia” wyniku zebrane dane będą mocno rozstrzelone?
Zastanawiałem się też nad potrzebą podnoszenia odczytywanych wartości do potęgi. Czy tu chodzi o to, że ze względu na amplitudę prądu wartości są raz dodatnie, a raz ujemne? Rozumiem, że dzięki podniesieniu do potęgi eliminujemy znoszenie się przebiegu funkcji na osi ujemnej i dodatniej? Potem za pętlą przeprowadzane jest działanie odwrotne – wyciągamy pierwiastek, dzięki czemu sprowadzamy liczbę do pierwotnej postaci. Proszę o potwierdzenie lub wytłumaczenie jeśli coś mylę.
W całym tym programie są dwie rzeczy, które są dla mnie zupełnie niejasne.
Dlaczego przy każdym odczycie wejścia analogowego odejmujemy wartość -510? Z czego wynika ta liczba?
Nie rozumiem co w całej układance wyraża mi wartość zmiennej relation? Skąd jest ta relacja 5%1023?
Niestety nie do końca rozumiem metodę obliczeń, którą częściowo znalazłem w sieci i to co finalnie poskładałem. Proszę o wyjaśnienie przebiegu kodu z perspektywy wykonywanych działań pomiarowych.
Zakładam, że w pętli for prowadzony jest pomiar odczytów z wejścia analogowego. Pomiar jest prowadzony w dłuższej perspektywie czasowej, dane są odczytywane z częstotliwością 1 ms, a następnie są przypisywane są do zmiennej AggregateReadingInTime.
Proszę o potwierdzenie czy działanie to robione jest że względu na, potrzebę wyeliminowania znacznych odchyleń dla wartości prowadzonych odczytów? Rozumiem, że bez zebrania w czasie 1000 ms kilkuset odczytów i późniejszego „uśrednienia” wyniku zebrane dane będą mocno rozstrzelone?
Zastanawiałem się też nad potrzebą podnoszenia odczytywanych wartości do potęgi. Czy tu chodzi o to, że ze względu na amplitudę prądu wartości są raz dodatnie, a raz ujemne? Rozumiem, że dzięki podniesieniu do potęgi eliminujemy znoszenie się przebiegu funkcji na osi ujemnej i dodatniej? Potem za pętlą przeprowadzane jest działanie odwrotne – wyciągamy pierwiastek, dzięki czemu sprowadzamy liczbę do pierwotnej postaci. Proszę o potwierdzenie lub wytłumaczenie jeśli coś mylę.
W całym tym programie są dwie rzeczy, które są dla mnie zupełnie niejasne.
Dlaczego przy każdym odczycie wejścia analogowego odejmujemy wartość -510? Z czego wynika ta liczba?
Nie rozumiem co w całej układance wyraża mi wartość zmiennej relation? Skąd jest ta relacja 5%1023?
Kod:
int PinId =A0;
int SensorAnalogValue = 0;
float AggregateReadingInTime = 0;
float CurrentValue = 0;
float relation = 0.004887586;// 5 dzielone przez 1023
// Czujnik ACS712 5 Amper use 0.185
// Czujnik ACS712 10 Amper use 0.100
// Czujnik ACS712 30 Amper use 0.066
float resolution = 0.100; // rozdzielczość czujnika ACS712
int voltage = 233; // napięcie w gniazdku w Polsce jest ~233v w USA ~120V
void setup() {
Serial.begin(9600);
pinMode(PinId, INPUT);
}
void loop() {
AggregateReadingInTime =0;
for(int i=1; i<=1000; i++){
SensorAnalogValue = (analogRead(PinId) -510);
// funckja pow podniesienie do potęgi drugiej
AggregateReadingInTime += pow(SensorAnalogValue,2);
delay(1);
}
//funkcja sqrt pierwiastek drugiego stopnia
AggregateReadingInTime = (sqrt(AggregateReadingInTime/1000)) * relation;
CurrentValue = (AggregateReadingInTime/resolution);
if(CurrentValue <= 0.095){
CurrentValue = 0;
}
Serial.print("Current : ");
Serial.print(CurrentValue);
Serial.print(" A ");
Serial.print("Energy:");
Serial.print(CurrentValue * voltage);
Serial.println(" Watt ");
delay(100);
}