Go Down

Topic: Thermostat mit Arduino, DS18B20, 20x4 LCD (Read 4663 times) previous topic - next topic

MasterOfPuppets

Vielen lieben dank,
dass ist natürlich wesentlich einfacher und unkomplizierter.... kann ich diesen task also direkt in meinen loop einbinden und muss in meiner if bedingung nur noch mit dem stichwort Heizung EIN den task für das einschalten abrufen?

Gruß

DrDiettrich

Jede Task in einem Programm muß bei jedem Durchlauf von loop() aufgerufen werden, damit sie alle quasi-parallel ablaufen können. Siehe die Beispiele zu ALib0.
Man könnte den Code (taskBegin bis taskEnd) auch direkt in loop() einfügen, damit geht aber IMO die Übersichtlichkeit verloren.

Die Bedingung (hier HeizungEin) kann eine globale Variable sein, man könnte sie aber auch als Parameter übergeben. Dann reicht es, irgendwo im Programmablauf HeizungEin auf true oder false zu setzen, um die Heizung ein- oder auszuschalten.

MasterOfPuppets

Vielen Dank für die nette Hilfe, ich werde mich jetzt mal durch die Beispiele arbeiten um auch zu verstehen was ich da einfüge.

Gruß

MasterOfPuppets

So habs jetzt einmal ausprobiert und den task für meine Einschaltbedingung eingebunden.

Funktioniert beim ersten mal ganz Super, jedoch auch nur beim allerersten mal wenn das Programm startet. Wenn die Heizung dann jedoch ausschaltet und die Bedingungen für das wiedereinschalten gegeben sind, werden sofort alle 3 eingeschaltet und der Task wird ignoriert =(.

Code: [Select]
#include <ALib0.h>
#include <Wire.h>
#include <OneWire.h>
#include <DallasTemperature.h>
#include <LiquidCrystal_I2C.h>




#define I2C_ADDR 0x27 // <<- Add your address here.
#define Rs_pin 0
#define Rw_pin 1
#define En_pin 2
#define BACKLIGHT_PIN 3
#define D4_pin 4
#define D5_pin 5
#define D6_pin 6
#define D7_pin 7

LiquidCrystal_I2C lcd(I2C_ADDR,En_pin,Rw_pin,Rs_pin,D4_pin,D5_pin,D6_pin,D7_pin);

int BLED = 2;
int GLED = 3;
int RLED = 4;

int heater1 = 9; // heatergroup 1 control pin
int heater2 = 10; // heatergroup 2 control pin
int heater3 = 11; // heatergroup 3 control pin


float boxtemp = 0.0;

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

// 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 boxThermometer = { 0x28, 0xFF, 0x8F, 0x64, 0x86, 0x16, 0x05, 0xB8 };



void setup(void)
{
  // Start up the library
  sensors.begin();
  // set the resolution to 12 bit
  sensors.setResolution(boxThermometer, 12);
 
 
  pinMode(BLED, OUTPUT); // LED's
  pinMode(GLED, OUTPUT);
  pinMode(RLED, OUTPUT);
 
  digitalWrite(BLED, HIGH); // set LED's off
  digitalWrite(GLED, HIGH);
  digitalWrite(RLED, HIGH);

 

lcd.begin(20,4);
// columns, rows. use 16,2 for a 16x2 LCD, etc.

// LCD Backlight ON
lcd.setBacklightPin(BACKLIGHT_PIN,POSITIVE);
lcd.setBacklight(HIGH);

lcd.print ("Thermobox");
lcd.print ("2017");

delay(4000);

lcd.clear();



pinMode(heater1, OUTPUT); // Box heatergroup 1
pinMode(heater2, OUTPUT); // Box heatergroup 2
pinMode(heater3, OUTPUT); // Box heatergroup 3

}

void printTemperature(DeviceAddress deviceAddress)
{
  float tempC = sensors.getTempC(deviceAddress);
  if (tempC == -127.00) {
lcd.print("Error");
} else {
lcd.print(tempC);
  }
 { boxtemp = sensors.getTempC(deviceAddress);

}
}

void loop(void)
{
  delay(500);

  sensors.requestTemperatures();

lcd.setCursor(0,0);
lcd.print("*****Temperatur*****");
 
lcd.setCursor(0,1);
lcd.print("Ist: ");

printTemperature(boxThermometer);

lcd.print((char)223);
lcd.print("C");

lcd.setCursor(0,2);
lcd.print("Soll: 60");
lcd.print((char)223);
lcd.print("C");

if (boxtemp <= 25)
{
  digitalWrite(BLED, LOW);
  digitalWrite(GLED, HIGH);
  digitalWrite(RLED, HIGH);

 taskBegin();
 digitalWrite(heater1, HIGH);
 taskDelay(10000);
 digitalWrite(heater2, HIGH);
 taskDelay(10000);
 digitalWrite(heater3, HIGH);
 taskEnd();

}

else if (boxtemp >= 26)

{ digitalWrite(heater1, LOW);
  digitalWrite(heater2, LOW);
  digitalWrite(heater3, LOW);
  digitalWrite(RLED, LOW);
  digitalWrite(GLED, HIGH);
  digitalWrite(BLED, HIGH);
 
}

else
{ digitalWrite(GLED, LOW);
  digitalWrite(RLED, HIGH);
  digitalWrite(BLED, HIGH);
}

lcd.setCursor(0,3);
if (digitalRead(9)==HIGH || digitalRead(10)==HIGH || digitalRead(11)==HIGH)
{
lcd.print("Heizen EIN");
} else {
lcd.print("Heizen AUS"); }

  delay(500);
 
  }

DrDiettrich

So wird der Task Code nicht bei jedem Durchlauf von loop() durchlaufen, und dann kann das nicht funktionieren.

MasterOfPuppets

Aber wieso nicht?

Der Task steht doch direkt im loop, wie die if bedingungen auch....

Gruß

DrDiettrich

Aber das "if" verhindert, daß der Code bei jedem Durchlauf ausgeführt wird.

Solange Du nicht ganz verstanden hast, wie Tasks auf einem Arduino funktionieren, halte Dich einfach an das Beispiel, das ich gepostet hatte. Wenn das funktioniert, kannst Du mit eigenen Experimenten anfangen.

MasterOfPuppets

Ok danke für die Erklärung. Das heißt also den task vor dem loop definieren und in der if bedingung einfach nur noch abrufen, wenn ich das jetzt richtig verstanden habe.
Gruß

DrDiettrich

Direkt in loop() aufrufen, ohne wenn und aber.

agmue

Es paßt jetzt nicht so wirklich in den Kommunikationsfluß, aber ich hatte mir halt parallel Gedanken hinsichtlich einer Lösung mit millis() gemacht, die ich jetzt irgendwie mal loswerden möchte.

Da mir Temperatursensoren fehlen, habe ich diese durch ein Poti ersetzt. Das läßt die Logik auch schneller testen.

Code: [Select]
#include <ALib0.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>

#define I2C_ADDR 0x27 // <<- Add your address here.
#define Rs_pin 0
#define Rw_pin 1
#define En_pin 2
#define BACKLIGHT_PIN 3
#define D4_pin 4
#define D5_pin 5
#define D6_pin 6
#define D7_pin 7

LiquidCrystal_I2C lcd(I2C_ADDR, En_pin, Rw_pin, Rs_pin, D4_pin, D5_pin, D6_pin, D7_pin);

const byte BLED = 2;
const byte GLED = 3;
const byte RLED = 4;

const byte heater1 = 9; // heatergroup 1 control pin
const byte heater2 = 10; // heatergroup 2 control pin
const byte heater3 = 11; // heatergroup 3 control pin

const uint16_t intervall = 5000;
char boxThermometer;
float boxtemp = 0.0;
byte status = 255;

void setup(void)
{
  Serial.begin(9600);
  pinMode(BLED, OUTPUT); // LED's
  pinMode(GLED, OUTPUT);
  pinMode(RLED, OUTPUT);

  digitalWrite(BLED, HIGH); // set LED's off
  digitalWrite(GLED, HIGH);
  digitalWrite(RLED, HIGH);

  lcd.begin(16, 4);
  lcd.setBacklightPin(BACKLIGHT_PIN, POSITIVE);
  lcd.setBacklight(HIGH);

  pinMode(heater1, OUTPUT); // Box heatergroup 1
  pinMode(heater2, OUTPUT); // Box heatergroup 2
  pinMode(heater3, OUTPUT); // Box heatergroup 3
}

void printTemperature(char box)
{
  float tempC = analogRead(A0) / 10;
  lcd.print(tempC);
  boxtemp = tempC;
}

void loop(void)
{
  delay(100);

  lcd.setCursor(0, 0);
  lcd.print("Ist: ");
  printTemperature(boxThermometer);
  lcd.print((char)223);
  lcd.print("C");

  if (boxtemp < 25)
  {
    digitalWrite(BLED, LOW);
    digitalWrite(GLED, HIGH);
    digitalWrite(RLED, HIGH);
    if (status == 255) status = 0;
  }
  else if (boxtemp > 26)
  {
    digitalWrite(RLED, LOW);
    digitalWrite(GLED, HIGH);
    digitalWrite(BLED, HIGH);
    digitalWrite(heater1, LOW);
    digitalWrite(heater2, LOW);
    digitalWrite(heater3, LOW);
    status = 255;
  }
  else
  {
    digitalWrite(GLED, LOW);
    digitalWrite(RLED, HIGH);
    digitalWrite(BLED, HIGH);
  }

  lcd.setCursor(0, 1);
  if (digitalRead(heater1) == HIGH || digitalRead(heater2) == HIGH || digitalRead(heater3) == HIGH)
  {
    lcd.print("Heizen EIN");
  } else {
    lcd.print("Heizen AUS");
  }
  heizen();
}

void heizen()
{
  static uint32_t heizenMillis = 0;
  if ((millis() - heizenMillis >= intervall) && (status < 3))
  {
    Serial.println(status);
    heizenMillis = millis();
    switch (status) {
      case 0:
        digitalWrite(heater1, HIGH);
        break;
      case 1:
        digitalWrite(heater2, HIGH);
        break;
      case 2:
        digitalWrite(heater3, HIGH);
        break;
    }
    status++;
  }
}

MasterOfPuppets

#25
Feb 05, 2017, 12:58 am Last Edit: Feb 05, 2017, 01:09 am by MasterOfPuppets
Hallo agmue, dake für deine Gedanken.

Habe jetzt den Code von DrDiettrich direkt in meinen Loop außerhalb der if bedingungen eingefügt.
Jedoch bekomme ich jetzt eine fehlermeldung, dass ich das codewort für "HeizungEin" bestimmen soll.
Wie mache ich das am besten um es auch nachher in meiner If bedingung aufrufen zu können?

Code: [Select]
#include <ALib0.h>
#include <Wire.h>
#include <OneWire.h>
#include <DallasTemperature.h>
#include <LiquidCrystal_I2C.h>




#define I2C_ADDR 0x27 // <<- Add your address here.
#define Rs_pin 0
#define Rw_pin 1
#define En_pin 2
#define BACKLIGHT_PIN 3
#define D4_pin 4
#define D5_pin 5
#define D6_pin 6
#define D7_pin 7

LiquidCrystal_I2C lcd(I2C_ADDR,En_pin,Rw_pin,Rs_pin,D4_pin,D5_pin,D6_pin,D7_pin);

int BLED = 2;
int GLED = 3;
int RLED = 4;

int heater1 = 9; // heatergroup 1 control pin
int heater2 = 10; // heatergroup 2 control pin
int heater3 = 11; // heatergroup 3 control pin


float boxtemp = 0.0;

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

// 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 boxThermometer = { 0x28, 0xFF, 0x8F, 0x64, 0x86, 0x16, 0x05, 0xB8 };


void setup(void)
{
  // Start up the library
  sensors.begin();
  // set the resolution to 12 bit
  sensors.setResolution(boxThermometer, 12);
 
 
  pinMode(BLED, OUTPUT); // LED's
  pinMode(GLED, OUTPUT);
  pinMode(RLED, OUTPUT);
 
  digitalWrite(BLED, HIGH); // set LED's off
  digitalWrite(GLED, HIGH);
  digitalWrite(RLED, HIGH);

 

lcd.begin(20,4);
// columns, rows. use 16,2 for a 16x2 LCD, etc.

// LCD Backlight ON
lcd.setBacklightPin(BACKLIGHT_PIN,POSITIVE);
lcd.setBacklight(HIGH);

lcd.print ("Thermobox");
lcd.print ("2017");

delay(4000);

lcd.clear();



pinMode(heater1, OUTPUT); // Box heatergroup 1
pinMode(heater2, OUTPUT); // Box heatergroup 2
pinMode(heater3, OUTPUT); // Box heatergroup 3

}

void printTemperature(DeviceAddress deviceAddress)
{
  float tempC = sensors.getTempC(deviceAddress);
  if (tempC == -127.00) {
lcd.print("Error");
} else {
lcd.print(tempC);
  }
 { boxtemp = sensors.getTempC(deviceAddress);

}
}

void loop(void)
{
  delay(500);

  sensors.requestTemperatures();

lcd.setCursor(0,0);
lcd.print("*****Temperatur*****");
 
lcd.setCursor(0,1);
lcd.print("Ist: ");

printTemperature(boxThermometer);

lcd.print((char)223);
lcd.print("C");

lcd.setCursor(0,2);
lcd.print("Soll: 60");
lcd.print((char)223);
lcd.print("C");

if (boxtemp <= 25)
{
  digitalWrite(BLED, LOW);
  digitalWrite(GLED, HIGH);
  digitalWrite(RLED, HIGH);
  digitalWrite(heater1, HIGH);
  digitalWrite(heater2, HIGH);
  digitalWrite(heater3, HIGH);
 

}

else if (boxtemp >= 26)

{ digitalWrite(heater1, LOW);
  digitalWrite(heater2, LOW);
  digitalWrite(heater3, LOW);
  digitalWrite(RLED, LOW);
  digitalWrite(GLED, HIGH);
  digitalWrite(BLED, HIGH);
 
}

else
{ digitalWrite(GLED, LOW);
  digitalWrite(RLED, HIGH);
  digitalWrite(BLED, HIGH);
}

lcd.setCursor(0,3);
if ((digitalRead(9)==HIGH) && (digitalRead(10)==HIGH) && (digitalRead(11)==HIGH))
{
lcd.print("Heizen EIN");
} else {
lcd.print("Heizen AUS"); }


{
 taskBegin();
 taskWaitFor(HeizungEin);
 digitalWrite(heater1, HIGH);
 taskDelay(1000);
 digitalWrite(heater2, HIGH);
 taskDelay(1000);
 digitalWrite(heater3, HIGH);
//warten auf Ausschalten
 taskWaitFor(!HeizungEin);
 digitalWrite(heater1, LOW);
 digitalWrite(heater2, LOW);
 digitalWrite(heater3, LOW);
 taskEnd();
}


  delay(500);
 
  }


Gruß

MasterOfPuppets

okay Kommando zurück, ich habe es geschafft =)

Code: [Select]
#include <ALib0.h>
#include <Wire.h>
#include <OneWire.h>
#include <DallasTemperature.h>
#include <LiquidCrystal_I2C.h>




#define I2C_ADDR 0x27 // <<- Add your address here.
#define Rs_pin 0
#define Rw_pin 1
#define En_pin 2
#define BACKLIGHT_PIN 3
#define D4_pin 4
#define D5_pin 5
#define D6_pin 6
#define D7_pin 7

LiquidCrystal_I2C lcd(I2C_ADDR,En_pin,Rw_pin,Rs_pin,D4_pin,D5_pin,D6_pin,D7_pin);

int BLED = 2;
int GLED = 3;
int RLED = 4;

int heater1 = 9; // heatergroup 1 control pin
int heater2 = 10; // heatergroup 2 control pin
int heater3 = 11; // heatergroup 3 control pin

bool HeizungEin = true;


float boxtemp = 0.0;

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

// 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 boxThermometer = { 0x28, 0xFF, 0x8F, 0x64, 0x86, 0x16, 0x05, 0xB8 };


void setup(void)
{
  // Start up the library
  sensors.begin();
  // set the resolution to 12 bit
  sensors.setResolution(boxThermometer, 12);
 
 
  pinMode(BLED, OUTPUT); // LED's
  pinMode(GLED, OUTPUT);
  pinMode(RLED, OUTPUT);
 
  digitalWrite(BLED, HIGH); // set LED's off
  digitalWrite(GLED, HIGH);
  digitalWrite(RLED, HIGH);

 

lcd.begin(20,4);
// columns, rows. use 16,2 for a 16x2 LCD, etc.

// LCD Backlight ON
lcd.setBacklightPin(BACKLIGHT_PIN,POSITIVE);
lcd.setBacklight(HIGH);

lcd.print ("Thermobox");
lcd.print ("2017");

delay(4000);

lcd.clear();



pinMode(heater1, OUTPUT); // Box heatergroup 1
pinMode(heater2, OUTPUT); // Box heatergroup 2
pinMode(heater3, OUTPUT); // Box heatergroup 3

}

void printTemperature(DeviceAddress deviceAddress)
{
  float tempC = sensors.getTempC(deviceAddress);
  if (tempC == -127.00) {
lcd.print("Error");
} else {
lcd.print(tempC);
  }
 { boxtemp = sensors.getTempC(deviceAddress);

}
}

void loop(void)
{
  delay(500);

  sensors.requestTemperatures();

lcd.setCursor(0,0);
lcd.print("*****Temperatur*****");
 
lcd.setCursor(0,1);
lcd.print("Ist: ");

printTemperature(boxThermometer);

lcd.print((char)223);
lcd.print("C");

lcd.setCursor(0,2);
lcd.print("Soll: 60");
lcd.print((char)223);
lcd.print("C");

if (boxtemp <= 25)
{
  digitalWrite(BLED, LOW);
  digitalWrite(GLED, HIGH);
  digitalWrite(RLED, HIGH);
  HeizungEin = true;

}

else if (boxtemp >= 26)

{
  digitalWrite(RLED, LOW);
  digitalWrite(GLED, HIGH);
  digitalWrite(BLED, HIGH);
  HeizungEin = false;
 
}

else
{ digitalWrite(GLED, LOW);
  digitalWrite(RLED, HIGH);
  digitalWrite(BLED, HIGH);
}

lcd.setCursor(0,3);
if ((digitalRead(9)==HIGH) && (digitalRead(10)==HIGH) && (digitalRead(11)==HIGH))
{
lcd.print("Heizen EIN");
}
else if ((digitalRead(9)==HIGH) || (digitalRead(10)==HIGH) || (digitalRead(11)==HIGH))
{
lcd.print("Heizen Warten...");
}
else {
lcd.print("Heizen AUS"); }


{
 taskBegin();
 taskWaitFor(HeizungEin);
 digitalWrite(heater1, HIGH);
 taskDelay(1000);
 digitalWrite(heater2, HIGH);
 taskDelay(1000);
 digitalWrite(heater3, HIGH);
//warten auf Ausschalten
 taskWaitFor(!HeizungEin);
 digitalWrite(heater1, LOW);
 digitalWrite(heater2, LOW);
 digitalWrite(heater3, LOW);
 taskEnd();
}


  delay(500);
 
  }


Jetzt läuft alles wie es soll =) Vielen Dank nochmal an alle die mich unterstützt haben, vorallem aber an DrDiettrich.

Gruß

Go Up
 


Please enter a valid email to subscribe

Confirm your email address

We need to confirm your email address.
To complete the subscription, please click the link in the email we just sent you.

Thank you for subscribing!

Arduino
via Egeo 16
Torino, 10131
Italy