Lüftersteuerung + Temperatur Messung

Hallo! Ich habe folgende zwei Codes:

#include <Keypad.h>

const byte ROWS = 1;  // nur 1 Zeile im Tastenfeld
const byte COLS = 4;  // 4 Spalten im Tastenfeld
char keys[ROWS][COLS] = {
  { '1', '2', '3', '4' }
};  // Die einzigen verfügbaren Tasten auf dem Tastenfeld

byte rowPins[ROWS] = { A0 };          // Der Pin, an dem die Zeile angeschlossen ist
byte colPins[COLS] = { 2, 3, 4, 5 };  // Die Pins, an denen die Spalten angeschlossen sind

int fanPin = 9;    // Der Pin, an dem das PWM-Signal ausgegeben wird
int pwmValue = 0;  // Der aktuelle PWM-Wert

Keypad keypad = Keypad(makeKeymap(keys), rowPins, colPins, ROWS, COLS);

void setup() {
  Serial.begin(9600);             // Serielle Kommunikation starten
  pinMode(fanPin, OUTPUT);        // Pin für den Lüfter als Ausgang definieren
  analogWrite(fanPin, pwmValue);  // PWM-Wert auf 0 setzen
}

void loop() {
  char key = keypad.getKey();  // Tastendruck abfragen
  if (key != NO_KEY) {         // Wenn eine Taste gedrückt wurde
    if (key == '1') {          // Wenn Taste 1 gedrückt wurde
      Serial.println("Aus");   // Text "Aus" auf dem seriellen Monitor ausgeben
      pwmValue = 0;            // PWM-Wert auf 0 setzen
    }
    if (key == '2') {              // Wenn Taste 2 gedrückt wurde
      Serial.println("Stufe: 1");  // Text "Stufe: 1" auf dem seriellen Monitor ausgeben
      pwmValue = 35;               // PWM-Wert auf 25% setzen (64 von 255)
    }
    if (key == '3') {              // Wenn Taste 3 gedrückt wurde
      Serial.println("Stufe: 2");  // Text "Stufe: 2" auf dem seriellen Monitor ausgeben
      pwmValue = 160;              // PWM-Wert auf 50% setzen (128 von 255)
    }
    if (key == '4') {              // Wenn Taste 4 gedrückt wurde
      Serial.println("Stufe: 3");  // Text "Stufe: 3" auf dem seriellen Monitor ausgeben
      pwmValue = 255;              // PWM-Wert auf 75% setzen (192 von 255)
    }
    analogWrite(fanPin, pwmValue);  // PWM-Wert auf den Pin ausgeben
    Serial.println(pwmValue);
  }
}

Dieser Code ermöglicht die Lüftersteuerung mit einem 4x1 Tastenfeld's. Der zweite Code ermöglicht eine Temperatur Messung mit dem DS18B20 Sensor:

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

#define ONE_WIRE_BUS 12 // Datenleitung des DS18B20 an digitalen Pin 12 anschließen

OneWire oneWire(ONE_WIRE_BUS); // Eine Instanz von OneWire erstellen
DallasTemperature sensors(&oneWire); // Eine Instanz von DallasTemperature erstellen

void setup() {
  Serial.begin(9600); // Serielle Kommunikation starten
  sensors.begin(); // DallasTemperature initialisieren
}

void loop() {
  sensors.requestTemperatures(); // Temperaturmessung starten
  float temperatureC = sensors.getTempCByIndex(0); // Temperatur in Celsius abrufen
  Serial.print("Temperatur in Celsius: ");
  Serial.println(temperatureC); // Temperatur ausgeben
  
  delay(1000); // Eine Sekunde warten, bevor die nächste Messung durchgeführt wird
}

Ich möchte nun diese beiden Codes zusammenfügen, sodass die Temperatur dauerhaft gemessen wird bis eben einer der Taster gedrückt wird und sofort seine Stufe einstellt.

Wie kann man das umsetzen?

Evntl. Interrupts ?

Danke im vorraus!
MfG
Nils

Sobald eine Taste betätigt wird, soll die Temperaturmessung aufhören?
"bis eben" ist vermutlich missverständlich.

Das delay(1000) muss durch eine "xyWithoutDelay" Konstruktion ersetzt werden ( Ähnlich BlinkWithoutDelay ), die dafür sorgt, dass nur einmal je Sekunde gemessen wird, aber in dieser Sekunde dauernd das keypad auf Betätigung überwacht wird.

Hinweis: Interrupts sind nicht die Lösung, die haben da nichts verloren.

Also die Temperatur soll dauerhaft gemessen werden, wenn die Taste gerückt wird soll sie ihre funktion ausführen. Dite Temperatur soll aber weiterhin gemessen werden. In dem jetztigem Programm funktioniert das aber nicht. Die Temperatur wird gemessen und wenn ich den Taster nicht zum richtigen Zeitpunkt drückte passiert nichts.

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

#define ONE_WIRE_BUS 12 // Datenleitung des DS18B20 an digitalen Pin 12 anschließen

OneWire oneWire(ONE_WIRE_BUS); // Eine Instanz von OneWire erstellen
DallasTemperature sensors(&oneWire); // Eine Instanz von DallasTemperature erstellen


const byte ROWS = 1;  // nur 1 Zeile im Tastenfeld
const byte COLS = 4;  // 4 Spalten im Tastenfeld
char keys[ROWS][COLS] =
{
  { '1', '2', '3', '4' }
};  // Die einzigen verfügbaren Tasten auf dem Tastenfeld

byte rowPins[ROWS] = { A0 };          // Der Pin, an dem die Zeile angeschlossen ist
byte colPins[COLS] = { 2, 3, 4, 5 };  // Die Pins, an denen die Spalten angeschlossen sind

int fanPin = 9;    // Der Pin, an dem das PWM-Signal ausgegeben wird
int pwmValue = 0;  // Der aktuelle PWM-Wert
uint32_t lastMillis;

Keypad keypad = Keypad(makeKeymap(keys), rowPins, colPins, ROWS, COLS);

void setup()
{
  Serial.begin(9600);             // Serielle Kommunikation starten
  pinMode(fanPin, OUTPUT);        // Pin für den Lüfter als Ausgang definieren
  analogWrite(fanPin, pwmValue);  // PWM-Wert auf 0 setzen
  sensors.begin(); // DallasTemperature initialisieren
  sensors.requestTemperatures(); // Temperaturmessung starten
  lastMillis = millis();
}

void loop()
{
  char key = keypad.getKey();  // Tastendruck abfragen
  if (key != NO_KEY)           // Wenn eine Taste gedrückt wurde
  {
    if (key == '1')            // Wenn Taste 1 gedrückt wurde
    {
      Serial.println("Aus");   // Text "Aus" auf dem seriellen Monitor ausgeben
      pwmValue = 0;            // PWM-Wert auf 0 setzen
    }
    if (key == '2')                // Wenn Taste 2 gedrückt wurde
    {
      Serial.println("Stufe: 1");  // Text "Stufe: 1" auf dem seriellen Monitor ausgeben
      pwmValue = 35;               // PWM-Wert auf 25% setzen (64 von 255)
    }
    if (key == '3')                // Wenn Taste 3 gedrückt wurde
    {
      Serial.println("Stufe: 2");  // Text "Stufe: 2" auf dem seriellen Monitor ausgeben
      pwmValue = 160;              // PWM-Wert auf 50% setzen (128 von 255)
    }
    if (key == '4')                // Wenn Taste 4 gedrückt wurde
    {
      Serial.println("Stufe: 3");  // Text "Stufe: 3" auf dem seriellen Monitor ausgeben
      pwmValue = 255;              // PWM-Wert auf 75% setzen (192 von 255)
    }
    analogWrite(fanPin, pwmValue);  // PWM-Wert auf den Pin ausgeben
    Serial.println(pwmValue);
  }
  if (millis() - lastMillis > 1000)
  {
    float temperatureC = sensors.getTempCByIndex(0); // Temperatur in Celsius abrufen
    Serial.print("Temperatur in Celsius: ");
    Serial.println(temperatureC); // Temperatur ausgeben
    sensors.requestTemperatures(); // Temperaturmessung starten
    lastMillis = millis();
  }
}

Ja, der Ablauf ist so richtig.

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