Arduino-Integration
Diese Seite bietet fertige Arduino-Beispiele zur Integration von FG-3+ und FG-3C Sensoren mit Arduino-kompatiblen Boards (Arduino Uno, Arduino Mega, ESP32 usw.).
FG-3+ — Frequenz-/Periodenmessung
Der FG-3+ gibt einen 5-V-Rechteckimpuls aus, dessen Periode proportional zum Magnetfeld ist. Das folgende Beispiel misst die Impulsperiode mit pulseIn(), was für Anwendungen mit niedriger Aktualisierungsrate geeignet ist. Für höhere Genauigkeit und schnelleres Sampling verwenden Sie stattdessen den Hardware-Timer-Input-Capture.
Der FG-3+ Ausgang hat 5-V-Logik. Schließen Sie es an einen 3,3-V-MCU (wie ESP32) nur über einen Spannungsteiler oder Pegelumsetzer an. Schließen Sie kein 5-V-Signal direkt an einen 3,3-V-GPIO-Pin an.
// FG-3+ Frequenzmessungsbeispiel
// Liest die Impulsperiode eines FG-3+ Sensors und gibt sie auf Serial aus.
//
// Verdrahtung:
// FG-3+ VCC -> 5V
// FG-3+ GND -> GND
// FG-3+ OUT -> Pin 2 (über Pegelumsetzer für 3.3V-Boards)
//
// Hinweis: pulseIn() blockiert während der Messung. Verwenden Sie Hardware-Timer
// für zeitkritische Anwendungen.
const int SENSOR_PIN = 2; // Digitaleingangspin am FG-3+ OUT
void setup() {
Serial.begin(115200);
pinMode(SENSOR_PIN, INPUT);
Serial.println("FG-3+ Periodenmessung");
Serial.println("Period_us");
}
void loop() {
// Periode eines vollständigen Impulses messen (HIGH + LOW Dauer)
// pulseIn gibt die Dauer in Mikrosekunden zurück; 0 bei Timeout
unsigned long highTime = pulseIn(SENSOR_PIN, HIGH, 100000UL); // 100 ms Timeout
unsigned long lowTime = pulseIn(SENSOR_PIN, LOW, 100000UL);
if (highTime == 0 || lowTime == 0) {
Serial.println("Timeout - kein Signal erkannt");
return;
}
unsigned long periodUs = highTime + lowTime;
// Periode in Mikrosekunden ausgeben
// Zum Umrechnen in Feldwert (nT) den Kalibrierungsfaktor des Sensors anwenden
Serial.println(periodUs);
delay(100); // 10 Hz Ausgaberate
}
Die Beziehung zwischen Periode (µs) und Magnetfeld (nT) hängt vom spezifischen Sensorgerät ab. Wenden Sie die Kalibrierungskoeffizienten aus dem Kalibrierungszertifikat Ihres Sensors an, um die Periode in einen Feldwert umzurechnen.
FG-3+ — Höhere Genauigkeit mit Hardware-Timer (ESP32)
Für bessere Genauigkeit auf einem ESP32 verwenden Sie den Hardware-Timer-Input-Capture:
// FG-3+ Hochgenaue Periodenmessung mit ESP32 PCNT
// Verwendet den Pulse-Counter-Peripheriegerät für präzises Frequenzzählen.
//
// Verdrahtung:
// FG-3+ OUT -> GPIO 4 (über Pegelumsetzer)
#include "driver/pcnt.h"
#define PCNT_UNIT PCNT_UNIT_0
#define PCNT_INPUT GPIO_NUM_4
#define COUNT_TIME_MS 1000 // Impulse für 1 Sekunde zählen
void setup() {
Serial.begin(115200);
// PCNT konfigurieren, um steigende Flanken am Eingangspin zu zählen
pcnt_config_t pcnt_config = {
.pulse_gpio_num = PCNT_INPUT,
.ctrl_gpio_num = PCNT_PIN_NOT_USED,
.lctrl_mode = PCNT_MODE_KEEP,
.hctrl_mode = PCNT_MODE_KEEP,
.pos_mode = PCNT_COUNT_INC, // Steigende Flanken zählen
.neg_mode = PCNT_COUNT_DIS,
.counter_h_lim = 30000,
.counter_l_lim = 0,
.unit = PCNT_UNIT,
.channel = PCNT_CHANNEL_0,
};
pcnt_unit_config(&pcnt_config);
pcnt_counter_pause(PCNT_UNIT);
pcnt_counter_clear(PCNT_UNIT);
pcnt_counter_resume(PCNT_UNIT);
Serial.println("Frequency_Hz");
}
void loop() {
int16_t count = 0;
pcnt_counter_clear(PCNT_UNIT);
delay(COUNT_TIME_MS);
pcnt_get_counter_value(PCNT_UNIT, &count);
// count = Impulse pro Sekunde = Frequenz in Hz
Serial.println(count);
}
FG-3C — UART-Lesen
Der FG-3C im UART-Modus überträgt ASCII-Feldwerte mit 115200 Baud auf Pin 4.
// FG-3C UART-Lese-Beispiel
// Liest Magnetfeldwerte vom FG-3C Sensor über Hardware-UART.
//
// Verdrahtung (Arduino Mega oder ESP32):
// FG-3C Pin 1 (VCC) -> 5V
// FG-3C Pin 2 (GND) -> GND
// FG-3C Pin 4 (TX) -> Serial1 RX (über Pegelumsetzer für 3.3V-Boards)
//
// Auf Arduino Uno (kein Hardware Serial1): SoftwareSerial auf Pins 10, 11 verwenden.
// Auf ESP32: Serial2 oder beliebigen verfügbaren UART verwenden.
// Für ESP32: Serial2 RX = GPIO16, TX = GPIO17
// Für Arduino Mega: Serial1 RX = Pin 19
void setup() {
Serial.begin(115200); // USB-Seriell — zum Ausgeben auf PC
Serial1.begin(115200); // Hardware-UART — verbunden mit FG-3C Pin 4
Serial.println("FG-3C UART-Reader");
Serial.println("Field_nT");
}
void loop() {
// Eine Zeile vom FG-3C lesen (mit Zeilenumbruch abgeschlossen)
if (Serial1.available()) {
String line = Serial1.readStringUntil('\n');
line.trim();
if (line.length() > 0) {
float fieldNT = line.toFloat();
// Auf USB-Seriell zur Überwachung ausgeben
Serial.println(fieldNT, 1); // 1 Dezimalstelle
}
}
}
Auf Arduino Uno (einzelner Hardware-UART) verwenden Sie stattdessen die SoftwareSerial-Bibliothek auf freien Digitalpins. SoftwareSerial ist auf niedrigere zuverlässige Baudraten begrenzt; für 115200 auf Uno verwenden Sie ein Board mit Hardware-UART (Mega, ESP32, Leonardo).
Mehrere FG-3+ Sensoren lesen (3-Achsen oder Gradiometer)
Für ein 3-Achsen-System oder Gradiometer jeden Sensor an einem separaten Pin messen:
// Multi-Sensor FG-3+ Periodenmessung
// Liest 3 Sensoren auf Pins 2, 3, 4 (z.B. für eine 3-Achsen-Sensoranordnung)
//
// Verdrahtung:
// Sensor X OUT -> Pin 2
// Sensor Y OUT -> Pin 3
// Sensor Z OUT -> Pin 4
// Alle über Pegelumsetzer für 3.3V-Boards
const int PINS[3] = {2, 3, 4};
const char* AXIS[3] = {"X", "Y", "Z"};
void setup() {
Serial.begin(115200);
for (int i = 0; i < 3; i++) {
pinMode(PINS[i], INPUT);
}
Serial.println("Axis,Period_us");
}
void loop() {
for (int i = 0; i < 3; i++) {
unsigned long highTime = pulseIn(PINS[i], HIGH, 100000UL);
unsigned long lowTime = pulseIn(PINS[i], LOW, 100000UL);
if (highTime > 0 && lowTime > 0) {
unsigned long period = highTime + lowTime;
Serial.print(AXIS[i]);
Serial.print(",");
Serial.println(period);
}
}
delay(200); // ~5 Hz pro Achse
}