automatischer aquarienkühler

Hallo zusammen…
Vorne weg. Eigentlich bin ich einer, der immer alles alleine macht und machen will…
Aber beim programmieren stelle ich mich anscheinend einfach zu blöd an;)

Was ich eigentlich will…
2 DS18b20 die in 2 aquarien die Temperatur messen.
Diese Temperaturen solenl dann auf dem Display angezeigt werden.
Eine 2 RGB leds sollen dann bei 22-24° Grün, unter 22° Blau und über 24° rot leuchten.
Zusätzlich soll dann ab 24,5° der jeweilige lüfter angehen um das jeweilge Becken zu kühlen.

Das das Display etwas anzeigt, habe ich schonmal geschafft.
Auch die Messung der Temperatur ging.
Aber das alles jetzt zu einem Code zusammen Packen, klappt beim beste willen überhaupt nicht…

hier mal Bilder von der Hardware:

Die beiden einzelnen Codes:

Display :

#include <Wire.h>  

#include <LiquidCrystal_I2C.h>


LiquidCrystal_I2C lcd(0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);  // Set the LCD I2C address



void setup()   
{
  Serial.begin(9600);  

  lcd.begin(20,4);   

  for(int i = 0; i< 3; i++)
  {
    lcd.backlight();
    delay(250);
    lcd.noBacklight();
    delay(250);
  }
  lcd.backlight(); 



  lcd.setCursor(0,0); 
  lcd.print("reihe1 ");
 
  delay(1000);
  lcd.setCursor(0,1);
  lcd.print("reihe2");
  delay(1000);  
  lcd.setCursor(0,2);
  lcd.print("reihe3");
  delay(1000);  
  lcd.setCursor(0,3);
  lcd.print("reihe4");
  delay(1000); 
  



}

void loop()   
{
  {
   
    if (Serial.available()) {
      delay(100);
      lcd.clear();
      while (Serial.available() > 0) {
        lcd.write(Serial.read());
      }
    }
  }

}

und der sensor:

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

// Data wire is plugged into port 2 on the Arduino
#define ONE_WIRE_BUS 2
#define TEMPERATURE_PRECISION 9

// Setup a oneWire instance to communicate with any OneWire devices (not just Maxim/Dallas temperature ICs)
OneWire oneWire(ONE_WIRE_BUS);

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

int numberOfDevices; // Number of temperature devices found

DeviceAddress tempDeviceAddress; // We'll use this variable to store a found device address

void setup(void)
{
  // start serial port
  Serial.begin(9600);
  Serial.println("Dallas Temperature IC Control Library Demo");

  // Start up the library
  sensors.begin();
  
  // Grab a count of devices on the wire
  numberOfDevices = sensors.getDeviceCount();
  
  // locate devices on the bus
  Serial.print("Locating devices...");
  
  Serial.print("Found ");
  Serial.print(numberOfDevices, DEC);
  Serial.println(" devices.");

  // report parasite power requirements
  Serial.print("Parasite power is: "); 
  if (sensors.isParasitePowerMode()) Serial.println("ON");
  else Serial.println("OFF");
  
  // Loop through each device, print out address
  for(int i=0;i<numberOfDevices; i++)
  {
    // Search the wire for address
    if(sensors.getAddress(tempDeviceAddress, i))
	{
		Serial.print("Found device ");
		Serial.print(i, DEC);
		Serial.print(" with address: ");
		printAddress(tempDeviceAddress);
		Serial.println();
		
		Serial.print("Setting resolution to ");
		Serial.println(TEMPERATURE_PRECISION, DEC);
		
		// set the resolution to TEMPERATURE_PRECISION bit (Each Dallas/Maxim device is capable of several different resolutions)
		sensors.setResolution(tempDeviceAddress, TEMPERATURE_PRECISION);
		
		 Serial.print("Resolution actually set to: ");
		Serial.print(sensors.getResolution(tempDeviceAddress), DEC); 
		Serial.println();
	}else{
		Serial.print("Found ghost device at ");
		Serial.print(i, DEC);
		Serial.print(" but could not detect address. Check power and cabling");
	}
  }

}

// function to print the temperature for a device
void printTemperature(DeviceAddress deviceAddress)
{
  // method 1 - slower
  //Serial.print("Temp C: ");
  //Serial.print(sensors.getTempC(deviceAddress));
  //Serial.print(" Temp F: ");
  //Serial.print(sensors.getTempF(deviceAddress)); // Makes a second call to getTempC and then converts to Fahrenheit

  // method 2 - faster
  float tempC = sensors.getTempC(deviceAddress);
  Serial.print("Temp C: ");
  Serial.print(tempC);
  Serial.print(" Temp F: ");
  Serial.println(DallasTemperature::toFahrenheit(tempC)); // Converts tempC to Fahrenheit
}

void loop(void)
{ 
  // call sensors.requestTemperatures() to issue a global temperature 
  // request to all devices on the bus
  Serial.print("Requesting temperatures...");
  sensors.requestTemperatures(); // Send the command to get temperatures
  Serial.println("DONE");
  
  
  // Loop through each device, print out temperature data
  for(int i=0;i<numberOfDevices; i++)
  {
    // Search the wire for address
    if(sensors.getAddress(tempDeviceAddress, i))
	{
		// Output the device ID
		Serial.print("Temperature for device: ");
		Serial.println(i,DEC);
		
		// It responds almost immediately. Let's print out the data
		printTemperature(tempDeviceAddress); // Use a simple function to print out the data
	} 
	//else ghost device! Check your power requirements and cabling
	
  }
}

// function to print a device address
void printAddress(DeviceAddress deviceAddress)
{
  for (uint8_t i = 0; i < 8; i++)
  {
    if (deviceAddress[i] < 16) Serial.print("0");
    Serial.print(deviceAddress[i], HEX);
  }
}

Evtl ist ja jemand so lieb der das ausm ff kann mir einen zu basteln…

Nur mal so eine Frage: Die beiden obigen Sketche hast du zu min. 98% NICHT selbst geschrieben sondern per copy&paste übernommen, oder?

Na das sind die Beispiel Sketche. Irgendwo muss man ja anfangen. Habe von jemanden auch ein Sketch bekommen, aber der ist mit anderen librarys. Diesen habe ich auch versucht so anzupassen das er mit meinen läuft. Aber wenn ich 1 Fehler behoben habe, kommen gleich 3 neue.

Hallo,
alles ein wenig “müllich” gehe da doch einmal anders ran.
C & P ist ja schön und gut, aber man solllte schon wissen, was es macht.

Damit solltest Du etwas auf dem Display darstellen können:

#include <Wire.h>  
#include <LiquidCrystal_I2C.h>

LiquidCrystal_I2C lcd(0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);  // Set the LCD I2C address

void setup()   
{
 lcd.begin(20,4);
 lcd.backlight(); 
}

void loop()   
{
lcd.setCursor(0,0);
  lcd.print("Zeile 1");
lcd.setCursor(0,1);
  lcd.print("Zeile 2");
lcd.setCursor(0,2);
  lcd.print("Zeile 3");
lcd.setCursor(0,3);
  lcd.print("Zeile 4");
}

Für den TempSensor suche Dir mal etwas “einfaches” was nur die Temperatur
anzeigt.

Wenn Du die Anzeige auf einem Display haben willst, dann brauchst Du kein
“Serial.print”
Dieses “Serial.print” löscht Du alles raus- aber ACHTUNG!
Nicht die Zeile, die die Temperatur ausgibt.
In Deinem Sketch z.B.

Serial.print("Temp C: ");
Serial.print(tempC);

das änders Du in

lcd.setCursor(0,0);
lcd.print("Temp C: ");
lcd.print(tempC);

so geht es im ganz Groben.
Gruß und Spaß
Andreas

Kkz89: Na das sind die Beispiel Sketche.

Das ist ein Sketch um die Sensoren auf dem Bus durchzutesten. Damit kann man gut sehen ob die funktionieren und die Adressen auslesen. Aber um praktisch die Temperaturen zu lesen ist der nicht gedacht. Da sind zig Sachen drin die man nicht braucht.

Schau dir mal die anderen Beispiele an.

Im Prinzip braucht du neben der Initialisierung nur requestTemperatures() und eine der Lese-Funktionen (entweder nach Adresse oder Index)

so der code für das “Thermometer” ist fertig…
Nun noch die lüfter ansteuern und rgb ansteuern.
Hat da jemand beispiele für dieses If / else ?

#include <OneWire.h>

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


#define ONE_WIRE_BUS 52    


OneWire oneWire(ONE_WIRE_BUS);

DallasTemperature sensors(&oneWire);

LiquidCrystal_I2C lcd(0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);



DeviceAddress Probe01 = { 0x28, 0xFF, 0x1B, 0x4B, 0x2E, 0x04, 0x00, 0x6B }; //1
DeviceAddress Probe02 = { 0x28, 0xFF, 0x1F, 0x76, 0x2B, 0x04, 0x00, 0x94 }; //2
//DeviceAddress Probe03 = { 0x28, 0x9A, 0x80, 0x40, 0x04, 0x00, 0x00, 0xD5 }; //3
//DeviceAddress Probe04 = { 0x28, 0x10, 0xA4, 0x57, 0x04, 0x00, 0x00, 0xA9 };//4


void setup()   
{

  sensors.begin();

  sensors.setResolution(Probe01, 10);
  sensors.setResolution(Probe02, 10);
//  sensors.setResolution(Probe03, 10);
//  sensors.setResolution(Probe04, 10);


  lcd.begin (20,4);  
lcd.backlight();
}


void loop()   
{
  sensors.requestTemperatures(); 
  
  lcd.clear();  
  lcd.home();
  lcd.backlight();  
  

  lcd.setCursor(0,0); 
  lcd.print("Becken1: ");
  displayTemperature(Probe01);

  lcd.setCursor(0,1); 
  lcd.print("Becken2: ");
  displayTemperature(Probe02);

//  lcd.setCursor(0,2); 
//  lcd.print("3: ");
//  displayTemperature(Probe03);

//  lcd.setCursor(0,3); 
//  lcd.print("4: ");
//  displayTemperature(Probe04);

  delay(20000);  //aktualisierungszeit

}


void displayTemperature(DeviceAddress deviceAddress)
{

float tempC = sensors.getTempC(deviceAddress);

   if (tempC == -127.00) 
   {
    lcd.print("Temperature Error");
   }
   else
   {
   lcd.print("C=");
   lcd.print(tempC);
 
   }
}

Hallo,
hier gibt es etwas für if / else:

http://arduino.cc/de/pmwiki.php?n=Reference/If
http://arduino.cc/de/pmwiki.php?n=Reference/Else

hier auch etwas zu delay():
http://arduino.cc/de/pmwiki.php?n=Reference/Delay

Ist ja schön, dass Du einen Fehler abfängst wenn die Temperatur bei
Minus 127 Grad liegt- d.h. bei Minus 125 Grad geht es Deinen Fischen noch gut?
Beachtlich!

Tausche das delay() mal gegen millis() aus. Delay läßt Deinen Sketch nicht
weiterlaufen. Der steht hier z.B. ca. 33Min.

http://arduino.cc/de/pmwiki.php?n=Reference/Millis

Einen defekten Sensor fängst Du ja nicht auf, wie wäre es denn mit einer
zu hohen oder zu tiefen Temperatur?

if (Temperatur < 28)
{
Heizung an;
}
if (Temperatur > 38)
{
Lüfter an;
}

if ((Temperatur >= 22) || (Temperatur <= 24))
{
RGB an
}

so ähnlich könnte das laufen, keine Ahnung was Du da vor hast.
Gruß und Spaß
Andreas

es ist vollbracht.
Leichte anpassungen müssen noch vorgenommen werden…
richige temp.
Und das die rgbs richtig leuchten… leuchten tuen sie, allerdings wechselt das rot zu grün nicht dann wenn der lüfter ausgeht, sondern vorher…

wenn jemanden sonst was auffällt, was verbessert werden könnte…

#include <OneWire.h>
#include <AFMotor.h>


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


#define ONE_WIRE_BUS 52 


OneWire oneWire(ONE_WIRE_BUS);

DallasTemperature sensors(&oneWire);

LiquidCrystal_I2C lcd(0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);



DeviceAddress Probe01 = { 0x28, 0xFF, 0x1B, 0x4B, 0x2E, 0x04, 0x00, 0x6B }; //1
DeviceAddress Probe02 = { 0x28, 0xFF, 0x1F, 0x76, 0x2B, 0x04, 0x00, 0x94 }; //2
//DeviceAddress Probe03 = { 0x28, 0x9A, 0x80, 0x40, 0x04, 0x00, 0x00, 0xD5 }; //3
//DeviceAddress Probe04 = { 0x28, 0x10, 0xA4, 0x57, 0x04, 0x00, 0x00, 0xA9 };//4

int rgb1r=40; // Hier die richtigen Pins eintragen
int rgb1g=41;
int rgb1b=42;
int rgb2r=43;
int rgb2g=44;
int rgb2b=45;

float Temperatur = 28.0; 
long previousMillis = 0;
long interval = 1000; 

AF_DCMotor Fan1(1, MOTOR12_64KHZ);
AF_DCMotor Fan2(2, MOTOR12_64KHZ);


void setup() 
{

  Fan1.setSpeed(255);
  Fan2.setSpeed(200);
  
  
sensors.begin();

sensors.setResolution(Probe01, 10);
sensors.setResolution(Probe02, 10);
// sensors.setResolution(Probe03, 10);
// sensors.setResolution(Probe04, 10);

pinMode(rgb1r, OUTPUT); 
pinMode(rgb1g, OUTPUT); 
pinMode(rgb1b, OUTPUT); 
pinMode(rgb2r, OUTPUT);
pinMode(rgb2g, OUTPUT); 
pinMode(rgb2b, OUTPUT); 

lcd.begin (20,4); 
lcd.backlight();
}


void loop() 
{
sensors.requestTemperatures(); 

if(sensors.getTempC(Probe01)>Temperatur+1){
Fan1.run(FORWARD);
digitalWrite(rgb1r,HIGH);
digitalWrite(rgb1g,LOW);
digitalWrite(rgb1b,LOW);
}else if(sensors.getTempC(Probe01)<Temperatur-1){
Fan1.run(RELEASE);
digitalWrite(rgb1b,HIGH);
digitalWrite(rgb1g,LOW);
digitalWrite(rgb1r,LOW);
}else{
digitalWrite(rgb1g,HIGH);
digitalWrite(rgb1r,LOW);
digitalWrite(rgb1b,LOW);
}
if(sensors.getTempC(Probe02)>Temperatur+0.5){
Fan2.run(FORWARD);
digitalWrite(rgb2r,HIGH);
digitalWrite(rgb2g,LOW);
digitalWrite(rgb2b,LOW);
}else if(sensors.getTempC(Probe02)<Temperatur-0.5){
Fan2.run(RELEASE);
digitalWrite(rgb2b,HIGH);
digitalWrite(rgb2g,LOW);
digitalWrite(rgb2r,LOW);
}else{
digitalWrite(rgb2g,HIGH);
digitalWrite(rgb2r,LOW);
digitalWrite(rgb2b,LOW);
}

unsigned long currentMillis = millis();
if(currentMillis - previousMillis > interval) {
previousMillis = currentMillis; 
lcd.clear(); 
lcd.home();
lcd.backlight(); 

lcd.setCursor(0,0); 
lcd.print(F("Becken1: "));
displayTemperature(Probe01);

lcd.setCursor(0,1); 
lcd.print(F("Becken2: "));
displayTemperature(Probe02);

// lcd.setCursor(0,2); 
// lcd.print("3: ");
// displayTemperature(Probe03);

// lcd.setCursor(0,3); 
// lcd.print("4: ");
// displayTemperature(Probe04);

}

}


void displayTemperature(DeviceAddress deviceAddress)
{

float tempC = sensors.getTempC(deviceAddress);

if (tempC == -127.00) 
{
lcd.print("Temperature Error");
}
else
{
lcd.print("C=");
lcd.print(tempC);

}
}

Als ich heute morgen den Controller angeschlossen habe, waren auf einmal die Sensoren vertauscht. Also der, der eigentlich zu temp1 gehörte war nun 2 und anders rum. Wie geht das. ? Die haben doch ne feste Adresse welche dann der jeweiligen Temp zugeordnet ist.