Guten Tag werte Gemeinde,
so, das erste mal in meinem leben darf ich programmieren. Etwas richtiges, keine Osterdatum, sondern ich möchte von einem Sensor Daten auslesen.
Ich benutze einen Sensor namens "Amsys 5812-0150-B" dies ist ein barometrischer Druck Sensor, der mir auf einem analogen Ausgang das Signal des Drucksensors ausgibt, der Messbereich geht von 758,4-1206 mbar. Aus dem I2C bekomme ich ebenfalls den Druck und kann zusätzlich noch die Temperatur auslesen.
Ersteres habe ich ohne Probleme lesen können. Das Signal wurde mir schön ausgegeben. Da ich aber auch einen Temperatursensor bei habe will ich auch dieses Signal auswerten. Also machte ich mich ans Werk und mein Elend begann......
Ich habe den Sensor korrekt angeschlossen an mein Arduino Dueminalove-Board und ein kleines Programm geschrieben das ich jetzt hier mal reinsetze:
#include <Wire.h>
int DruckPin = 1; // Drucksensor eingang
float val = 0;
#define address 0x78 /hex-adresse des sensors
void setup() {
Wire.begin();
Serial.begin(9600);
Serial.println("Momentanen Druck auslesen und ausgeben");
Serial.println();
pinMode(DruckPin, INPUT); // DruckPIN Eingang
}
void loop() {
Wire.beginTransmission(address); // drucksensor initialisieren
Wire.send(0);// Zeiger auf 0 setzen
Wire.requestFrom(address, 4);// bescheid sagen wiviele Bytes kommen. nämlich 4
int Druck1;// variablen für die einzelnen Bytes
int Druck2;
int Temperatur1;
int Temperatur2;
if (Wire.available()) {
Druck1 = Wire.receive(); //1.Byte
Druck2 = Wire.receive();//2.Byte
Temperatur1 = Wire.receive();//3.byte
Temperatur2 = Wire.receive();//4.Byte
}
Wire.endTransmission();// ende der übertragung
Serial.println("-----------");//hier beginnt die ausgabe
Serial.println(Druck1);// 1.Byte
Serial.println(Druck2);//2.Byte
Serial.println(Temperatur1);//3.byte
Serial.println(Temperatur2);//4.Byte
val =analogRead(DruckPin); // der analoge Ausgang des Sensors wird ausgelesen
Serial.println(val); //wert von val in bit wird ausgegeben
val = (val*0.438)+758,4; // umrechnung des wertes in val wird umgerechnet in mbar.
Serial.println(val); // ausgabe des wertes auf serial monitor
delay(500); // kurze pause, dann geht es wieder von vorne los
}
auf dem Serial monitor erscheint dann alles was ich ihm sage, leider stimmen meine Werte nicht.
Der analog Wert ergibt auf dem Serialmonitor nach der Umrechnung ungefähr 1010mbar, damit liege ich auf jedenfall richtig, die Wetterstation die etwas weiter wegliegt gibt ähnliche Werte.
Wenn ich jedoch die Bytes aus dem I2C auslese bekomme ich folgendes:
72 // 1.Byte Druck
40// 2.Byte Druck
56//3.byte Temp
220//4.byte Temp
So diese Werte muss ich jetzt in den Messwert umwandeln. für den Druck sieht das dann folgendermaßen aus: 1.+2.Byte ergibt: 7240
Ich vermute dass es sich um einen Hex-Wert handelt. Dies ergibt Dezimalumgewandelt: 29248(Warum ich das brauche erzähle ich jetzt)
Das Datenblatt des Sensor http://www.amsys.de/sheets/amsys.de.ams5812.pdf gibt mir vor das der Wert dezimal umgewandelt werden muss, siehe Seite 9, im Datenblatt um auf counts zu kommen und um dann gemäss der Formel aus dem Datenblatt daraus den Messwert zuerechnen.
Ich habe das mal per Hand durchgerechnet und bin zu folgendem ergebnis gekommen:
Als erstes Rechne Ich Sensp(Siehe Seite 10) aus. Die Werte die ich einsetzen muss ergeben sich aus dem Datenblatt. Sensp errechnet sich daher zu: 58513. Wenn ich dies in die Formel für p eingebe, dann bekomme ich einen Druck von 1,202 bar als ergebnis. Das kann nicht stimmen, da ich mich in normaler umgebung befinde und mein analog-Ausgang mir einen realitischen Wert liefert
Mein Temperatur Wert ist totale Grütze, der kann gar nicht stimmen, da hier die Werte 56 und 220 aneinander gehangen 56220 ergeben was dezimal 352800 ergibt und mir dann in der Rechnung hinterher nen negativen Wert gibt.
Da der analoge Augang funktioniert muss der Sensor funktionieren, da das analoge Signal vom Sensor direkt aus dem I2C_Signal generiert wird. Bleibt nur ein Fehler meinerseits.
Wer nach diesem langen Roman jemand so nett und könnte mal auf den Quellcode rauflinsen? ich bin gerade sehr ratlos was der fehler sein könnte:-(
