Terrarium Steuerung

Hallo Gemeinde,

Ich bin Anfänger im Bereich Arduino und habe ein Problem.

Für mein Terrarium möchte ich gerne eine Temperaturüberwachung bauen.

Es sollen insgesamt 4 Sensoren (LM35 und DS18B20 sind vorhanden), ein Lüfter (12V) und ein LCD Display 16x2 zum Einsatz an einem Mega2560 kommen.

Ich habe es mittlerweile hinbekommen einen LM35 auszulesen und den dann auf ein LCD KeypadShield anzuzeigen. Bekomme aber keinen weiteren Sensor zum laufen.

Bei dem DS18B20 verzweifele ich. Da bekomme ich noch nicht mal die ID ausgelesen.

Nutze ich den Sketch aus dem Buch "Arduino Praxiseinstieg Behandelt Arduino 1.0" Um den LM25 mit Lüfter und Anzeige zu nutzen, bekomme ich beim kompillieren immer wieder Fehlermeldungen.

Für eure Hilfe bin ich dankbar!

Zaubersmut

Für den DS18B20 versuche mal diese Lib: http://www.milesburton.com/?title=Dallas_Temperature_Control_Library

Das sind Beispiele dabei. Auch ein Test Sketch um die Adressen auszulesen

Und denke daran dass du einen 4,7k Widerstand zwischen 5V und der Datenleitung brauchst!

Ansonsten musst du auch deinen Code posten. Sonst kann dir niemand damit helfen

Danke, das hat schon mal geholfen.

Ich denke das ich den Sketch, zumindest für die Temperatur, schon mal erfolgreich geändert habe.
Was mich noch stört ist, das die Ausgabe auch noch in Fahrenheit kommt.

Jetzt fehlt mir nur noch die Ausgabe auf das I2C LCD 16x2 und die Ansteuerung des Lüfters.

#include <OneWire.h>
#include <DallasTemperature.h>

// Data wire is plugged into pin 3 on the Arduino
#define ONE_WIRE_BUS 3

// Setup a oneWire instance to communicate with any OneWire devices
OneWire oneWire(ONE_WIRE_BUS);

// Pass our oneWire reference to Dallas Temperature. 
DallasTemperature sensors(&oneWire);

// Assign the addresses of your 1-Wire temp sensors.
// See the tutorial on how to obtain these addresses:
// http://www.hacktronics.com/Tutorials/arduino-1-wire-address-finder.html

DeviceAddress Liegeplatz1 = { 0x28, 0x00, 0xE5, 0xB1, 0x04, 0x00, 0x00, 0x96 };
DeviceAddress Liegeplatz2 = { 0x28, 0xAD, 0xEE, 0x30, 0x05, 0x00, 0x00, 0x0D };
DeviceAddress Liegeplatz3 = { 0x28, 0x50, 0xD5, 0xB1, 0x04, 0x00, 0x00, 0x3C };
DeviceAddress Technik = { 0x28, 0xA8, 0x31, 0xB2, 0x04, 0x00, 0x00, 0xA2 };

void setup(void)
{
  // start serial port
  Serial.begin(9600);
  // Start up the library
  sensors.begin();
  // set the resolution to 10 bit (good enough?)
  sensors.setResolution(Liegeplatz1, 10);
  sensors.setResolution(Liegeplatz2, 10);
  sensors.setResolution(Liegeplatz3, 10);
  sensors.setResolution(Technik, 10);
}

void printTemperature(DeviceAddress deviceAddress)
{
  float tempC = sensors.getTempC(deviceAddress);
  if (tempC == -127.00) {
    Serial.print("Error getting temperature");
  } else {
    Serial.print("C: ");
    Serial.print(tempC);
    Serial.print(" F: ");
    Serial.print(DallasTemperature::toCelsius(tempC));
  }
}

void loop(void)
{ 
  delay(2000);
  Serial.print("Getting temperatures...\n\r");
  sensors.requestTemperatures();
  
  Serial.print("Liegeplatz1 Temperatur is: ");
  printTemperature(Liegeplatz1);
  Serial.print("\n\r");
  Serial.print("Liegeplatz2 Temperatur is: ");
  printTemperature(Liegeplatz2);
  Serial.print("\n\r");
  Serial.print("Liegeplatz3 Temperatur is: ");
  printTemperature(Liegeplatz3);
  Serial.print("\n\r\n\r");
  Serial.print("Technik Temperatur is: ");
  printTemperature(Technik);
  Serial.print("\n\r");
}

Terrarium.ino (2.11 KB)

Hallo

Hier ist ein Sketch wo mit du die Temperatur auf ein I2C LCD anzeigen lassen kannst.
Jetzt brauchst du nur noch bei Temperatur 1 Regeln in der geschleiften Klammer von if http://arduino.cc/de/Reference/If#.UzMATFevkuQ nur noch den passenden pin auf HIGH oder LOW setzen.

#include <OneWire.h>
#include <DallasTemperature.h>
#include <LCD.h> 
#include <LiquidCrystal_I2C.h>
#include <Wire.h>

//LCD 
int n = 1; 
LiquidCrystal_I2C lcd(0x3F,2,1,0,4,5,6,7); // I2C-Adresse, wo den PCF8574A ist 0x3F oder 0x27

#define ONE_WIRE_BUS 22
OneWire oneWire(ONE_WIRE_BUS);



// Temperatur Adressierung
DallasTemperature sensors(&oneWire);
DeviceAddress Temp1 = { 0x28, 0xA4, 0xAF, 0x50, 0x4, 0x0, 0x0, 0x84 };
DeviceAddress Temp2 = { 0x28, 0x71, 0xEF, 0x50, 0x4, 0x0, 0x0, 0x42 };


void setup(void)
{
  
  lcd.begin (16,2); 
  lcd.setBacklightPin(3,POSITIVE); 
  lcd.setBacklight(HIGH); 
  lcd.home ();
  
  // Sensoren
  sensors.begin();
   
  //sonstiges
  Wire.begin();
  sensors.setResolution(Temp1, 10);
  sensors.setResolution(Temp2, 10);
}


void printTemperature(DeviceAddress deviceAddress)
{
  float tempC = sensors.getTempC(deviceAddress);
  if (tempC == -127.00) 
  {lcd.setCursor(0, 0);
   lcd.print("Sensor fehlt");} 
  else 
  {lcd.print(tempC);}    
}


void loop(void)
{
  // Anfang Temperatur auslesen
  sensors.requestTemperatures();
  // Temperatur 1 auslesen
  lcd.clear();
  lcd.setCursor(0, 0);
  lcd.print("Sensor 1 ");
  printTemperature(Temp1);
  lcd.print("C");
  // Thermometer 1 Regeln
  float temp1 = sensors.getTempC(Temp1);
  if (temp1 < 27)
  {lcd.print(" KALT");} 
  else 
  {lcd.print("  OK ");}
  if (temp1 > 28)  
  {lcd.print(" WARM");}
  
  
  // Temperatur 2 auslesen 
  lcd.setCursor(0, 1);
  lcd.print("Sensor 2 ");
  printTemperature(Temp2);
  lcd.print("C");
  // Thermometer 2 Regeln
  float temp2 = sensors.getTempC(Temp2);
  if (temp2 < 24) 
  {lcd.print(" KALT");} 
  else 
  {lcd.print("  OK ");}
  if (temp2 > 26)  
  {lcd.print(" WARM");} 
   delay(2500);
}

Wenn ich den Sketch von Ingo nehme und erst mal die if Funktion ausklammer, vom leichten zum schweren,
bekomme ich beim kompilieren immer noch Fehlermeldungen. Habe die schon auf ein minimum drücken können.

Die Fehlermeldungen:

sketch_mar27a.ino: In function ‘void loop()’:
sketch_mar27a:59: error: expected `;’ before ‘Temperature’
sketch_mar27a:59: error: statement cannot resolve address of overloaded function
sketch_mar27a:75: error: ‘Temp2’ was not declared in this scope

Wobei ich denke, wenn ich den Fehler bei Sensor1 kenne, kann ich den letzten Punkt auch beheben.

Hier der Sketch dazu:

#include <OneWire.h>
#include <DallasTemperature.h>
#include <LCD.h> 
#include <LiquidCrystal_I2C.h>
#include <Wire.h>

//LCD 
int n = 1; 
LiquidCrystal_I2C lcd(0x27,2,1,0,4,5,6,7); // I2C-Adresse, wo den PCF8574A ist 0x3F oder 0x27

#define ONE_WIRE_BUS 3
OneWire oneWire(ONE_WIRE_BUS);


// Temperatur Adressierung
DallasTemperature sensors(&oneWire);
DeviceAddress Liegeplatz1 = { 0x28, 0x00, 0xE5, 0xB1, 0x04, 0x00, 0x00, 0x96 };
DeviceAddress Liegeplatz2 = { 0x28, 0xAD, 0xEE, 0x30, 0x05, 0x00, 0x00, 0x0D };


void setup(void)
{
  
  lcd.begin (16,2); 
  lcd.setBacklightPin(3,POSITIVE); 
  lcd.setBacklight(HIGH); 
  lcd.home ();
  
  // Sensoren
  sensors.begin();
   
  //sonstiges
  Wire.begin();
  sensors.setResolution(Liegeplatz1, 12);
  sensors.setResolution(Liegeplatz2, 12);
}


void printTemperature(DeviceAddress deviceAddress)
{
  float tempC = sensors.getTempC(deviceAddress);
  if (tempC == -127.00) 
  {lcd.setCursor(0, 0);
   lcd.print("Sensor fehlt");} 
  else 
  {lcd.print(tempC);}    
}


void loop(void)
{
  delay(3000);
  // Anfang Temperatur auslesen
  sensors.requestTemperatures();
  // Temperatur 1 auslesen
  lcd.clear();
  lcd.setCursor(0, 0);
[color=red]  lcd.print("Liegeplatz 1 ");[/color] Hier ist der Fehler
  lcd.print Temperature(Temp1);
  lcd.print("\n\r");
  lcd.print("C");
  // Thermometer 1 Regeln
 // float temp1 = sensors.getTempC(Temp1);
//  if (temp1 < 27)
  //{lcd.print(" KALT");} 
  //else 
  //{lcd.print("  OK ");}
  //if (temp1 > 28)  
  //{lcd.print(" WARM");}
  
  
  // Temperatur 2 auslesen 
  lcd.setCursor(0, 1);
  lcd.print("Sensor 2 ");
  printTemperature(Temp2);
  lcd.print("C");
  // Thermometer 2 Regeln
  /*float temp2 = sensors.getTempC(Temp2);
  if (temp2 < 24) 
  {lcd.print(" KALT");} 
  else 
  {lcd.print("  OK ");}
  if (temp2 > 26)  
  {lcd.print(" WARM");} 
   delay(2500);
   */
}

Hallo

Es muss heißen printTemperature(Liegeplatz1); und nicht lcd.print Temperature(Temp1);

Probiere den Sketch

#include <OneWire.h>
#include <DallasTemperature.h>
#include <LCD.h>
#include <LiquidCrystal_I2C.h>
#include <Wire.h>

//LCD
int n = 1;
LiquidCrystal_I2C lcd(0x27,2,1,0,4,5,6,7); // I2C-Adresse, wo den PCF8574A ist 0x3F oder 0x27

#define ONE_WIRE_BUS 3
OneWire oneWire(ONE_WIRE_BUS);


// Temperatur Adressierung
DallasTemperature sensors(&oneWire);
DeviceAddress Liegeplatz1 = { 0x28, 0x00, 0xE5, 0xB1, 0x04, 0x00, 0x00, 0x96 };
DeviceAddress Liegeplatz2 = { 0x28, 0xAD, 0xEE, 0x30, 0x05, 0x00, 0x00, 0x0D };


void setup(void)
{
 
  lcd.begin (16,2);
  lcd.setBacklightPin(3,POSITIVE);
  lcd.setBacklight(HIGH);
  lcd.home ();
 
  // Sensoren
  sensors.begin();
   
  //sonstiges
  Wire.begin();
  sensors.setResolution(Liegeplatz1, 12);
  sensors.setResolution(Liegeplatz2, 12);
}


void printTemperature(DeviceAddress deviceAddress)
{
  float tempC = sensors.getTempC(deviceAddress);
  if (tempC == -127.00)
  {lcd.setCursor(0, 0);
   lcd.print("Sensor fehlt");}
  else
  {lcd.print(tempC);}   
}


void loop(void)
{
  delay(3000);
  // Anfang Temperatur auslesen
  sensors.requestTemperatures();
  // Temperatur 1 auslesen
  lcd.clear();
  lcd.setCursor(0, 0);
  lcd.print("Liegeplatz 1 "); //Hier ist der Fehler
  printTemperature(Liegeplatz1);
  lcd.print("\n\r");
  lcd.print("\337C");
  // Thermometer 1 Regeln
 // float temp1 = sensors.getTempC(Temp1);
//  if (temp1 < 27)
  //{lcd.print(" KALT");}
  //else
  //{lcd.print("  OK ");}
  //if (temp1 > 28) 
  //{lcd.print(" WARM");}
 
 
  // Temperatur 2 auslesen
  lcd.setCursor(0, 1);
  lcd.print("Liegeplatz 2 ");
  printTemperature(Liegeplatz2);
  lcd.print("C");
  // Thermometer 2 Regeln
  /*float temp2 = sensors.getTempC(Temp2);
  if (temp2 < 24)
  {lcd.print(" KALT");}
  else
  {lcd.print("  OK ");}
  if (temp2 > 26) 
  {lcd.print(" WARM");}
   delay(2500);
   */
}

Der Fehler ist daß Du bei

lcd.print Temperature(Temp1);

die Klammern vergessen hast.

lcd.print (Temperature(Temp1));

Grüße Uwe

Hallo Uwe

Wenn man

lcd.print (Temperature(Temp1));

Kommt folgender Fehler

was not declared in this scope

Man muss

printTemperature(Temp1);

dann funktioniert es

Ingo79: Hallo Uwe

Wenn man

lcd.print (Temperature(Temp1));

Kommt folgender Fehler

was not declared in this scope

Man muss

printTemperature(Temp1);

dann funktioniert es

Eine Funktion wie lcd.print braucht zwingend Klammern. Mein Fehler war, daß ich nicht darauf geachtet habe, daß Temperature(Temp1) auch eine Funktion ist und daß ich den Sketch nicht genau analysiert habe. Wenn dann noch der Funktionsname falsch geschrieben wurde dann produziert das wieder neue Fehler.

Danke für die Korrektur.

Grüße Uwe

Danke für eure Hilfe. Das Problem mit dem Display ist gelöst.

Jetzt wird mir als Temperatur aber nur 85 Grad angezeigt.

In Englisch habe ich da genug Hilfen gefunden. Allerdings ist mein Englisch in Schrift nicht gerade gut.

#include <LiquidCrystal.h>

#include <OneWire.h>
#include <DallasTemperature.h>

// Data wire is plugged into pin 3 on the Arduino
#define ONE_WIRE_BUS 3

LiquidCrystal lcd(8, 9, 4, 5, 6, 7);

// Setup a oneWire instance to communicate with any OneWire devices
OneWire oneWire(ONE_WIRE_BUS);

// Pass our oneWire reference to Dallas Temperature. 
DallasTemperature sensors(&oneWire);

// Assign the addresses of your 1-Wire temp sensors.

DeviceAddress Liegeplatz1 = { 0x28, 0x00, 0xE5, 0xB1, 0x04, 0x00, 0x00, 0x96 };
DeviceAddress Liegeplatz2 = { 0x28, 0xAD, 0xEE, 0x30, 0x05, 0x00, 0x00, 0x0D };
DeviceAddress Liegeplatz3 = { 0x28, 0x50, 0xD5, 0xB1, 0x04, 0x00, 0x00, 0x3C };
DeviceAddress Technik = { 0x28, 0xA8, 0x31, 0xB2, 0x04, 0x00, 0x00, 0xA2 };

void setup(void)
{
  lcd.begin(16, 2); //Start LCD
  // start serial port
  Serial.begin(9600);
  // Start up the library
  sensors.begin();
  // set the resolution to 10 bit (good enough?)
  sensors.setResolution(Liegeplatz1, 10);
  sensors.setResolution(Liegeplatz2, 10);
  sensors.setResolution(Liegeplatz3, 10);
  sensors.setResolution(Technik, 10);
}

void printTemperature(DeviceAddress deviceAddress)
{
  float tempC = sensors.getTempC(deviceAddress);
  if (tempC == -127.00) {
    Serial.print("Error getting temperature");
  } else {
    Serial.print("C: ");
    Serial.print(tempC);
    Serial.print(" F: ");
    Serial.print(DallasTemperature::toCelsius(tempC));
  }
}

void loop()
{ 
  delay(5000);
 // Serial.print("Getting temperatures...\n\r");
 // sensors.requestTemperatures();
  
  Serial.print("Liegeplatz 1 : ");
  printTemperature(Liegeplatz1);
  Serial.print("\n\r");
  Serial.print("Liegeplatz2 Temperatur is: ");
  printTemperature(Liegeplatz2);
  Serial.print("\n\r");
  Serial.print("Liegeplatz3 Temperatur is: ");
  printTemperature(Liegeplatz3);
  Serial.print("\n\r\n\r");
  Serial.print("Technik Temperatur is: ");
  printTemperature(Technik);
  Serial.print("\n\r");
}

in dem seriell Monitor kommt dann folgendes

Liegeplatz 1 : C: 85.00 F: 29.44
Liegeplatz2 Temperatur is: C: 85.00 F: 29.44
Liegeplatz3 Temperatur is: C: 85.00 F: 29.44

Technik Temperatur is: C: 85.00 F: 29.44

Woran liegt es das ich die 85° angezeigt bekomme?
Wie kann ich die Anzeige F ausblenden?
Wie bekomme ich den Absatz zwischen Liegeplatz3 und Technik weg?

Danke für eure Hilfe!!

Hallo,
probiere das einmal ohne “DallasLib” für Deine Dallas.

#include <OneWire.h>

#include <LiquidCrystal.h>

#include <Wire.h>



// OneWire DS18S20, DS18B20, DS1822 Temperature Example
//
// http://www.pjrc.com/teensy/td_libs_OneWire.html
//
// The DallasTemperature library can do all this work for you!
// http://milesburton.com/Dallas_Temperature_Control_Library

OneWire  ds(10);  // on pin 10

void setup(void) {
  Serial.begin(19200);
}

void loop(void) {
  byte i;
  byte present = 0;
  byte type_s;
  byte data[12];
  byte addr[8];
  float celsius, fahrenheit;
  
  if ( !ds.search(addr)) {
    Serial.println("No more addresses.");
    Serial.println();
    ds.reset_search();
    delay(250);
    return;
  }
  
  Serial.print("ROM =");
  for( i = 0; i < 8; i++) {
    Serial.write(' ');
    Serial.print(addr[i], HEX);
  }

  if (OneWire::crc8(addr, 7) != addr[7]) {
      Serial.println("CRC is not valid!");
      return;
  }
  Serial.println();
 
  // the first ROM byte indicates which chip
  switch (addr[0]) {
    case 0x10:
      Serial.println("  Chip = DS18S20");  // or old DS1820
      type_s = 1;
      break;
    case 0x28:
      Serial.println("  Chip = DS18B20");
      type_s = 0;
      break;
    case 0x22:
      Serial.println("  Chip = DS1822");
      type_s = 0;
      break;
    default:
      Serial.println("Device is not a DS18x20 family device.");
      return;
  } 

  ds.reset();
  ds.select(addr);
  ds.write(0x44,1);         // start conversion, with parasite power on at the end
  
  delay(750);     // maybe 750ms is enough, maybe not
  // we might do a ds.depower() here, but the reset will take care of it.
  
  present = ds.reset();
  ds.select(addr);    
  ds.write(0xBE);         // Read Scratchpad

  Serial.print("  Data = ");
  Serial.print(present,HEX);
  Serial.print(" ");
  for ( i = 0; i < 9; i++) {           // we need 9 bytes
    data[i] = ds.read();
    Serial.print(data[i], HEX);
    Serial.print(" ");
  }
  Serial.print(" CRC=");
  Serial.print(OneWire::crc8(data, 8), HEX);
  Serial.println();

  // convert the data to actual temperature

  unsigned int raw = (data[1] << 8) | data[0];
  if (type_s) {
    raw = raw << 3; // 9 bit resolution default
    if (data[7] == 0x10) {
      // count remain gives full 12 bit resolution
      raw = (raw & 0xFFF0) + 12 - data[6];
    }
  } else {
    byte cfg = (data[4] & 0x60);
    if (cfg == 0x00) raw = raw << 3;  // 9 bit resolution, 93.75 ms
    else if (cfg == 0x20) raw = raw << 2; // 10 bit res, 187.5 ms
    else if (cfg == 0x40) raw = raw << 1; // 11 bit res, 375 ms
    // default is 12 bit resolution, 750 ms conversion time
  }
  celsius = (float)raw / 16.0;
  fahrenheit = celsius * 1.8 + 32.0;
  Serial.print("  Temperature = ");
  Serial.print(celsius,1);
  Serial.print(" Celsius, ");
  Serial.print(fahrenheit);
  Serial.println(" Fahrenheit");
}

Hoffe es hilft.
Gruß und Spaß
Andreas