Hallsensor code Frage

Tach ich bin der Neue!! :o

Seit mir meine Enkel einen Arduino uno und einige Sensoren (+ Zubehör) geschenkt hat ,lässt mich der “kleine” nicht mehr los. Zur Zeit beschäftige ich mich mit einem Teslameter der Magnete im Tesla Bereich messen kann,der Aufbau war recht schnell gemacht,doch mit dem Code habe ich noch so meine Probleme

Ich versuche einen Hallsensor abzufragen aber verstehe nicht genau wie ich das machen muss!

der Sensor hat Max. Sensitivität: 1.8-2.5 (mV/mT), Messbereich: 3T

Was ich nicht versteh ist was ich einstellen wo ändern muss!

Hier mein Code:

#include <Wire.h>
#include <LiquidCrystal.h>

LiquidCrystal lcd(12, 11, 5, 4, 3, 2);

float somma = 0;
float media = 0;
float gauss = 0;
float millitesla = 0;
int i = 0;
float reset = 0;  
float correzione = 0;
float gauss_ofset = 0;

void setup() {

  lcd.begin(16, 2);
  lcd.setCursor (0, 0);
  lcd.print ("   GAUSSMETER") ;
  lcd.setCursor (0, 1);
  lcd.print ("Erstellt 13/03/17") ;
  delay (500);
  lcd.clear();

  somma = 0;
  float voltage = 0;
  media = 0;
  i = 0;
  correzione = 0;
  gauss_ofset = 0;

  for (i = 0; i < 50; i++)
  {
    int sensorValue = analogRead(A0);
    float voltage = ((sensorValue * (5.0 / 1023.0)) - 0 ;
    somma = somma + voltage;
    lcd.setCursor (0, 0);
    lcd.print ("Anzahl ");
	delay (100);
    lcd.setCursor (0, 1);
    lcd.print (i) ;

  }
  delay (100);
  lcd.setCursor (0, 1);
  lcd.print ("AUTORESET DONE") ;
  delay (1000);
  media = (somma / 50);
  gauss = (((5000 * ((media - 2.3) / 0.018)))) ;
  correzione = gauss;

}

void loop()
{



  somma = 0;                 
  float voltage = 0;
  media = 0;
  i = 0;
  gauss = 0;

  for (i = 0; i < 50; i++)
  {
    int sensorValue = analogRead(A0);
    float voltage = ((sensorValue * (5.0 / 1023.0)) * 1) - 0 ;
    somma = somma + voltage;
    delay(10);
  }


  media = (somma / 50);
  gauss = (((5000 * ((media - 2.3) / 0.018)))) ;
  gauss_ofset = gauss - correzione ;
  millitesla = (gauss_ofset * 0.0001);


  lcd.clear();
  lcd.setCursor (0, 0);
  lcd.print ("GAUSS= ");
  lcd.setCursor (0, 1);
  lcd.print ("TESLA= ");
  delay(10);
  lcd.setCursor (8, 0);
  lcd.print(gauss_ofset, 2);
  lcd.setCursor (8, 1);
  lcd.print (millitesla, 2);


}

Was willst Du denn ändern / einstellen?
Was macht der bisherige Code bzw. macht er nicht so, wie Du willst?

Bei der angegebenen Spannung / mT bist Du wohl bei 3T schon über 5V.
Hast Du einen Link zum Hallsensor bzw. zum Datenblatt?

Gruß Tommy

Erst mal Danke-

Hier der Link zum Datenblatt http://www.sonnecy-shop.com/media/pdf/66/53/11/DE-CYSJ302C.pdf

Also wenn ich einen Magneten Messe der laut Händler einen Tesla Wert von 1.32...1.38 hat,zeigt mir das Teil manchmal 1,1 manchmal 3,4 usw Nord + Süd - macht er aber Problemlos. Ich habe nicht verstanden ob das richtig ist :
gauss = (((5000 * ((media - 2.3) / 0.018)))) ;

Die 5000 sind klar 1T = 10.000 Gauss ,aber der letzte Wert ist der in Volt ?? 1,8 mV = 0.018 Volt??
Die 2,3 sind die Spannung die angezeigt wird (kleinster Wert) der Angezeigt wird wenn kein Magnet davor ist !!

Soll das heißen: 2,3V ohne Magnet, also nur mit dem Magnetfeld der Erde? Dann müsste dieser Wert doch lageabhängig entsprechend der Ausrichtung zum Erdmagnetfeld sein?
Die 2,3V kommen mir etwas hoch vor. Zur Formel kann ich nichts sagen, da musst Du den fragen, von dem Du sie hast.

Gruß Tommy

Ein mV ist doch nicht ein hunderstel sondern ein tausenstel Volt. Also sind 1,8mV 0,0018 Volt.

Danke Franz,ich versuche es gleich einmal!

Die 2,3 Volt ist die kleinste Spannung die man einstellen kann wenn der Poti ganz links ist .

So gemessen 1,35 Tesla das dürfte stimmen!! :wink: nur die Anzeige springt immer noch ...hoch runter

Tommy56:
Soll das heißen: 2,3V ohne Magnet, also nur mit dem Magnetfeld der Erde? Dann müsste dieser Wert doch lageabhängig entsprechend der Ausrichtung zum Erdmagnetfeld sein?
Die 2,3V kommen mir etwas hoch vor. Zur Formel kann ich nichts sagen, da musst Du den fragen, von dem Du sie hast.

Gruß Tommy

Ich versuche das Morgen einmal,was sollte deiner Meinung nach den Angezeigt werden?

Zur Software,das ist eine Freie von einer italienischen Webseite . Ich werde einfach noch etwas testen.

Springende Werte könnten auch auf Kontaktproblemen beruhen. Absonsten Mittelwertbildung.

Gruß Tommy

Ok,danke. Das werde ich Morgen überprüfen!
Ich habe den Code mal etwas übersetzt,Google sei dank und angepasst ,so wird er um einiges verständlicher!

#include <Wire.h>
#include <LiquidCrystal.h>

LiquidCrystal lcd(12, 11, 5, 4, 3, 2);

float summe = 0;
float media = 0;
float gauss = 0;
float tesla = 0;
int i = 0;
float reset = 0;  
float korrektur_wert = 0;
float gauss_offset = 0;

void setup() {

  lcd.begin(16, 2);
  lcd.setCursor (0, 0);
  lcd.print (" TESLAMETER") ;
  lcd.setCursor (0, 1);
  lcd.print ("Erstellt 13/03/17") ;
  delay (500);
  lcd.clear();

  summe = 0;
  float voltage = 0;
  media = 0;
  i = 0;
  korrektur_wert = 0;
  gauss_offset = 0;

  for (i = 0; i < 50; i++)
  {
    int sensorValue = analogRead(A0);
    float voltage = ((sensorValue * (5.0 / 1023.0)) - 0 ;
    summe = summe + voltage;
    lcd.setCursor (0, 0);
    lcd.print ("Anzahl ");
	delay (100);
    lcd.setCursor (0, 1);
    lcd.print (i) ;

  }
  delay (500);
  lcd.setCursor (0, 1);
  lcd.print ("AUTORESET DONE") ;
  delay (1000);
  media = (summe / 50);
  gauss = (((5000 * ((media - 2.3) / 0.0018)))) ;
  korrektur_wert = gauss;

}

void loop()
{



  summe = 0;                 
  float voltage = 0;
  media = 0;
  i = 0;
  gauss = 0;

  for (i = 0; i < 50; i++)
  {
    int sensorValue = analogRead(A0);
    float voltage = ((sensorValue * (5.0 / 1023.0)) * 1) - 0 ;
    summe = summe + voltage;
    delay(10);
  }


  media = (summe / 50);
  gauss = (((5000 * ((media - 2.3) / 0.0018)))) ;
  gauss_offset = gauss - korrektur_wert ;
  tesla = (gauss_offset * 0.0001);


  lcd.clear();
  lcd.setCursor (0, 0);
  lcd.print ("GAUSS= ");
  lcd.setCursor (0, 1);
  lcd.print ("TESLA= ");
  delay(10);
  lcd.setCursor (8, 0);
  lcd.print(gauss_offset, 2);
  lcd.setCursor (8, 1);
  lcd.print (tesla, 2);


}

Tommy56:
Soll das heißen: 2,3V ohne Magnet, also nur mit dem Magnetfeld der Erde? Dann müsste dieser Wert doch lageabhängig entsprechend der Ausrichtung zum Erdmagnetfeld sein?
Die 2,3V kommen mir etwas hoch vor. Zur Formel kann ich nichts sagen, da musst Du den fragen, von dem Du sie hast.

Gruß Tommy

Das Erdmagnetfeld ist zu schwach um mit dem Sensor gemessen zu werden.

Erdmagnetfeld – Wikipedia
Am Äquator hat das Magnetfeld eine Stärke von ca. 30 µT = 30.000 nT. An den Polen ist der Betrag doppelt so groß. In Mitteleuropa sind es ca. 48 µT, wobei ca. 20 µT in der horizontalen und ca. 44 µT in der vertikalen Richtung auftreten.

Grüße Uwe

So,Kontaktproblemen .JA das verwendete Board und die Kabel sind auf Deutsch für den A.....!
Ich habe mit erst einmal ein Laborsteckbrett und Kabel bestellt! Wenn beides da ist geht es weiter!

Eine Frage hätte ich noch: :o

Kann wir jemand sagen ob das so richtig ist ?
(die Null nehme ich mal raus,da Sinnlos)

float voltage = ((sensorValue * (5.0 / 1023.0)) - 0

oder sollte es so lauten

float voltage = ((sensorValue * 5.0) / 1023.0))

Oder kann ich die Klammern ganz weg lassen?

float voltage = (sensorValue * 5.0 / 1023.0)

Klammer (n von innen nach außen) vor Punkt vor Strich ...

Dein 1. Beispiel

float voltage = ((10.0 * (6.0 / 3.0)) - 0

x = (6.0 / 3.0) = 2.0
y = (10.0 * x) = 20.0
z = 20.0 - 0.0 = 20.0

Dein 2. Beispiel

float voltage = ((10.0 * 6.0) / 3.0)

x = (10.0 * 6.0) = 60.0
y = (x / 3.0) = 20.0

Dein 3. Beispiel

float voltage = (10.0 * 6.0 / 3.0)

x = 60.0 / 3.0 = 20.0

hmmm ... :wink:

@FlyingEagle: Ganz so trivial ist es nicht:

float x = 5 / 10 * 100

x = ?

Gruß Tommy

Korrekterweise müsste es

float voltage = sensorValue * 5.0 / 1024.0;

lauten, 1024 nicht 1023. analogRead - divide by 1023 or 1024? ``

Aber die 5.0 beinhalten aller Wahrscheinlichkeit nach sowieso einen viel höheren Fehler.

Tommy56:
@FlyingEagle: Ganz so trivial ist es nicht:

float x = 5 / 10 * 100

x = ?

Gruß Tommy

Nicht Äpfel mit Birnen vergleichen, von links nach rechts, du stellst hier Multiplikation und Division um, das ist natürlich was anderes.

Nicht ablenken! Was kommt raus?

Das sind nicht Äpfel und Birnen, sondern alles Berechnungen, wie sie laufend in Codes vorkommen.

Gruß Tommy

Tommy56:
Nicht ablenken! Was kommt raus?

Das sind nicht Äpfel und Birnen, sondern alles Berechnungen, wie sie laufend in Codes vorkommen.

Gruß Tommy

Generell würde ich sagen 50, aber du hast bestimmt etwas, um mir zu zeigen das es nicht 50 ist.

Und trotzdem passt diese Formel nicht zu der vom TO gegebenen.

Es kommt 0 raus und das ist ein beliebter Fehler, da die rechte Seite als int von links nach rechts gerechnet wird.

5 / 10 = 0 --> 0 * 100 = 0

Anders sieht das aus wenn Du rechnest:

float x = 5 .0/ 10 * 100
Dann wird die rechte Seite gleich als float gerechnet.

Warum habe ich diese Rechnung hier rein gebracht?
Im Original war es:
float voltage = (sensorValue * 5.0 / 1023.0) und dabei wird die rechte Seite in float gerechnet.

Dasraus hast Du sorglos

float voltage = ((10 * 6) / 3) gemacht, das in in gerechnet wird und Deine Antwort hat gezeigt, dass Du den Unterschied nicht kanntest.

Darauf wollte ich hinweisen. das 5.0 im Original hatte schon seinen Sinn.

Gruß Tommy

ich habe die Zahlen vielleicht achtlos verwendet, ich wollte nur nicht mit 5.0 / 1023.0 rechnen.

Rechnerisch bleibt es aber dabei.

Im Windows-Rechner kann man das so eingeben, dann kommt 50 raus :wink: