Industriële fabricage
Industrieel internet der dingen | Industriële materialen | Onderhoud en reparatie van apparatuur | Industriële programmering |
home  MfgRobots >> Industriële fabricage >  >> Manufacturing Technology >> Productieproces

Meet elke wisselstroom met ACS712

Componenten en benodigdheden

Arduino UNO
× 1
OLED i²c 128x32
× 1
ACS712 30A
× 1
LCD 16x2 i²c
× 1

Over dit project

WEES VOORZICHTIG ALS U DE STROOMLIJN GEBRUIKT

Hallo, en welkom bij een andere tutorial, deze gaat over het meten van wisselstroom (AC), met behulp van ACS712 Ik gebruik de 30 Amps-versie die ACS712 30A is, en ons mooie Arduino Uno-bord, ik probeerde een OLED-scherm toe te voegen maar eindigde helaas Ik heb het tijdens het opnemen van de zelfstudie afgebroken, dus schakelde ik over naar het LCD-scherm, maar hieronder vind je de bedrading en codes voor beide versies.

En met "Elke AC ..." bedoel ik dat we een code / bibliotheek gaan zien die voor alle signaaltypen werkt, niet alleen voor sinusgolven één, en dat onze ampèremeter het TRUE ROOT MEAN SQUARE kan berekenen. En merk op dat de sensor het Hall-effect gebruikt (productie van een spanningsverschil over een elektrische geleider, dwars op een elektrische stroom in de geleider en op een aangelegd magnetisch veld loodrecht op de stroom)

Je kunt dit project met dit combineren:Eenvoudige meting van AC-spanning met Arduino en ZMPT101B

Er zullen tests worden uitgevoerd op een gloeilamp, aangestuurd door een lichtdimmer in serie met een referentiemultimeter en de ACS712-stroomsensormodule.

Dit is het plan:

  • Eerst moeten we onze module koppelen aan het Arduino-bord en de signaalvorm controleren wanneer de dimmer AAN staat - Volledige cyclus - Halve cyclus.
  • Vervolgens gaan we een eenvoudige code controleren waarvoor geen bibliotheek nodig is, maar die alleen werkt met het Sinewaves-signaal (het zal worden getest).
  • Daarna gaan we de code zien die de TRMS van de AC zal meten, en het LCD-scherm gebruiken.

Onderdelen

Wees voorzichtig bij het kiezen van de ACS712, probeer niet op veilig te spelen zoals ik deed (door een 30 Amp-versie aan te schaffen), dit zal alleen maar grote fluctuaties geven als je het probeert te gebruiken voor huishoudelijk gebruik of kleine versterkers, dus hier voor mij zou een 5A of 10A versie prima zijn geweest. Houd er ook rekening mee dat 30A of 20A ... ook van invloed zijn op uw kalibraties, maar er wordt uitgelegd hoe u moet kalibreren in video en in opmerkingen over codes.

Dat zijn de onderdelen die ik heb gebruikt, je kunt de UNO vervangen door elk compatibel bord, of die LCD i²c door een OLED of een ander scherm dat je verkiest.

Test 1

Bekabeling en code

De bedrading voor test 1 vindt u hieronder (bedrading 1), naast de code (code 1).

Resultaten

Upload de code en start de seriële plotter, je zou een sinusgolfachtig signaal moeten kunnen zien, de rode lijn geeft aan wanneer ik de dimmer uitzette en de stroom die vorm begon te krijgen die je normaal in een triac aantreft.

Test 2

Als u nu de stroom wilt meten met alleen de bovenstaande code, krijgt u waarden rond 512 - 511, ze weerspiegelen helemaal niet de RMS-waarde. Dus om de RMS-waarde van het signaal te meten, houden we dezelfde bedrading als hierboven, maar nu hebben we een andere code nodig die de RMS kan berekenen.

Bekabeling en code

De bedrading is hetzelfde als (bedrading 1), maar met een andere code vindt u hieronder (code 2).

Resultaten

Zoals je kunt zien, zijn de waarden aan de linkerkant (RMS) hetzelfde als de waarde gemeten door de multimeter, aan de rechterkant zijn dat piek-tot-piek-waarden, en merk op dat de dimmer op volledige cyclus staat, aangezien ik een 75W-lamp gebruik en 230VAC/50Hz.

!!!!!!!!!!!!!!!! MAAR !!!!!!!!!!!!!!!!!!!!!

Hier heb ik mijn lichtdimmer helemaal naar beneden gedraaid, wat betekent dat ik ongeveer 1/4 van een cyclus ben, de multimeter geeft me 0.21A maar mijn code geeft me 0.36A, de code meet nog steeds van Peak tot Peak, maar zoals je hierboven kunt zien, is mijn signaal niet lineair als ik de dimmer helemaal omlaag zet.

En dat is het verschil tussen een TRMS-meting en een meting die alleen werkt met een sinusgolfsignaal.

Test 3

Nu zie je het probleem van de bovenstaande code, maar gelukkig is er een bibliotheek om te redden, ik waardeer die bibliotheek echt voor al het werk dat het doet, want zoals je weet, als je een RMS-waarde wilt berekenen, moet je Integrale Calculus gebruiken, en dat is heel moeilijk te bereiken op een elektronisch ontwikkelingsbord, je kunt het cpp-bestand van de bibliotheek controleren om te zien welke methoden worden gebruikt, zoals de "Gemiddelde" "Sigma" ... Dingen gerelateerd aan statistieken / waarschijnlijkheden ....

Bekabeling, code en bibliotheek

De bedrading is hetzelfde als de bedrading die hierboven is gebruikt (bedrading 1), en hieronder vindt u de code (code 3).

En hier kunt u de bibliotheek met filters downloaden:Download de bibliotheek hier

Resultaten

De juiste resultaten staan ​​in het midden, de linker zijn zonder kalibratie en de rechter worden gebruikt om te demonstreren hoe te kalibreren (bekijk de video).

Zoals je het enorme verschil tussen de twee codes zag reageren op een niet-lineair signaal, maar de tweede fungeert als een TRMS-multimeter.

Testen met LCD/OLED

Hier houden we dezelfde dingen, alles wat we doen is in plaats van de seriële monitor te gebruiken, we kunnen LCD of OLED gebruiken

Bekabeling, codes en bibliotheken

De bedrading vindt u hieronder (Wiring_LCD) en (Wiring_OLED), codes ook hieronder (Code_ACS712_LCD) en (Code_ACS712_OLED).

Dit zijn de OLED-bibliotheken

https://github.com/adafruit/Adafruit_SSD1306https://github.com/adafruit/Adafruit-GFX-Library

En hier is de LCD_i2c_library

https://drive.google.com/file/d/1Oc56q2GPs5SOA-PdbVHHSxKCnI9KY5xd/view

Resultaat

Dit is de enige test die ik kon doen omdat ik mijn OLED-scherm brak tijdens het opnemen van de video-tutorial. Over het algemeen werkt dit op dezelfde manier als we eerder zagen, het geeft het alleen weer op een LCD i²c-scherm. (Ja, de TRMS-waarden zijn niet de piek-tot-piekmethode).

Dat is alles mensen, ik hoop dat je deze tutorial leuk vindt, vergeet niet de video-tutorial leuk te vinden en je te abonneren op het SurtrTech-kanaal als je steun wilt tonen, heel erg bedankt.

Laat een vraag achter in de reacties.

Code

  • Code_1.ino
  • Code_2.ino
  • Code_3.ino
  • Code_ACS712_LCD.ino
  • Code_ACS712_OLED.ino
Code_1.inoArduino
Deze code is bedoeld om de module te testen en de signaalvorm te visualiseren
/*Deze code werkt met ACS712 Stroomsensor, het maakt het mogelijk om de onbewerkte gegevens te lezen. Het is beter om het te gebruiken met seriële plotter Meer details op www.surtrtech.com*/ #define Current_sensor A0 //De sensor analoge ingang pinfloat i;void setup() {Serial.begin(9600);pinMode(Current_sensor, INPUT);}void loop() {i =analogRead(Current_sensor); Serieel.println(i); vertraging (100); // Als u de vertraging wijzigt of verwijdert, verandert de manier waarop het signaal wordt weergegeven // stel het in totdat u de juiste sinusgolfvorm krijgt}
Code_2.inoArduino
Deze code gebruikt de piek-tot-piek meetmethode om de RMS van een sinusgolfsignaal
/* te berekenen. methode om de RMS te berekenen * Ga voor meer informatie naar www.surtrtech.com */#define SAMPLES 300 //Aantal samples dat u elke keer wilt nemen #define ACS_Pin A0 //ACS712 datapin analoge inputfloat High_peak,Low_peak; // Variabelen om float Amps_Peak_Peak, Amps_RMS te meten of te berekenen; void setup () {Serial.begin (9600); pinMode (ACS_Pin, INPUT); // Definieer pin-modus} void loop () { read_Amps (); // Start de functie read_Amps Amps_RMS =Amps_Peak_Peak*0.3536*0.06; //Nu hebben we de piek-tot-piekwaarde, normaal gesproken vereist de formule alleen vermenigvuldiging met 0,3536 // maar aangezien de waarden erg groot zullen zijn, moet je vermenigvuldigen met 0,06, je kunt het eerst niet gebruiken, // voer je berekeningen uit en vergelijk ze met echte waarden gemeten door een ampèremeter. bijv.:0.06=Reële waarde/Gemeten waarde Serial.print(Amps_RMS); //Hier toon ik de RMS-waarde en de piek-tot-piekwaarde, u kunt afdrukken wat u wilt en het "A"-symbool toevoegen... Serial.print ("\t"); Serial.println (Amps_Peak_Peak); delay(200);}void read_Amps() //read_Amps functie berekent het verschil tussen de hoge piek en lage piek {//get peak to peak value int cnt; // Teller High_peak =0; //We nemen eerst aan dat onze hoge piek gelijk is aan 0 en dat de lage piek 1024 is, ja omgekeerd Low_peak =1024; for(cnt=0; cnt High_peak) // Als die waarde hoger is dan de hoge piek (in eerste instantie is dit 0) { High_peak =ACS_Value; // De hoge piek verandert van 0 in die gevonden waarde} if (ACS_Value  
Code_3.inoArduino
Deze code gebruikt statistische formules om de TRMS van een signaal te berekenen, ongeacht de sape en geeft deze weer op de seriële monitor
/* Deze code werkt met de ACS712-stroomsensor, het maakt de berekening van het signaal TRMS mogelijk * Bezoek www.surtrtech.com voor meer details */#include  //Deze bibliotheek doet enorm veel werk, controleer het .cpp-bestand#define ACS_Pin A0 //Sensorgegevenspin op A0 analoge inputfloat ACS_Value; //Hier behouden we de onbewerkte gegevenswaardensfloat testFrequency =50; // testsignaal frequentie (Hz)float windowLength =40.0/testFrequency; // hoe lang het signaal moet worden gemiddeld, voor statististfloat intercept =0; // aan te passen op basis van kalibratietestsfloat slope =0,0752; // aan te passen op basis van kalibratietesten //Bekijk de ACS712 Tutorial-video van SurtrTech om te zien hoe je ze kunt krijgen, want dit hangt af van je sensor, of kijk hieronder float Amps_TRMS; // geschatte werkelijke stroom in ampsunsigned lange printPeriod =1000; // in milliseconden// Volg de tijd in milliseconden sinds de laatste lezing unsigned long previousMillis =0; void setup () {Serial.begin (9600); // Start de seriële poort pinMode (ACS_Pin, INPUT); // Definieer de pin-modus} void loop () { RunningStatistics inputStats; // maak statistieken om naar het onbewerkte testsignaal te kijken inputStats.setWindowSecs( windowLength); //Stel de vensterlengte in while (true) { ACS_Value =analogRead (ACS_Pin); // lees de analoge in-waarde:inputStats.input (ACS_Value); // log naar Stats-functie if((unsigned long)(millis() - previousMillis)>=printPeriod) { // elke seconde doen we de berekening previousMillis =millis (); // update tijd Amps_TRMS =onderscheppen + helling * inputStats.sigma(); Serial.print( "\t Amps:" ); Serial.print( Amps_TRMS); } }}/* Over de helling en het snijpunt * Eerst moet u weten dat alle TRMS-berekeningen worden gedaan door functies uit de bibliotheek, dit is de waarde "inputStats.sigma()" * Eerst kunt u die "inputStats.sigma" weergeven ()" als uw TRMS-waarde, probeer deze dan te meten wanneer de invoer 0,00A is * Als de gemeten waarde 0 is, zoals ik heb begrepen, kunt u het snijpunt op 0 houden, anders moet u optellen of aftrekken om dat te krijgen waarde gelijk aan 0 * Met andere woorden " verwijder de offset" * Schakel vervolgens de stroom in tot een bekende waarde, gebruik bijvoorbeeld een lamp of een led waarvan u weet wat het vermogen is en u weet al uw spanning, dus een beetje wiskunde u' krijg de theoretische versterkers * je deelt die theoretische waarde door de gemeten waarde en hier heb je de helling, plaats ze nu of wijzig ze */
Code_ACS712_LCD.inoArduino
Deze code gebruikt de TRMS-berekeningsmethode en geeft deze weer op het LCD-scherm i²c
/* Deze code werkt met ACS712 en LCD ic * Het meet de TRMS van een wisselstroom en geeft de waarde weer op het scherm * Bezoek www.SurtrTech.com voor meer details */#include  //Deze bibliotheek doet enorm veel werk, controleer het .cpp-bestand#include  //LCD ic library#define ACS_Pin A0 //ACS712 data pin#define I2C_ADDR 0x27 // I2C-adres, u moet de code gebruiken om het adres eerst (0x27) hier te scannen#define BACKLIGHT_PIN 3 // LCD-pinnen declareren#define En_pin 2#define Rw_pin 1#define Rs_pin 0#define D4_pin 4#define D5_pin 5#define D6_pin 6#define D7_pin 7LiquidCrystal_I2C lcd(I2C_ADDR,En_pin,Rw_pin,Rs_pin,D4_pin,D5_pin,D6_pin,D7_pin); // Het declareren van de lcdfloat testFrequency =50; // testsignaal frequentie (Hz)float windowLength =40.0/testFrequency; // hoe lang het signaal moet worden gemiddeld, voor statististfloat intercept =0; // aan te passen op basis van kalibratietestsfloat slope =0,0752; // aan te passen op basis van kalibratietesten //Bekijk de ACS712 Tutorial-video van SurtrTech om te zien hoe je ze kunt krijgen, want dit hangt af van je sensor, of kijk hieronder float Amps_TRMS; float ACS_Value; unsigned long printPeriod =1000; unsigned long previousMillis =0; void setup () { digitalWrite (2, HIGH); lcd.begin (16,2); lcd.setBacklightPin (BACKLIGHT_PIN,POSITIEF); lcd.set Achtergrondverlichting (HOOG); //Verlichting achtergrondverlichting lcd.home (); }void loop() { RunningStatistics inputStats; // maak statistieken om naar het onbewerkte testsignaal te kijken inputStats.setWindowSecs( windowLength); while (waar) { ACS_Value =analogRead (ACS_Pin); // lees de analoge in-waarde:inputStats.input (ACS_Value); // log naar Stats-functie if((unsigned long)(millis() - previousMillis)>=printPeriod) { // elke seconde doen we de berekening previousMillis =millis (); // update tijd Amps_TRMS =onderscheppen + helling * inputStats.sigma(); // Kalibreer de waarden lcd.clear (); // wis het lcd-scherm en print in een bepaalde positie lcd.setCursor (2,0); lcd.print(Amps_TRMS); lcd.print("A"); } }}/* Over de helling en het snijpunt * Eerst moet u weten dat alle TRMS-berekeningen worden gedaan door functies uit de bibliotheek, dit is de waarde "inputStats.sigma()" * Eerst kunt u die "inputStats.sigma" weergeven ()" als uw TRMS-waarde, probeer deze dan te meten wanneer de invoer 0,00A is * Als de gemeten waarde 0 is, zoals ik heb begrepen, kunt u het snijpunt op 0 houden, anders moet u optellen of aftrekken om dat te krijgen waarde gelijk aan 0 * Met andere woorden " verwijder de offset" * Schakel vervolgens de stroom in tot een bekende waarde, gebruik bijvoorbeeld een lamp of een led waarvan u weet wat het vermogen is en u weet al uw spanning, dus een beetje wiskunde u' krijg de theoretische versterkers * je deelt die theoretische waarde door de gemeten waarde en hier heb je de helling, plaats ze nu of wijzig ze */
Code_ACS712_OLED.inoArduino
Deze code gebruikt de TRMS-berekeningsmethode en geeft de waarde weer op de OLED.
/* Deze code werkt met ACS712 en OLED ic * Het meet de TRMS van een wisselstroom en geeft de waarde weer op het scherm * Bezoek www.SurtrTech. com voor meer details */#include  //Deze bibliotheek doet enorm veel werk, controleer het .cpp-bestand#include  //OLED-bibliotheken#include #define ACS_Pin A0#define SCREEN_WIDTH 128 // Breedte OLED-display, in pixels#define SCREEN_HEIGHT 32 // Hoogte OLED-display, in pixels#define OLED_RESET -1 // Reset pin # (of -1 als Arduino-resetpin gedeeld wordt)float testFrequency =50; // testsignaal frequentie (Hz)float windowLength =40.0/testFrequency; // hoe lang het signaal moet worden gemiddeld, voor statististfloat intercept =0; // aan te passen op basis van kalibratietestsfloat slope =0,0752; // aan te passen op basis van kalibratietesten //Bekijk de ACS712 Tutorial-video van SurtrTech om te zien hoe je ze kunt krijgen, want dit hangt af van je sensor, of kijk hieronder float Amps_TRMS; float ACS_Value; unsigned long printPeriod =1000; unsigned long previousMillis =0;Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET); // De weergavenaam (display) ongeldig instellen () { display.begin (SSD1306_SWITCHCAPVCC, 0x3C); // Start het OLED-display display.clearDisplay (); display.display();}void loop() { RunningStatistics inputStats; // maak statistieken om naar het onbewerkte testsignaal te kijken inputStats.setWindowSecs( windowLength); while (waar) { ACS_Value =analogRead (ACS_Pin); // lees de analoge in-waarde:inputStats.input (ACS_Value); // log naar Stats-functie if((unsigned long)(millis() - previousMillis)>=printPeriod) { // Voer de berekeningen elke 1s uit previousMillis =millis (); // update tijd Amps_TRMS =onderscheppen + helling * inputStats.sigma(); display.clearDisplay(); display.setTextSize (3); display.setTextColor(WIT); display.setCursor(15,10); display.print(Amps_TRMS); display.println ("A"); weergave.weergave(); } }}/* Over de helling en het snijpunt * Eerst moet u weten dat alle TRMS-berekeningen worden gedaan door functies uit de bibliotheek, dit is de waarde "inputStats.sigma()" * In eerste instantie kunt u die "inputStats.sigma ()" als uw TRMS-waarde, probeer deze dan te meten wanneer de invoer 0,00A is * Als de gemeten waarde 0 is, zoals ik heb begrepen, kunt u het snijpunt op 0 houden, anders moet u optellen of aftrekken om dat te krijgen waarde gelijk aan 0 * Met andere woorden " verwijder de offset" * Zet vervolgens de stroom aan tot een bekende waarde, gebruik bijvoorbeeld een lamp of een led waarvan je weet wat het vermogen is en je weet al je spanning, dus een beetje wiskunde je' krijg de theoretische versterkers * je deelt die theoretische waarde door de gemeten waarde en hier heb je de helling, plaats ze nu of wijzig ze */

Schema's

Bedrading gebruikt bij testen 1,2 en 3 Gebruik LCD i²c Gebruik OLED 128x32

Productieproces

  1. Hoe de luchtkwaliteit op OpenSensors te meten
  2. CO2-monitoring met K30-sensor
  3. Doofblinde communicatie met 1Sheeld/Arduino
  4. Bedien muntvangers met Arduino
  5. Arduino met Bluetooth om een ​​LED te bedienen!
  6. Capacitieve vingerafdruksensor met een Arduino of ESP8266
  7. Spelen met Nextion Display
  8. Nunchuk-gestuurde robotarm (met Arduino)
  9. Een Billy Bass-mond animeren met elke audiobron
  10. Zonnestraling meten met Arduino
  11. Mini-radar met Arduino