KLINGELSCHALTUNG

HALLO,
hab mal eine frage zu einem Programm das ich gerade schreiben möchte.(ARDUINO,UNO)
Folgende Funktion:
Sobald der Taster betätigt wird soll die Klingel drei mal kurz klingeln.
Wird der Taster ein oder zwei mal kurz gedrückt soll eine rote LED leuchten .
Wird der Taster drei mal kurz gedrückt soll eine gelbe LED leuchten.
Wird der Taster ein mal kurz und ein mal lange gedrückt soll eine grüne LED leuchten.
Nach einer kurzen Zeit soll das Programm wieder zurücksetzen und wieder auf einen Taster druck warten.

Bitte das Programm erklären damit ich es auch selbst schreiben und bei bedarf ändern oder erweitern kann.

DANKE

Du schreibst, du möchtest ein Programm schreiben aber erwartest dass dir jemand ein Programm zuschiebt und dann auch noch mit Erklärung auf nem Silbertablett?
Ich kenn zwar einen der es hin und wieder mal macht aber ich glaub nicht dass du Erfolg haben wirst.
Jeder fängt klein an, warum bei dir ne Ausnahme machen.

bastiino:
Bitte das Programm erklären damit ich es auch selbst schreiben und bei bedarf ändern oder erweitern kann.

Das Beste ist, du schaust dir die Basics an, übst mit den Beispielen in der IDE, da sind auch sehr gute Beschreibungen dabei.
Ich glaube nicht, das hier jemand deine Arbeit macht und dir das auch noch haarklein erklärt.

Tasten prellen, da kann man gut die Bibliothek Bounce2 einsetzen zum Entprellen. Bei der Bibliothek gibt es auch Beispiele. Wichtig ist, die Schwelle zwischen “kurz” und “lang” in Millisekunden zu definieren.

bastiino:
Sobald der Taster betätigt wird soll die Klingel drei mal kurz klingeln.

Das könnte so aussehen:

#include <Bounce2.h>

#define TASTER_PIN 2
#define LED_PIN 13
#define BLINKZAHL 3

Bounce debouncer = Bounce();
const unsigned long  blinkIntervall = 500;
unsigned long aktMillis, blinkMillis;
byte blinkZaehler;

void setup() {
  pinMode(TASTER_PIN, INPUT_PULLUP);
  pinMode(LED_PIN, OUTPUT);
  debouncer.attach(TASTER_PIN);
  debouncer.interval(50);
}

void loop()
{
  aktMillis = millis();
  if ( debouncer.update() ) {
    if (debouncer.read()) {
      blinkZaehler = BLINKZAHL * 2 - 1;
      digitalWrite(LED_PIN, HIGH);
      blinkMillis = aktMillis;
    }
  }

  if ((aktMillis - blinkMillis >= blinkIntervall) && (blinkZaehler > 0)) {
    digitalWrite(LED_PIN, !digitalRead(LED_PIN));
    blinkMillis = aktMillis;
    blinkZaehler--;
  }
}

Für die zeitliche Steuerung gab es hier schon mal das Thema LED mit einem Taster steuern.

Zerlege Dein Programm in einzele Schritte.

Erkenne ob Der Taster gedrückt
Erkenne ob der Taster kurz gedrückt
Erkenne ob der Taster kurz nicht gedrückt
Erkenne ob der Taster lange gedrückt
Erkenne ob der Taster lange nicht gedrückt.
Dann informiere Dich über einen Endlichen Automat und über Millis()

Grüße Uwe

Das Problem bei allen Neulingen ist, man bemüht sich und die schauen nicht einmal vorbei, geschweige denn sich zu bedanken.

skorpi08:
Das Problem bei allen Neulingen ist, man bemüht sich und die schauen nicht einmal vorbei, geschweige denn sich zu bedanken.

Obwohl ich ja "DANKE" lese, muß ich Dir leider zustimmen. Ob das in diesem Thema auch so ist, würde ich aber noch nicht beurteilen wollen. Mitglieder eines deutschsprachigen Forums können durchaus jetzt ihre Tiefschlafphase haben. International gilt "Wait a day!" Bleiben wir also optimistisch :smiley:

Hier sehe ich einfach, der TO muss die Antworten erst mal verdauen. :wink:
Dann kommen sicher noch zahlreiche Fragen.

leer

Genau richtig erklärt.
Zu erwähnen ist, dass sogar beim Öffnen eines Kontakts Prellen auftreten kann. Auch wenn die Hüpf-Erklärung da schwieriger ist.
Und dass 50 ms seeehr reichlich ist. Das kriegt man schon fast absichtlich per Hand hin.

Statt einer der debounce Libraries reicht oft schon ein

  delay(2); // evtl zur  Sicherheit auch 5ms warten

wenn eine Änderung des Tasters erkannt wurde.
Das ist immer noch schnell genug, um Kommentare über "böses delay" in den allermeisten Fällen ignorieren zu können. :wink:

michael_x:
Und dass 50 ms seeehr reichlich ist. Das kriegt man schon fast absichtlich per Hand hin.

Jetzt hast Du mich erwischt! Anstelle von einem Taster mit Knackfrosch-Effekt stecke ich Kabel in ein Steckbrett, was wohl längeres Entprellen notwendig macht, sagt die Praxis. ::slight_smile:

michael_x:
Statt einer der debounce Libraries reicht oft schon ein

  delay(2); // evtl zur  Sicherheit auch 5ms warten

wenn eine Änderung des Tasters erkannt wurde.

Die Bounce2-Bibliothek entprellt ja nicht nur, sondern bietet auch Flankenerkennung. Für mich selbst mache ich das mit

  if (!altTaster && aktTaster) {
   delay(30);

was aber nicht so einfach zu erklären ist. Daher hoffe ich

  if ( debouncer.update() ) {
   if (debouncer.read()) {

bringt den Fragesteller eher auf die richtigen Gedanken. Kann auch eine Fehleinschätzung sein. Also Bounce2 für Entprellen und Flankenerkennung.

@Christian: Wenn es mal gebraucht wird, würde ich mich über Deine unterstützende Erklärung zur Notwendigkeit einer Flankenerkennung freuen :slight_smile:

leer

DANKE für die hilfe versuch mich da mal rein zu arbeiten

Hi nochmal
habe den Code jetzt soweit geschrieben klappt auch soweit anstatt einer zeit schleife habe ich aber jetzt eine Reset Taste benutzt. Habe auch versucht mich in den vorgeschrieben Sketch Debounce zu arbeiten , leider ist mein technisches englisch nicht das beste. Gibt es eine einfache Variante lange und/oder mehrmalige Taster Betätigungen abzufragen?

int ResetPin = 7;
int InputPin1 = 2;
int klingelPin =3;

int ledpin1 = 4;
int ledpin2 = 5;
int ledpin3 = 6;

void setup() {

pinMode(2,INPUT);
pinMode(7,INPUT);
pinMode(klingelPin,OUTPUT);

pinMode(4,OUTPUT);
pinMode(5,OUTPUT);
pinMode(6,OUTPUT);
}

void loop() {

if (digitalRead (InputPin1) == 1)

{

digitalWrite (ledpin1,HIGH);

digitalWrite (klingelPin,HIGH);
delay(250);

digitalWrite (klingelPin,LOW);
delay(250);

digitalWrite (klingelPin,HIGH);
delay(250);

digitalWrite (klingelPin,LOW);
delay(250);

digitalWrite (klingelPin,HIGH);
delay(250);

digitalWrite (klingelPin,LOW);
delay(250);

}

if (digitalRead (InputPin1)== 0)

{
digitalWrite (klingelPin,LOW);
}

if (digitalRead (ResetPin)==1)
{
digitalWrite (ledpin1,LOW);
}

}

ClickButton oder OneButton Library.

Ich bevorzuge ClickButton aber jedem dasseine.

Hallo und Willkommen im Forum,

BLINK WITHOUT DELAY solltest Du Dir dringend in der IDE angucken :wink:

Auch für das Programmieren mit einzelnen Funktionen solltest Du gerade am Anfang Mühe investieren.

Vereinfachtes Beispiel:

Funktion Abfrage Tastendruck -> ERGEBNISNr.

wenn ERGEBNISNr=1 dann Funktion Blinkesooderso1
wenn ERGEBNISNr=2 dann Funktion Blinkesooderso2
wenn ERGEBNISNr=3 dann Funktion Blinkesooderso3

Funktion Blinkesooderso1: Blinke 224365 mal

Funktion Blinkesooderso2: Blinke 44 mal

Funktion Blinkesooderso3: Blinke 345 mal

Die Syntax hierzu solltest Du Dir dringend selber erarbeiten mittels Referenz: Arduino Reference - Arduino Reference

Viele Grüße...

Gibt es eine einfache Variante lange und/oder mehrmalige Taster Betätigungen abzufragen?

Es gibt Unmengen Libraries und Beispiele, die aber meiner Meinung nach nicht viel bringen, wenn du sie nicht verstehst. Man muss sie finden, ausprobieren, verstehen, feststellen, dass sie was andseres machen als man denkt. Oder es hakt schon beim Ausprobieren, dann muss den eigenen Fehler finden, wobei das Verstehen auch hilfreich ist.

Und ob du das als "einfach" empfindest, ist eine andere Frage.
Man findet asserdem viel Mist im Internet, aber das einigermassen richtig zu beurteilen ist immer schwer.

Wird der Taster ein oder zwei mal kurz gedrückt soll eine rote LED leuchten .
Wird der Taster drei mal kurz gedrückt soll eine gelbe LED leuchten.

Das ist eine verteufelt schwere Aufgabe, insbesondere wenn bei drei mal kurz drücken die rote LED nicht schon vorher losgegangen sein soll.

Und mit delay() geht es überhaupt nicht.

Fang erstmal einfacher an:
z.B.
Während ein Taster gedrückt ist, soll eine Klingel mehrfach kurz läuten (z.B. 100 ms an, 200 ms aus), bis der Taster wieder losgelassen wurde. Beim Loslassen hört die Klingel auf, nachdem die 100 ms zu Ende sind. Je nachdem, wie oft es geklingelt hat, leuchtet dann für max. 5 s eine von 3 LED: 1mal - Grün, 2mal - Gelb, 3mal oder öfter Rot.

Wenn der Taster vor Ablauf der 5 sek. wieder gedrückt wird, geht die LED sofort aus (und das mehrfache kurze Klingeln startet wieder wie anfangs beschrieben)

Nur mal als Beispiel, da kannst du meinetwegen für die 100/200 ms der Klingel ein delay() verwenden. Tip: Das ist schon für andere Aufgaben böse gepfuscht, länger sollte ein loop Durchlauf keinesfalls dauern, denn sobald der Taster gedrückt wurde, sollte sofort etwas passieren.

Kannst du auch in Teilaufgaben ( Klingel / LED ) aufteilen und nacheinander ans Laufen bringen.