Briefkasten Meldeanlage LOW HIGH Problem

Halllo Zusammen,
ich habe mir eine Brief im Briefkasten Meldeanlage gebaut.
Ein Magnetschalter gibt den Impuls, dass sich die Klappe geöffnet hat.
Daraufhin geht die Displaybeleuchtung an, es steht ein Text (Brief im Briefkasten) auf dem Display und die Rote LED “sollte blinken”
Nachdem man den Briefkasten geleert hat drückt man einen Taster und die Grüne LED geht an, das Display geht aus ( bis wieder jemand die Klappe öffnet und den nächsten Brief einwirft)

Soweit funktioniert das alles bis auf das Blinken der Roten LED. Die Blinkt nur solange die Klappe vom Briefkasten noch geöffnet ist. Sie soll sich aber wie das Display verhalten, eben nur Blinkend und so auch per LED melden dass Post da ist. Sie meldet das nur solange die Klappe noch offen ist. Das Display bzw. die Beleuchtung des Displays verhält sich richtig und geht erst aus wenn man am Taster bestätigt hat den Brief rausgenommen zu haben. Ich finde einfach den Fehler im Code nicht. Fällt euch etwas auf ?

#include <Wire.h> 
#include <LiquidCrystal_I2C.h>

// LCD Adresse
LiquidCrystal_I2C lcd(0x27, 16, 2);

const int button_text = 9;
const int button_erase = 8;
const int greenLEDPin = 10;     
const int redLEDPin = 11;     

int text;
int erase;

bool previous_text = false;
bool previous_erase = false;



void setup() {

// LCD Initialisieren
lcd.begin();

// Digitale Inputs Outputs gesetzt
pinMode(greenLEDPin, OUTPUT);
pinMode(redLEDPin, OUTPUT);

pinMode(button_text,INPUT_PULLUP);
pinMode(button_erase,INPUT_PULLUP);

}


void loop() {


text = digitalRead(button_text);

erase = digitalRead(button_erase);



if( text == HIGH ){

// LCD Hintergrundlicht einschalten
lcd.backlight();

lcd.print("      Post ");

lcd.setCursor(0, 1);

lcd.print(" im Briefkasten ");

digitalWrite(greenLEDPin, LOW);   // Grüne LED wieder aus weil Brief im Briefkasten soll rote LED blinken

digitalWrite(redLEDPin, HIGH);   // Rote LED an
delay(1000);                       // wait for a second
digitalWrite(redLEDPin, LOW);    // Rote LED aus
delay(1000);     


}

else if(erase == LOW){

lcd.clear();
lcd.noBacklight(); // LCD Beleichtung aus weil Briege abgeholt

digitalWrite(greenLEDPin, HIGH);   // Grüne LED an weil kein Brief mehr im Briefkasten
digitalWrite(redLEDPin, LOW);      // Rote LED aus weil Briefe abgeholt

}

}

So hast Du es ja auch programmiert. Du darfst mit dem Schalter (text ist eine blöde Bezeichnung dafür) nur einen Merker setzen, ob es blinken soll. Den setzt Du zurück, wenn Du mit blinken fertig bist.

Wenn während Deiner Delay eine Aktion erfolgt, dann verpasst Du die, also solltest Du das Blinken ohne delay bauen. Schaue Dir BlinkWithoutDelay und die Nachtwächtererklärung an und verstehe es.

Gruß Tommy

arduinoandi:
Ich finde einfach den Fehler im Code nicht. Fällt euch etwas auf ?

Ich sehe das wie Tommy. Im Grunde möchtest Du mehrere gleichzeitige Abläufe, was für ein Ding, das grob gesagt nur ein- und ausschalten kann, defacto nicht möglich ist. Der Trick ist, eine „spezielle Programmierstrategie“ anzuwenden. Die Nachtwächtererklärung ist IMO sehr gut. Mir ist zu dem Thema auch etwas eingefallen.

Gruß

Gregor

mehrere gleichzeitige Abläufe, was für ein Ding, das grob gesagt nur ein- und ausschalten kann, defacto nicht möglich ist

Das ist Unsinn. Man müsste "defacto" durch "rein theoretisch" ersetzen, damit ich die Bewertung "Unsinn" revidiere.

Selbst ein Nachtwächter kann auf seiner Runde mehrere Sachen erledigen.

Und loop sollte man so programmieren, dass es seine Runde in 0 msec erledigt, dann kann es beliebig viele Aufgaben gleichzeitig machen.
Na ja, wenn loop statt 0 doch 0,01 ms braucht, gehen noch 100000 Aktionen in einer Sekunde. Das ist zwar nicht mehr "gleichzeitig" aber für vieles, und deinen Briefkasten allemal, ausreichend.

delay(1000); geht natürlich nicht, aber das braucht man ja auch nicht zum Blinken.

michael_x:
Das ist Unsinn. Man müsste "defacto" durch "rein theoretisch" ersetzen, damit ich die Bewertung "Unsinn" revidiere.

Wieso ist das Unsinn?! Ein Arduino kann zu einer Zeit nur eine Sache tun - das ist nicht nur theoretisch so, sondern auch praktisch, defacto und sonstwas.

Nebenläufigkeit ist bei nur einem Kern ja wohl kaum möglich. Oder verstehen wir uns falsch?

Gruß

Gregor

Nebenläufigkeit ist bei nur einem Kern ja wohl kaum möglich. Oder verstehen wir uns falsch?

Selbst ein dummer Arduino UNO kann mehrere Dinge gleichzeitig

  • Mit 3 Timern 6 verschiednene PWM
  • Der WDT läuft separat, und der ADC kann im Hintergrund wandeln.
  • Der BOD beobachtet die Spannung und der Analog Comparator tut auch sein Ding.
  • SPI, UART und TWI zappeln mit den Leitungen

Alle zusätzlich und GLEICHZEITIG zum Hauptprogramm

Nebenläufig heißt übrigens nicht automatisch gleichzeitig.
Ein quasi, oder fast, gleichzeitig ist für die meisten Probleme völlig ausreichend.

Die Operationen können dabei nur scheinbar nebenläufig (parallel), im sogenannten präemptiven Multitasking, auf einem Prozessor ausgeführt werden oder auch echt nebenläufig auf

einem Mehrkernprozessor oder
physisch getrennten Prozessoren, wie etwa in einem Mehrprozessorsystem, oder
mehreren getrennten und über ein Netzwerk verbundenen Computern.

Aus: Nebenläufigkeit – Wikipedia

Hallo,

combie, es geht um Programmcode in der loop. Es geht nicht um Hardwareeinheiten die nebenbei alleine arbeiten können. Am Timer Einstellungen ändern und die USART auslesen geht auch nicht gleichzeitig sondern nur nacheinander.

Die Diskussion von Micha und Gregor ist eine Frage der Definition “Gleichzeitig”. Laut meiner Definition ist das “zur gleichen Zeit mehrere Dinge tun”, hier nicht möglich. Ein Nachtwächter kann auf seiner Runde (loop) tausende Dinge tun. Aber diese nicht zur gleichen Zeit. Mit jeder zusätzlichen Aufgabe verlängert sich seine Rundenzeit.

Gleichzeitig arbeiten können nur die Hardwareinheiten wenn sie mit sich selbst zu tun haben. Und selbst da gibts Abhängigkeiten durch Interrupts. Wenn man das ganz genau betrachtet.

Die Diskussion von Micha und Gregor ist eine Frage der Definition "Gleichzeitig". Laut meiner Definition ist das "zur gleichen Zeit mehrere Dinge tun", hier nicht möglich.

Worüber sich die beiden unterhalten, ist mir recht egal!

Mein Kommentar bezog sich auf Gregors Definitionsversuch von "Nebenläufig".

Und das hat eben nichts/wenig mit "Gleichzeitig" zu tun.

Dann reden alle aneinandern vorbei und meinem im Kern für sich bezogen das Gleiche. Ich weiß was Gregor meint. Ich weiß was Micha meint und ich weiß was combie meint. Und ich weiß wie sie es meinen. Das alles auseinanderzuklamüsern ist fast unmöglich, deswegen führt die Diskussion zu nichts.

Combie hat gute Argumente und Beispiele gebracht, dennoch nochmal mein Senf:

es geht um Programmcode in der loop

Die sinnvollere Sicht ist die, dass man loop so schreiben sollte, dass alles was in einem Durchlauf passiert, als gleichzeitig betrachtet werden kann.

Das macht deutlich mehr Sinn als Gregors theoretische Einschränkung.

Das Argument mit den mehreren Kernen die erforderlich wären, ist erst recht irrelevant. Dadurch würde nichts besser, und die generell mit Multitasking verbundenen Probleme nur unwesentlich schwieriger.

Ist aber alles völlig OT hier. Natürlich kann man gleichzeitig eine Led blinken lassen und sofort wenn ein Kontakt betätigt wird, damit aufhören.

Das alles auseinanderzuklamüsern ist fast unmöglich, deswegen führt die Diskussion zu nichts.

Natürlich geht das!

Wort für Wort definieren, und dann eine Einigung darüber erzielen.
Damit schafft man eine einheitliche Sprache, und kann plötzlich darüber reden, ohne das jeder was anderes meint.

Definiere mal "Nebenläufig" ....
Was ist das für dich?

Hallo,

ne, combie hat leider keine guten Argumente gebracht. Damit wurde das Thema leider nur unnötig in die Breite gezogen und verwirrt den Unwissenden noch mehr. Denn er bezieht sich nur auf Nebenläufigkeiten. Im Ursprung ging es jedoch genau nicht um seine aufgezählten Nebenläufigkeiten. Zu Beginn ging es um den Programmablauf in loop. Dann kam der Begriff "Nebenläufigkeit" dazu. Das "Nebenläufigkeit" etwas anderes ist als "Gleichzeitig" ist ja wohl klar.

Im Kern kann man den Satz stehen lassen.
"Die sinnvollere Sicht ist die, dass man loop so schreiben sollte, dass alles was in einem Durchlauf passiert, als gleichzeitig betrachtet werden kann."

Dazu muss man ergänzend nur wissen, dass loop weiterhin sequentiell das Programm abarbeitet und weil das ohne zeitliche Blockaden sehr schnell geht, ist es gefühlt gleichzeitig. Ich würde aber niemals ohne klitzekleine nähere Erklärung behaupten das loop alles gleichzeitig machen kann. Das ist der Kern meiner Aussage. Bin mir sicher das meinte auch Gregor. Damit sind wir wieder alle beisammen - denke ich.

Die nebenläufig arbeitenden Hardwareeinheiten sind ein anderes Thema. Aus meiner Sicht zumindestens, denn ich würde das nicht allgemein vermischen. Denn um diese zubehandeln, also darauf zuzugreifen, auslesen und ähnliche Dinge, muss die loop das in ihre Sequenz aufnehmen bzw. einreihen wenn nicht gerade ein Interrupt hart unterbricht und damit sind wir wieder genau nicht bei Nebenläufigkeit.