Taster "schalten" vor Abfrage

Hallo,
ich habe hier ein Problem mit der Abfrage von Tastern. (Mega 2560)

Auf den EingangsPin´s 25, 26, 27 und 28 habe ich ein 1,6kHz Signal.
Es sieht verdächtig danach aus, als ob die Eingänge immer geschaltet
werden.

Wie kann ich das unterbinden?

Anschluss Taster: Masse-> R-> PinInput
Anschluss Taster gedrückt: Masse-> R-> PinInput-> Taster schaltet Plus an PinInput

Das Programm macht noch nichts besonderes. Es zeigt auf einem 4x20 Display
Datum und Zeit an. Wenn ein Taster gedrückt ist, dann gibt es eine StatusMeldung aus.
Gruß und Dank
Andreas

#include <DS1307RTC.h>
#include <Time.h>
#include <Wire.h>
#include <LiquidCrystal.h>

const int LED = 13;                         // LED an Pin x
const int S1 = 25;                          // Taster (S1..S4) an Pin x
const int S2 = 26;
const int S3 = 27;
const int S4 = 28;
 tmElements_t tm;

LiquidCrystal lcd(12, 11, 5, 4, 3, 2);

void setup() {
  lcd.begin(20, 4);
  pinMode(LED, OUTPUT);                     // Pin LED als Ausgang
  pinMode(S1, INPUT);                       // Taster (S1..S4) als Eingang
  pinMode(S2, INPUT);
  pinMode(S3, INPUT);
  pinMode(S4, INPUT);

}

void loop() {
  
{   int val = digitalRead(S1);              // Taster lesen
  if (val == HIGH)                          // ist Taster gedrückt
 {
                                            // #### Reaktion Taster S1 ###
 digitalWrite(LED, HIGH);                   // wenn Taster gedrückt - LED ein
 lcd.setCursor(7, 3);                       // Status-Meldung S1
    lcd.print("S1-ein");
 digitalWrite(LED, LOW);                    // Taster-Eingabe löschen
}
}
{   int val = digitalRead(S2);              // Taster lesen
  if (val == HIGH)                          // ist Taster gedrückt
 {
                                            // ### Reaktion Taster S2 ###
 digitalWrite(LED, HIGH);                   // wenn Taster gedrückt - LED ein
 lcd.setCursor(7, 3);                       // Status-Meldung S2
    lcd.print("S2-ein");
 digitalWrite(LED, LOW);                    // Taster-Eingabe löschen
}
}
{   int val = digitalRead(S3);              // Taster lesen
  if (val == HIGH)                          // ist Taster gedrückt
 {
                                            // ### Reaktion Taster S3 ###
 digitalWrite(LED, HIGH);                   // wenn Taster gedrückt - LED ein
 lcd.setCursor(7, 3);                       // Status-Meldung S3
    lcd.print("S3-ein");
 digitalWrite(LED, LOW);                    // Taster-Eingabe löschen
}
}
{   int val = digitalRead(S4);              // Taster lesen
  if (val == HIGH)                          // ist Taster gedrückt
 {
                                            // ### Reaktion Taster S4 ###
 digitalWrite(LED, HIGH);                   // wenn Taster gedrückt - LED ein
 lcd.setCursor(7, 3);                       // Status-Meldung S4
    lcd.print("S4-ein");
 digitalWrite(LED, LOW);                    // Taster-Eingabe löschen
}
                                            // ### Zeit lesen ###
}

  if (RTC.read(tm)) {

lcd.setCursor(0, 0);
lcd.print(" ");
lcd.setCursor(6, 1);
    print2digits(tm.Hour);
    lcd.write(':');
    print2digits(tm.Minute);
    lcd.write(':');
    print2digits(tm.Second);

lcd.setCursor(5, 2);
    lcd.print(tm.Day);
    lcd.write('.');
    lcd.print(tm.Month);
    lcd.write('.');
    lcd.print(tmYearToCalendar(tm.Year));
    lcd.setCursor(1, 3);
    lcd.print("                  ");        // Status-Meldungen löschen

  }  else {
      lcd.setCursor(1, 3);
      lcd.print("ChronoDOT - Fehler");     // Status-Meldung RTC oder BUS Fehler
    }
 }
void print2digits(int number) {
  if (number >= 0 && number < 10) {
    lcd.write('0');
  }
  lcd.print(number);
}

1,6kHz??

Dir fehlt die Entprellung der Taster. Entweder mit Kondensatoren oder Software Debouncing.

#include <Bounce.h> // http://playground.arduino.cc/code/bounce
#define BUTTON0 10
Bounce bounce0= Bounce(BUTTON0, 5);

void setup() {
  pinMode(BUTTON0, INPUT_PULLUP); // invertierte Logik!
}

void loop() {
  if (bouncer0.update() && bounceHour.read() == false) {
    // mache etwas
  }
}

Achtung, Logik ist invertiert! Sprich, wenn false, ist dein Taster gedrückt worden.

Taster werden wie folgt angeschlossen
Gnd an Pin 1 vom Taster, vom Taster Pin2 gehts dann auf die I/O. Keine externe Schaltung von nöten

Hallo,
prellen der Taster kann ich mir nicht vorstellen, weil-
Ich starte das Programm und mache nichts- dann lassen sich die
1,6kHz messen.
Die LED, die geschaltet wird, leuchtet nicht mit voller Leuchtkraft.
Sieht eher aus als wenn sie gedimmt ist.

Wenn ich diesen Schnipsel nehme, dann treten die "kHz" nicht auf.
Auch die LED leuchtet mit voller Kraft.

const int LED = 13;          
const int S1 = 25;          
const int S2 = 26;
const int S3 = 27;
const int S4 = 28;
 


void setup() {
  pinMode(LED, OUTPUT);       
  pinMode(S1, INPUT);      
  pinMode(S2, INPUT);
  pinMode(S3, INPUT);
  pinMode(S4, INPUT);
}



void loop(){
  int val = digitalRead(S1);  
  if (val == HIGH)            
  { 
    digitalWrite(LED, HIGH);     
  }
  {
   int val = digitalRead(S2);  
   if (val == HIGH)            
  { 
    digitalWrite(LED, HIGH);     
  }
  {
  int val = digitalRead(S3);  
  if (val == HIGH)            
  { 
    digitalWrite(LED, HIGH);     
  }
  {
  int val = digitalRead(S4);  
  if (val == HIGH)            
  { 
    digitalWrite(LED, HIGH);     
  }
 
 
  else
  {
    digitalWrite(LED, LOW);      
  }
  
  
}}}
 }

Halte ich beim Programm "Uhrzeit" die Taste gedrückt, dann leuchtet die LED
nicht mit voller Kraft.
Mache ich das mit dem Schnipsel, dann leuchtet sie mit voller Kraft.
Beim Schnipsel gibt es auch 0-null kHz.
Da stimmt etwas nicht mit der Abfrage- oder der Prüfung…
Gruß und Dank
Andreas

Ich verstehe immer noch nicht was es mit dem Frequenz auf sich haben soll

Auf den EingangsPin´s 25, 26, 27 und 28 habe ich ein 1,6kHz Signal.
Es sieht verdächtig danach aus, als ob die Eingänge immer geschaltet
werden.

Wie kann ich das unterbinden?

Anschluss Taster: Masse-> R-> PinInput
Anschluss Taster gedrückt: Masse-> R-> PinInput-> Taster schaltet Plus an PinInput

Wie mißt Du die 1,6kHz? Wie groß sond die Pulldown-Widerstände?
Bei der Beschaltung mit einem Pulldown-Widerstand kannst Du keine Spannung haben.
Bitte schick uns ein Foto der Schaltung.
Grüße Uwe

Hallo,

"Ich verstehe immer noch nicht was es mit dem Frequenz auf sich haben soll"

Ich bin der Meinung, das die Eingänge/Ausgang mit einer Frequenz von 1,6kHZ
von High auf Low geschaltet werden.
Eben, weil etwas bei der Abfrage/Setzen der Selben nicht stimmt. Die LED
leuchtet ja nicht mit voller Kraft, also wird sie "gedimmt".
Die Taster (Schließer) sind ganz normal angeschlossen:
GND-> Pulldown (15K)-> Pin 25
betätigt:
GND-> Pulldown (15)-> Taster gibt 3,3V-> auf Pin 25

Das ist der Code(1) "mit den 1,6kHz" für 1 Taster:

{   int val = digitalRead(S1);              // Taster lesen
  if (val == HIGH)                          // ist Taster gedrückt
 {                                          // #### Reaktion Taster S1 ###
 digitalWrite(LED, HIGH);                   // wenn Taster gedrückt - LED ein
 lcd.setCursor(7, 3);                       // Status-Meldung S1
    lcd.print("S1-ein");
 digitalWrite(LED, LOW);                    // Taster-Eingabe löschen
}
}

Das ist der gänderte Code(2) ohne 1,6kHz für 1 Taster:
Ich habe hier einfach ein "else" eingefügt. Die 1,6kHz sind nicht mehr
vorhanden.

{   int val = digitalRead(S1);              // Taster lesen
  if (val == HIGH)                          // ist Taster gedrückt
 {                                          // #### Reaktion Taster S1 ###
 digitalWrite(LED, HIGH);                   // wenn Taster gedrückt - LED ein
 lcd.setCursor(7, 3);                       // Status-Meldung S1
    lcd.print("S1-ein");   
 }
else {
 digitalWrite(LED, LOW);                    // Taster-Eingabe löschen
}
}

Das ist der originale Tasten-Code(3), alles i.O.

const int ledPin = 13;           
const int inputPin = 25;           

void setup() {
  pinMode(ledPin, OUTPUT);        
  pinMode(inputPin, INPUT);        
}

void loop(){
  int val = digitalRead(inputPin);  
  if (val == HIGH)                 
  {
    digitalWrite(ledPin, HIGH);     
  }
  else
  {
    digitalWrite(ledPin, LOW);     
  }
}

Bei Code(3) liegen am Pin 13 (LED) 5V an.

Bei Code(2) liegen an Pin 13 (LED) bei
Taster-1, 0,66V an
Taster-2, 0,66V an
Taster-3, 0,66V an
Taster-4, 5,00V an

Bei Code(1) liegen an Pin 13 (LED) bei
Taster-1, 3,17V an
Taster-2, 2,45V an
Taster-3, 1,76V an
Taster-4, 5,00V an

deswegen meine ich, dass etwas mit der Abfrage/Setzen nicht stimmt.
1 Taster funktioniert ja an allen Ports.
Am Schaltungsaufbau wird nichts geändert.

Gruß und Dank
Andreas

so sind die Taster angeschlossen:

Unbenannt.png

Die Taster (Schließer) sind ganz normal angeschlossen:
GND-> Pulldown (15K)-> Pin 25
betätigt:
GND-> Pulldown (15)-> Taster gibt 3,3V-> auf Pin 25

Wieso 3,3V?

Hast Du die 1,6Khz am Taster-Pin oder an der LED?
Falls an der LED:
mit Code1 ist das logisch.
Du schaltest die LED ein, verplemperst einige Zeit mit der Displayausgabe und schaltest die LED aus. Beim nächsten loop() Durchgang macht Du das gleiche. Ein loop() Durchgang braucht einige Zeit. Die LED wird dauernd ein bzw ausgeschaltet. Wenn die LED eingeschaltet sein soll solange der Taster gedrückt ist mußt Du wie Code2 machen.
Die Spannung, Die Du am LED mißt hängt vom Ein-Aus-Verhältnis des LEDs und von der Kalinbrationskurve bzw Schaltung des Meßgeräts ab.

Grüße Uwe

Hallo,
dank derer, die mir hier auf die Sprünge geholfen haben, habe ich es
hinbekommen.
Ich kann über 4 Taster, 4 Funktionen mit Status-Meldungen auslösen.
An Pin 13 liegen 5V an, wenn Taster gedrückt.
Wenn es ohne Betätigung eines Taster durchläuft, dann wird kein Pin
geschaltet- nur abgefragt.
Das mag noch ein wenig holprig programmiert sein, ist aber für mich eine gute
Grundlage um jetzt verschiedene Funktionen aufzubauen.
Gruß und Dank
Andreas

hier jetzt nur die TasterAbfragen:

{   int val = digitalRead(S1);              // Taster lesen
  if (val == HIGH)                          // ist Taster gedrückt
 {                                          // #### Reaktion Taster S1 ###
 digitalWrite(LED, HIGH);                   // wenn Taster gedrückt - LED ein
 lcd.setCursor(7, 3);                       // Status-Meldung S1
    lcd.print("S1-ein");    
 }
else {
  if (val == LOW)                           // Taster-Eingabe löschen
 digitalWrite(LED, LOW);                    // und/oder andere Funktion                 
}                                           
}
{   int val = digitalRead(S2);              // Taster lesen
  if (val == HIGH)                          // ist Taster gedrückt
 {                                          // ### Reaktion Taster S2 ###
 digitalWrite(LED, HIGH);                   // wenn Taster gedrückt - LED ein
 lcd.setCursor(7, 3);                       // Status-Meldung S2
    lcd.print("S2-ein");
  }
else {   
// digitalWrite(LED, LOW);                  // Taster-Eingabe löschen
}                                           // und/oder andere Funktion
}
{   int val = digitalRead(S3);              // Taster lesen
  if (val == HIGH)                          // ist Taster gedrückt
 {                                          // ### Reaktion Taster S3 ###
 digitalWrite(LED, HIGH);                   // wenn Taster gedrückt - LED ein
 lcd.setCursor(7, 3);                       // Status-Meldung S3
    lcd.print("S3-ein");
 }
else {
// digitalWrite(LED, LOW);                  // Taster-Eingabe löschen
}                                           // und/oder andere Funktion
}
{   int val = digitalRead(S4);              // Taster lesen
  if (val == HIGH)                          // ist Taster gedrückt
 {                                          // ### Reaktion Taster S4 ###
 digitalWrite(LED, HIGH);                   // wenn Taster gedrückt - LED ein
 lcd.setCursor(7, 3);                       // Status-Meldung S4
    lcd.print("S4-ein");
 }
else {
// digitalWrite(LED, LOW);                  // Taster-Eingabe löschen
}                                           // und/oder andere Funktion                                         
}