Go Down

Topic: Mehrere Taster an einem Analog-Eingang auslesen (Read 545 times) previous topic - next topic

UnoRookie

Hallo,
ich habe wie im Bild unten mehrere Taster gemeinsam über 3 x 220 Ohm Widerstände miteinander verbunden und mit dem Analog Pin 5 des Arduino ausgelwertet. Der rechte Widerstand, der die Taster mit GROUND verbindet beträgt 1,5 KOhm.
Hab dann ein kleines Programm geschrieben, das die Werte ausliest und dann über den SerialMonitor ausgibt, welcher Knopf gedrückt wurde :
Code: [Select]

...
while ((KeyValue = analogRead(input)) < 500)
   delayMicroseconds(1);
//Taste 1 gedrückt
if ((KeyValue > 700) && (KeyValue < 720))
{
   Serial.println("Taste 1 gedrückt");
   delay(1000);
}
if ((KeyValue > 780) && (KeyValue < 820))
{
   Serial.println("Taste 2 gedrückt");
   delay(1000);
}
if ((KeyValue > 870) && (KeyValue < 1000))

   Serial.println("Taste 3 gedrückt");
   delay(1000);
}...

Jetzt zu meiner Frage : Sehr oft müssen die Werte von Breadboard zu Breadboard angepasst werden. Zum Beispiel funktionieren die obigen Werte für das aktuelle Steckbrett, bei einem anderen Steckbrett mit demselben Aufbau allerdings kann es sein, dass "Taste 1 gedrückt" oder "Taste 2 gedrückt" niemals erscheinen, weil es da um den Wert 20 veränderte Analogwerte gibt.
Wie ist das möglich ?
Kann man das ganze so umbauen, dass die Werte von Steckbrett zu Steckbrett konstanter sind als jetzt ?
P.S. : Die verwendeten Widerstände haben eine Toleranz von 1 % und die verwendeten Steckbretter sind beide von Elegoo.

Vielen Dank für eure Hilfe !

ElEspanol

Du prüfst auf einen sehr kleinen Wertebereich. Auch kannst du das mit if und else if so aufbauen, das du nicht auf einen Bereich prüfst, sondern nur einen Vergleich machst

HotSystems

Sieh dir mal diese Schaltung an, damit erreichst du eine höhere Sicherheit.
Dann noch den Sketch optimieren und das funktioniert.
I2C = weniger ist mehr: weniger Kabel, mehr Probleme. 8)

uwefed

Sieh dir mal diese Schaltung an, damit erreichst du eine höhere Sicherheit.
Dann noch den Sketch optimieren und das funktioniert.
Mir scheint der TO hat gerade diese Schaltung aufgebaut.
Grüße Uwe

UnoRookie

#4
Oct 18, 2017, 07:51 am Last Edit: Oct 18, 2017, 08:34 am by UnoRookie
Quote
Du prüfst auf einen sehr kleinen Wertebereich.
Welche Werte wären denn ideal ?
Quote
nicht auf einen Bereich prüfst, sondern nur einen Vergleich machst
Ähm, da komm ich jetzt nicht so ganz mit. Ich kann ja nicht auf LOW oder HIGH prüfen, sondern nur auf einen Wertebereich oder ?

Mir gehts darum dass, falls ich das ganze ausbauen will (z.B. 6 statt bisher 3 Taster), dass ich dann gewisse feste "Wertebereiche" habe, mit denen ich arbeiten kann und ich nicht immer wieder von Steckbrett zu Steckbrett erst mit dem SerialMonitor die Werte auslesen und dann im Code anpassen muss.

combie

Du kannst auch einen Kalibrierlauf machen und die Werte ins EEPROM schreiben.
Du musst nichts selber im Code eintragen.


Mir scheint der TO hat gerade diese Schaltung aufgebaut.
Wenn man sich die Widerstandswerte so anschaut, dann doch eher nicht.
Ähnlich, aber nicht diese Schaltung.

"Freiheit, Gleichheit, Brüderlichkeit!"
Aber wie gelangen wir zu den Tätigkeitswörtern?
Quelle: Stanislaw Jerzy Lec

ElEspanol

#6
Oct 18, 2017, 08:50 am Last Edit: Oct 18, 2017, 08:53 am by ElEspanol
du musst die Widerstände so wählen, das du am Analogpin einen möglichst grossen Spannungsbereich abdeckst. Deswegen sind identische Werte ungeeignet.
Dann von niedrig nach hoch mit else if und nur auf kleiner vergleichen. Dann kannst du u. U. über 10 Taster problemlos abfragen. bei weniger Taster und geschickter Kombination unter Umständen sogar 2 gleichzeitig gedrückte Tasten

Theseus

#7
Oct 18, 2017, 09:02 am Last Edit: Oct 18, 2017, 09:06 am by Theseus
Welche Werte wären denn ideal ?Ähm, da komm ich jetzt nicht so ganz mit. Ich kann ja nicht auf LOW oder HIGH prüfen, sondern nur auf einen Wertebereich oder ?
Du fragst nur ein kleines Intervall von 20 oder 40 ab. Dazwischen sind Lücken. Das entspricht einer Zielscheibe, wo zwischen den Ringen größere Lücken sind und alles was dort landet wird nicht bewertet.

Du solltest diese Lücken schließen. Am besten lässt du dir am seriellen Monitor auch den analogen Wert anzeigen und setzt die Intervalgrenzen dazwischen.
Ich habe das in den Code mit else-Schachtelung eingefügt.

Code: [Select]

...
while ((KeyValue = analogRead(input)) < 500)
   delayMicroseconds(1);
//Taste 1 gedrückt
if ((KeyValue > 500) && (KeyValue < 750))
{
   Serial.println("Taste 1 gedrückt");
   delay(1000);
} else {
if (KeyValue < 850)
{
   Serial.println("Taste 2 gedrückt");
   delay(1000);
} else {
if (KeyValue < 1023)

   Serial.println("Taste 3 gedrückt");
   delay(1000);
}
}}...

guntherb

#8
Oct 18, 2017, 09:03 am Last Edit: Oct 26, 2017, 12:56 pm by guntherb
Du fragst ja nur sehr enge Bereiche ab. Wenn du mal die Streuung nur über die Toleranz rechnest, fällt das teilweise schon aus deinem Fenster raus (Ich habe hier mal 5% Extremwerten gerechnet.) Und alle Ungenauigkeiten über Aufbau, schlechte Kontakte etc sind noch nicht mit drin.


Ich würde jeweils nur eine Schwelle zwischen zwei Schaltzuständen festlegen, und nur die abfragen.


Code: [Select]
if(AD_wert < 350){
    // nix gedrückt
  }
  else if(AD_wert >= 350 && AD_wert < 753){
    // T1 gedrückt
  }
  else if(AD_wert >= 753 && AD_wert < 844){
    // T2 gedrückt
  }
  else if(AD_wert >= 844){
    // T3 gedrückt
  }
Grüße
Gunther

UnoRookie

#9
Oct 18, 2017, 09:18 am Last Edit: Oct 18, 2017, 09:30 am by UnoRookie
Quote
du musst die Widerstände so wählen, das du am Analogpin einen möglichst grossen Spannungsbereich abdeckst. Deswegen sind identische Werte ungeeignet.
Also wären folgende Widerstände (z.B. 200, 400, 600, 800 Ohm, usw.) wohl besser geeignet, oder ?

@Theseus : Vielen Dank, verstanden
@guntherb : Darf ich mal blöd fragen, wie du diese Werte berechnet hast ?

HotSystems

Also wären folgende Widerstände (z.B. 200, 400, 600, 800 Ohm, usw.) wohl besser geeignet, oder ?
Du kannst es natürlich auch mit den Widerständen aufbauen.

Aber warum nimmst du nicht die Werte, die sich bewährt haben und im Web mehrfach gezeigt werden ?
I2C = weniger ist mehr: weniger Kabel, mehr Probleme. 8)

UnoRookie

Quote
Aber warum nimmst du nicht die Werte, die sich bewährt haben und im Web mehrfach gezeigt werden ?
Weil da Werte teils über 10k Ohm verwendet werden. Und Widerstände über 10k können von meinem Arduino-Durchgangsprüfer, mit dem ich meine ersten Lötversuche immer auf Kontakt überprüfe, nimmer ausgewertet werden. Ab 10k Widerstand ist der Zustand immer LOW => hat aber nix mit dem Thema zu tun.

@guntherb : Darf ich mal blöd fragen, wie du diese Werte berechnet hast ?

combie

Quote
hat aber nix mit dem Thema zu tun.
Aber offensichtlich schon!
Denn du machst ja deine Schaltung davon abhängig.

Und schickst uns mit ungenannten Bedingungen in die Irre.
(und dich selber gleich mit)

Bitte kaufe dir ein Multimeter, dann bist du diese Einschränkung los.
"Freiheit, Gleichheit, Brüderlichkeit!"
Aber wie gelangen wir zu den Tätigkeitswörtern?
Quelle: Stanislaw Jerzy Lec

UnoRookie

#13
Oct 18, 2017, 09:55 am Last Edit: Oct 18, 2017, 11:06 am by UnoRookie
Quote
Bitte kaufe dir ein Multimeter, dann bist du diese Einschränkung los.
Hab ich bereits, sollte ich wahrscheinlich öfters verwenden

P.S. :
Um meine Grenzen aufzuheben (Salopp gesagt) :
Wenn man den 5V-Ausgang am Arduino über einen Widerstand mit einem AnalogPin verbindet, ab wann liegt dann der Wert 0 an (was ist also die "magische Obergrenze" für einen Widerstand beim auswerten über den AnalogPin) ?

nix_mehr_frei

Widerstände gibt es in verschiedenen Fertigungstoleranzen und aus unterschiedlichen Materialien, die auch unterschiedlich driften bei Temperatur und Alterung.
Bei solchen Sachen verwende 1% Metallschichtwiderstände, die kosten kaum mehr, sind aber hinreichend genau und stabil. Außerdem schau dir mal die Grundlagen eines R2R Netzwerkes an:
https://de.wikipedia.org/wiki/R2R-Netzwerk
Da haben dieses Problem bereits helle Köpfe für dich gelöst. Das wird seit Jahrzehnten bei A/D und D/A Wandlern so gemacht. Du kaufst dir eine 100'er Tüte 1% Metallschicht. Untereinander sind Exemplare aus der selben Charge sogar noch genauer. Es zählt hier nicht der Absolutwert, sondern die Abweichung. Und du schaltest einfach für 2R zwei in Reihe ODER für R zwei Exemplare parallel. So erreichst du mit einem einzigen Wert die geringsten Abweichungen untereinander  ;)
rot ist blau und Plus ist Minus

Go Up