• Witaj na Forum Arduino Polska! Zapraszamy do rejestracji!
  • Znajdziesz tutaj wiele informacji na temat hardware / software.
Witaj! Logowanie Rejestracja


Ocena wątku:
  • 0 głosów - średnia: 0
  • 1
  • 2
  • 3
  • 4
  • 5
Pomiar prądu zmiennego z gniazdka (230v) czujnikiem acs712 na Arduino Leonardo
#1
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?


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

}
 
Odpowiedź
#2
Witam
Po kolei:
-To czujnik do pomiaru prądu przemiennego.
- Pomiar nie trwa 1000 ms. ale wykonujesz 1000 pomiarów. Po każdym pomiarze robisz 1 ms. przerwy.
- W praktyce robi się aż tyle pomiarów, bo to jest sinusoida- zmienna w czasie - i tu masz absolutną rację.
- Operacja podnoszenie do kwadratu "podnosi" drugą połówkę przebiegu do pomiaru.
- Wydaje mi się że masz tu błąd: sqrt(AggregateReadingInTime/1000), bo 1000*X*X to nie to samo co SQRT(X*X/1000), za to poprawnie jest SQRT(X*X) /1000. Chyba źle zamknięty nawias....a wynik różni się przeszło 30 razy. [sqrt(1000)].  Huh
- Skąd te 510 ? Przetwornik AC jest 10-bitowy czyli mierzone napięcie wejściowe w zakresie 0-5 V konwertuje na 1 z 1024 stanów, gdzie 0 to 0V a 1023 to 5V. Ponieważ ten Twój czujnik mierzy prąd przemienny zatem przy zerowej wartości na jego wyjściu jest 2,5 V - dokładnie połowa napięcia. Dla naszego wejścia Analogowego to wartość ok 512. Tutaj zakłada się 510 - i o tyle należy odjąć lub dodać do równania.
- Z kolei 5/1024 daje nam tzw. rozdzielczość czyli odpowiedź na pytanie ile zmieniło się napięcie wejściowe jeśli Analog zmienił swój stan o 1. 
Pozostałe rzeczy są już raczej zrozumiałe. 
Pozdrawiam   
 
Odpowiedź
#3
(21-01-2016, 19:30)wojtekizk napisał(a): Witam
Po kolei:
-To czujnik do pomiaru prądu przemiennego.
- Pomiar nie trwa 1000 ms. ale wykonujesz 1000 pomiarów. Po każdym pomiarze robisz 1 ms. przerwy.
- W praktyce robi się aż tyle pomiarów, bo to jest sinusoida- zmienna w czasie - i tu masz absolutną rację.
- Operacja podnoszenie do kwadratu "podnosi" drugą połówkę przebiegu do pomiaru.
- Wydaje mi się że masz tu błąd: sqrt(AggregateReadingInTime/1000), bo 1000*X*X to nie to samo co SQRT(X*X/1000), za to poprawnie jest SQRT(X*X) /1000. Chyba źle zamknięty nawias....a wynik różni się przeszło 30 razy. [sqrt(1000)].  Huh
- Skąd te 510 ? Przetwornik AC jest 10-bitowy czyli mierzone napięcie wejściowe w zakresie 0-5 V konwertuje na 1 z 1024 stanów, gdzie 0 to 0V a 1023 to 5V. Ponieważ ten Twój czujnik mierzy prąd przemienny zatem przy zerowej wartości na jego wyjściu jest 2,5 V - dokładnie połowa napięcia. Dla naszego wejścia Analogowego to wartość ok 512. Tutaj zakłada się 510 - i o tyle należy odjąć lub dodać do równania.
- Z kolei 5/1024 daje nam tzw. rozdzielczość czyli odpowiedź na pytanie ile zmieniło się napięcie wejściowe jeśli Analog zmienił swój stan o 1. 
Pozostałe rzeczy są już raczej zrozumiałe. 
Pozdrawiam   



ok. to dzięki za uświadomienie skąd ta liczba 512 Smile . Czyli mamy więc dwie rozdzielczości? Pierwsza to ta  rozdzielczość czujnika "100 mv", a druga to wejście analogowe (0-1024)?

Jakie należny przyjąć założenia jeśli wejście analogowe modułu esp8216-12 akceptuje napięcie wejściowe tylko 1V? Chcę wgrać ten program docelowo na esp8216-12.  Gdzieś wyczytałem, że tam jest 8 bitowy przetwornik. Więc skala będzie odczytów z wejścia analogowego wyniesie od 0-255? Proszę o potwierdzenie.

Zrobiłem dzielnik napięcia tak żeby na wejściu analogowym czujnika zamiast 2,5V w stanie spoczynku (brak odbiornika) było napięcie 0,5V i maksymalnie 1V przy pełnym obciążeniu układu. Dzięki temu moduł esp8216-12 będzie tolerować takie stany.

Rozumiem więc, że  1,0/255 = 0,003921568627451 i na taką zmienić w programie dla tego układu? Dodatkowo wartość, którą będę odejmować muszę wyznaczyć na 127?
 
Odpowiedź
#4
(21-01-2016, 22:44)kamil2234 napisał(a):
(21-01-2016, 19:30)wojtekizk napisał(a): Witam
Po kolei:
-To czujnik do pomiaru prądu przemiennego.
- Pomiar nie trwa 1000 ms. ale wykonujesz 1000 pomiarów. Po każdym pomiarze robisz 1 ms. przerwy.
- W praktyce robi się aż tyle pomiarów, bo to jest sinusoida- zmienna w czasie - i tu masz absolutną rację.
- Operacja podnoszenie do kwadratu "podnosi" drugą połówkę przebiegu do pomiaru.
- Wydaje mi się że masz tu błąd: sqrt(AggregateReadingInTime/1000), bo 1000*X*X to nie to samo co SQRT(X*X/1000), za to poprawnie jest SQRT(X*X) /1000. Chyba źle zamknięty nawias....a wynik różni się przeszło 30 razy. [sqrt(1000)].  Huh
- Skąd te 510 ? Przetwornik AC jest 10-bitowy czyli mierzone napięcie wejściowe w zakresie 0-5 V konwertuje na 1 z 1024 stanów, gdzie 0 to 0V a 1023 to 5V. Ponieważ ten Twój czujnik mierzy prąd przemienny zatem przy zerowej wartości na jego wyjściu jest 2,5 V - dokładnie połowa napięcia. Dla naszego wejścia Analogowego to wartość ok 512. Tutaj zakłada się 510 - i o tyle należy odjąć lub dodać do równania.
- Z kolei 5/1024 daje nam tzw. rozdzielczość czyli odpowiedź na pytanie ile zmieniło się napięcie wejściowe jeśli Analog zmienił swój stan o 1. 
Pozostałe rzeczy są już raczej zrozumiałe. 
Pozdrawiam   



ok. to dzięki za uświadomienie skąd ta liczba 512 Smile . Czyli mamy więc dwie rozdzielczości? Pierwsza to ta  rozdzielczość czujnika "100 mv", a druga to wejście analogowe (0-1024)?

Jakie należny przyjąć założenia jeśli wejście analogowe modułu esp8216-12 akceptuje napięcie wejściowe tylko 1V? Chcę wgrać ten program docelowo na esp8216-12.  Gdzieś wyczytałem, że tam jest 8 bitowy przetwornik. Więc skala będzie odczytów z wejścia analogowego wyniesie od 0-255? Proszę o potwierdzenie.

Zrobiłem dzielnik napięcia tak żeby na wejściu analogowym czujnika zamiast 2,5V w stanie spoczynku (brak odbiornika) było napięcie 0,5V i maksymalnie 1V przy pełnym obciążeniu układu. Dzięki temu moduł esp8216-12 będzie tolerować takie stany.

Rozumiem więc, że  1,0/255 = 0,003921568627451 i na taką zmienić w programie dla tego układu? Dodatkowo wartość, którą będę odejmować muszę wyznaczyć na 127?

Witam
Dokładnie tak jak piszesz. 
Pozdrawiam
 
Odpowiedź
#5
O ile program działa na Arduino to na ESP8266-12 już nie chce.

Dociekając przyczyn przeniosłem zebrane dane z  na wykres.  Jak widać po danych (dane > 255 )  przetwornik ESP8266-12 jest 10 bitowy, a nie jak sądziłem 8 bitowy.

Nie mniej jednak patrząc na wykres można zauważyć charakterystyczny spadek w przebiegu amplitudy do około 360.  Niestety ale to mocno zaburza pomiar. Powtórzyłem badanie na Arduino Leonardo i tam taki problem nie występuje.  Szukałem również w przyczynach zasilenia układu stosując zamiennie port usb jak również zasilacz serwisowy.  W obydwu przypadkach problem się powtarza. Kondensatory na magistrali 3,3 V lub 5,0 nie przyniosły pozytywnych rezultatów.
Macie pomysł skąd ten spadek?

Pomiar prądu w czasie łącznym 500 ms z częstotliwością próbkownaia co 1 ms z czujnika ACS712 (20A) na ESP8266-12 (dzielnik napięcia 2,5V -> 0,5V gdzie R1 to 200K R2 to 50K ) :

[Obrazek: 768cc9d7350fc2e4.png]

Dla porównania pomiar na Arduino Leonardo

[Obrazek: 2b71073219be34f4.png]



Dodaje jeszcze jeden pomiar dla Leonardo z dzielnikiem napięcia (dzielnik napięcia 2,5V -> 0,5V gdzie R1 to 200K R2 to 50K )

[Obrazek: 30c28f664ddec93a.png]


Jak widać przy wykorzystaniu dzielnika napięć rozdzielczość pomiaru dla Arduino Leonardo nie jest wystarczająca. Jednak test z Arduino i dzielnikiem napięć miał wykluczyć czy zostawanie dzielnika w ESP8266-12 mogło mieć wpływ na ten zjazd do 360. Jak widać nie ma to wpływu. Pytanie co do przyczyny spadku na amplitudzie pozostaje więc otwarte.
 
Odpowiedź
#6
Poprawiłem kod dla ESP8266-12 - można go oczywiście stosować również na Arduino Smile  Udaje się już mierzyć prąd powyżej 30-40 Watt.

Stwierdziłem, że będę wycinać to coś u dołu lub u góry poprzez określenie PERCENTYLA.  Zanim zacząłem to pisać pobawiłem się wykresami w excelu, aby sprawdzić czy funkcja będzie odporna na duże zniekształcenia.  Akurat w moim wypadku nie było ich tak dużo więc postanowiłem każdy pomiar przekraczający PERCENTYL górny lub dolny zmienić na aktualną wartość środka osi po której porusza się amplituda przebiegu prądu w danym momencie.  Dodatkowo,  aby nie wycinać wszystkiego z górnego pasma i dolnego pasma zostawiłem marines o wartości 5. Margines ma na celu ograniczenie wycinania chwilowych nieznacznych skoków.  

Nie wiem czy prawidłowo (jestem początkujący) ale mam zamiar go jeszcze udoskonalić jak przestudiuje wzory na przebiegi prądu, zniekształcenia harmoniczne etc. 

  
Kod:
#include <stdio.h>
#include <stdlib.h>

int lo = 1000 ;
int PinId =A0;
int SensorAnalogValue = 0;
int array[1000];
int tablica[1000];
float AggregateReadingInTime = 0;
double CurrentValue = 0;
float relation = 0.004887586;
//float relation = 0.003921569;
float Srednia = 0;
int percentyl_top, percentyl_lower;

float resolution = 0.100;
int voltage = 233;
float srednia = 0 ;

void setup() {


Serial.begin(9600);
pinMode(PinId, INPUT);


}

void loop() {



 for(int i=1;  i<=lo; i++){
 
   array[i] = analogRead(PinId);
   tablica[i] = array[i];
 //  SensorAnalogValue = SensorAnalogValue - 404;
 // funckja pow podniesienie do potęgi drugiej
   //AggregateReadingInTime += pow(SensorAnalogValue,2);
   delay(1);
 }


percentyl_lower = mypercentile(array,0.05, lo);
Serial.print("percentyl_lower: ");
Serial.print(percentyl_lower);
Serial.print(" percentyl_top: ");
percentyl_top  = mypercentile(array,0.95, lo);
Serial.println(percentyl_top);

srednia  =  (percentyl_top+percentyl_lower)/2;
Serial.print("Srednia: ");
Serial.println( srednia);

 
for(int i=1;  i<=lo; i++){

 if ( tablica[i] > percentyl_top +5 ) {
       tablica[i] = srednia  ;
   }

 if ( tablica[i] < percentyl_lower  -5 ) {
      tablica[i] = srednia ;
     // Serial.println(tablica[i]);
      // delay(100);
   }

  //Serial.println(tablica[i]);
   
    tablica[i] = tablica[i] - srednia;


   
  AggregateReadingInTime += pow(tablica[i],2);
 //delay(100);
 }

 

 //funkcja sqrt pierwiastek drugiego stopnia

 AggregateReadingInTime = (sqrt(AggregateReadingInTime/lo)) ;

 Serial.print("WS : ");
 Serial.print(AggregateReadingInTime);
 
 AggregateReadingInTime = AggregateReadingInTime * relation;

 CurrentValue = (AggregateReadingInTime/resolution);

 
 
 Serial.print(" Current : ");
 Serial.print(CurrentValue);
 Serial.print(" A ");



 Serial.print("Energy:");
 Serial.print(CurrentValue * voltage);
 Serial.println(" Watt ");

/* */



 


 delay(1500);

}

int mypercentile(int data[], float percentile, int count){
 float p, allindex;
 int result = 0;
   if((0 < percentile) && (percentile < 1 )) {
       p = percentile;
   }else if( 1 < percentile && percentile <= 100 ) {
       p = percentile * .01;
   }else {
       
       return(result);
   }
 
   //Serial.print("count drugi: ");
  // Serial.println(count);

   allindex = (count-1)*p;
    int intvalindex = (int)(allindex);
   float floatval = allindex - intvalindex;
   sort(data, count);


    //Serial.print("  floatval: ");
   //Serial.println(  floatval);

   if((floatval- (long int)floatval) == 0){
       result = data[intvalindex];
   }else {
       if(count > intvalindex+1)
           result = floatval*(data[intvalindex+1] - data[intvalindex]) + data[intvalindex];
       else
           result = data[intvalindex];
   }
 
  return(result);

   

}

void sort(int a[], int size) {
   for(int i=0; i<(size-1); i++) {
       for(int o=0; o<(size-(i+1)); o++) {
               if(a[o] > a[o+1]) {
                   int t = a[o];
                   a[o] = a[o+1];
                   a[o+1] = t;
               }
       }
   }
}
 
Odpowiedź
#7
Panowie jesli pozwolicie to zapytam: Czy ten czujnik nadaje sie do poiaru prądu do około 1A ale prądu stałego ?
Jeżeli tak to, gdybym go zastosował do pomiaru prądu stałego to wynik musiałbym podzielić przez 2 ?
Wiem że są wykonania ASC dla 5, 20 i 30A ale Może są jakieś odpowiedniki tego układu dedykowane dla niższych wartości i prądu stałego przy napięciu około 12V ?
 
Odpowiedź
#8
Witam
Musisz pogrzebać u wujka Google. Generalnie jest całe multum gotowych rozwiązań. Zacznij od Allegro, potem może TME, Nettigo, Pololu, Bootland... jest tego sporo na rynku.
Pozdrawiam
 
Odpowiedź
#9
(25-01-2016, 00:47)kamil2234 napisał(a): Poprawiłem kod dla ESP8266-12 - można go oczywiście stosować również na Arduino Smile  Udaje się już mierzyć prąd powyżej 30-40 Watt.

Stwierdziłem, że będę wycinać to coś u dołu lub u góry poprzez określenie PERCENTYLA.  Zanim zacząłem to pisać pobawiłem się wykresami w excelu, aby sprawdzić czy funkcja będzie odporna na duże zniekształcenia.  Akurat w moim wypadku nie było ich tak dużo więc postanowiłem każdy pomiar przekraczający PERCENTYL górny lub dolny zmienić na aktualną wartość środka osi po której porusza się amplituda przebiegu prądu w danym momencie.  Dodatkowo,  aby nie wycinać wszystkiego z górnego pasma i dolnego pasma zostawiłem marines o wartości 5. Margines ma na celu ograniczenie wycinania chwilowych nieznacznych skoków.  

Nie wiem czy prawidłowo (jestem początkujący) ale mam zamiar go jeszcze udoskonalić jak przestudiuje wzory na przebiegi prądu, zniekształcenia harmoniczne etc. 

  
Kod:
#include <stdio.h>
#include <stdlib.h>

int lo = 1000 ;
int PinId =A0;
int SensorAnalogValue = 0;
int array[1000];
int tablica[1000];
float AggregateReadingInTime = 0;
double CurrentValue = 0;
float relation = 0.004887586;
//float relation = 0.003921569;
float Srednia = 0;
int percentyl_top, percentyl_lower;

float resolution = 0.100;
int voltage = 233;
float srednia = 0 ;

void setup() {


Serial.begin(9600);
pinMode(PinId, INPUT);


}

void loop() {



 for(int i=1;  i<=lo; i++){
 
   array[i] = analogRead(PinId);
   tablica[i] = array[i];
 //  SensorAnalogValue = SensorAnalogValue - 404;
 // funckja pow podniesienie do potęgi drugiej
   //AggregateReadingInTime += pow(SensorAnalogValue,2);
   delay(1);
 }


percentyl_lower = mypercentile(array,0.05, lo);
Serial.print("percentyl_lower: ");
Serial.print(percentyl_lower);
Serial.print(" percentyl_top: ");
percentyl_top  = mypercentile(array,0.95, lo);
Serial.println(percentyl_top);

srednia  =  (percentyl_top+percentyl_lower)/2;
Serial.print("Srednia: ");
Serial.println( srednia);

 
for(int i=1;  i<=lo; i++){

 if ( tablica[i] > percentyl_top +5 ) {
       tablica[i] = srednia  ;
   }

 if ( tablica[i] < percentyl_lower  -5 ) {
      tablica[i] = srednia ;
     // Serial.println(tablica[i]);
      // delay(100);
   }

  //Serial.println(tablica[i]);
   
    tablica[i] = tablica[i] - srednia;


   
  AggregateReadingInTime += pow(tablica[i],2);
 //delay(100);
 }

 

 //funkcja sqrt pierwiastek drugiego stopnia

 AggregateReadingInTime = (sqrt(AggregateReadingInTime/lo)) ;

 Serial.print("WS : ");
 Serial.print(AggregateReadingInTime);
 
 AggregateReadingInTime = AggregateReadingInTime * relation;

 CurrentValue = (AggregateReadingInTime/resolution);

 
 
 Serial.print(" Current : ");
 Serial.print(CurrentValue);
 Serial.print(" A ");



 Serial.print("Energy:");
 Serial.print(CurrentValue * voltage);
 Serial.println(" Watt ");

/* */



 


 delay(1500);

}

int mypercentile(int data[], float percentile, int count){
 float p, allindex;
 int result = 0;
   if((0 < percentile) && (percentile < 1 )) {
       p = percentile;
   }else if( 1 < percentile && percentile <= 100 ) {
       p = percentile * .01;
   }else {
       
       return(result);
   }
 
   //Serial.print("count drugi: ");
  // Serial.println(count);

   allindex = (count-1)*p;
    int intvalindex = (int)(allindex);
   float floatval = allindex - intvalindex;
   sort(data, count);


    //Serial.print("  floatval: ");
   //Serial.println(  floatval);

   if((floatval- (long int)floatval) == 0){
       result = data[intvalindex];
   }else {
       if(count > intvalindex+1)
           result = floatval*(data[intvalindex+1] - data[intvalindex]) + data[intvalindex];
       else
           result = data[intvalindex];
   }
 
  return(result);

   

}

void sort(int a[], int size) {
   for(int i=0; i<(size-1); i++) {
       for(int o=0; o<(size-(i+1)); o++) {
               if(a[o] > a[o+1]) {
                   int t = a[o];
                   a[o] = a[o+1];
                   a[o+1] = t;
               }
       }
   }
}

Cześć,
Twój kod działa prawie doskonale. Prawie, bo o ile całkiem ładnie mierzy pobór prądu, o tyle czasami wyrzuca jakieś przekłamania. Rzuć proszę okiem na te pomiary (bez podłączonego żadnego obciążenia):

Kod:
Srednia: 521.00; WS: 31.97 Current: 1.25 A Energy: 288.36 W
Srednia: 489.00; WS: 2.10 Current: 0.08 A Energy: 18.90 W
Srednia: 489.00; WS: 2.30 Current: 0.09 A Energy: 20.75 W
Srednia: 485.00; WS: 2.65 Current: 0.10 A Energy: 23.87 W
Srednia: 490.00; WS: 1.89 Current: 0.07 A Energy: 17.03 W
Srednia: 521.00; WS: 31.81 Current: 1.25 A Energy: 286.91 W
Srednia: 490.00; WS: 1.80 Current: 0.07 A Energy: 16.27 W
Srednia: 520.00; WS: 31.78 Current: 1.25 A Energy: 286.60 W
Srednia: 490.00; WS: 2.50 Current: 0.10 A Energy: 22.55 W
Srednia: 489.00; WS: 2.24 Current: 0.09 A Energy: 20.24 W
Srednia: 490.00; WS: 2.04 Current: 0.08 A Energy: 18.40 W
Srednia: 521.00; WS: 31.34 Current: 1.23 A Energy: 282.70 W
Srednia: 521.00; WS: 28.66 Current: 1.12 A Energy: 258.53 W
Srednia: 522.00; WS: 29.15 Current: 1.14 A Energy: 262.96 W
Srednia: 494.00; WS: 2.27 Current: 0.09 A Energy: 20.50 W
Srednia: 493.00; WS: 2.06 Current: 0.08 A Energy: 18.63 W
Srednia: 493.00; WS: 1.95 Current: 0.08 A Energy: 17.63 W
Srednia: 521.00; WS: 31.95 Current: 1.25 A Energy: 288.20 W
Srednia: 521.00; WS: 31.05 Current: 1.22 A Energy: 280.04 W
Srednia: 490.00; WS: 2.32 Current: 0.09 A Energy: 20.94 W
Srednia: 492.00; WS: 1.78 Current: 0.07 A Energy: 16.08 W
Srednia: 490.00; WS: 2.09 Current: 0.08 A Energy: 18.90 W
Srednia: 492.00; WS: 1.93 Current: 0.08 A Energy: 17.38 W
Srednia: 522.00; WS: 29.96 Current: 1.17 A Energy: 270.21 W
Srednia: 491.00; WS: 2.32 Current: 0.09 A Energy: 20.95 W
Srednia: 491.00; WS: 2.06 Current: 0.08 A Energy: 18.60 W
Srednia: 491.00; WS: 1.88 Current: 0.07 A Energy: 16.98 W
Srednia: 490.00; WS: 2.07 Current: 0.08 A Energy: 18.66 W
Srednia: 522.00; WS: 31.05 Current: 1.22 A Energy: 280.04 W
Srednia: 524.00; WS: 29.97 Current: 1.18 A Energy: 270.36 W
Srednia: 494.00; WS: 2.01 Current: 0.08 A Energy: 18.12 W
Srednia: 494.00; WS: 1.94 Current: 0.08 A Energy: 17.46 W
Srednia: 495.00; WS: 1.99 Current: 0.08 A Energy: 17.99 W
Srednia: 522.00; WS: 30.97 Current: 1.21 A Energy: 279.36 W
Srednia: 522.00; WS: 30.57 Current: 1.20 A Energy: 275.76 W
Srednia: 521.00; WS: 29.99 Current: 1.18 A Energy: 270.51 W

Masz może pomysł, skąd się mogą brać te przekłamania? ESP zasilam z przetwornicy, która daje ładne i stabilne napięcie, więc samo zasilanie nie powinno być problemem...

Będę wdzięczny za jakąkolwiek pomoc.

--
EDIT

Zmieniłem wartości w tych dwóch liniach (z 0.05 i 0.95) i chyba jest już ok:
Kod:
percentyl_lower = mypercentile(array,0.10, lo);
percentyl_top  = mypercentile(array,0.90, lo);

Działa, ale nadal nie rozumiem dlaczego i w czym tkwi problem Wink

Pozdrawiam serdecznie!
Łukasz
 
Odpowiedź
#10
Cześć, próbuję odpalić ten moduł z arduino (z wgranym programem (tym pierwszym)) i niby wszysko ok, ale wartości które widzę w serial monitorze są złe. Po podłączeniu żarówki 100W (powinna pobierać około 0,5A) program pokozuje 0,00A jednak jak zamieniłem wartości w pętli
if(CurrentValue <= 0.095){
CurrentValue = 0;
}
z 0.095 na 0.005 to pokazuje mierzoną wartość 0,09A
czy wiesz z czego może to wynikać ??
 
Odpowiedź
  


Skocz do:


Przeglądający: 1 gości