Heißluftkollektorsteuerung

Hallo,

ich muss leider das Projekt zweier Arbeitskollegen fertigstellen. Die Aufgabe lautet, Steuerung eines Lüfters über ein Relai und über Bluetooth, desweiteren sollen über 2 Temperatur Sensoren die Raumtemperatur und die Temperatur in einem Heißluftkollektor ausgelsen werden. Schaltungstechnisch hab ich alles bereits erledigt, lediglich beim Code bin ich mir unsicher. Habe zwar schon einige Projekte mit dem Arduino gemacht nur noch nie mit einem Bluetoothmodul.

Es sollte so sein das die 2 Temperatursensoren ausgelesen werden, die Werte dann benutzt werden um den Lüfter anzusteuern. Es desweiteren sollte es möglich sein den Lüfter per Bluetooth anzuschalten.

Ich danke jedem der mir weiterhelfen kann.

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

#define ONE_WIRE_BUS_PIN 13

OneWire oneWire(ONE_WIRE_BUS_PIN);

DallasTemperature sensors(&oneWire);

DeviceAddress Sensor01 = { 0x28, 0xFF, 0xB6, 0xAC, 0x84, 0x16, 0x04, 0xFB }; 
DeviceAddress Sensor02 = { 0x28, 0xFF, 0x05, 0x0E, 0x03, 0x15, 0x02, 0xC4 };
int Lufter = 5;
int temp1 = sensors.getTempCByIndex(0);
int temp2 = sensors.getTempCByIndex(1);

void setup()   
{
  pinMode(13, OUTPUT);
  Serial.begin(9600);
  Serial.print("Initializing Temperature Control Library Version ");
  Serial.println(DALLASTEMPLIBVERSION);

  sensors.begin();

  sensors.setResolution(Sensor01, 10);
  sensors.setResolution(Sensor02, 10);

}

void loop()   
{
 
  Serial.println();
  Serial.print("Anzahl der gefunden Geräte: ");  
  Serial.println(sensors.getDeviceCount());   
  Serial.print("... ");  
  Serial.println();   
    
  sensors.requestTemperatures();  
  Serial.println(temp1);
  Serial.print("Temperatur im Unterrichtsraum:   ");
  printTemperature(Sensor01);
  Serial.println();
  
  Serial.println(temp2);
  Serial.print("Temperatur im Kollektor:         ");
  printTemperature(Sensor02);
  Serial.println();

  delay(10000);
     
//Bluetooth

if(Serial.available()>0)
   {     
      char data= Serial.read(); // reading the data received from the bluetooth module
      switch(data)
      {
        case 'a': 
        digitalWrite(5, HIGH); 
        Serial.print("Luefter an");
        delay(300000);
        break; 
        case 'd': 
        digitalWrite(5, LOW); 
        Serial.print("Luefter aus");
        delay(300000);
        break; 
        default : break;
      }
      Serial.println(data);
   }
   digitalWrite(5, LOW);
   
//Sensor 
 
if (temp1 < temp2 && temp1 < 23 && temp2 > 35  ) //Wenn es im Kollektor wärmer ist, schalte Lüfter an
{
  digitalWrite(Lufter, HIGH);
  Serial.print("Luefter an");
  delay(300000);
  
}
else
{
  digitalWrite(Lufter, LOW);
  Serial.print("Luefter aus");
  delay(30000);
}
}

void printTemperature(DeviceAddress deviceAddress)
{

float tempC = sensors.getTempC(deviceAddress);

   if (tempC == -127.00) 
   {
   Serial.print("Error getting temperature  ");
   } 
   else
   {
     Serial.print(tempC);
   Serial.print(" Grad Celsius ");

   }



}

Sensor_Relais_Bluetooth_.ino (2.21 KB)

Ein Verdrahtungsdiagramm und Links zur verwendeten Hardware wären nicht schlecht...

Grundsätzlich solltest Du in Deinem Sketch die delay()s eliminieren. Es gibt ein Beispiel in der IDE (BlinkWithoutDelay), das Dir zeigt, wie man ohne delay() auskommt.
Die Temperatur-Anzeige würde ich auch per Befehl steuerbar machen, dann ist die Anzeige etwas weniger "nervös".
Das Mischen der Zugriffe über den Index und über die Adresse würde ich unterlassen, das wird nur Verwirrung stiften. Wenn Du die Adresse kennst, würde ich immer die verwenden.

Und poste bitte deinen Sketch hier in Code-Tags.

Verwende dazu die Schaltfläche </> oben links im Editorfenster.
Das kannst du auch nachträglich machen.
Dazu den Sketch markieren und die Schaltfläche klicken.

Damit wird dieser für alle besser lesbar.

Wenn Du Deinen Sketch direkt hier im Forum in Codetags (</> oben links) einstellst, wird er von mehr Leuten gelesen.
Das Delay(10000) blockiert während der Zeit völlig und das Auslesen der Sensoren solltest Du im Loop machen.

Gruß Tommy

Danke erstmal an alle die bereits etwas geschrieben haben,

hab den Code jetzt mit den Code tags eingefügt.
Der Aufbau funktioniert so wie ich ihn gemacht habe nur das Bluetooth Modul (HC-06) funktioniert nicht so ganz wie ich möchte, es soll sozusagen wenn ich im Terminal “a” eingebe das Relai (für den Lüfter) durchschalten. Leider funktioniert das nicht wie erhofft. Wenn nichts eingegeben wird, soll der Lüfter durch die If Funktion aufgrund der Temperatur gesteuert werden.

pylon:
Ein Verdrahtungsdiagramm und Links zur verwendeten Hardware wären nicht schlecht…

Grundsätzlich solltest Du in Deinem Sketch die delay()s eliminieren. Es gibt ein Beispiel in der IDE (BlinkWithoutDelay), das Dir zeigt, wie man ohne delay() auskommt.
Die Temperatur-Anzeige würde ich auch per Befehl steuerbar machen, dann ist die Anzeige etwas weniger “nervös”.
Das Mischen der Zugriffe über den Index und über die Adresse würde ich unterlassen, das wird nur Verwirrung stiften. Wenn Du die Adresse kennst, würde ich immer die verwenden.

Das Problem ist nur das ich bei der If Funktion eine Fehlermeldung bekomme wenn ich es über die DeviceAdress mache. Ein Kollege meinte da zu mir das ich das so nicht machen kann da dort keine Ausgelesenen Informationen enthalten sind.

MfG

Ein Problem ist, du liest die Temperatur nur im Setup (Tommy hat es schon geschrieben) aus.
Das passiert nur einmalig beim Start und später nicht mehr.

Soll heißen, das funktioniert nicht.
Die Temperatur musst du ständig (in der Loop) auslesen.
Von Bluetooth kann ich in deinem Sketch bisher nichts sehen.

Und wie schon angemerkt, deine langen delays stören den Ablauf total.

Danke an alle für die vielen Antworten.

Habe das Problem selbst gelöst.

MfG

Üblicherweise wird dann die Lösung hier nochmal vorgestellt.

Gruß Tommy

Nur zur Info ich brauch das delay damit der Lüfter nicht ständig an und ausgeht und den Code muss auch jemand anderes verstehen könnten, der nachdem ich die Firma verlasse noch den Kollektor betreiben kann und vielleicht noch einen neuen aufbauen kann.

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

#define ONE_WIRE_BUS_PIN 13

OneWire oneWire(ONE_WIRE_BUS_PIN);

DallasTemperature sensors(&oneWire);

DeviceAddress Sensor01 = { 0x28, 0xFF, 0xB6, 0xAC, 0x84, 0x16, 0x04, 0xFB }; 
DeviceAddress Sensor02 = { 0x28, 0xFF, 0x05, 0x0E, 0x03, 0x15, 0x02, 0xC4 };
int Lufter = 5;
int temp1 = sensors.getTempCByIndex(0);
int temp2 = sensors.getTempCByIndex(1);

void setup()   
{
  pinMode(5, OUTPUT);
  Serial.begin(9600);
  Serial.print("Initializing Temperature Control Library Version ");
  Serial.println(DALLASTEMPLIBVERSION);

  sensors.begin();

  sensors.setResolution(Sensor01, 10);
  sensors.setResolution(Sensor02, 10);

}

void loop()   
{
 
  Serial.println();
  Serial.print("Anzahl der gefunden Geräte: ");  
  Serial.println(sensors.getDeviceCount());   
  Serial.print("... ");  
  Serial.println();   
    
  sensors.requestTemperatures();  
  Serial.print("Temperatur im Unterrichtsraum:   ");
  Serial.print(temp1);
  Serial.println();
  
  Serial.print("Temperatur im Kollektor:         ");
  Serial.print(temp2);
  Serial.println();

     
//Bluetooth

if(Serial.available()>0)
   {     
      char data= Serial.read(); // reading the data received from the bluetooth module
      switch(data)
      {
        case 'a': 
        digitalWrite(5, HIGH); 
        Serial.print("Luefter an");
        delay(300000);
        break; 
        case 'd': 
        digitalWrite(5, LOW); 
        Serial.print("Luefter aus");
        delay(300000);
        break; 
        default : break;
      }
      Serial.println(data);
   }
   digitalWrite(5, LOW);
   
//Sensor 
 
if (temp1 < temp2 && temp1 < 23 && temp2 > 35  ) //Wenn es im Kollektor wärmer ist, schalte Lüfter an
{
  digitalWrite(Lufter, HIGH);
  Serial.print("Luefter an");
  delay(300000);
  
}
else
{
  digitalWrite(Lufter, LOW);
  Serial.print("Luefter aus");
  delay(30000);
}
}

RealArcangel:
Nur zur Info ich brauch das delay damit der Lüfter nicht ständig an und ausgeht und den Code muss auch jemand anderes verstehen könnten, der nachdem ich die Firma verlasse noch den Kollektor betreiben kann und vielleicht noch einen neuen aufbauen kann.

Danke für die Rückmeldung.

Ein delay ist immer schlecht und leicht durch die Funktion "millis()" zu ersetzen.
Und damit jemand anderes den Code verstehen kann, fehlen da allerdings Kommentare.
Diese sind auch für dich nützlich, wenn du den Sketch in 2 Jahren erweitern willst.

HotSystems:
Danke für die Rückmeldung.

Ein delay ist immer schlecht und leicht durch die Funktion "millis()" zu ersetzen.
Und damit jemand anderes den Code verstehen kann, fehlen da allerdings Kommentare.
Diese sind auch für dich nützlich, wenn du den Sketch in 2 Jahren erweitern willst.

Ich bin Azubi und musste mir alles darüber selbst beibringen (wird der nächste auch müssen, deshalb halte ich den Code so einfach wie möglich), werde versuche noch Kommentare hinzuzufügen, werde aber noch ne 20 seitige Projektdokumentation schreiben müssen wo ich eh alles genau erklären muss. Werd mal schauen wie ich das mach.

MfG

RealArcangel:
Ich bin Azubi und musste mir alles darüber selbst beibringen (wird der nächste auch müssen, deshalb halte ich den Code so einfach wie möglich), werde versuche noch Kommentare hinzuzufügen, werde aber noch ne 20 seitige Projektdokumentation schreiben müssen wo ich eh alles genau erklären muss. Werd mal schauen wie ich das mach.

MfG

Das kennen wir, mussten die meisten von uns, ist also kein Beinbruch. Daher sind Kommentare im Sketch immer besser.

… ein Ausbilder von mir sagte mal, dass sich die Kommentare wie eine Geschichte lesen lassen sollten. Das bringt Klarheit in’s programm, auch wenn ein Fremder den Code mal bearbeiten muss.

… ist dschon 35 Jahre her und bezog sich auf Assembler, trifft aber heute immer noch zu