Skocz do zawartości

Pomiar prądu modułem ACS712


Krisk

Pomocna odpowiedź

Hej,

próbuję uruchomić moduł pomiaru ACS712 i nie mogę sobie z tym poradzić. Podłączyłem zgodnie ze schematem, przez moduł przechodzi AC 230V, jako obciążenie podłączałem po kolei, lampa LED, lutownica i żelazko. Po podłączeniu każdego urządzenia mierzyłem napięcie na wyjściu z modułu. Z obciążeniem czy bez, cały czas na wyjściu jest 2,36V.

Użyłem 2 różnych modułów, czy ktoś używał tych modułów, działają wam?

 

obraz.thumb.png.682d1adf71d39f50dc4e26d0c9fe6e4e.png

Link do komentarza
Share on other sites

Gdy prąd nie płynie to na wyjściu czujnika powinna być połowa napięcia zasilania - czyli ok. 2,5V. Zmiany tego napięcia nie są duże, rzędu 0,1 V na amper. Obserwuj na mierniku miejsca po przecinku.

Link do komentarza
Share on other sites

Mam nadzieję, że wiesz iż mierząc prąd zmienny otrzymujesz z czujnika napięcie zmienne, którego średnia wartość jest zawsze równa 2,5V, bez względu na wartość prądu. Trzeba to uwzględnić w pomiarach.

Zacznij od pomiarów prądu stałego.

Link do komentarza
Share on other sites

Zarejestruj się lub zaloguj, aby ukryć tę reklamę.
Zarejestruj się lub zaloguj, aby ukryć tę reklamę.

jlcpcb.jpg

jlcpcb.jpg

Produkcja i montaż PCB - wybierz sprawdzone PCBWay!
   • Darmowe płytki dla studentów i projektów non-profit
   • Tylko 5$ za 10 prototypów PCB w 24 godziny
   • Usługa projektowania PCB na zlecenie
   • Montaż PCB od 30$ + bezpłatna dostawa i szablony
   • Darmowe narzędzie do podglądu plików Gerber
Zobacz również » Film z fabryki PCBWay

analogRead() odczyta wartość chwilową. Jeśli dokonamy wielu pomiarów w czasie jednego okresu przebiegu (np. co 1 ms), to z tych wyników jesteśmy w stanie policzyć  sobie różne rzeczy - np. wartość średnią.

Link do komentarza
Share on other sites

Podłączyłem miernik z pomiarem prądu zmiennego i faktycznie wartość się zmienia w zależności od podłączenia. Znalazłem jakiś przykładowy kod, jednak na Serial print wychodzą takie błędy, co to może być?


/*
Measuring AC Current Using ACS712
www.Kraj.in
*/
const int sensorIn = A0;
int mVperAmp = 185; // use 100 for 20A Module and 66 for 30A Module
#define VOLT5 5

double Voltage = 0;
double VRMS = 0;
double AmpsRMS = 0;

void setup(){
Serial.begin(9600);
pinMode(VOLT5, OUTPUT);
digitalWrite(VOLT5, HIGH);

}

void loop(){

Voltage = getVPP();
VRMS = (Voltage/2.0) *0.707; //root 2 is 0.707
AmpsRMS = (VRMS * 1000)/mVperAmp;
Serial.print(AmpsRMS);
Serial.println(" Amps RMS");
}

float getVPP()
{
float result;
int readValue; //value read from the sensor
int maxValue = 0; // store max value here
int minValue = 1024; // store min value here

uint32_t start_time = millis();
while((millis()-start_time) < 3000) //sample for 3 Sec
{
readValue = analogRead(sensorIn);
// see if you have a new maxValue
if (readValue > maxValue)
{
/*record the maximum sensor value*/
maxValue = readValue;
}
if (readValue < minValue)
{
/*record the minimum sensor value*/
minValue = readValue;
}
}

// Subtract min from max
result = ((maxValue - minValue) * 5.0)/1024.0;
return result;
}

Soft WDT reset

Exception (4):
epc1=0x40007307 epc2=0x00000000 epc3=0x00000000 excvaddr=0x00000000 depc=0x00000000

>>>stack>>>

ctx: cont
sp: 3ffffdd0 end: 3fffffd0 offset: 0160
3fffff30:  00000005 00000005 00000001 40226cae  
3fffff40:  00000000 00000c00 00000bb7 00000bb7  
3fffff50:  00070007 00050007 00050006 00050005  
3fffff60:  00000000 00001306 40234c74 00000003  
3fffff70:  402021db 7f440000 3ffee530 00000004  
3fffff80:  00000bb7 00000c00 00000003 402010a0  
3fffff90:  40201284 3ffe87d6 3ffee530 3ffee598  
3fffffa0:  3fffdad0 00000000 3ffee584 40201120  
3fffffb0:  00000000 00000000 3ffee584 402019d4  
3fffffc0:  feefeffe feefeffe 3fffdab0 40100dc9  
<<<stack<<<

--------------- CUT HERE FOR EXCEPTION DECODER ---------------
�)����(���d�R@D0.01 Amps RMS

Link do komentarza
Share on other sites

Co to za płytka, bo chyba nie atmega? Watchdog się włącza bo 3 sekundy to dla niego za dużo i uważa że program się zwiesił. Sprawdź w dokumentacji dla swojej płytki jak nakarmić watchdoga albo pokombinuj z yield/delay.

Link do komentarza
Share on other sites

Próbowałem na płytkach ESP8266 i ESP32, w obu ten sam błąd. Zmieniłem na 1 s i jest ok.

Wyniki z tego pomiaru nie są idealne, przykładowo nawet jak nie jest podłączone żadne urządzenie to wyniki są takie:

0.10 Amps RMS
0.10 Amps RMS
0.10 Amps RMS
0.09 Amps RMS
0.10 Amps RMS
0.09 Amps RMS
0.10 Amps RMS
0.11 Amps RMS
0.10 Amps RMS
0.10 Amps RMS
0.10 Amps RMS
0.10 Amps RMS
0.10 Amps RMS
0.10 Amps RMS
0.09 Amps RMS

Za bardzo mi to chyba nie będzie przeszkadzać, potrzebuję to tylko do wyłapania, czy pracuje pompa, która ma 800W, więc ustawię jakiś próg, aby otrzymać informację.

 

 

Link do komentarza
Share on other sites

(edytowany)

W 8266 możesz wrzucić do pętli delay(0) albo yield(). W esp32 lepiej użyć możliwości RTOS (w Arduino IDE możesz ich użyć bez problemu i instalacji jakichs dodatków).

Watchdog o ile pamietam jest ustawiony na 2 sekundy, ale to można podobno zmienić (nie próbowałem).

Edytowano przez ethanak
Link do komentarza
Share on other sites

1 godzinę temu, Krisk napisał:

nawet jak nie jest podłączone żadne urządzenie to wyniki są takie:

0.10 Amps RMS

Taka to uroda tej metody pomiaru.

Choć w czasie jednego cyklu pomiarowego jest wykonywanych mnóstwo pomiarów, to wystarczy dosłownie jeden o trochę nietypowej wartości (np. jakieś zakłócenia) i cały wynik jest zafałszowany. Aby tego uniknąć niezbędne jest filtrowanie sygnału.

1 godzinę temu, Krisk napisał:

Zmieniłem na 1 s i jest ok.

Jeśli do przesyłania wyników będziesz używał wi-fi, to już pewnie nie będzie ok. Zastosuj lepiej sugestie @ethanaka.

Link do komentarza
Share on other sites

Program będzie pracować na 8266, nie do końca rozumiem po co delay(0) i w którym miejscu to dodać.

Generalnie chciałbym dodać warunek, że jeśli wartość AmpRMS > 0.2 to otrzymuję powiadomienie, ale tylko raz. I jeśli wartość spadnie poniżej 0.2 to dostaję inne powiadomienie. Nie wiem do końca jak ten kawałek napisać. Zrobiłem tak jak poniżej, ale wtedy otrzymuję powiadomienia co chwilę.

    if(AmpsRMS > 0.2)
    {Serial.println("POMPA PRACUJE!!!");
    bot.sendMessage(CHAT_ID, "POMPA PRACUJE!!!");
    }

 

Link do komentarza
Share on other sites

19 minut temu, Krisk napisał:

nie do końca rozumiem po co delay(0)

Oba rodzaje ESP oprócz wykonywania Twojego programu mają do wykonania szereg czynności porządkowych, które muszą być wykonane w odpowiednim czasie. Normalnie ma to miejsce po każdym "obiegu" loop(). Twój program czekając na wynik pomiaru przez 3 sekundy uniemożliwiał to i pojawiał się błąd .

Wstawiając delay(0) do wnętrza pętli while (w dowolnym jej miejscu) oddasz na chwilę sterowanie do warstwy zarządzającej, aby zrobiła porządki.

21 minut temu, Krisk napisał:

otrzymuję powiadomienia co chwilę.

Musisz wprowadzić dodatkową zmienną, która będzie zapamiętywała fakt wysłania powiadomienia. Przed wysłaniem następnego powiadomienia sprawdzasz zawartość tej zmiennej i wiesz czy wysłać, czy nie.

Link do komentarza
Share on other sites

9 minut temu, jand napisał:

Musisz wprowadzić dodatkową zmienną, która będzie zapamiętywała fakt wysłania powiadomienia. Przed wysłaniem następnego powiadomienia sprawdzasz zawartość tej zmiennej i wiesz czy wysłać, czy nie.

A dasz przykład takiego zapisu?

 

Link do komentarza
Share on other sites

 bool stan = true; //zmienna globalna


if(AmpsRMS > 0.2 && stan == true)
    {Serial.println("POMPA PRACUJE!!!");
    bot.sendMessage(CHAT_ID, "POMPA PRACUJE!!!"); 
     stan = false;
    }  
if(AmpsRMS < 0.2 && stan == false)
    {Serial.println("POMPA NIE PRACUJE!!!");
    bot.sendMessage(CHAT_ID, "POMPA NIE PRACUJE!!!"); 
     stan = true;
    }

 

Link do komentarza
Share on other sites

Dołącz do dyskusji, napisz odpowiedź!

Jeśli masz już konto to zaloguj się teraz, aby opublikować wiadomość jako Ty. Możesz też napisać teraz i zarejestrować się później.
Uwaga: wgrywanie zdjęć i załączników dostępne jest po zalogowaniu!

Anonim
Dołącz do dyskusji! Kliknij i zacznij pisać...

×   Wklejony jako tekst z formatowaniem.   Przywróć formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Twój link będzie automatycznie osadzony.   Wyświetlać jako link

×   Twoja poprzednia zawartość została przywrócona.   Wyczyść edytor

×   Nie możesz wkleić zdjęć bezpośrednio. Prześlij lub wstaw obrazy z adresu URL.

×
×
  • Utwórz nowe...

Ważne informacje

Ta strona używa ciasteczek (cookies), dzięki którym może działać lepiej. Więcej na ten temat znajdziesz w Polityce Prywatności.