[Gelöst]Arduino 8 Taster 8 LED's

Hallo

Ich habe folgendes Problem:

Ich habe 8 Taster und 8 LED's an meinem Arduino angeschlossen.
Jeder Taster sendet etwas über die Serielle Schnittstelle und schaltet einne LED an und aus.

Nur habe ich das Problem das ich nicht die Taster unabhängig voneinander drücken kann.
Da es schwer zu erklären ist habe ich es per Video aufgenommen
https://www.youtube.com/watch?v=CJW0NxKMD-Y

Anbei ebenso eine Schematic datei für Fritzing

Worin liegt mein fehler? Zu hohe widerstände für die Taster ( 100kOhm jeder) ?

LG
Hitmare

chansw.zip (21.5 KB)

a) nicht jeder hier hat Fritzing... also am besten nen Screenshot vom Schaltplan machen und diesen dann hier reinstellen
b) ohne Code wirds noch schwieriger, die Fehlerquelle zu finden....

Hitmare:
Anbei ebenso eine Schematic datei für Fritzing

Worin liegt mein fehler?

Das mit Fritzing wurde schon geschrieben.
Und keine Zip-Dateien reinstellen, die sieht sich keiner an, genau so wie Videos.

Immer die Fehler genau beschreiben.
Den Sketch hier posten.
Setze den bitte in Code-Tags.

Verwende dazu die Schaltfläche </> oben links im Editorfenster.
Das kannst du auch nachträglich machen.
Dazu den Sketch markieren und die Schaltfläche klicken.

Damit wird dieser für alle besser lesbar.

Hallo,

also Videos kann man schon zur Verfügung stellen, besser wie Bilder, noch dazu wenn das sauber auf YouTube verlinkt ist. An Hand des Videos mutmaße ich schon das seine Tasterabfragen blockierend programmiert sind. Wie und warum sieht man dann im Code.

sind die Taster entprellt?

Gundelputz:
sind die Taster entprellt?

HotSystems:
Das mit Fritzing wurde schon geschrieben.
Und keine Zip-Dateien reinstellen, die sieht sich keiner an, genau so wie Videos.

Immer die Fehler genau beschreiben.
Den Sketch hier posten.
Setze den bitte in Code-Tags.

Verwende dazu die Schaltfläche </> oben links im Editorfenster.
Das kannst du auch nachträglich machen.
Dazu den Sketch markieren und die Schaltfläche klicken.

Damit wird dieser für alle besser lesbar.

Hallo

Danke für die raschen antworten

Ich versuche mal den Fehler zu beschreiben:

Wenn ich die 8 Tasten von link nach rechts drücke, wird nur jeder 2te taster erkannt (1,3,5,7)
Drücke ich die Taster von rechts nach links wird zwar jeder Taster erkannt aber die Taster dazwischen nicht mehr
Wenn ich 2 Taster drücke zb 2 und 4 wird Taster 3 der dazwischen liegt nicht mehr erkannt

Hier erstmal der Code:

#include <EEPROM.h>



void setup() {
  // put your setup code here, to run once:
pinMode(2, INPUT_PULLUP);
pinMode(3, INPUT_PULLUP);
pinMode(4, INPUT_PULLUP);
pinMode(5, INPUT_PULLUP);
pinMode(6, INPUT_PULLUP);
pinMode(7, INPUT_PULLUP);
pinMode(8, INPUT_PULLUP);
pinMode(9, INPUT_PULLUP);


pinMode(A0, OUTPUT);
pinMode(A1, OUTPUT);
pinMode(A2, OUTPUT);
pinMode(A3, OUTPUT);
pinMode(A4, OUTPUT);
pinMode(A5, OUTPUT);
pinMode(10, OUTPUT);
pinMode(11, OUTPUT);

eepromWriteInt(2, 0); 
eepromWriteInt(3, 0);
eepromWriteInt(4, 0);
eepromWriteInt(5, 0);
eepromWriteInt(6, 0);
eepromWriteInt(7, 0);
eepromWriteInt(8, 0);
eepromWriteInt(9, 0);
Serial.begin(115200);
}

void loop() {


  // put your main code here, to run repeatedly:

if (digitalRead(2) == LOW) {
  change(2);
}
if (digitalRead(3) == LOW) {
  change(3);
}
if (digitalRead(4) == LOW) {
  change(4);
}
if (digitalRead(5) == LOW) {
  change(5);
}
if (digitalRead(6) == LOW) {
  change(6);
}
if (digitalRead(7) == LOW) {
  change(7);
}
if (digitalRead(8) == LOW) {
  change(8);
}
if (digitalRead(9) == LOW) {
  change(9);
}




}

void change(int port) {

if (eepromReadInt(port) == 0) {
    Serial.print(port);
    Serial.print("0");
    analogpin(port, 0);
    eepromWriteInt(port, 1);
    while (digitalRead(port) == LOW) { delay(200); } 
    //delayMicroseconds(500);
    return;
  }
if (eepromReadInt(port) == 1) {
    Serial.print(port);
    Serial.print("1");
    analogpin(port, 1);
    eepromWriteInt(port, 0);
    while (digitalRead(port) == LOW) { delay(200); } 
    //delayMicroseconds(500);
    return;
  }
}

void analogpin(int analog, int val) {
  if ( analog == 2 && val == 0 ) { digitalWrite(11, HIGH);}
  if ( analog == 2 && val == 1 ) { digitalWrite(11, LOW); }
  if ( analog == 3 && val == 0 ) { digitalWrite(10, HIGH); }
  if ( analog == 3 && val == 1 ) { digitalWrite(10, LOW); }
  if ( analog == 4 && val == 0 ) { digitalWrite(A5, HIGH); }
  if ( analog == 4 && val == 1 ) { digitalWrite(A5, LOW); }
  if ( analog == 5 && val == 0 ) { digitalWrite(A4, HIGH); }
  if ( analog == 5 && val == 1 ) { digitalWrite(A4, LOW); }
  if ( analog == 6 && val == 0 ) { digitalWrite(A3, HIGH); }
  if ( analog == 6 && val == 1 ) { digitalWrite(A3, LOW); }
  if ( analog == 7 && val == 0 ) { digitalWrite(A2, HIGH); }
  if ( analog == 7 && val == 1 ) { digitalWrite(A2, LOW); }
  if ( analog == 8 && val == 0 ) { digitalWrite(A1, HIGH); }
  if ( analog == 8 && val == 1 ) { digitalWrite(A1, LOW); }
  if ( analog == 9 && val == 0 ) { digitalWrite(A0, HIGH); }
  if ( analog == 9 && val == 1 ) { digitalWrite(A0, LOW); }
  
}

void eepromWriteInt(int adr, int wert) {
// 2 Byte Integer Zahl im EEPROM ablegen an der Adresse
// Eingabe: 
//   adr: Adresse +0 und +1 wird geschrieben
//   wert: möglicher Wertebereich -32,768 bis 32,767
// Ausgabe: 
//   -
// 2 Byte Platz werden belegt.
//
// Matthias Busse 5.2014 V 1.0

byte low, high;

  low=wert&0xFF;
  high=(wert>>8)&0xFF;
  EEPROM.write(adr, low); // dauert 3,3ms 
  EEPROM.write(adr+1, high);
  return;
} //eepromWriteInt

int eepromReadInt(int adr) {
// 2 Byte Integer Zahl aus dem EEPROM lesen an der Adresse
// Eingabe: 
//   adr: Adresse +0 und +1 wird gelesen
// Ausgabe: int Wert
//
// Matthias Busse 5.2014 V 1.0

byte low, high;

  low=EEPROM.read(adr);
  high=EEPROM.read(adr+1);
  return low + ((high << 8)&0xFF00);
} //eepromReadInt

Gundelputz:
sind die Taster entprellt?

Ob der Taster entprellt ist weis ich nicht.
Taster Modell: SEI R13-24 3A125VAC 1.5A250VAC

Anbei noch die Bilder vom Schaltplan und aufbau

Wozu die Pullup Widerstände in Hardware, wenn du diese in der Software einschaltest?
Auch schaltest du so beide parallel und erhöst somit den Stromverbrauch! (Bei Parallelschaltung von Widerständen ist der Gesamtwiderstand kleiner als der kleinste Teilwiderstand, somit steigt der Strom)

Ich verstehe so wie so nicht warum immer (fast) alle Pullups nehmen. Mit Pulldown reduziert sich automatisch der benötigte Ruhestrom.

Gruß

MiReu

Mit Pulldown reduziert sich automatisch der benötigte Ruhestrom.

Das verstehe wiederum ich nicht. Oder glaub eher, dass du da einen Denkfehler machst.

An einem CMOS Eingang fliesst nur Strom, wenn der Zustand sich ändert. Deshalb sollte der Eingang nicht floaten. Aber ob HIGH oder LOW ist egal.

MiReu:
Wozu die Pullup Widerstände in Hardware, wenn du diese in der Software einschaltest?
Auch schaltest du so beide parallel und erhöst somit den Stromverbrauch! (Bei Parallelschaltung von Widerständen ist der Gesamtwiderstand kleiner als der kleinste Teilwiderstand, somit steigt der Strom)

Ich verstehe so wie so nicht warum immer (fast) alle Pullups nehmen. Mit Pulldown reduziert sich automatisch der benötigte Ruhestrom.

Gruß

MiReu

Klingt jetzt blöd aber das hat sich so ergeben das ich Pullup nutze.

Ich vermute eher das Problem in deinen Eeprom-Zugriffen. Du hast Funktionen, die zwei Byte schreiben/lesen. Bei der Adressangabe liegst du aber nur einen Speicherblock auseinander.

  1. Wieso genau nutzt Du den EEPROM? Wenn ich das richtig sehe, nur um den LED-Status zu ändern? Der EEPROM macht eigentlich nur Sinn, wenn man Zustände speichern möchte, wo man den Controller zwischendurch ausschalten kann/muss. Also entweder normale Variablen dafür nutzen oder noch eleganter:
    digitalWrite(Pin, !digitalRead(Pin));

  2. Du nutzt in Deiner change()-Methode ein Delay, das blockiert relativ lange den Code. Weg damit.... Nutze stattdessen lieber millis() (siehe Tutorial)

  3. Deine Taster sind nicht entprellt, dies geschieht in der Regel über die Software. Um keine eigenen Entprell-Routinen schreiben zu müssen, kannst Du einfach die Bounce2 Bibliothek nutzen

sth77:
Ich vermute eher das Problem in deinen Eeprom-Zugriffen. Du hast Funktionen, die zwei Byte schreiben/lesen. Bei der Adressangabe liegst du aber nur einen Speicherblock auseinander.

Ich wüsste nicht wieso das ein Problem sein sollte ?

DerLehmi:

  1. Wieso genau nutzt Du den EEPROM? Wenn ich das richtig sehe, nur um den LED-Status zu ändern? Der EEPROM macht eigentlich nur Sinn, wenn man Zustände speichern möchte, wo man den Controller zwischendurch ausschalten kann/muss. Also entweder normale Variablen dafür nutzen oder noch eleganter:
    digitalWrite(Pin, !digitalRead(Pin));

  2. Du nutzt in Deiner change()-Methode ein Delay, das blockiert relativ lange den Code. Weg damit.... Nutze stattdessen lieber millis() (siehe Tutorial)

  3. Deine Taster sind nicht entprellt, dies geschieht in der Regel über die Software. Um keine eigenen Entprell-Routinen schreiben zu müssen, kannst Du einfach die Bounce2 Bibliothek nutzen

Ich nutze den delay damit die Funktion pausiert. Würde man den Knopf länger drücken würde ja die Funktion immer wieder ausgeführt werden und somit dauern den zustand wechseln

Somit sollte eig der Delay kein problem sein weil er ja nur eintritt wenn der Knopf gedrückt wird

Wie könnte ich das Problem sonst lösen?

Dann erklär uns doch mal die Notwendigkeit der Eeprom-Programmierung. Klar, die Schaltung soll auch nach Unterbrechung der Spannungsversorgung die Zustände halten. Aber warum muss soviel Speicher zugeballert werden? 8 Zustände kann man auch locker in ein einzelnes Byte packen. Bau doch mal einen Testsketch ohne die Eeprom-Geschichte zusammen und ergänze dann die Speichermöglichkeit.

Ich nutze den delay damit die Funktion pausiert. Würde man den Knopf länger drücken würde ja die Funktion immer wieder ausgeführt werden und somit dauern den zustand wechseln

Das kannst Du nicht mit einer Pause realisieren. Da mußt Du kontrollieren ob der Zustand des Pins sich ändert und dann ein bzw Ausschalten.
Arbeite mit indizierten Variablen (arrays) und For schleifen. Ein solcher Spaghetticode ist ein Grauß.

Ich wüsste nicht wieso das ein Problem sein sollte ?

Wie schon beschrieben ist der Fehler daß du 2 Byte ins EEProm schreibst aber die Adresse nur um 1 Byte verschiebst. Nimm entweder die Funktion, die 1 Byte ins EEprom schreibt, Lösche die Eepromsache ganz oder verwende Adressen die um 2Byte außeinanderliegen.
Vieleicht solltest Du die Basisgrundlagen lernen.

Dann erklär uns doch mal die Notwendigkeit der Eeprom-Programmierung. Klar, die Schaltung soll auch nach Unterbrechung der Spannungsversorgung die Zustände halten. Aber warum muss soviel Speicher zugeballert werden? 8 Zustände kann man auch locker in ein einzelnes Byte packen. Bau doch mal einen Testsketch ohne die Eeprom-Geschichte zusammen und ergänze dann die Speichermöglichkeit.

Wenn der Zustand denn abgespeichert würde. Beim Einschalten wird das EEprom ja als erstes gelöscht.

Grüße Uwe

Hitmare:
Wie könnte ich das Problem sonst lösen?

zum Beispiel so:

bool keyup = true;

void setup() {
  // put your setup code here, to run once:
  
 }

void loop() {
  // put your main code here, to run repeatedly:

  if (keyup == true && digitalRead(2) == LOW) {
    change(2);
   keyup = false;
  }

if (keyup == false && digitalRead(2) == HIGH) keyup = true; /*bei mehreren Tasten musst Du entweder alle Tasten
                                                            mit && verknüpft abfragen, oder fur jede Taste eine
                                                            keyup variable anlegen*/
}

Das dürfte der Kompiler aber mit lautem Geschrei ablehnen.

bool keyup ist im setup deklariert und im Loop verwendet.
Außerdem steht eine if einfach so im Raum ohne in einer Funktion zu sein.

Wenn Du Beispielcode gibst, dann sollte der auch grundlegend funktionieren können.

Gruß Tommy

Hast recht Tommy.

Habs korrigiert.

LG Stefan

Deltaflyer:
Hast recht Tommy.

Habs korrigiert.

LG Stefan

Den 2. Fehler nicht.

Gruß Tommy

Wo?
Hab's doch schon korrigiert und damit in die loop reingenommen, wo ich sie haben wollte.
Hatte ja beim ersten mal die abschliessende '}' nicht mit kopiert, als ich den sketch aus der IDE holte.

LG Stefan

Ok, die Änderung hatte ich übersehen.

Gruß Tommy