Hello guys,
I’m using a arduino uno and a magnetic field sensor to measure the 50Hz alternating current of a wire cable. The rms value should be measured. My problem is I don’t know how to get the sample rate of the Programm… how can I plot the signal with time x axis in seconds and get the sample rate? Here is the code:
#include <Wire.h> //Einbindung der I2C Bibliothek
unsigned char CMPS2_address = 0x30; //I2C Adresse des Kompasses
/***********DEKLARATION DER VARIABLEN*************************************/
int taster = 7;
int tasterstatus = 0;
float data[3]; //Daten nach Umrechnung in mG
unsigned int raw[3]; //Rohdaten
float offset[3];
float current[3]; //Werte nach Feldunterdrückung
float field[3];
unsigned long zeit;
float rms; //Betrag von X,Y und Z
int Cycles = 0;
float mw[200];
float midrms = 0; //Variable für den gleitenden midrms
float mid1 = 0; //Mittelwert wenn Gerät Aus ist
float mid2 = 0; //Mittelwert wenn Gerät An (ohne Sonden)
float mid3 = 0; //Mittelwert wenn Sonden An
float schw1 = 0; //1. Schwellwert
float schw2 = 0; //2. Schwellwert
//Variablen für die Ermittlung der Mittelwerte
int aktiv = 0;
float speicher1 = 0;
float speicher2 = 0;
float speicher3 = 0;
int counter1 = 0;
int counter2 = 0;
int counter3 = 0;
float current2 = 0;
//Variablen für die Zustandsausgabe
static byte alterZustand = 255; //a value that does not make sense so that the first change is noticed
int zustand = 0; // Zustandsvariable
const unsigned long ZeitInterval = 5000; //Wiederholzeit des Zustand: soll eine Stunde betragen
unsigned long letzteZeit = 0;
int test;
int Strompin = A0; //Stromsensorpin
float val = 0;
/**********************INITIALISIERUNG*************************************/
void setup() {
pinMode(Strompin, INPUT);
Serial.begin(9600); // Kommunikation mit dem seriellen Monitor
Serial.setTimeout(0);
delay(10);
CMPS2_init(); //Kompass initialisierung
pinMode(taster, INPUT);
Serial.println(F("*************Zustandserfassungssystem************"));
Serial.println(F("Drücken sie den Taster um eine Feldunterdrückung durchzuführen"));
Serial.println(F("Lassen sie das Gerät ausgeschaltet. Warten sie 10 Sekunden. Drücken sie die 1 wenn sie fertig sind."));
}
/*******************HAUPTPROGRAMM UND SCHLEIFE*****************************/
void loop()
{
messung();
Strommessung();
//zeit=millis();
//Serial.print(zeit);
//Serial.print(" ");
Serial.print(rms);
Serial.print(" ");
Serial.println(current2);
//Schwellwertermittlung();
float angle = CMPS2_getHeading();
/*if (test == 52) { //Wenn 4 gedrückt wurde dann Ausgabe der Zustände
aktiv = 4;
}
if (aktiv == 4) {
Zustandsausgabe();
}*/
delay(100);
}
/**********6. Funktion für die Feldunterdrückung und Berechnung des gleitenden Mittelwerts anhand des rms*********/
void messung() {
tasterstatus = digitalRead(taster);
if (tasterstatus == LOW)
{
for (int i = 0; i < 3; i++)
{
field[i] = data[i]; //Wenn Taster gedrückt ist, soll jetzige Feld mit altem Feld gleichgesetzt werden
}
}
for (int i = 0; i < 3; i++)
{
current[i] = data[i] - field[i]; //Magnetfeld des Kabels = Feld - altes Feld
}
rms = sqrt(sq(current[0]) + sq(current[1]) + sq(current[2])); //Betrag der drei magnetischen Flussdichten in x,y und z-Richtung
//Bildung des gleitenden Mittelwerts nach jeweils 200 Messungen
mw[Cycles++] = rms;
if (Cycles >= 200)
{
Cycles = 0;
}
for (int i = 0; i < 200; i++)
{
midrms += mw[i];
}
midrms = midrms / 200;
//Serial.println(midrms);
}
float CMPS2_getHeading(void) {
CMPS2_read_XYZ(); //Auslesen x,y, und z-Daten des Magnetfeldes
//Eliminierung Offset
for (int i = 0; i < 3; i++)
{
data[i] = data[i] - offset[i];
}
float temp0 = 0;
float temp1 = 0;
float deg = 0;
}
/********************5. Messungen des Magnetfeldes in x,y und z-Richtung auslesen*********************/
void CMPS2_read_XYZ(void) {
//command internal control register 0 bit 0 (measure)
Wire.beginTransmission(CMPS2_address);
Wire.write(0x07);
Wire.write(0x01);
Wire.endTransmission();
delay(8);
//Warten bis Messung fertig ist
bool flag = false;
while (!flag) {
//In Status Register springen
Wire.beginTransmission(CMPS2_address);
Wire.write(0x06);
Wire.endTransmission();
//Werte auslesen
Wire.requestFrom(CMPS2_address, (uint8_t)1);
int temporal = 0;
if (Wire.available()) {
temporal = Wire.read();
}
//Wenn der letzte Bit 1 ist, sind die Daten bereit
temporal &= 1;
if (temporal != 0) {
flag = true;
}
}
//Den Adressen Pointer zur ersten Adresse bewegen
Wire.beginTransmission(CMPS2_address);
Wire.write(0x00);
Wire.endTransmission();
//Daten speichern
Wire.requestFrom(CMPS2_address, (uint8_t)6);
byte tmp[6] = {0, 0, 0, 0, 0, 0}; //array für Rohdaten
if (Wire.available()) {
for (int i = 0; i < 6; i++) {
tmp[i] = Wire.read();
}
}
//Rohdaten rekonstruieren
raw[0] = tmp[1] << 8 | tmp[0]; //x
raw[1] = tmp[3] << 8 | tmp[2]; //y
raw[2] = tmp[5] << 8 | tmp[4]; //z
//Rohdaten in milliGauss konvertieren
for (int i = 0; i < 3; i++) {
data[i] = 0.48828125 * (float)raw[i];
}
}
/***********************3. Kompass initialisieren und kalibrieren************************/
void CMPS2_init(void) {
float out1[3];
float out2[3];
int i;
Wire.begin(); // I2C Initialisation
//Kalibration: SET
Wire.beginTransmission(CMPS2_address);
Wire.write(0x07);
delay(10);
Wire.write(0x80);
Wire.endTransmission();
delay(80);
Wire.beginTransmission(CMPS2_address);
Wire.write(0x07);
delay(10);
Wire.write(0x20);
Wire.endTransmission();
delay(10);
CMPS2_read_XYZ();
for (i = 0; i < 3; i++)
{
out1[i] = data[i];
}
//Kalibration: RESET
Wire.beginTransmission(CMPS2_address);
Wire.write(0x07);
delay(10);
Wire.write(0x80);
Wire.endTransmission();
delay(60);
Wire.beginTransmission(CMPS2_address);
Wire.write(0x07);
delay(10);
Wire.write(0x40);
Wire.endTransmission();
delay(10);
CMPS2_read_XYZ();
for (i = 0; i < 3; i++)
{
out2[i] = data[i];
}
//Offset Berechnung
for (i = 0; i < 3; i++)
{
offset[i] = (out1[i] + out2[i]) * 0.5;
}
//command internal control register 0 for set operation
Wire.beginTransmission(CMPS2_address);
Wire.write(0x07);
delay(10);
Wire.write(0x40); //SET
Wire.endTransmission();
delay(10);
//command internal control register 1 to 16 bit resolution, 8ms Messungszeit
Wire.beginTransmission(CMPS2_address);
Wire.write(0x08);
delay(10);
Wire.write(0x00);
Wire.endTransmission();
delay(10);
}