Pular para o conteúdo principal

Integração Arduino

Esta página fornece exemplos Arduino prontos para uso para integrar sensores FG-3+ e FG-3C com placas compatíveis com Arduino (Arduino Uno, Arduino Mega, ESP32, etc.).


FG-3+ — Medição de Frequência / Período

O FG-3+ produz um pulso retangular de 5 V cuja período é proporcional ao campo magnético. O exemplo abaixo mede o período do pulso usando pulseIn(), adequado para aplicações de baixa taxa de atualização. Para maior precisão e amostragem mais rápida, use a captura de entrada do timer de hardware.

Deslocamento de Nível

A saída do FG-3+ é lógica 5 V. Conecte a um MCU 3,3 V (como ESP32) apenas através de um divisor de tensão ou conversor de nível. Não conecte um sinal de 5 V diretamente a um pino GPIO de 3,3 V.

// Exemplo de Medição de Frequência FG-3+
// Lê o período de pulso de um sensor FG-3+ e imprime na Serial.
//
// Fiação:
// FG-3+ VCC -> 5V
// FG-3+ GND -> GND
// FG-3+ OUT -> Pino 2 (via conversor de nível para placas 3.3V)
//
// Nota: pulseIn() bloqueia durante a medição. Use timers de hardware
// para aplicações críticas no tempo.

const int SENSOR_PIN = 2; // Pino de entrada digital conectado ao FG-3+ OUT

void setup() {
Serial.begin(115200);
pinMode(SENSOR_PIN, INPUT);
Serial.println("Medição de Período FG-3+");
Serial.println("Period_us");
}

void loop() {
// Medir o período de um pulso completo (duração HIGH + LOW)
// pulseIn retorna duração em microssegundos; 0 se timeout
unsigned long highTime = pulseIn(SENSOR_PIN, HIGH, 100000UL); // timeout 100 ms
unsigned long lowTime = pulseIn(SENSOR_PIN, LOW, 100000UL);

if (highTime == 0 || lowTime == 0) {
Serial.println("Timeout - nenhum sinal detectado");
return;
}

unsigned long periodUs = highTime + lowTime;

// Imprimir o período em microssegundos
// Para converter em valor de campo (nT), aplique o fator de calibração do sensor
Serial.println(periodUs);

delay(100); // Taxa de saída 10 Hz
}
Calibração

A relação entre período (µs) e campo magnético (nT) depende da unidade de sensor específica. Aplique os coeficientes de calibração do certificado de calibração do seu sensor para converter período em valor de campo.


FG-3+ — Maior Precisão com Timer de Hardware (ESP32)

Para melhor precisão em um ESP32, use a captura de entrada do timer de hardware:

// Medição de Período de Alta Precisão FG-3+ usando ESP32 PCNT
// Usa o periférico Pulse Counter para contagem de frequência precisa.
//
// Fiação:
// FG-3+ OUT -> GPIO 4 (via conversor de nível)

#include "driver/pcnt.h"

#define PCNT_UNIT PCNT_UNIT_0
#define PCNT_INPUT GPIO_NUM_4
#define COUNT_TIME_MS 1000 // Contar pulsos por 1 segundo

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

// Configurar PCNT para contar bordas de subida na pino de entrada
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, // Contar bordas de subida
.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 = pulsos por segundo = frequência em Hz
Serial.println(count);
}

FG-3C — Leitura UART

O FG-3C no modo UART transmite valores de campo ASCII a 115200 baud no Pino 4.

// Exemplo de Leitura UART FG-3C
// Lê valores de campo magnético do sensor FG-3C via UART de hardware.
//
// Fiação (Arduino Mega ou ESP32):
// FG-3C Pin 1 (VCC) -> 5V
// FG-3C Pin 2 (GND) -> GND
// FG-3C Pin 4 (TX) -> Serial1 RX (via conversor de nível para placas 3.3V)
//
// No Arduino Uno (sem Serial1 de hardware): use SoftwareSerial nos pinos 10, 11.
// No ESP32: use Serial2 ou qualquer UART disponível.

void setup() {
Serial.begin(115200); // Serial USB — para impressão no PC
Serial1.begin(115200); // UART de hardware — conectado ao FG-3C Pin 4

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

void loop() {
// Ler uma linha do FG-3C (terminada com nova linha)
if (Serial1.available()) {
String line = Serial1.readStringUntil('\n');
line.trim();

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

// Imprimir na serial USB para monitoramento
Serial.println(fieldNT, 1); // 1 casa decimal
}
}
}
observação

No Arduino Uno (UART de hardware único), use a biblioteca SoftwareSerial em pinos digitais disponíveis. O SoftwareSerial é limitado a taxas de baud menores; para 115200 no Uno, use uma placa com UART de hardware (Mega, ESP32, Leonardo).


Lendo Múltiplos Sensores FG-3+ (3 Eixos ou Gradiômetro)

Para um sistema de 3 eixos ou gradiômetro, meça cada sensor em um pino separado:

// Medição de Período Multi-sensor FG-3+
// Lê 3 sensores nos pinos 2, 3, 4 (ex. para um conjunto de sensores de 3 eixos)
//
// Fiação:
// Sensor X OUT -> Pino 2
// Sensor Y OUT -> Pino 3
// Sensor Z OUT -> Pino 4
// Todos via conversores de nível para placas 3.3V

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 por eixo
}