Taster Hochzählen und Zeit abfragen Klimaschrank

Hallo Zusammen, ich arbeite gerade an einem Klimaschrank mit zwei Kammern welche über einen Arduino kontrolliert werden. Das Ziel ist es, dass man am Anfang mit zwei Potis die Temperatur (0° bis 70°C) und die Zeitdauer (0 bis 50Tage) einstellen kann. Der Schrank sollte dann selber die eingestellte Zeit ablaufen und danach abschalten. Die Kammern sollten einzeln angesteuert werden. Momentan wird noch alles im Seriellen Monitor angezeigt, warte noch auf das i2c 2x16 display.

Mein erstes Problem ist, dass ich nicht weiss, wie man mit dem gedrückten Taster nur eine Variable Hochzählt und nicht extrem schnell hochzählt. Also 1 Klick gleich +1.

Und mein zweites Problem ist, dass ich nicht weiss wie ich die Zeit Stoppen kann. Es gibt ja die Funktion millis() welche eine unsigned long Variable bis 232 zählen kann was ca 50 Tagen entspricht. Aber wi wende ich dies an?

Wäre froh um einen Tipp.

Hardware:
Arduino Mega 2560

Code:

#include <Debounce.h> //Bibliothek zum entprellen der Taster
#include <OneWire.h>  //Bibliothek für die Datenübertragung des Temperatursensors
#include <DallasTemperature.h> //Bibliothek für die Messung der Temperatur
#define K1 2 //Relais K1 auf Pin 2
#define K2 3 //Relais K2 auf Pin 3
#define K3 4 //Relais K3 auf Pin 4
#define K4 5 //Relais K4 auf Pin 5
#define S1 8 //Bestätigungs Taster auf Pin 8
#define S0 9 //Notaus
#define Poti1 A0 //Signal Poti1 auf Pi n A0
#define Poti2 A1 //Signal Poti2 auf Pin A1
#define ONE_WIRE_BUS 10
int sens1; //Variabel für Wert Poti1 0 - 1023
int sens2; //Variabel für Wert Poti2 0 - 1023
int temp1; //Variabel für Wert Poti1 umgewandelt in 0 - 70 (wegen Temperatur)
int temp2; //Variabel für Wert Poti2 umgewandelt in 0 - 70 (wegen Temperatur)
int time1; //Variabel für Zeit Kammer 1
int time2; //Variabel für Zeitausgabe Kammer 2
int buttonState; //Variabel für auslesen von S1
int buttonStateS0; //Variabel für Notaustaster
int counter1 = 0; //Zählervariabel für Regelung1
int counter2 = 0; //Zählervariabel für Regelung2
int counter3 = 0; //Zählervariabel für Notaus
OneWire oneWire(ONE_WIRE_BUS); //Busverbindung starten zum Sensor
DallasTemperature sensors(&oneWire); //Temperatur auslesen über die Busverbindung
Debounce Button(8); //Taster entprellen an Pin 8

void setup() {

  Serial.begin(9600); //Serieller Monitor starten
  sensors.begin(); //Sensor startet die Messung
  pinMode(K1, OUTPUT); //Relais K1 wird als output festgelegt
  pinMode(K2, OUTPUT); //Relais K2 wird als output festgelegt
  pinMode(K3, OUTPUT); //Relais K3 wird als output festgelegt
  pinMode(K4, OUTPUT); //Relais K4 wird als output festgelegt
  pinMode(S1, INPUT); //Taster S1 wird als Input festgelegt
  pinMode(S0, INPUT); //Notaus als Input festlegen

}

void loop() {

  Regelung1(); //springt zur Funktion Regelung1
  Regelung2(); //springt nach Regelung1 zur Funktion Regelung2

  buttonStateS0 = digitalRead(S0);
  if (buttonStateS0) {
    Notaus(); //sprintg zur Funktion Notaus
  }

  sensors.requestTemperatures(); //Temperatur wird im Hintergrund angefordert und abgespeichert
  Serial.print("Temp Kammer 1: ");
  Serial.print(sensors.getTempCByIndex(0)); //Index "0" ist Sensor 1, und Index "1" ist Sensor 2 auf der gleichen bus verbindung
  Serial.print("°C   |   Temp Kammer 2: ");
  Serial.print(sensors.getTempCByIndex(1)); //Index "0" ist Sensor 1, und Index "1" ist Sensor 2 auf der gleichen bus verbindung
  Serial.println("°C");
  //  delay(20);

  if ((sensors.getTempCByIndex(0)) < temp1) { //Wenn die Messung am Sensor 1 tiefer ist als die festgelegte Temperatur, dann wird K1 eingeschaltet um aufzuheizen
    digitalWrite(K1, HIGH); // K1 wird eingeschaltet für Heizung Kammer 1
    digitalWrite(K3, HIGH); // K3 wird eingeschaltet für lüfter Kammer 1
    // delay(20);
  }
  else {
    digitalWrite(K1, LOW); //Wenn Messung am Sensor 1 höher ist ist als die festgelegte Temperatur, dann wird K1 ausgeschaltet um abzukühlen
  }

  if ((sensors.getTempCByIndex(1)) < temp2) { //Wenn Temp Messung am Sensor 2 tiefer ist als die festgelegte Temperatur, dann wird K2 eingeschaltet um aufzuheizen
    digitalWrite(K2, HIGH); // K2 wird eingeschaltet für Heizung Kammer 2
    digitalWrite(K4, HIGH); // K4 wird eingeschaltet für lüfter Kammer 2
    // delay(20);
  }
  else {
    digitalWrite(K2, LOW); //Wenn Messung am Sensor 2 höher ist ist als die festgelegte Temperatur, dann wird K2 ausgeschaltet um abzukühlen
  }
}


void Regelung1() { //definieren der Funktion Temp und Zeit Regelung Kammer 1

  while (counter1 == 0) {
    Debounce Button(8);
    buttonState = digitalRead(S1); //auf die Variabel Buttonstate kommt der Wert von S1

    sens1 = analogRead(Poti1); //Poti1 auslesen mit sens1
    sens2 = analogRead(Poti2); //Poti2 auslesen mit sens2

    temp1 = map(sens1, 0 , 1023, 0, 70); //umwandeln von 0 bis 1023 auf 0 bis 70°C temp1
    time1 = map(sens2, 0 , 1023, 0, 50); //umwandeln von 0 bis 1023 auf 0 bis 50 Tagen time1

    Serial.print("Temp 1: ");
    Serial.print(temp1);
    Serial.print("°C");
    Serial.print("  ¦¦¦  ");
    Serial.print("Time 1: ");
    Serial.print(time1);
    Serial.print("Tage    | ");
    Serial.println(!buttonState);

    if (!buttonState) {
      counter1 ++;
    }
  }
}

void Regelung2() {

  while (counter1 == 1) {
    Debounce Button(8);
    buttonState = digitalRead(S1);

    sens1 = analogRead(Poti1); //Poti1 auslesen mit sens1
    sens2 = analogRead(Poti2); //Poti2 auslesen mit sens2

    temp2 = map(sens1, 0 , 1023, 0, 70); //umwandeln von 0 bis 1023 auf 0 bis 70°C temp2
    time2 = map(sens2, 0 , 1023, 0, 50); //umwandeln von 0 bis 1023 auf 0 bis 50 Tagen time2

    Serial.print("Temp 2: ");
    Serial.print(temp2);
    Serial.print("°C");
    Serial.print("  ¦¦¦  ");
    Serial.print("Time 2: ");
    Serial.print(time2);
    Serial.print("Tage    | ");
    Serial.println(!buttonState);

    if (!buttonState) {
      counter1 ++;
      counter2 ++;
    }
  }
}

void Notaus() { //Notaus Funktion fals der Notasu Knopf gedrückt wird. Alles wird ausgeschalten

  while (1) {
    digitalWrite(K1, LOW); // K1 ausschalten
    digitalWrite(K2, LOW); // K2 ausschalten
    digitalWrite(K3, LOW); // K3 ausschalten
    digitalWrite(K4, LOW); // K4 ausschalten
    Serial.println("Not-Aus, Maschine Neustarten");
  }
}

Danke und Grüsse.

Fifty days is just over the time millis can measure. However, you're counting days, so you can use millis to tell you when a day has passed since the start and decrement days remaining.

You may want to put stuff in EEPROM to keep track of where you are time wise in case of a power outage.

für das Zeit-Problem kannst du entweder eine zusätzliche Variable nehmen, welche die Überläufe zählt, oder ein Echtzeitmodul verwenden. Da ein solches Modul eine eigene Batterie hat, übersteht das auch Stromausfälle. Wenn du dann die Start-Zeit im EEPROM hast wäre also selbst ein Stromausfall kein größeres Problem.

Für den Knopf kenne ich nur die Theorie, da ich mich noch nie ernsthaft damit beschäftigen wollte: Du magst nicht schauen ob der Knopf gedrückt ist sondern den Status in einer Variable speichern und nur schauen ob sich der Status geändert hat. Dazu könntest du dir den Quellcode der Keypad-Bibliothek anschauen, die tut das zwar für ein ganzes Tastenfeld was die aber als Array von Knöpfen sieht, in deinem Fall wäre das dann ein Feld mit nur einer Taste, sollte sich also recht einfach übertragen lassen.

Mein erstes Problem ist, dass ich nicht weiss, wie man mit dem gedrückten Taster nur eine Variable Hochzählt und nicht extrem schnell hochzählt. Also 1 Klick gleich +1.

dazu gibt es in der IDE ein Beispiel "State Change detection"

Hallo,
was hast Du denn da eigendlcih vor, Ich denke Du willst Temperatur und Zeit mit je einem Poti einstellen. Fas soll da der Taster noch hochzählen. Willst Du immer nur ganze Tage einstellen, oder was soll die kleinste Einheit sein?
Bei der Temperatur gehe ich mal von Grad aus , das ist ja ok.

Du kannst auch die Potis weglassen und nimmst 2 Taster und 2 Schalter.

Taster + , -
Schalter Vorwahl Zeit/ Temperatur
Schalter Start / Aus

Heinz

This topic was automatically closed 120 days after the last reply. New replies are no longer allowed.