Lumaktaw patungo sa pangunahing content

Arduino Integration

Nagbibigay ang pahinang ito ng mga handang gamitin na halimbawa ng Arduino para sa pag-integrate ng mga sensor na FG-3+ at FG-3C sa mga Arduino-compatible board (Arduino Uno, Arduino Mega, ESP32, atbp.).


FG-3+ — Pagsukat ng Frequency / Period

Ang FG-3+ ay naglalabas ng 5 V PWM na ang panahon nito ay proporsyonal sa magnetic field. Sinusukat ng halimbawa sa ibaba ang panahon ng pulso gamit ang pulseIn(), na angkop para sa mga aplikasyon na may mababang update rate. Para sa mas mataas na katumpakan at mas mabilis na sampling, gumamit ng hardware timer input-capture sa halip.

Level Shifting

Ang output ng FG-3+ ay 5 V logic. Ikonekta sa isang 3.3 V MCU (tulad ng ESP32) sa pamamagitan lamang ng voltage divider o level shifter. Huwag direktang ikonekta ang 5 V signal sa isang 3.3 V GPIO pin.

// FG-3+ Frequency Measurement Example
// Reads the pulse period from an FG-3+ sensor and prints it to Serial.
//
// Wiring:
// FG-3+ VCC -> 5V
// FG-3+ GND -> GND
// FG-3+ OUT -> Pin 2 (via level shifter for 3.3V boards)
//
// Note: pulseIn() blocks during measurement. Use hardware timers
// for time-critical applications.

const int SENSOR_PIN = 2; // Digital input pin connected to FG-3+ OUT

void setup() {
Serial.begin(115200);
pinMode(SENSOR_PIN, INPUT);
Serial.println("FG-3+ Period Measurement");
Serial.println("Period_us");
}

void loop() {
// Measure the period of one complete pulse (HIGH + LOW duration)
// pulseIn returns duration in microseconds; 0 if 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 - no signal detected");
return;
}

unsigned long periodUs = highTime + lowTime;

// Print the period in microseconds
// To convert to field value (nT), apply your sensor's calibration factor
Serial.println(periodUs);

delay(100); // 10 Hz output rate
}
Calibration

Ang relasyon sa pagitan ng panahon (µs) at magnetic field (nT) ay nakasalalay sa partikular na sensor unit. Mag-apply ng mga calibration coefficient mula sa calibration certificate ng inyong sensor para i-convert ang panahon sa halaga ng field.


FG-3+ — Mas Mataas na Katumpakan gamit ang Hardware Timer (ESP32)

Para sa mas mataas na katumpakan sa isang ESP32, gumamit ng hardware timer input capture:

// FG-3+ High-Accuracy Period Measurement using ESP32 PCNT
// Uses the Pulse Counter peripheral for precise frequency counting.
//
// Wiring:
// FG-3+ OUT -> GPIO 4 (via level shifter)

#include "driver/pcnt.h"

#define PCNT_UNIT PCNT_UNIT_0
#define PCNT_INPUT GPIO_NUM_4
#define COUNT_TIME_MS 1000 // Count pulses for 1 second

void setup() {
Serial.begin(115200);

// Configure PCNT to count rising edges on the input pin
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, // Count rising edges
.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 = pulses per second = frequency in Hz
Serial.println(count);
}

FG-3C — Pagbabasa ng UART

Ang FG-3C sa UART mode ay nagpapadala ng mga ASCII field value sa 115200 baud sa Pin 4.

// FG-3C UART Reading Example
// Reads magnetic field values from FG-3C sensor via hardware UART.
//
// Wiring (Arduino Mega or ESP32):
// FG-3C Pin 1 (VCC) -> 5V
// FG-3C Pin 2 (GND) -> GND
// FG-3C Pin 4 (TX) -> Serial1 RX (via level shifter for 3.3V boards)
//
// On Arduino Uno (no hardware Serial1): use SoftwareSerial on pins 10, 11.
// On ESP32: use Serial2 or any available UART.

// For ESP32: Serial2 RX = GPIO16, TX = GPIO17
// For Arduino Mega: Serial1 RX = Pin 19

void setup() {
Serial.begin(115200); // USB serial — for printing to PC
Serial1.begin(115200); // Hardware UART — connected to FG-3C Pin 4

Serial.println("FG-3C UART Reader");
Serial.println("Field_nT");
}

void loop() {
// Read one line from the FG-3C (terminated with newline)
if (Serial1.available()) {
String line = Serial1.readStringUntil('\n');
line.trim();

if (line.length() > 0) {
float fieldNT = line.toFloat();

// Print to USB serial for monitoring
Serial.println(fieldNT, 1); // 1 decimal place
}
}
}
note

Sa Arduino Uno (single hardware UART), gumamit ng SoftwareSerial library sa mga spare digital pin sa halip ng Serial1. Ang SoftwareSerial ay limitado sa mas mababang maaasahang baud rate; para sa 115200 sa Uno, gumamit ng board na may hardware UART (Mega, ESP32, Leonardo).


Pagbabasa ng Maraming FG-3+ Sensor (3-Axis o Gradiometer)

Para sa isang 3-axis system o gradiometer, sukatin ang bawat sensor sa isang hiwalay na pin:

// Multi-sensor FG-3+ Period Measurement
// Reads 3 sensors on pins 2, 3, 4 (e.g., for a 3-axis sensor assembly)
//
// Wiring:
// Sensor X OUT -> Pin 2
// Sensor Y OUT -> Pin 3
// Sensor Z OUT -> Pin 4
// All via level shifters for 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 per axis
}