Для электронщиков и радиолюбителей

Измеритель магнитного поля на основе Arduino и датчика Холла своими руками

Измеритель магнитного поля на основе Arduino своими руками

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

Помимо Arduino в основе данного проекта лежит датчик Холла UGN3503 в корпусе TO-92.

Измеритель магнитного поля на основе Arduino своими руками

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

Измеритель магнитного поля на основе Arduino своими руками

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

Измеритель магнитного поля на основе Arduino своими руками

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

Само устройство можно разместить в каком-нибудь удобном корпусе, чтобы использовать его в портативном режиме.

Измеритель магнитного поля на основе Arduino своими руками

Вот код программы измерителя напряженности магнитного поля на основе 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()