Propleme bei Düngepumpe

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 :frowning:

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 :slight_smile: 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 :confused:

ok für meine Zwecke reicht es vielen Dank