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
showerloop mit Controllino
17.03.2021, 13:50
Beitrag #105
RE: showerloop mit Controllino
Hallo zusammen,
ich sollte mal Aufführen was alles passiert ist und was ich noch benötige.
Also so wie es aussieht läuft Programmtechnisch "fast" alles.
Aber dazu später.
Die Anlage wird jetzt mit 24 Volt betrieben.
Als Pumpe habe ich jetzt eine Seaflo 51-Serie 24V, die eine selbst einschaltet, sobald man den Wasserhahn öffnet, also entfällt die Pumpensteuerung.
Die Heizung wird über einen 230 Volt 1500 Watt Waschmaschinenheizstab betrieben und über einen DS18B20 Sensor gesteuert.
Die Anlage läuft, jetzt kommt "fast", bis auf die Heizungssteuerung.
Einmal möchte ich einen Programmschritt "Wasser erwärmen" einfügen und zum Zweiten, Duschen mit Heizung, das ist für den Fall, dass man länger duscht und dabei das Wasser wieder kälter wird.
Jetzt fragt ihr, warum baust du nicht ein Poti ein um die Temperatur zu regeln?
Daran hab ich auch schon gedacht aber momentan bin ich fällt mir dazu nichts ein, mein Hirn ist, wie Trabatoni so schön sagte, wie eine Flasche leer.
Ja, ich hab ja schon Schwierigkeiten bei der Programmierung der Heizung und das ist mein nächster Punkt.
In meinem Sketch habe ich angefangen in case 6 die Heizungssteuerung zu Programmieren.
Aber fragt mich nicht, ich komme einfach nicht drauf wie ich das mit einer Schleife hinbringen soll.
Schon im voraus vielen Dank für euere Hilfe.
LG Breze

Code:
// Version 17.3.2021
#include <Controllino.h>
#include <SPI.h>
#include <SoftwareSerial.h>
#include <Wire.h>
#include <Keypad_I2C.h>

#include <OneWire.h>                       // OneWire Bibliothek einbinden
#include <DallasTemperature.h>             // Dallas Termperatur Bibliothek einbinden
#define ONE_WIRE_BUS 9                     // Das Datenkabel ist an Pin 9 des Controllino angeschlossen
OneWire oneWire(ONE_WIRE_BUS);             // Einrichten einer OneWire-Instanz für die Kommunikation mit OneWire-Geräten ein
DallasTemperature sensors(&oneWire);       // Übergeben Sie den OneWire-Verweis auf Dallas Temperature

#define I2CADDR 0x21

#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 16, 2);

// Einstellung für Ventile und Pumpe
byte ventil_1Pin = (CONTROLLINO_D0);
byte ventil_2Pin = (CONTROLLINO_D1);
byte ventil_3Pin = (CONTROLLINO_D2);
byte ventil_4Pin = (CONTROLLINO_D3);
byte ventil_5Pin = (CONTROLLINO_D4);
byte uvPin = (CONTROLLINO_D5);
byte Pumpe = (CONTROLLINO_R0);
byte Heizung = (CONTROLLINO_R5);

int ActualTemp;
int EndTemp = 40;

//Keypad festlegen:
const byte ROWS = 4;  //4 Zeilen
const byte COLS = 3;  //3 Spalten
byte rowPins[ROWS] = { 0, 1, 2, 3 };//Definition der Pins für die 4 Zeilen
byte colPins[COLS] = { 4, 5, 6 };    //Definition der Pins für die 3 Spalten

//Aufbau der Tastatur als mehrdimensionales Array abbilden.
char keys[ROWS][COLS] = {
  {'1', '2', '3'},
  {'4', '5', '6'},
  {'7', '8', '9'},
  {'*', '0', '#'},
};

// Instanz von Keypad erzeugen, Keymap und Pins übergeben
TwoWire *jwire = &Wire;   //test passing pointer to keypad lib
Keypad_I2C kpd( makeKeymap(keys), rowPins, colPins, ROWS, COLS, I2CADDR, PCF8574, jwire );

void setup() {
  Serial.begin(9600);
  sensors.begin();        // Start der Bibliothek
  while ( !Serial ) {
    /*wait*/
  }
  //  Wire.begin( );
  jwire->begin( );

  //  kpd.begin( makeKeymap(keys) );
  kpd.begin( );
  lcd.init();                         // initialize the lcd
  lcd.begin(16, 2);                   // Die Größe des Displays festlegen und das Display intialisieren.
  lcd.backlight();
  lcd.setCursor(5, 0);                // Springe mit dem Cursor in der 1. Zeile an Position 3.
  lcd.print("showerloop");            // Schreibe ab dort mittig den Text "showerloop" als Titel.

  // Ausgänge setzen
  pinMode(ventil_1Pin, OUTPUT);
  pinMode(ventil_2Pin, OUTPUT);
  pinMode(ventil_3Pin, OUTPUT);
  pinMode(ventil_4Pin, OUTPUT);
  pinMode(ventil_5Pin, OUTPUT);
  pinMode(uvPin, OUTPUT);
  pinMode(Pumpe, OUTPUT);
  pinMode(Heizung, OUTPUT);
}
char alt = '9'; // Wenn 9 aus ist
void loop() {

  // Gedrückte Taste abfragen
  char taste = kpd.getKey();
  //  char taste = tastenfeld.getKey();
  if (taste) {                                 // da war was
    if (taste != alt) {
      alt = taste;
      // alles aus
      digitalWrite(ventil_1Pin, LOW);          //Ventil 1 schließen
      digitalWrite(ventil_2Pin, LOW);          //Ventil 2 schließen
      digitalWrite(ventil_3Pin, LOW);          //Ventil 3 schließen
      digitalWrite(ventil_4Pin, LOW);          //Ventil 4 schließen
      digitalWrite(ventil_5Pin, LOW);          //Ventil 5 schließen
      digitalWrite(uvPin, LOW);                //UV-Entkeimung aus
      digitalWrite(Pumpe, LOW);                //Pumpe aus
      digitalWrite(Heizung, LOW);              //Heizung aus
    }
    if (taste >= '0' && taste <= '9') { // eine Ziffer
      switch (taste) { // Auswahl

        // 1 = duschen, Ventil 2, 4, 5, UV und Pumpe
        case '1':
          lcd.setCursor(0, 1);
          lcd.print("Programm: ");
          lcd.print(taste);
          lcd.setCursor(11, 1);
          lcd.print(" duschen ");
          Serial.print("Programm ");
          Serial.print(taste);
          Serial.println(" duschen");
          digitalWrite(ventil_2Pin, HIGH);          //Ventil 2 öffnen
          delay (200);
          //          digitalWrite(ventil_4Pin, HIGH);          //Ventil 4 öffnen
          //          delay (200);
          digitalWrite(ventil_5Pin, HIGH);          //Ventil 5 öffnen
          delay (200);
          digitalWrite(uvPin, HIGH);                //UV-Entkeimung an
          delay (200);
          digitalWrite(Pumpe, HIGH);                //Pumpe an
          break;

        case '2':
          // 2 = reinigen, Ventil 1, 4, 3 und Pumpe
          lcd.setCursor(0, 1);
          lcd.print("Programm: ");
          lcd.print(taste);
          lcd.setCursor(11, 1);
          lcd.print(" reinigen");
          Serial.print("Programm ");
          Serial.print(taste);
          Serial.println(" reinigen");
          digitalWrite(ventil_1Pin, HIGH);          //Ventil 1 öffnen
          delay (200);
          digitalWrite(ventil_4Pin, HIGH);          //Ventil 4 öffnen
          delay (200);
          digitalWrite(ventil_3Pin, HIGH);          //Ventil 3 öffnen
          delay (200);
          digitalWrite(Pumpe, HIGH);                //Pumpe an
          break;

        case '3':
          // 3 = bypass, Ventil 1, 5, UV und Pumpe
          lcd.setCursor(0, 1);
          lcd.print("Programm: ");
          lcd.print(taste);
          lcd.setCursor(11, 1);
          lcd.print(" bypass  ");
          Serial.print("Programm ");
          Serial.print(taste);
          Serial.println(" bypass");
          digitalWrite(ventil_1Pin, HIGH);          //Ventil 1 öffnen
          delay (200);
          digitalWrite(ventil_5Pin, HIGH);          //Ventil 5 öffnen
          delay (200);
          digitalWrite(uvPin, HIGH);                //UV-Entkeimung an
          delay (200);
          digitalWrite(Pumpe, HIGH);                //Pumpe an
          break;

        case '4':
          // 4 = entleeren, Ventil 2, 3 und Pumpe
          lcd.setCursor(0, 1);
          lcd.print("Programm: ");
          lcd.print(taste);
          lcd.setCursor(11, 1);
          lcd.print(" entleer.");
          Serial.print("Programm ");
          Serial.print(taste);
          Serial.println(" entleeren");
          digitalWrite(ventil_2Pin, HIGH);          //Ventil 2 öffnen
          delay (200);
          digitalWrite(ventil_3Pin, HIGH);          //Ventil 3 öffnen
          delay (200);
          digitalWrite(Pumpe, HIGH);                //Pumpe an
          break;

        case '5':
          // 5 = spülen, Ventil 1-5, Betriebslampe, UV und Pumpe
          lcd.setCursor(0, 1);
          lcd.print("Programm: ");
          lcd.print(taste);
          lcd.setCursor(11, 1);
          lcd.print(" sp\365len  ");
          Serial.print("Programm ");
          Serial.print(taste);
          Serial.println(" spuelen");
          digitalWrite(ventil_1Pin, HIGH);          //Ventil 1 öffnen
          delay (200);
          digitalWrite(ventil_2Pin, HIGH);          //Ventil 2 öffnen
          delay (200);
          digitalWrite(ventil_3Pin, HIGH);          //Ventil 3 öffnen
          delay (200);
          //          digitalWrite(ventil_4Pin, HIGH);          //Ventil 4 öffnen
          //          delay (200);
          digitalWrite(ventil_5Pin, HIGH);          //Ventil 5 öffnen
          delay (200);
          digitalWrite(uvPin, HIGH);                //UV-Entkeimung an
          delay (200);
          digitalWrite(Pumpe, HIGH);                //Pumpe an
          break;

        case '6':
          // 6 = Wasser erwärmen
          sensors.requestTemperatures();
          lcd.setCursor(0, 1);
          lcd.print("Programm: ");
          lcd.print(taste);
          lcd.setCursor(11, 1);
          lcd.print(" Wasser erwärmen.");
          lcd.setCursor(0, 2);
          lcd.print("Temperatur ");
          lcd.print(sensors.getTempCByIndex(0));
          lcd.print(" /337C");

          ActualTemp = sensors.getTempCByIndex(0);  //Aktuellle Temperatur ermitteln
          digitalWrite(Heizung, HIGH);              //Heizung einschalten

          if (ActualTemp = EndTemp) {
            digitalWrite(Heizung, LOW);             //Heizung ausschalten
          }

          break;

        case '7':
          // 7 = frei
          lcd.setCursor(0, 1);
          lcd.print("Programm: ");
          lcd.print(taste);
          lcd.setCursor(11, 1);
          lcd.print(" n. Verw.");
          break;

        case '8':
          // 8 = frei
          lcd.setCursor(0, 1);
          lcd.print("Programm: ");
          lcd.print(taste);
          lcd.setCursor(11, 1);
          lcd.print(" n. Verw.");
          break;

        case '9':
          // 9 = beenden
          lcd.clear();
          lcd.setCursor(5, 0);                     // Springe mit dem Cursor in der 1. Zeile an Position 1.
          lcd.print("showerloop");                 // Schreibe ab dort den Text "Sekunden seit".
          Serial.print("Programm ");
          Serial.print(taste);
          Serial.println(" Ende");
          digitalWrite(ventil_1Pin, LOW);          //Ventil 1 schließen
          digitalWrite(ventil_2Pin, LOW);          //Ventil 2 schließen
          digitalWrite(ventil_3Pin, LOW);          //Ventil 3 schließen
          digitalWrite(ventil_4Pin, LOW);          //Ventil 4 schließen
          digitalWrite(ventil_5Pin, LOW);          //Ventil 5 schließen
          digitalWrite(uvPin, LOW);                //UV-Entkeimung aus
          digitalWrite(Pumpe, LOW);                //Pumpe aus
          return 0;
      }
    }
  }
}
Angehängte Datei(en)
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
17.03.2021, 15:09 (Dieser Beitrag wurde zuletzt bearbeitet: 17.03.2021 15:10 von MicroBahner.)
Beitrag #106
RE: showerloop mit Controllino
(17.03.2021 13:50)Breze schrieb:  In meinem Sketch habe ich angefangen in case 6 die Heizungssteuerung zu Programmieren.
Aber fragt mich nicht, ich komme einfach nicht drauf wie ich das mit einer Schleife hinbringen soll.
loop ist deine Schleife. Also fragst Du im loop direkt die Temoeratur ab, und wenn sie größer als deine Endtemperatur ist, dann schaltest Du aus. Das kannst Du immer machen - unabhängig von deinen Tasten. In deinem Taste'6' schaltest Du nur die Heizung ein, sonst nichts. Für das Ausschalten sorgt dann die Temperaturabfrage im loop.
Code:
void loop() {
  // Wassertemperatut prüfen, und gegebenenfalls Heizung abschalten
  ActualTemp = sensors.getTempCByIndex(0);  //Aktuellle Temperatur ermitteln
  if (ActualTemp >= EndTemp) {
    digitalWrite(Heizung, LOW);             //Heizung ausschalten
  }

  // Gedrückte Taste abfragen
  char taste = kpd.getKey();
  ...
  ...
    case '6':
      // 6 = Wasser erwärmen
      ...
      ...
      lcd.print(sensors.getTempCByIndex(0));
      lcd.print(" /337C");
      digitalWrite(Heizung, HIGH);              //Heizung einschalten
      break;
      ...
}

Wenn Du die Temperatur während des Aufheizens kontinuierlich anzeigen willst, wir's etwas komplizierter, dann musst Du das auch noch direkt in den loop ziehen, musst dann aber berücksichtigen, dass die anderen Tasten das LCD auch benutzen.

Gruß, Franz-Peter
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
18.03.2021, 22:24
Beitrag #107
RE: showerloop mit Controllino
(05.03.2021 09:53)Franz54 schrieb:  Schaue mal hier. Bischen runter scrollen. Da habe ich einen Link mit Industriesensoren. Da gibt es verschiedenen Kabellängen bis 10m. Und eine Link zu den Sensor Einsteckhüllen für 6mm Sensoren. Bischen Wärmeleitpaste mit rein, dann passt das.

Ich habe meinen Text in dem Link erweitert. Irgendwo hat mal jemand geschrieben, dass diese Industriesensoren "K" Type anstelle der Max6675 Fühler passen. Das habe ich in meiner Seite so übernommen und wollte das gelegentlich dann mit einem Fühler von denen testen. Dann habe ich es rausgeschoben, weil die Dinger ja nicht zu den günstigen Fühlern zählen. Jetzt durch das Thema hier bin ich wieder dran erinnert worden, habe mir gleich so einen Fühler besorgt, und habe ihn getestet. Ergebnis ist negativ. Ich habe es in dem Link auf meiner HP beschrieben was da falsch läuft. Möchte es jetzt nicht nochmal erzählen. Steht im Link nicht zu übersehen.

https://www.youtube.com/watch?v=Fnzn85oWM_Q
Hier was zum Thema Deutsche Politik Angry
Und hier zum Thema richtige Politik Big Grin
Webseite des Benutzers besuchen Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
26.03.2021, 15:16
Beitrag #108
RE: showerloop mit Controllino
Hallo Franz-Peter,
danke übrigens für deine Hilfe, ich bin erst jetzt wieder dazugekommen hier weiter zu machen.
Dieser Satz (siehe unten) bereitet mir Kopfzerbrechen, natürlich würde ich gerne die Temperatur beim aufheizen angezeigt bekommen.
Ich verstehe aber nicht das mit den "anderen Tasten".
Es ist so, dass ich durch drücken der Taste 6 die Heizung für den Wasserbehälter einschalte.
Erst wenn das Wasser warm ist, schalte ich die Heizung aus und beginne mit dem Duschen (Taste 1).
Es wird also während des Aufheizens keine Taste gedrückt also auch nicht im LCD angezeigt, oder liege ich hier falsch?

"
Wenn Du die Temperatur während des Aufheizens kontinuierlich anzeigen willst, wir's etwas komplizierter, dann musst Du das auch noch direkt in den loop ziehen, musst dann aber berücksichtigen, dass die anderen Tasten das LCD auch benutzen.
"

LG Breze
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
26.03.2021, 15:36
Beitrag #109
RE: showerloop mit Controllino
Hallo Breze,
(26.03.2021 15:16)Breze schrieb:  Erst wenn das Wasser warm ist, schalte ich die Heizung aus und beginne mit dem Duschen (Taste 1).
Es wird also während des Aufheizens keine Taste gedrückt also auch nicht im LCD angezeigt, oder liege ich hier falsch?
Ich gehe vom Programm aus. Und da hindert dich niemand, während des Aufheizens eine andere Taste zu drücken. In deinem bisherigen Sketch passiert ja nur etwas, wenn auch eine Taste gedrückt wird ( der ganze Block mit dem 'if ( taste )'.
Wenn Du Dinge unabhängig vom Tastendrücken machen willst, musst Du das im loop ausserhalb dieses ganze if-Blocks für die Tasten machen. So wie beim Überwachen der Temperatur, um die Heizung auszuschalten. Natürlich kannst Du dann dort auch regelmäßig die Temperatur auf dem LCD anzeigen, um den Temperaturanstieg zu visualisieren. Vom Programm her hindert dich aber niemand, in dieser Zeit eine Taste zu drücken, die dann etwas anderes auf dem LCD anzeigt, was dann wieder von der regelmäßigen Temperaturanzeige überschrieben wird. Da bekommst Du also ein Durcheinander auf dem LCD. Mal wird es regelmäßig im loop beschrieben, und mal wenn eine Taste gedrückt wird. Das musst Du dann mit Flags lösen, was denn gerade für eine Anzeige auf dem LCD aktiv ist.
Oder Du baust die Anzeige auf dem LCD so auf, dass da immer an einer festen Stelle Platz für die aktuelle Temperatur ist. Die kannst Du dann im loop immer aktualisieren, musst aber bei den Tastern darauf achten, dass die diesen Bereich des LCD nicht mitbenutzen.

Gruß, Franz-Peter
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
Antwort schreiben 


Gehe zu:


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