Mal wieder: Brauche Hilfe bei millis() Operation

Hi Leute,

ich kann mir schon denken was jetzt wieder jeder denkt. Nicht schon wieder jemand der bei millis() Hilfe braucht.
Leider ist es aber so, bisher kam ich mit dem Konstrukt auch ganz gut zurecht, leider hat bisher bei meinem Problem jeglicher Lösungsansatz nicht funktioniert.

Ziel ist es, bei dieser Steuerung einen wert durch Tastendruck zu verändern.
Da ich noch ein LCD als Ausgabe verwende, dachte ich mir, dass es ganz nett wäre wenn die Hintergrundbeleuchtung gleichzeitig mit dem Tastendruck für 1 Sekunden angeht. Leider bekomm ich es nicht hin, während dieser Sekunde durch einen weiteren Tastendruck den Wert abermals zu erhöhen.

Vieleicht könnt ihr mir helfen.

Hier mein Sketch:

#include <OneButton.h>
#include <RCSwitch.h>
#include <OneWire.h>
#include <LiquidCrystal.h>
#include <DallasTemperature.h>
#include <EEPROMEx.h>
 
#define button_1 A0
#define button_2 A1
OneButton button_up(button_1, true);     // false = mit Pull-Down-Widerstand, true = ohne Widerstand 
OneButton button_down(button_2, true);
#define ONE_WIRE_BUS 13                  // Data wire is plugged into pin 2 on the Arduino
RCSwitch mySwitch = RCSwitch();          // RCSwicht zuweisen
OneWire oneWire(ONE_WIRE_BUS);           // Setup a oneWire instance to communicate with any OneWire devices 
DallasTemperature sensors(&oneWire);     // Pass oneWire reference to Dallas Temperature.
LiquidCrystal lcd(12, 11, 10, 7, 6, 5, 4);
#define light 3                          // LED des LCD

float tempist = 0;                       // Ist-Temperatur Variable
float tempsoll;                          // Soll-Temperatur Variable                     
int state = 0;                           // Status Variable
int addr = 0;                            // EEPROM Adresse
unsigned long previousMillis = 0;         // Millis Handler
unsigned long currentMillis = 0;



void setup()
{
  // start serial port
  Serial.begin(9600);
  sensors.begin();                       // Start der Dallas Temperature library
  mySwitch.enableTransmit(10);           // Benutze Pin 10 für AM Transmitter
  lcd.begin(16,2);              
  pinMode(light, OUTPUT);                // LCD Pin Output definiert
  button_up.attachClick(up_click);       // OneButton zuweisen
  button_down.attachClick(down_click);   
  button_up.attachPress(up_press);
  button_up.setPressTicks(3000);
  tempsoll = EEPROM.readFloat(addr);     //EEPROM Wert Variable zuweisen
  lcdprint();
}


void loop()
{
  currentMillis = millis();
  button_up.tick();
  button_down.tick();
  delay(5);
  if(currentMillis - previousMillis > 10000) {  // save the last time you blinked the LED 
    previousMillis = currentMillis;
    gettemp();
    lcdprint();
  }
  if (tempist >= tempsoll +1 && state == 0) {   //Wenn die Temperatur >= der Soll-Temperatur + 1°C Hysteresis dann schalte Kühlung ein
  state = 1;                                    // Statusvariable für Kühlung
  mySwitch.switchOn("11111", 4);
  }
  if (tempist < tempsoll -1 && state == 1) {
  state = 0;
  mySwitch.switchOff("11111", 4);
  }
}

void lcdprint()
{
  lcd.setCursor(0,0);
  lcd.clear();
  lcd.print("K\365hlung:");
  if (state == 1)
  {
    lcd.setCursor(9,0);
    lcd.print("An ");
  }
  else
  {
    lcd.setCursor(9,0);
    lcd.print("Aus");
  }
  lcd.setCursor(0,1);
  lcd.print("I");
  lcd.setCursor(2,1);
  lcd.print(tempist);
  lcd.setCursor(8,1);
  lcd.print("S");
  lcd.setCursor(10,1);
  lcd.print(tempsoll);
}

void gettemp()
{
  Serial.print(" Requesting temperatures...");
  sensors.requestTemperatures(); // Send the command to get temperatures
  Serial.println("DONE");
  Serial.print("Temperature for Device 1 is: ");
  tempist = sensors.getTempCByIndex(0);
  Serial.print(tempist);
}

// OneButton Library Funktionen definieren
void up_click() {
  digitalWrite(light, HIGH);
  tempsoll += 0.5;
  lcdprint();
  digitalWrite(light, LOW);
  }

void down_click(){
  tempsoll -= 0.5;
  lcdprint();
}

void up_press(){
  //EEProm
  digitalWrite(light, HIGH);
  EEPROM.writeFloat(addr, tempsoll);        //tempsoll in EEPROM speichern
  lcd.setCursor(0,0);
  lcd.clear();
  lcd.print("Soll-Temperatur");
  lcd.setCursor(0,1);
  lcd.print("gespeichert");
  delay(5000);
  digitalWrite(light, LOW);
}

Es geht, im Besonderen um diesen Teil:

void up_click() {
  digitalWrite(light, HIGH);
  tempsoll += 0.5;
  lcdprint();
  digitalWrite(light, LOW);
  }

Bei jedem Tastendruck mußt Du nur millis() in der Variablen abspeichern mit der Du kontrollierst ob die Zeit vergangen ist.

also

Taste gedrückt
{HintergrundLEd einschalten
timeLED = millis()
LEDHintergrund =1 // Status Hintergrundbeleuchtung
...
}

if ((millis() > timeLED + EinZeitLED) && LEDHintergrund ==1 )
{
LEDHintergrund =0;
HintergrundLEd ausschalten
}

Grüße Uwe

Vielen Dank, auf die Möglichkeit das ganze in der loop ausschalten zu lassen bin ich nicht gekommen. Funktioniert jetzt bestens :slight_smile: !