Как измерить напряженность магнитного поля магнита, катушки индуктивности, дросселя, намагниченной отвертки, куска железа или чего-то еще? Это можно сделать с помощью измерителя магнитного поля, который мы соберем на основе Arduino.
Помимо Arduino в основе данного проекта лежит датчик Холла UGN3503 в корпусе TO-92.

Чтобы сделать это устройство более информативным, был использован OLED-дисплей 128×32, на котором вы можете прочитать значение напряженности магнитного поля тестируемого объекта в мТл (миллиТесла). Вместе с дисплеем имеется светодиод и зуммер, которые выдают свет и звук пропорционально значению. Схема подключения всех перечисленных компонентов в составе измерителя напряженности магнитного поля представлена далее.

Значение «фильтруется» путем простого расчета среднего значения последних 500 м/с выборок, около 2000-4000 показаний датчика, затем отображается каждые полсекунды, в то же время отбрасываются пиковые значения, чтобы иметь красивое стабильное значение на выходе. Включите питание схемы через разъем mini-USB. Разместите датчик в какой-нибудь трубке и расположите его лицевой стороной вверх, наиболее чувствительной стороной с маркировкой.

Датчик 3503 выдает 0,1 мТл (1 Гаусс) на каждые 1,3 мВ. Обратите внимание, что магнитное поле может быть + или — (северный и южный полюса магнита), поэтому датчик генерирует «нулевую» начальную точку при напряжении 2,5 В, ниже которого находятся отрицательные значения, а над ним – положительные значения. «Нулевая» точка может немного колебаться в зависимости от напряжения питания и температурных условий, поэтому здесь предусмотрена кнопка, которую вы должны нажать, чтобы установить «ноль» перед началом измерения магнитного поля. Этот инструмент обеспечит полную шкалу +- 192,3 мТл (+- 1923 Гаусса).
Само устройство можно разместить в каком-нибудь удобном корпусе, чтобы использовать его в портативном режиме.

Вот код программы измерителя напряженности магнитного поля на основе Arduino.
#include <Wire.h>
#include <Adafruit_SSD1306.h>
Adafruit_SSD1306 display = Adafruit_SSD1306 (128, 32, &Wire, -1);
float aVal=0;
float aZero=0;
float aRead=0;
float VL=0;
float Gauss=0;
float mTesla=0;
float fTot=0;
float fNr=0;
float fMax=0;
float fMin=0;
float fAvr=0;
unsigned long fprevMillis=0;
const unsigned long fMillis=500;
const int aValPin=14;
const int aLedPin=10;
const int aBuzPin=9;
const int aButton=15;
String mT = » -0.0 mT»;
void setup() {
//Serial.begin(9600);
display.begin(SSD1306_SWITCHCAPVCC, 0x3C);
mT.reserve(20);
} //setup()
void loop() {
aRead=analogRead(aValPin);
if (aZero==0) aZero=aRead;
if (digitalRead(aButton)==LOW) aZero=aRead;
aVal=(map(aRead,0,1023,0,5000)-map(aZero,0,1023,0,5000)) / 1.3;
if (aVal != 0) {
fTot=fTot+aVal;
fNr=fNr+1;
}
if (aVal>fMax) fMax=aVal;
if (aVal<fMin) fMin=aVal;
if (millis() > (fMillis+fprevMillis)) showVal();
} //loop()
void showVal() {
if (fMax != 0) {
fTot=fTot-fMax;
fNr=fNr-1;
}
if (fMin != 0) {
fTot=fTot-fMin;
fNr=fNr-1;
}
if (fNr > 0) {
aVal=fTot/fNr;
} else {
aVal=0;
}
if (aVal != aZero) {
Gauss=aVal;
mTesla=Gauss/10;
VL=abs((aVal) / 10);
if (VL>255) VL=255;
analogWrite(aLedPin,VL);
analogWrite(aBuzPin,VL);
//Serial.print(roundOneDec(mTesla));
//Serial.println(«mT»);
} else {
Gauss=0;
mTesla=0;
analogWrite(aLedPin,0);
analogWrite(aBuzPin,0);
}
display.clearDisplay();
display.setTextColor(SSD1306_WHITE);
display.setTextSize(1);
display.setCursor(1,1);
display.print(«Magnetic Field Meter»);
display.setTextSize(2);
display.setCursor(8,16);
mT=» «+String(roundOneDec(mTesla),1)+» mT»;
display.print(mT.substring(mT.length()-9));
display.display();
fprevMillis=millis();
fTot=0;
fNr=0;
fMin=0;
fMax=0;
} //showVal()
float roundOneDec(float f) {
float y, d;
y = f*10;
d = y — (int)y;
y = (float)(int)(f*10)/10;
if (d >= 0.5) {
y += 0.1;
} else {
if (d < -0.5) {
y -= 0.1;
}
}
return y;} //roundOneDec()