Go Down

Topic: Zeitverzögerte Auswertung von Eingängen? (Read 650 times) previous topic - next topic

Tommy56

Bei mehreren Eingängen wohl als Array zu programmieren. Da fehlt mir noch das Wissen, das fehlerfrei umzusetzen.
Da hilft nur lernen, aber nicht alles auf einmal, sondern schrittweise. Erst mal einen Sensor sauber verarbeiten.

Gruß Tommy
"Wer den schnellen Erfolg sucht, sollte nicht programmieren, sondern Holz hacken." (Quelle unbekannt)

ElEspanol

#16
Jun 16, 2019, 08:35 pm Last Edit: Jun 16, 2019, 08:36 pm by ElEspanol
Aber das eigentliche Problem besteht noch?
Du wolltest doch einen Eingang einlesen, an dem das Signal jeweils länger als 100ms durchgehend angelegen sein muss, bevor du die entsprechende bool variable änderst?

Oder hat sich da mit den vielen Türen die Problemstellung geändert?


4711

Nein, das Problem besteht noch, verschwindet leider nicht von selbst.
Nur mit C++ kann ich jetzt nicht anfangen und die Bounced Beispiele kann ich akt. nicht umsetzen, da fehlt mir noch zuviel Knowhow.

combie

Nein, das Problem besteht noch, verschwindet leider nicht von selbst.
Nur mit C++ kann ich jetzt nicht anfangen und die Bounced Beispiele kann ich akt. nicht umsetzen, da fehlt mir noch zuviel Knowhow.
Das ist eine unangenehme Zwickmühle....

Wie kann ich dir helfen diesem Teufelskreis zu entrinnen?
Nobody is perfect!
(und selbst der nicht zu 100%)

4711

Helfen würde mir ein Beispiel, dass in standard Arduino Sprache (ich weiß, klingt blöd) geschrieben wurde und einfach einen (oder mehrere) Eingänge entprellt. Unabhängig von Schalter und LED usw. und eff.(weniger Speicher braucht) und sauber programmiert ist.
:)

Tommy56

Na das Beispiel in der IDE wurde Dir doch bereits mehrfach genannt. Noch einfacher geht es nicht.

Gruß Tommy
"Wer den schnellen Erfolg sucht, sollte nicht programmieren, sondern Holz hacken." (Quelle unbekannt)

HotSystems

Helfen würde mir ein Beispiel, dass in standard Arduino Sprache (ich weiß, klingt blöd) geschrieben wurde und einfach einen (oder mehrere) Eingänge entprellt. Unabhängig von Schalter und LED usw. und eff.(weniger Speicher braucht) und sauber programmiert ist.
:)
Was nützt dir ein Beispiel, das in C++ (Standard Arduino Sprache) geschrieben ist, wenn du es nicht verstehst.
Du solltest einfach mal die vorhandenen Beispiele verwenden und damit üben, dann lernst du auch daran.

Gruß Dieter

I2C = weniger ist mehr: weniger Kabel, mehr Probleme. 8)

combie

#22
Jun 17, 2019, 02:22 pm Last Edit: Jun 17, 2019, 02:25 pm by combie
Helfen würde mir ein Beispiel, dass in standard Arduino Sprache (ich weiß, klingt blöd) geschrieben wurde und einfach einen (oder mehrere) Eingänge entprellt. Unabhängig von Schalter und LED usw. und eff.(weniger Speicher braucht) und sauber programmiert ist.
:)
Ja, das klingt etwas blöd.... (sorry)
Denn die "standard Arduino Sprache" ist C++.

Und alle bisher gezeigten Beispiel sind in C++.
Auch wohl alle im Internet findbaren.
Selbst die in Büchern und Köpfen versteckten.

Ich sehe nur einen Weg dir zu helfen: Eine Buchempfehlung

Nobody is perfect!
(und selbst der nicht zu 100%)

4711

so, hier mal mein erster Entwurf, hab ihn noch nicht getestet
Code: [Select]
// DEBOUNCE ------------------------------------------
  unsigned long lastDebounceTime = 0;  // the last time the output pin was toggled
  unsigned long debounceDelay = 50;    // the debounce time; increase if the output flickers
  unsigned int iSensor1State;          // aktueller Zustand vom Eingang
  unsigned int ilastSensor1State = LOW; // letzter Zustand vom Eingang

void Debounce() {
  int ireadingSensor1 = digitalRead(I_Sensor1);
  if (ireadingSensor1 != ilastSensor1State) {
    lastDebounceTime = millis();
  }
  if ((millis() - lastDebounceTime) > debounceDelay) {
    if (ireadingSensor1 != iSensor1State) {
      bSensor1 = ireadingSensor1;
      if (iSensor1State == HIGH) {
        bSensor1 = !bSensor1;
      }
    }
  }
  ilastSensor1State = ireadingSensor1;
}


ElEspanol

Dann teste mal. wenn du einen lauffähigen Sketch hast, der kompiliert, kannst du ihn mal posten

postmaster-ino

#25
Jun 17, 2019, 11:22 pm Last Edit: Jun 17, 2019, 11:24 pm by postmaster-ino
Code: [Select]

/*
 * Der Sketch verwendet 1874 Bytes (5%) des Programmspeicherplatzes. Das Maximum sind 32256 Bytes.
 * Globale Variablen verwenden 232 Bytes (11%) des dynamischen Speichers, 1816 Bytes für lokale Variablen verbleiben. Das Maximum sind 2048 Bytes.
 *
 * Kompiliert ohne Warnungen auf Uno/Nano
 *
 * Sensoren entprellen, Forenbeitrag
 * https://forum.arduino.cc/index.php?topic=621568.msg4213625#msg4213625
 */

typedef struct {
  byte pin;                     //Pin des Sensor
  uint32_t prellzeit;       //wie lange soll auf ein gültiges Signal gewartet werden?
  uint32_t lastseen;       //wann wurde der letzte Zustand eingelesen
  boolean lastread;        //HIGH oder LOW
  boolean state;            //'sicherer' Zustand HIGH/LOW
} SENSOR;

SENSOR mySensor[] {
  {2, 50, 0, 0, 0},
  {3, 20, 0, 0, 0},
  {5, 50, 0, 0, 0},
  {A0, 10, 0, 0, 0}, //das letzte Komma stört nicht
};
const byte anzahlSensoren = sizeof(mySensor) / sizeof(mySensor[0]);

void setup() {
  for (byte t = 0; t < anzahlSensoren; t++) {
    pinMode(mySensor[t].pin, INPUT_PULLUP);
  }
}

void loop() {
  for (byte t = 0; t < anzahlSensoren; t++) {
    boolean zustand = digitalRead(mySensor[t].pin);
    if (zustand != mySensor[t].lastread) {
      //Zustand hat sich geändert
      mySensor[t].lastread = zustand;
      mySensor[t].lastseen = millis();
    } else {
      //der Zustand hält an
      if (mySensor[t].state != zustand && millis() - mySensor[t].lastseen >= mySensor[t].prellzeit) {
        mySensor[t].state = zustand;
      }
    }
  }
  //.....
  for (byte t = 0; t << anzahlSensoren; t++) {
    Serial.print(mySensor[t].state == 1 ? 'x' : '-'); //Ausgabe aller entprellten Sensoren-Werte
    Serial.print('\t');  //müsste TAB sein
  }
  Serial.println();  //neue Zeile
}


Sketch kompiliert ohne Warnungen ect.
Geht bestimmt eleganter - so weit bin ich aber noch nicht :/

Ungetestet!! - Vll. hilft'S ja trotzdem

MfG
anscheinend ist Es nicht erwünscht, einen Foren-internen Link als 'Homepage' einzubinden, damit JEDER nur einen Klick von combie's Liste zum Thema State-Maschine entfernt ist.
... dann eben nicht ...

4711


Doc_Arduino

#27
Jun 19, 2019, 08:23 pm Last Edit: Jun 19, 2019, 08:23 pm by Doc_Arduino
Hallo,

100ms ein = ein,
100ms aus = aus,
Schaltzustände dazwischen ignorieren

Nochmal zum Verständnis. Eingangssignal soll nur "ein" sein wenn der Sensor mindestens ununterbrochen 100ms lang high liefert und umgekehrt 100ms lang low dann "aus"?
Tschau
Doc Arduino '\0'

Messschieber auslesen: http://forum.arduino.cc/index.php?topic=273445
EA-DOGM Display - Demos: http://forum.arduino.cc/index.php?topic=378279

4711

Ja richtig.
Damit braucht es wohl eine Änderung von "wie lange soll auf ein gültiges Signal gewartet werden?" zu "wie lange muss das Signal high/low anstehen".

postmaster-ino

Hi

Äääh ... Nein?
Ggf. meinen Versuch da Oben Mal ansehen?
Bei JEDER Pegel-Änderung wird diese Zeit als Startzeit hinterlegt.
ERST, wenn die Prellzeit vorbei ist, wird dieser Status übernommen.

Dar 'riecht' doch schon durch, daß Da in beiden Richtungen die 100ms (oder was sonst) das Signal sauber anliegen muß - wenn nicht, wird ja die Startzeit neu gesetzt und schon ist's Essig mit der Prellzeit.

MfG
anscheinend ist Es nicht erwünscht, einen Foren-internen Link als 'Homepage' einzubinden, damit JEDER nur einen Klick von combie's Liste zum Thema State-Maschine entfernt ist.
... dann eben nicht ...

Go Up