Schau dir mal deine getDateDs3231() Funktion an. Da siehst du wie man Register ausliest.
Also einfach so:
int temperature()
{
union int16_byte {
int i;
byte b[2];
} rtcTemp;
Wire.beginTransmission(DS3231_I2C_ADDRESS);
Wire.write(0x11);
Wire.endTransmission();
Wire.requestFrom(DS3231_I2C_ADDRESS, 2);
rtcTemp.b[1] = Wire.read();
rtcTemp.b[0] = Wire.read();
return rtcTemp.i >> 6;
}
Oder eben 0.25 für Float. Also z.B.:
float temperature()
{
...
return (rtcTemp.i >> 6) * 0.25;
}
Nicht getestet!
Aber wie kommt jetzt die zahl in meine definierte Variable temperatur?
Die Temperatur wird als 10-Bit Wert in 0.25° Grad Schritten abgespeichert. Man wandelt also erst mal das Byte Array per Union in einen Integer. Dann muss man keine umständliche Konvertierung wegen dem Zweier-Komplement (für negative Temperaturen) machen. Dann schiebt man das 6 mal nach rechts, damit das niederwertigste Bit auch wirklich auf Bit 0 steht.
Und dann muss man sich eben entscheiden ob man das als Integer in Viertel-Grad Schritten oder als Float möchte.
ok langsam steig ich dahinter. Ich habe das ganze jetzt mal in meinen Code eingefügt aber allerdings eine Fehlermeldung bei dem return/rtcTemp.i >> 6 bekommen.
Arduino: 1.6.5 (Windows 8.1), Platine: "Arduino Nano, ATmega328"
Duengecontroll_1.3.ino: In function 'void getDateDs3231(int*)':
Duengecontroll_1.3:65: error: expected unqualified-id before 'return'
expected unqualified-id before 'return'
#include "LCD4Bit_mod.h"
#include "Wire.h"
#include <DS18B20.h>
int dosierpumpe1 = 10; // Düngepumpe 1 an Pin 10
int duengemenge1 = 9; // Düngemenge Pumpe 1 in ml
int duengedauer1 = duengemenge1 * 1.7; // Berechnung der Laufzeit Pumpe 1
long duengezeit1 = 100000; // Düngezeitpunkt 1 hhmmss
int motorPin = 2; // Lüfter an Pin 6
float threshold = 30; // Schalttemperatur für Lüfter (30 Grad Celsius)
float hysterese = 0.5; // Hysterese Wert (0.5 Grad Celsius)
char buffer[20] = ""; // Speicherbereich für Datenkonvertierung
LCD4Bit_mod lcd = LCD4Bit_mod(2); // LCD-Display
DS18B20_List ds18b20(9); // DS18B20 an Pin 9
#define wassertemperatur 0x899A // DS18B20 Adresse
#define DS3231_I2C_ADDRESS 0x68 // I2C Adresse
/****************************************************************************************************
* Konvertierung BCD-kodierter Dezimalzahl
*/
byte bcdToDec(byte val)
{
return ( (val / 16 * 10) + (val % 16) );
}
/****************************************************************************************************
* Zeit und Datum aus DS1307 auslesen und konvertieren
*/
void getDateDs3231(int date[])
{
Wire.beginTransmission(DS3231_I2C_ADDRESS); // I2C-Kommunikation im Schreibmodus starten
Wire.write(0x00); // Registerzeiger auf 0 setzen
Wire.endTransmission(); // I2C-Kommunikation beenden
Wire.requestFrom(DS3231_I2C_ADDRESS, 7); // I2C-Kommunikation im Lesemodus starten
date[ 0 ] = bcdToDec(Wire.read() & 0x7f); // Sekunden
date[ 1 ] = bcdToDec(Wire.read()); // Minuten
date[ 2 ] = bcdToDec(Wire.read() & 0x3f); // Stunden
date[ 3 ] = bcdToDec(Wire.read()); // Wochentag
date[ 4 ] = bcdToDec(Wire.read()); // Tag
date[ 5 ] = bcdToDec(Wire.read()); // Monat
date[ 6 ] = bcdToDec(Wire.read()); // Jahr
float temperature();
union int16_byte {
int i;
byte b[2];
} rtcTemp;
Wire.beginTransmission(DS3231_I2C_ADDRESS);
Wire.write(0x11);
Wire.endTransmission();
Wire.requestFrom(DS3231_I2C_ADDRESS, 2);
rtcTemp.b[1] = Wire.read();
rtcTemp.b[0] = Wire.read();
return (rtcTemp.i >> 6) * 0.25;
}
/****************************************************************************************************
*/
void setup() {
Serial.begin(9600);
Wire.begin(); // I2C-Bus einrichten
lcd.init(); // LCD-Anzeige initialisieren
lcd.clear();
lcd.printIn( "DS1307 - Uhr" );
pinMode(dosierpumpe1, OUTPUT); // Digitaler Pin 10 als Ausgang
pinMode(motorPin, OUTPUT); // Digitaler Pin 2 als Ausgang
}
/****************************************************************************************************
*/
void loop() {
int datum[ 7 ];
char str[30] ;
long Stunde = datum[2];
long uhrzeit = Stunde * 10000 + datum[1] * 100 + datum[0];
getDateDs3231( datum ); // Datum und Uhrzeit aus DS1307 holen
ds18b20.update(); // Temperatur aus DS18B20 holen
float T_wasser = ds18b20.get_temp_by_id(wassertemperatur);
// Temperatur aus DS3231 auslesen
// Schalten der Düngepumpen
if (uhrzeit < duengezeit1 )
digitalWrite( dosierpumpe1, LOW);
else if ( uhrzeit > duengezeit1 + duengedauer1)
digitalWrite( dosierpumpe1, LOW);
else
digitalWrite(dosierpumpe1, HIGH);
// Schalten des Lüfters
if (T_wasser > (threshold + hysterese))
digitalWrite(motorPin, HIGH);
else if (T_wasser < (threshold - hysterese))
digitalWrite(motorPin, LOW);
// Anzeige im LCD
sprintf( str, "%02d-%02d %02d:%02d:%02d",
datum[4], datum[5],
datum[2], datum[1], datum[0] );
lcd.cursorTo( 1, 0 );
lcd.printIn( str );
// Anzeige im Serial Monitor
sprintf( str, "Temp", dosierpumpe1);
lcd.cursorTo( 2, 0 );
lcd.printIn( str );
Serial.println(uhrzeit);
Serial.print("Wassertemperatur: ");
Serial.print(T_wasser);
Serial.println("C");
delay(1000);
}
Pass etwas besser auf wenn du Code änderst
float temperature();
Was soll das Semi-Kolon da? Dann fehlt die öffnende Klammer.
Außerdem hast du die schließende Klammer der vorherigen Funktion entfernt
Bist du etwa auf die Idee gekommen dass in die bestehende Funktion zu schreiben? Das ist eine eigenständige Funktion!! Ein paar Grundlagen über Funktionen zu lernen wäre nicht schlecht.
Ich habe mit diesen Funktionen bisher noch nichts gemacht. Bin ja gerade erst dabei das zu lernen
Das soll eine eigene Funktion werden
Also sowas (nur als theoretisches Beispiel!):
void func1()
{
}
int func2()
{
return ...;
}
void loop()
{
func1();
int var = func2();
}
Du musst jede Funktion für sich definieren. Dann kannst du sie in anderen Funktionen aufrufen.
Ja als du mich darauf aufmerksam gemacht hast habe ich dass gesehen. Aber schon mal vielen Dank.
So jetzt steckt ja eigentlich die Temperatur als Fließkommazahl in der variablen "temperature" oder?
temperature() ist keine Variable, sondern eine Funktion die einen Float Wert liefert.
Wenn du die Temperatur auslesen willst rufst du die Funktion auf und weißt den Wert einer Variablen zu:
void loop()
{
float temp = temperature();
}
Nenn die Funktion getTemperature() oder readTemperature() dann wird es vielleicht deutlicher
ok wieder ein haufen gelernt danke dor für die geduldige Hilfe. Hab den Code gerade aufgespielt und siehe da funktioniert. Leider ist der Sensor etwas langsam und reagiert nur sehr langsam aber das wird man wohl nicht ändern können oder?
Datenblatt Seite 15!
Die Temperatur wird automatisch nur alle 64 Sekunden aktualisiert. Wenn man es schneller möchte muss man das per Hand starten. Dazu muss man Bit 5 im Control Register setzen. Und dann das Bit solange auslesen bis es 0 ist. Dann ist die Wandlung fertig. Siehe Seite 13!
Das dürfte dich aber überfordern
ok für meine Zwecke reicht es vielen Dank