Go Down

Topic: wenn taste X sekunden gedrückt dann für X sekunden ausgang HIGH (Read 1 time) previous topic - next topic

arcaine

Das nächste was kuriose ist, ist das ich die tastMinzeit auf 6000 erhöht habe und jetzt 6mal in Folge alle 6000 Millis die led für 1000 millis an geht.

Ich habe einen Optokopptler eingebaut um den 24v Sensor von dem 5v Kreis zu trennen... die signalleitungen gehen mit den 5v jeweils auf den analogen Eingang des Uno's. Das sollte doch funktionieren oder liege ich da falsch?


arcaine

Hallo liebe Gemeinde,

Leider habe ich noch immer das selbe Problem wie ich es oben beschrieben habe...
Ich habe noch immer keine Lösung gefunden weshalb der uno den Ausgang auf HIGH setzt ohne dass das Ereignis eingetreten ist was er „bewerten" soll...
Verwendet habe ich den Sketch Combie (Jul 05 2020)

Peter-CAD-HST

Hallo,

ich bin Neuling und brauche für mein Projekt Hilfe!

Ich habe 5 Tasten (später Sensoren) und 5 LED´s (später Magnetventile).

LED 1 bis 4 soll wenn der jeweilige Taster (1-4) gedrückt wird (Zeitunabhängig) für 1sekunde geschalten werden.
LED 5 soll für ebenfalls 1sekunde geschalten werden aber erst wenn Taster5 eine gewisse zeit gedrückt wurde.

ich hoffe das mir das jemand helfen kann.

danke im Voraus
Moin arcaine
Gibt es, bedingt durch die Anfragelaufzeit hier im Forum, eine präzisere Funktionsbeschreibung für dein Projekt?
Gruß Peter
und gesund bleiben
KISS Q&D - keep calm and carry on - mind the gap - beware of sharks! -

my_xy_projekt

Moin,

Ich habe 5 Tasten (später Sensoren) und 5 LED´s (später Magnetventile).

LED 1 bis 4 soll wenn der jeweilige Taster (1-4) gedrückt wird (Zeitunabhängig) für 1sekunde geschalten werden.
LED 5 soll für ebenfalls 1sekunde geschalten werden aber erst wenn Taster5 eine gewisse zeit gedrückt wurde.
Ich hab mich an diese Kurzversion gehalten. Und versucht rauszulesen, was Du suchst.
Der input soll nicht retriggerbar sein - also erst output aus UND der input muss wieder freigegeben werden, damit ein erneuter input erkannt wird.
Die input/output verriegeln nicht gegenseitig.
Ich nutze eine etwas andere Formatierung - wer das nicht lesen kann oder wem das unübersichtlich ist, drücke einfach STRG-T

Code: [Select]

// Forumsketch https://forum.arduino.cc/index.php?msg=4663425
// 14. Oktober 2020
// nur einfach geteset, was auf dem seriellen Monitor passiert
// Dieser Sketch ist etwas overkill, benötigt aber nichts weiter
// Sehr viele serielle Ausgaben drin, damit man sieht, was wo passiert


const int Gruppen = 5;                                                   // Anzahl der Input/Output-Paare
const int Ausgabe_PIN[Gruppen] = {13, 12, 11, 10, 9};                    // Arduino-PIN für Ausgabe
const int Einschalt_PIN[Gruppen] = {6, 5, 4, 3, 2};                      // Arduino-PIN fuer Eingabe
const unsigned long einZeit[Gruppen] = {2000, 0, 0, 0, 0};               // Zeit die input aktiv sein muss in ms
const unsigned long einSperre[Gruppen] = {0, 0, 0, 0, 0};                // Wartezeit bis Output gesetzt in ms
const unsigned long ausSperre[Gruppen] = {1000, 1000, 1000, 1000, 1000}; // Wartezeit bis Output gelöscht in ms
bool Einschalt_Status[Gruppen] = {LOW, LOW, LOW, LOW, LOW};              // Merker für Outputuebergabe
bool tastenmerker[Gruppen] = {LOW, LOW, LOW, LOW, LOW};                  // Merker für Inputabfrage
unsigned long start_ein[Gruppen] = {0, 0, 0, 0, 0};                      // Zeitmerker

void setup() {
  Serial.begin(115200);
  Serial.println("Start: ");
  for (int i = 0; i < Gruppen; i++)
  {
    pinMode(Ausgabe_PIN[i], OUTPUT);
    digitalWrite(Ausgabe_PIN[i], LOW);
    pinMode(Einschalt_PIN[i], INPUT_PULLUP);
  }
}

void loop()
{
  for (int i = 0; i < Gruppen; i++)
  {
    if (!digitalRead(Ausgabe_PIN[i]))        // Nur wenn der Output nicht gesetzt ist, frage Input ab
    {
      if (!digitalRead(Einschalt_PIN[i])     // input nach GND
          && (!tastenmerker[i])              // und letzter status LOW?
          && (!Einschalt_Status[i]))         // und letzter Einschaltstatus LOW?
      {
        Serial.print(F("Input an PIN: "));
        Serial.print(Einschalt_PIN[i]);
        Serial.println(F(" erkannt"));
        start_ein[i] = millis();
        Einschalt_Status[i] = HIGH;
        tastenmerker[i] = HIGH;
      }
    }
    if (millis() - start_ein[i] < einZeit[i]) // Solange die Laenge des inputsignal nicht erreicht ist
    { if (digitalRead(Einschalt_PIN[i]) && tastenmerker[i])    // prüfe ob input sich geändert hat
      {
        Serial.print(F("einZeit: "));
        Serial.print(einZeit[i]);
        Serial.print(F(" an PIN: "));
        Serial.print(Einschalt_PIN[i]);
        Serial.println(F(" erkannt"));
        merkerReset(i);                       // Wenn ja, dann setze alles zurueck
      }
    }
    else
    {
      Einschalten(i);                         // Wenn nein, Uebergabe an Funktion
    }
    Ausschalten(i);
    merkerReset(i);
  }
}

void merkerReset(const int n)
{
  if (digitalRead(Einschalt_PIN[n]) && (tastenmerker[n]))
  {
    Serial.print(F("Setze tastenmerker: "));
    Serial.print(n);
    Serial.print(F(" fuer Pin: "));
    Serial.print(Einschalt_PIN[n]);
    Serial.println(F(" zurueck"));
    tastenmerker[n] = LOW;
    Einschalt_Status[n] = LOW;
  }
}

void Einschalten(const int p)
{
  if ((millis() - start_ein[p] > einSperre[p] + einZeit[p])  && (!digitalRead(Ausgabe_PIN[p])) && (Einschalt_Status[p]))
  {
    Serial.print(F("OutputPIN: "));
    Serial.print(Ausgabe_PIN[p]);
    Serial.println(F(" ein"));
    digitalWrite(Ausgabe_PIN[p], HIGH);
    Einschalt_Status[p] = LOW;
  }
}

void Ausschalten(const int p)
{
  if ((millis() - (start_ein[p] + einSperre[p] + einZeit[p]) > ausSperre[p]) && (digitalRead(Ausgabe_PIN[p])))
  {
    Serial.print(F("OutputPIN: "));
    Serial.print(Ausgabe_PIN[p]);
    Serial.println(F(" aus"));
    digitalWrite(Ausgabe_PIN[p], LOW);
  }
}

my_xy_projekt

Leider habe ich noch immer das selbe Problem wie ich es oben beschrieben habe...
Nu hab ich Dir schon was eigentlich Fertiges geliefert und es gibt noch immer keine Reaktion.
Frage: Hat es das erfüllt, was Du wolltest?

agmue

Nu hab ich Dir schon was eigentlich Fertiges geliefert und es gibt noch immer keine Reaktion.
Das hatte ich am 4.7.20 auch schon getan, am 5.7.20 durch combie verbessert. Reaktion kam am 14.9.20 mit "ich habe es soweit fertig gestellt". Grundsätzlich freue ich mich, überhaupt eine Reaktion zu bekommen, aber nach zwei Monaten habe ich den Faden verloren.

Ich hoffe, es tröstet Dich und gibt Dir Geduld und Hoffnung ;D

Die Vorstellungskraft ist wichtiger als Wissen, denn Wissen ist begrenzt. (Albert Einstein)


Go Up