Keypad dauerhaft erreichbar?

Hallo,

ich möchte ein Keypad dauerhaft nutzbar machen, die Delays können nicht entfernt oder geändert werden weil sonst nur noch der Zahlenwert auf dem Display flackert bzw. sich laufend ändert. Also der Arduino soll jeder Zeit auf die Eingabe vom Keypad reagieren.

Mein Arduino:
Arduino Mega 2560

Der Code:

#include <StaticThreadController.h>
#include <ThreadController.h>
#include <Thread.h>


#include <Wire.h>
#include <NoiascaLiquidCrystal.h>
#include <NoiascaHW/lcd_i2c.h> 
#include <Keypad.h>

const byte COLS = 4;
const byte ROWS = 4;

char hexaKeys[ROWS][COLS] ={
  {'D', '#', '0', '*'},
  {'C', '9', '0', '7'},
  {'B', '6', '0', '4'},
  {'A', '3', '0', '1'},
};

byte colPins[COLS] = {2, 3, 4, 5};
byte rowPins[ROWS] = {6, 7, 8, 9};
char Taste;

Keypad Tastenfeld = Keypad(makeKeymap(hexaKeys), rowPins, colPins, ROWS, COLS);
LiquidCrystal_I2C lcd(0x27, 16, 2);
int Feuchtigkeit = 0;
int water = 0;



void setup() {
  pinMode(52, OUTPUT);
  Serial.begin(9600);
  lcd.begin();
  lcd.backlight();
}

void loop() {
  
  digitalWrite(52, LOW);
  Feuchtigkeit = analogRead(A0);
  water = Feuchtigkeit; 
  
  if (water >= 100) {
    digitalWrite(52, HIGH);
  }

  Serial.println(Feuchtigkeit);

  lcd.setCursor(0, 0);
  lcd.print("");
  lcd.print(Feuchtigkeit);  
  lcd.print("   ");   

  delay(2000);
}

Sagst du, ich sehe das ganz anders als du und würde genau da ansetzen. Suche nach einer Möglichkeit ohne delays zu programmieren. Als einstieg in die Sache, lege ich dir das "blink without delay" Beispiel aus der Arduino IDE ans Herz.

Natürlich gibts auch ein Leben neben delay()
Aber ein delay() abbrechen, das geht nicht.

Tipp:

Der Kopf ist rund, damit das denken die Richtung ändern kann.

Doch.

Das ist richtig.
Der analogRead gibt Dir einen pendelnden Wert zurück. Steht im Datenblatt.
Also musst Du versuchen, dieses Pendeln mit in Deinen Code einzubinden.
Dazu gibt es mehrere Methoden.
Ich schlage mal einige vor:
a) Das Display nur alle xxx ms aktuallisieren
b) einen Mittelwert bilden und diesen ausgeben
c) die Wertänderung nur anzeigen, wenn die Abweichung über die Hysterese des analogwertes hinaus geht
d) Eine Mischung aus allen ist in unterschiedlichen Konstellationen möglich.

Das Delay muss weg, daran führt kein Weg vorbei.

Warum willst du alle 2 Sekunden den Wert auf das Display schreiben? Der richtige Ansatz wäre es, nur dann auf das Display zu schreiben, wenn der Wert sich ändert. Dann braucht es auch das Delay nicht.

Am Besten, du vergisst einfach, daß es "Delay()" überhaupt gibt. Es gibt (fast) immer einen besseren Weg als Delay.
Wie das geht, steht in den Beispielen (blinkWithoutDelay)

Und wozu braucht man so was?

War noch aus anderen Versuchen das Problem zu lösen

Dein Problem lasst sich ganz einfach lösen:

  1. Vergessen das es delay gibt
  2. Lernen, wie eine / mehrere Stateschienen miteinander arbeiten. Timings innerhalb der Statem. mit millis() machen.

Schau mal hier hinein: Arduino: Programmiertechniken/Statemaschine – Wikibooks, Sammlung freier Lehr-, Sach- und Fachbücher

guter Ansatz, werde ich umsetzen.

Danke für eure Unterstützung.