INFO: Dieses Forum nutzt Cookies...
Cookies sind für den Betrieb des Forums unverzichtbar. Mit der Nutzung des Forums erklärst Du dich damit einverstanden, dass wir Cookies verwenden.

Es wird in jedem Fall ein Cookie gesetzt um diesen Hinweis nicht mehr zu erhalten. Desweiteren setzen wir Google Adsense und Google Analytics ein.

Antwort schreiben 
 
Themabewertung:
  • 0 Bewertungen - 0 im Durchschnitt
  • 1
  • 2
  • 3
  • 4
  • 5
Heizungssteuerung realisieren
16.10.2016, 23:17
Beitrag #33
RE: Heizungssteuerung realisieren
Hallo,
probiere das einmal für Deinen Encoder.

Code:
/*******Interrupt-based Rotary Encoder Sketch*******
by Simon Merrett, based on insight from Oleg Mazurov, Nick Gammon, rt, Steve Spence
*/

static int pinA = 2; // Our first hardware interrupt pin is digital pin 2
static int pinB = 3; // Our second hardware interrupt pin is digital pin 3
volatile byte aFlag = 0; // let's us know when we're expecting a rising edge on pinA to signal that the encoder has arrived at a detent
volatile byte bFlag = 0; // let's us know when we're expecting a rising edge on pinB to signal that the encoder has arrived at a detent (opposite direction to when aFlag is set)
volatile byte encoderPos = 0; //this variable stores our current value of encoder position. Change to int or uin16_t instead of byte if you want to record a larger range than 0-255
volatile byte oldEncPos = 0; //stores the last encoder position value so we can compare to the current reading and see if it has changed (so we know when to print to the serial monitor)
volatile byte reading = 0; //somewhere to store the direct values we read from our interrupt pins before checking to see if we have moved a whole detent

void setup() {
  pinMode(pinA, INPUT_PULLUP); // set pinA as an input, pulled HIGH to the logic voltage (5V or 3.3V for most cases)
  pinMode(pinB, INPUT_PULLUP); // set pinB as an input, pulled HIGH to the logic voltage (5V or 3.3V for most cases)
  attachInterrupt(0,PinA,RISING); // set an interrupt on PinA, looking for a rising edge signal and executing the "PinA" Interrupt Service Routine (below)
  attachInterrupt(1,PinB,RISING); // set an interrupt on PinB, looking for a rising edge signal and executing the "PinB" Interrupt Service Routine (below)
  Serial.begin(115200); // start the serial monitor link
}

void PinA(){
  cli(); //stop interrupts happening before we read pin values
  reading = PIND & 0xC; // read all eight pin values then strip away all but pinA and pinB's values
  if(reading == B00001100 && aFlag) { //check that we have both pins at detent (HIGH) and that we are expecting detent on this pin's rising edge
    encoderPos --; //decrement the encoder's position count
    bFlag = 0; //reset flags for the next turn
    aFlag = 0; //reset flags for the next turn
  }
  else if (reading == B00000100) bFlag = 1; //signal that we're expecting pinB to signal the transition to detent from free rotation
  sei(); //restart interrupts
}

void PinB(){
  cli(); //stop interrupts happening before we read pin values
  reading = PIND & 0xC; //read all eight pin values then strip away all but pinA and pinB's values
  if (reading == B00001100 && bFlag) { //check that we have both pins at detent (HIGH) and that we are expecting detent on this pin's rising edge
    encoderPos ++; //increment the encoder's position count
    bFlag = 0; //reset flags for the next turn
    aFlag = 0; //reset flags for the next turn
  }
  else if (reading == B00001000) aFlag = 1; //signal that we're expecting pinA to signal the transition to detent from free rotation
  sei(); //restart interrupts
}

void loop(){
  if(oldEncPos != encoderPos) {
    Serial.println(encoderPos);
    oldEncPos = encoderPos;
  }
}
Gruß und Spaß
Andreas
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
08.01.2017, 23:26 (Dieser Beitrag wurde zuletzt bearbeitet: 08.01.2017 23:28 von Uwa.)
Beitrag #34
RE: Heizungssteuerung realisieren
Moin moin,

gestern und heute hab ich mal wieder getüftelt.
Als erstes den Widerstand, für die Fühler, auf 2,2k verringert. Brachte kaum verbesserung. Auch ein Delay, um den Fühlern mehr Zeit zu geben, brachte nix.
Nach langem hin und her, Pumpe ausgetauscht. Ersatzpumpe war defekt, also wieder zurück auf LosUndecided
Dabei hab ich gemerkt, daß das Gehäuse nicht richtig auf den Motor aufgesteckt war. Dadurch war das Gehäuse wohl nicht geerdet. Seither läuft das Mopped, mit 6 Fühlern, ohne Probleme.Shy
Also am Sketch weiter gebaut:
Speicherladung, in Abhängigkeit von der Pufferspeichertemperatur, eingepflanzt.
Anschließend noch der Kesselkreispumpe beigebracht, abhängigt von der Tempdifferenz zwischen Puffer und Kessel (Kachelofen), selbstständig ein und aus zu schalten.

YESSSS!!!!!!! LööptTongue

Und SO schauts aus:

PHP-Code:
#include <OneWire.h>
#include <DallasTemperature.h>
#include <LiquidCrystal.h>
LiquidCrystal lcd(012345);

#define ONE_WIRE_BUS A0
#define Mischer_AUF 6
#define Mischer_ZU 7
#define FBH_AUF 8
#define FBH_ZU 9
#define KK_Pumpe 10
#define WW_Pumpe 11



char sensor0Name[] = "tempKessel:";
char sensor1Name[] = "tempRL";
char sensor2Name[] = "tempWW";
char sensor3Name[] = "tempPuffer";
char sensor4Name[] = "tempFBH";
char sensor5Name[] = "tempAW:";

OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);

float FBHsoll 25;
int RLsoll 60;
int Kesselsoll 60;
int hyst 1;
int hystPuffer 5;
int hystSP 5;
int hystKessel 2;
int hystFBH 1;
int min 25;
int max 60;
int encoder 5;
int WWsoll 50;
int WWhyst 2;
const 
int pinA A1;
const 
int pinB A2;
boolean encA;
boolean encB;
boolean lastA false;
unsigned long currentTime;
unsigned long lastTime;
unsigned long MischenA;
unsigned long WartenAWartenB;
unsigned long FBH_MischenA;
unsigned long FBH_WartenAFBH_WartenB;

void setup() {

  
pinMode(pinAINPUT_PULLUP);
  
pinMode(pinBINPUT_PULLUP);
  
pinMode(Mischer_AUFOUTPUT);
  
pinMode(Mischer_ZUOUTPUT);
  
pinMode(FBH_AUFOUTPUT);
  
pinMode(FBH_ZUOUTPUT);
  
pinMode(WW_PumpeOUTPUT);
  
pinMode(KK_PumpeOUTPUT);
  
  
currentTime millis();
  
lastTime currentTime;
  
sensors.begin();

}

void loop() {
 

  
sensors.requestTemperatures();
  
delay(500);
  
float tempKessel sensors.getTempCByIndex(0);
  
float tempRL sensors.getTempCByIndex(1);
  
float tempWW sensors.getTempCByIndex(2);
  
float tempPuffer sensors.getTempCByIndex(3);
  
float tempFBH sensors.getTempCByIndex(4);
  
float tempAW sensors.getTempCByIndex(5);
  
  
lcd.begin(204);
  
lcd.clear();
  
lcd.setCursor(00);
  
lcd.print("RL:");
  
lcd.setCursor(30);
  
lcd.print(tempRL);
  
lcd.setCursor(100);
  
lcd.print("WT: ");
  
lcd.setCursor(130);
  
lcd.print(tempKessel);
  
lcd.setCursor(01);
  
lcd.print("FBH: ");
  
lcd.setCursor(41);
  
lcd.print(tempFBH);
  
lcd.setCursor(101);
  
lcd.print("FBHs:");
  
lcd.setCursor(151);
  
lcd.print(FBHsoll);
  
lcd.setCursor(02);
  
lcd.print("Puffer:");
  
lcd.setCursor(72);
  
lcd.print(tempPuffer);
  
lcd.setCursor(122);
  
lcd.print("WW:");
  
lcd.setCursor(152);
  
lcd.print(tempWW);
  
lcd.setCursor(03);
  
lcd.print("AWist:");
  
lcd.setCursor(63);
  
lcd.print(tempAW);


  
currentTime millis();                                         //Start Encoder
  
if (currentTime >= (lastTime 5))
  {
    
encA digitalRead(pinA);
    
encB digitalRead(pinB);
    if ((!
encA) && (lastA))
    {
      if (
encB)
      {
        if (
FBHsoll encoder <= max)
        {
          
FBHsoll FBHsoll encoder;
        }
      }
      else
      {
        if (
FBHsoll encoder >= min)
        {
          
FBHsoll FBHsoll encoder;
        }
      }
    }
    
lastA encA;
    
lastTime currentTime;
  }                                                                 
//Ende Encoder
                                                                    //Sart Kesselkreispumpe
  
if (tempPuffer tempKessel hystPuffer) {
    
digitalWrite(KK_PumpeHIGH);}
  if (
tempKessel <= tempPuffer) {
    
digitalWrite(KK_PumpeLOW);
  }                                                                 
//Ende Kesselkreispumpe
  
                                                                    //Start WW-Speicher
  
if (tempWW WWsoll WWhyst) {
    if (
tempPuffer 55) {
    
digitalWrite(WW_PumpeHIGH); }
    }
     if (
tempPuffer 52){
    
digitalWrite(WW_PumpeLOW);
    } 
    
  if (
tempWW WWsoll WWhyst){
    
digitalWrite(WW_PumpeLOW);}
                                                                    
//Ende WW-Speicher 
  
  
WartenA millis();                                               //Sart Rücklaufanhebung
  
if (WartenA WartenB 10000) {
    if (
tempRL > (RLsoll hyst)) {
      
MischenA millis();
      while (
millis() - MischenA < ((tempRL RLsoll) * 500)) {
        
digitalWrite(Mischer_ZUHIGH);
      }
      
digitalWrite(Mischer_ZULOW);
    }
    if (
tempRL < (RLsoll hyst)) {
      
MischenA millis();
      while (
millis() - MischenA < ((RLsoll tempRL) * 500)) {
        
digitalWrite(Mischer_AUFHIGH);

      }
      
digitalWrite(Mischer_AUFLOW);
    }
    
WartenB millis();
  }                                                                   
//Ende Rücklaufanhebung
  
  
FBH_WartenA millis();                                             //Start Mischer FBH
  
if (FBH_WartenA FBH_WartenB 10000) {
    if (
tempFBH > (FBHsoll hystFBH)) {
      
FBH_MischenA millis();
      while (
millis() - FBH_MischenA < ((tempFBH FBHsoll) * 500)) {
        
digitalWrite(FBH_ZUHIGH);
      }
      
digitalWrite(FBH_ZULOW);
    }
    if (
tempFBH < (FBHsoll hystFBH)) {
      
FBH_MischenA millis();
      while (
millis() - FBH_MischenA < ((FBHsoll tempFBH) * 500)) {
        
digitalWrite(FBH_AUFHIGH);

      }
      
digitalWrite(FBH_AUFLOW);
    }
    
FBH_WartenB millis();
  }
}                                                                       
//Ende Mischer FBH 
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
10.01.2017, 17:39
Beitrag #35
RE: Heizungssteuerung realisieren
Hallo und danke für die Rückmeldung!

Kannst du vielleicht kurz noch etwas über die jetzt verwendete Busstruktur incl. Kabellängen und Terminierung bei den 1-Wire Sensoren sagen?

Das könnte auch für andere interessant sein.

Gruß Arne

ExclamationMit zunehmender Anzahl qualifizierter Informationen bei einer Problemstellung, erhöht sich zwangsläufig die Gefahr auf eine zielführende Antwort.Exclamation
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
15.01.2017, 14:16 (Dieser Beitrag wurde zuletzt bearbeitet: 15.01.2017 14:33 von Uwa.)
Beitrag #36
RE: Heizungssteuerung realisieren
Moin moin,

heute mal wieder getüftelt.
Steuerung um noch mal einen Mischerkreis erweitert, und die Kesselkreispumpe unter 60°C gesperrt.
ZzT sind 6 Fühler angeschlossen:

Pufferspeicher oben......................1m
Warmwasserspeicher....................2m (3x1mm² Ölflex)
Vorlauffühler FBH..........................1m
Vorlauffühler Außenwandheizung....1m
Rücklauffühler Kesselkreis..............1m
Kesselfühler..................................12m (CAT7)

So sind sie angeschlossen, jedoch mit 2,2kOhm

[Bild: ds18b20-normal-power.jpg]

Das Teil regelt besser, als so manche kaufbare HeizungsregelungTongue



PHP-Code:
#include <OneWire.h>
#include <DallasTemperature.h>
#include <LiquidCrystal.h>
LiquidCrystal lcd(012345);

#define ONE_WIRE_BUS A0
#define Mischer_AUF 6
#define Mischer_ZU 7
#define FBH_AUF 8
#define FBH_ZU 9
#define KK_Pumpe 10
#define WW_Pumpe 11
#define AW_AUF 12
#define AW_ZU 13




char sensor0Name[] = "tempKessel:";
char sensor1Name[] = "tempRL";
char sensor2Name[] = "tempWW";
char sensor3Name[] = "tempPuffer";
char sensor4Name[] = "tempFBH";
char sensor5Name[] = "tempAW:";

OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);

float FBHsoll 26;
float AWsoll 28;
int RLsoll 60;
int Kesselsoll 60;
int hyst 1;
int hystPuffer 5;
int minKessel 50
int hystSP 5;
int hystKessel 2;
int hystFBH 1;
int minFBH 25;
int maxFBH 60;
int hystAW 1;
int minAW 25;
int maxAW 60;
int encoder 3;
int WWsoll 50;
int WWhyst 2;
const 
int pinA A1;
const 
int pinB A2;
boolean encA;
boolean encB;
boolean lastA false;
unsigned long currentTime;
unsigned long lastTime;
unsigned long MischenA;
unsigned long WartenAWartenB;
unsigned long FBH_MischenA;
unsigned long FBH_WartenAFBH_WartenB;
unsigned long AW_MischenA;
unsigned long AW_WartenAAW_WartenB;

void setup() {

  
pinMode(pinAINPUT_PULLUP);
  
pinMode(pinBINPUT_PULLUP);
  
pinMode(Mischer_AUFOUTPUT);
  
pinMode(Mischer_ZUOUTPUT);
  
pinMode(FBH_AUFOUTPUT);
  
pinMode(FBH_ZUOUTPUT);
  
pinMode(WW_PumpeOUTPUT);
  
pinMode(KK_PumpeOUTPUT);
  
pinMode(AW_AUFOUTPUT);
  
pinMode(AW_ZUOUTPUT);
  
  
currentTime millis();
  
lastTime currentTime;
  
sensors.begin();

}

void loop() {
 

  
sensors.requestTemperatures();
  
delay(500);
  
float tempKessel sensors.getTempCByIndex(0);
  
float tempRL sensors.getTempCByIndex(1);
  
float tempWW sensors.getTempCByIndex(2);
  
float tempPuffer sensors.getTempCByIndex(3);
  
float tempFBH sensors.getTempCByIndex(4);
  
float tempAW sensors.getTempCByIndex(5);
  
  
lcd.begin(204);
  
lcd.clear();
  
lcd.setCursor(00);
  
lcd.print("RL:");
  
lcd.setCursor(30);
  
lcd.print(tempRL);
  
lcd.setCursor(100);
  
lcd.print("WT: ");
  
lcd.setCursor(130);
  
lcd.print(tempKessel);
  
lcd.setCursor(01);
  
lcd.print("FBH: ");
  
lcd.setCursor(41);
  
lcd.print(tempFBH);
  
lcd.setCursor(101);
  
lcd.print("AWs:");
  
lcd.setCursor(151);
  
lcd.print(AWsoll);
  
lcd.setCursor(02);
  
lcd.print("Puffer:");
  
lcd.setCursor(72);
  
lcd.print(tempPuffer);
  
lcd.setCursor(122);
  
lcd.print("WW:");
  
lcd.setCursor(152);
  
lcd.print(tempWW);
  
lcd.setCursor(03);
  
lcd.print("AWist:");
  
lcd.setCursor(63);
  
lcd.print(tempAW);


  
currentTime millis();                                         //Start Encoder
  
if (currentTime >= (lastTime 5))
  {
    
encA digitalRead(pinA);
    
encB digitalRead(pinB);
    if ((!
encA) && (lastA))
    {
      if (
encB)
      {
        if (
AWsoll encoder <= maxAW)
        {
          
AWsoll AWsoll encoder;
        }
      }
      else
      {
        if (
AWsoll encoder >= minAW)
        {
          
AWsoll AWsoll encoder;
        }
      }
    }
    
lastA encA;
    
lastTime currentTime;
  }                                                                 
//Ende Encoder
                                                                    //Sart Kesselkreispumpe
  
if (tempPuffer tempKessel hystPuffer) {
    
digitalWrite(KK_PumpeHIGH);}
  if (
tempKessel <= tempPuffer) {
    
digitalWrite(KK_PumpeLOW);
  }
  
  if (
tempKessel minKessel) {
    
digitalWrite(KK_PumpeLOW);
  }
  
                                                                    
//Ende Kesselkreispumpe
  
                                                                    //Start WW-Speicher
  
if (tempWW WWsoll WWhyst) {
    if (
tempPuffer 55) {
    
digitalWrite(WW_PumpeHIGH); }
    }
     if (
tempPuffer 52){
    
digitalWrite(WW_PumpeLOW);
    } 
    
  if (
tempWW WWsoll WWhyst){
    
digitalWrite(WW_PumpeLOW);}
                                                                    
//Ende WW-Speicher 
  
  
WartenA millis();                                               //Sart Rücklaufanhebung
  
if (WartenA WartenB 10000) {
    if (
tempRL > (RLsoll hyst)) {
      
MischenA millis();
      while (
millis() - MischenA < ((tempRL RLsoll) * 500)) {
        
digitalWrite(Mischer_ZUHIGH);
      }
      
digitalWrite(Mischer_ZULOW);
    }
    if (
tempRL < (RLsoll hyst)) {
      
MischenA millis();
      while (
millis() - MischenA < ((RLsoll tempRL) * 500)) {
        
digitalWrite(Mischer_AUFHIGH);

      }
      
digitalWrite(Mischer_AUFLOW);
    }
    
WartenB millis();
  }                                                                   
//Ende Rücklaufanhebung
  
  
FBH_WartenA millis();                                             //Start Mischer FBH
  
if (FBH_WartenA FBH_WartenB 10000) {
    if (
tempFBH > (FBHsoll hystFBH)) {
      
FBH_MischenA millis();
      while (
millis() - FBH_MischenA < ((tempFBH FBHsoll) * 500)) {
        
digitalWrite(FBH_ZUHIGH);
      }
      
digitalWrite(FBH_ZULOW);
    }
    if (
tempFBH < (FBHsoll hystFBH)) {
      
FBH_MischenA millis();
      while (
millis() - FBH_MischenA < ((FBHsoll tempFBH) * 500)) {
        
digitalWrite(FBH_AUFHIGH);

      }
      
digitalWrite(FBH_AUFLOW);
    }
    
FBH_WartenB millis();
  }
                                                                       
//Ende Mischer FBH

  
AW_WartenA millis();                                                 //Start Mischer Außenwand
  
if (AW_WartenA AW_WartenB 10000) {
    if (
tempAW > (AWsoll hystAW)) {
      
AW_MischenA millis();
      while (
millis() - AW_MischenA < ((tempAW AWsoll) * 500)) {
        
digitalWrite(AW_ZUHIGH);
      }
      
digitalWrite(AW_ZULOW);
    }
    if (
tempAW < (AWsoll hystAW)) {
      
AW_MischenA millis();
      while (
millis() - AW_MischenA < ((AWsoll tempAW) * 500)) {
        
digitalWrite(AW_AUFHIGH);

      }
      
digitalWrite(AW_AUFLOW);
    }
    
AW_WartenB millis();
  }
}                                                                       
//Ende Mischer Außenwand 
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
16.01.2017, 13:22
Beitrag #37
RE: Heizungssteuerung realisieren
Moin moin,

danke für die schöne Zeichnung. Die hilft sicher vielen die Probleme mit 1-Wire haben.
Mit 2,2kΩ Pullup-Widerstand bist du auch auf einer sicheren Seite bei diesen Leitungslängen.
Die Busstruktur ist vermutlich entgegen der Zeichnung aber nicht linienförmig sondern sternförmig ?

(15.01.2017 14:16)Uwa schrieb:  ...
Das Teil regelt besser, als so manche kaufbare HeizungsregelungTongue
...

Bei manchen fertigen Heizungsregelungen weiß man auch nicht was man wirklich einstellt. Oft werden da eindeutig zweideutige Begriffe für irgend welche Parameter verwendet unter denen man sich nicht wirklich was vorstellen kann. Bei Eigenbaulösungen ist man an der Stelle klar im Vorteil.

Gruß
Arne

ExclamationMit zunehmender Anzahl qualifizierter Informationen bei einer Problemstellung, erhöht sich zwangsläufig die Gefahr auf eine zielführende Antwort.Exclamation
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
Gestern, 22:40
Beitrag #38
RE: Heizungssteuerung realisieren
Nabend,

die Zeichnung hab ich mir aus m www gezogen, und meine Fühler sind auch so angeschlossen. Nur sind halt die Kabellängen anders.


MFG Uwe
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
Antwort schreiben 


Möglicherweise verwandte Themen...
Thema: Verfasser Antworten: Ansichten: Letzter Beitrag
  Fräsmaschine mit Arduino Uno und Grbl realisieren Chef_2 8 1.005 07.11.2016 11:42
Letzter Beitrag: Nimes
  Heizungssteuerung Webasto HL 10011 Vinreeb 8 4.059 10.04.2015 09:29
Letzter Beitrag: Vinreeb
Rainbow Überarbeitung Heizungssteuerung JoeDorm 1 1.855 05.01.2015 03:37
Letzter Beitrag: JoeDorm

Gehe zu:


Benutzer, die gerade dieses Thema anschauen: 1 Gast/Gäste