habe mal wieder ein Problemchen wo ich nicht wirklich weiter komme. Also erstmal kurz was ich machen möchte. Ich habe einen DHT22 und einen BMP085 und möchte Temperatur, Luftfeuchte und Luftdruck auf meinem Serial Monitor ausgeben. Dabei habe ich 2 Probleme.
Die Temperatur wird zwar korrekt angezeigt, jedoch mit einem Hieroglyphen. Also zwischen der Temperatur (welches mit Absicht auf eine Stelle nach dem Komma begrenzt ist) und dem °C. Wie bekomme ich das weg, bzw. wieso kommt das? Wo liegt der Fehler?
z.B. hier das Copy aus dem Monitor:
Der Luftdruck wird so gemessen wie unter "Luftdruck Sensor". Soweit so gut. Jedoch Stimmt diese nicht ganz, weil ich diesen Druck noch auf meinen Standort (Meereshöhe) umrechnen muss. Formel hierzu: p0 = 990 hPa / 0,97259771 = 1017,9 hPa. Also 990hPa wird vom Sensor gemessen. Die 0,97259771 ist mein errechneter Exponentialkoeffizient. Ich möchte das der "Luftdruck Gerechnet" die 1017,9 hPa anzeigt und nicht die 964 hPa. Leider sehe ich hier auch nicht meinen Fehler. Zumindest ist es mit meiner jetzigen Art so das ich zumindest überhaupt irgendwas angezeigt bekomme, sonst zeigt er nur 0 hPa an..... Direkte Ausrechnung mit der oben stehende Formel sowie dem Exponentialkoeffizient scheint der Arduino generell nicht zu mögen. Zumindest scheint er falsch zu rechnen? Excel, mein Taschenrechner sowie Windows Taschenrechner rechnen richtig
Anbei noch mein Code (Ist kein endgültiger Code, nur zum Spielen und lernen, bitte nicht wundern):
//####################################################################//
// Librarys einbinden //
//####################################################################//
#include <Wire.h> // Wire Library
#include <dht.h> // DHT Library
//####################################################################//
// Konfiguration DHT Sensor //
//####################################################################//
// DHT Library starten
dht DHT;
// Definiere Pin für Innensensor
#define DHT22_PIN 6 // Innensensor
int interval_update = 10000; // Intervalzeit für Temperaturabfrage (10s)
unsigned long prev_update; // Variable "prev_update" wird als "unsigned long" deklariert
//####################################################################//
// Konfiguration BMP085 Sensor //
//####################################################################//
#define BMP085_ADDRESS 0x77 // I2C address of BMP085
const unsigned char OSS = 0; // Oversampling Setting
// Calibration values
int ac1;
int ac2;
int ac3;
unsigned int ac4;
unsigned int ac5;
unsigned int ac6;
int b1;
int b2;
int mb;
int mc;
int md;
// b5 is calculated in bmp085GetTemperature(...), this variable is also used in bmp085GetPressure(...)
// so ...Temperature(...) must be called before ...Pressure(...).
long b5;
short temperature;
float pressure;
//####################################################################//
// Konstanten und Variablen //
//####################################################################//
float Humidity_Out; // Variable um die Innenluftfeuchte zu speichern
float Temperature_Out; // Variable um die Innentemperatur zu speichern
float k_wert_out = 0.2; // Korrekturwert für den Innensensor
byte Sensor_Out_Fail = 0; // Variable um einen möglichen fehlenden / defekten Innensensor (zu beginn) zu speichern
byte Sensor_Out_Check_Fail = 0; // Variable um einen möglichen fehlenden / defekten Innensensor (zur Laufzeit) zu speichern
//####################################################################//
// Setup (wird einmalig durchlaufen) //
//####################################################################//
void setup(void) // Setup wird einmalig durchlaufen
{
Serial.begin(9600);
Wire.begin();
bmp085Calibration();
prev_update = millis(); // Millis (Zeit seitdem der µC läuft) wird in Variable "prev" geschrieben
// Anzahl der angeschlossenen Sensoren auswerten und erste Temperatur- / Luftfeuchte abfrage
int chk = DHT.read22(DHT22_PIN); // Initialisieren und DHT22_PIN einlesen
switch (chk){ // Case check
case DHTLIB_OK: // Wenn DHTLIB_OK
Humidity_Out = DHT.humidity; // Luftfeuchte in Humidity_In speichern
Temperature_Out = DHT.temperature - k_wert_out, 1; // Temperatur in Temperature_In abzüglich dem Korrekturwert speichern
break; // abbrechen
case DHTLIB_ERROR_CHECKSUM: // Wenn DHTLIB_ERROR_CHECKSUM
break; // abbrechen
case DHTLIB_ERROR_TIMEOUT: // Wenn DHTLIB_ERROR_TIMEOUT
Sensor_Out_Fail = 1; // Innensensor fehlt oder defekt --> eine 1 in Variable schreiben
break; // abbrechen
default: // Wenn default
break; // abbrechen
}
}
//####################################################################//
// Loop (wird ständig durchlaufen) //
//####################################################################//
void loop(void)
{
TemperaturSensor(); // Sensor abfragen und Wert verarbeiten
LuftfeuchteSensor(); // Sensor abfragen und Wert verarbeiten
SerialAusgabe(); // Ausgabe auf Serial Monitor
}
void LuftfeuchteSensor()
{
temperature = bmp085GetTemperature(bmp085ReadUT());
pressure = bmp085GetPressure(bmp085ReadUP());
delay(1000);
}
Wenn du /10000 machst ist das eine Integer-Division und der schneidet dir die Nachkomma-Stellen ab. Mach mal /10000.0
Bei beiden Divisionen
Wegen dem Grad-Zeichen könntest du mal probieren, den ASCII Code dafür mit Serial.write(176) rauszuschreiben. Weiß aber nicht ob er den Extended Table erkennt. Laut dem hier:
Die Temperatur wird zwar korrekt angezeigt, jedoch mit einem Hieroglyphen. Also zwischen der Temperatur (welches mit Absicht auf eine Stelle nach dem Komma begrenzt ist) und dem °C. Wie bekomme ich das weg, bzw. wieso kommt das? Wo liegt der Fehler?
Dein Arduino Code-Editor arbeitet mit UTF-8 Zeichensatz, das ist ein Zeichensatz, bei dem Sonderzeichen immer 2 Bytes gross sind. Und Dein serieller Monitor stellt jedes eintreffende Byte einzeln dar.
Das ist bei deutschen Umlauten noch schlimmer in der Ausgabe:
Serial.println("äöüß");
Beim °-Zeichen stimmt wenigstens das Lower-Byte, so dass Du beispielsweise die Bytes einzeln definieren könntest:
char gradC[4]={' ','°','C','\0'};
Und zur Ausgabe dann:
Serial.println(gradC);
Was das rechnen mit Gleitkommazahlen betrifft: Rechts vom Gleichheitszeichen sollte mindestens eine Gleitkommazahl in der Rechnung vorkommen, damit eine Gleitkommarechnung und keine Integer-Rechnung durchgeführt wird.