analogRead spinnt - nur woran kann das liegen ?

Hallo liebe Arduino-Community,

ich arbeite an einem wirklich wichtigen Projekt, bei dem ich das Drücken auf einen Schalter per analogRead erfasse (ich weis, das ist nicht optimal, aber für mein Projekt die einzige Lösung :roll_eyes: ).
Lezte Woche habe ich zuletzt daran gearbeitet und das Drücken auf einen Taster wurde immer richtig erfasst.
Jetzt wollte ich weiterarbeiten und jetzt lösen sich die Schalter automatisch aus (Werte bei den Messungen: 1023, mehrmals die Sekunde) :fearful:

Mein Vorgehen:

  1. Alle Kabel aus den Pins gezogen
  2. Beispielsketch "AnalogReadSerial" ausgeführt -> alles ok, Werte bei max. 400
  3. Kabel reingesteckt (wirklich nur ein Kabel ohne jegliche Hardware oder Verbindung zu etwas anderem) -> Werte des öfteren bei 1023
  4. Kabel rausgezogen -> wieder alles ok

Hat jemand von euch für diese plötzliche Änderungen eine Erklärung ? Ich kann mir das nicht anders erklären, als dass der Arduino einen Schlag hat, aber wovon ? :open_mouth:

Du willst einen offenen Eingang messen? Das Kabel wirkt wie eine Antenne und fängst sich zufällige Werte ein.

Einen offenen Analogeingang zu messen ist eine beliebte Möglichkeit sich für random() einen richtigen zufälligen Seed zu hohlen damit der Pseudo-Zufallszahlgenerator nicht immer die gleiche Sequenz hat:
http://arduino.cc/en/Reference/RandomSeed

Du musst wie bei digitalRead() auch den Eingang mit einem Pulldown oder Pullup auf ein definiertes Potential legen.

P.S.:
Du kannst auch die Analog-Eingänge als digitale I/Os verwenden!

niclasonline:
Hat jemand von euch für diese plötzliche Änderungen eine Erklärung ?

Schaltung?
Sketch?

Welche Hardwareschaltung im Zusammenhang mit welchem Sketch möchtest Du denn erklärt bekommen?

Sollen wir beides raten?

Erstmal vielen Dank für eure Antworten ! :slight_smile:

Serenifly:
Du willst einen offenen Eingang messen? Das Kabel wirkt wie eine Antenne und fängst sich zufällige Werte ein.

Einen offenen Analogeingang zu messen ist eine beliebte Möglichkeit sich für random() einen richtigen zufälligen Seed zu hohlen damit der Pseudo-Zufallszahlgenerator nicht immer die gleiche Sequenz hat:
http://arduino.cc/en/Reference/RandomSeed

Du musst wie bei digitalRead() auch den Eingang mit einem Pulldown oder Pullup auf ein definiertes Potential legen.

P.S.:
Du kannst auch die Analog-Eingänge als digitale I/Os verwenden!

Das das Kabel wie eine Antenne wirken kann ist mir wohl bewusst, jedoch hatte ich bei vorherigen Tests ein Kabel drinnenstecken und es hat die Werte sicht so komisch verändert, dass 1023 erreicht werden :~ Mal ein bisschen Copy&Paste aus den Daten:
188
255
430
295
182
281
438
260<-Zu dem Zeitpunkt habe ich das Kabel eingesteckt
0
1023
1023
8
0
361
1023
0
0
0
1023
1023
0
0
145
1023

jurs:

niclasonline:
Hat jemand von euch für diese plötzliche Änderungen eine Erklärung ?

Schaltung?
Sketch?

Welche Hardwareschaltung im Zusammenhang mit welchem Sketch möchtest Du denn erklärt bekommen?

Sollen wir beides raten?

Schaltung: Keine, nur ein eingestecktes Kabel auf A0
Sketch: Den Beispielsketch "AnalogSerialRead"

/*
  AnalogReadSerial
  Reads an analog input on pin 0, prints the result to the serial monitor.
  Attach the center pin of a potentiometer to pin A0, and the outside pins to +5V and ground.
 
 This example code is in the public domain.
 */

// the setup routine runs once when you press reset:
void setup() {
  // initialize serial communication at 9600 bits per second:
  Serial.begin(9600);
}

// the loop routine runs over and over again forever:
void loop() {
  // read the input on analog pin 0:
  int sensorValue = analogRead(A0);
  // print out the value you read:
  Serial.println(sensorValue);
  delay(1);        // delay in between reads for stability
}

Ich hoffe mal, ich habe genug Daten geliefert - sollte das nicht der Fall sein, bitte noch mal nachfragen :wink:

niclasonline:
Schaltung: Keine, nur ein eingestecktes Kabel auf A0

Beim Lesen Deines ersten Postings habe ich vermutet, dass in der Schaltung irgendwo ein "Taster" steckt.

Und jetzt ist der Taster weg und Du hast "nur ein eingestecktes Kabel auf A0".

Also irgendwie soll das Kabel wohl eine Antenne an A0 sein, die irgendwas empfangen soll.
Ich kann mir nur nicht vorstellen, was das wohl sein soll.

Und möglicherweise hast Du irgendwo außer einem lockeren Kabel an A0 auch noch einen Taster.
Aber wer weiß schon, wo der angeschlossen ist.

Im Kommentar des geposteten Sketches steht etwas von einem Potentiometer.
Das Potentiometer hast Du wohl auch nicht in der Schaltung?
Irgendeinen Sinn ergibt das, was Du schreibst, für mich nicht.

Und was von der Beschreibung her keinen Sinn ergibt, da wundert es mich irgendwie auch nicht, wenn es nicht wie gewünscht funktioniert.

jurs:

niclasonline:
Schaltung: Keine, nur ein eingestecktes Kabel auf A0

Beim Lesen Deines ersten Postings habe ich vermutet, dass in der Schaltung irgendwo ein "Taster" steckt.

Und jetzt ist der Taster weg und Du hast "nur ein eingestecktes Kabel auf A0".

Also irgendwie soll das Kabel wohl eine Antenne an A0 sein, die irgendwas empfangen soll.
Ich kann mir nur nicht vorstellen, was das wohl sein soll.

Und möglicherweise hast Du irgendwo außer einem lockeren Kabel an A0 auch noch einen Taster.
Aber wer weiß schon, wo der angeschlossen ist.

Im Kommentar des geposteten Sketches steht etwas von einem Potentiometer.
Das Potentiometer hast Du wohl auch nicht in der Schaltung?
Irgendeinen Sinn ergibt das, was Du schreibst, für mich nicht.

Und was von der Beschreibung her keinen Sinn ergibt, da wundert es mich irgendwie auch nicht, wenn es nicht wie gewünscht funktioniert.

Ok, sorry, dann habe ich das ganze etwas schlecht beschrieben :cold_sweat:
Also ich habe ein Projekt, bei dem ein Taster angeschlossen ist also:
5V---|Taster|----A0

Wenn der Taster gedrückt wird, bekomme ich 1023 als Wert zurück und weis somit, dass der Taster gedrückt ist.
Jetzt ist es aber so (obwohl ich nichts verändert habe), dass ich den Wert 1023 bekomme, obwohl der Schalter nicht gedrückt ist :-/
Nachdem ich alle Anschlüsse aus den Pins gezogen habe also an den Arduino ist nichts außer das USB-Kabel angeschlossen), bekomme ich Werte bis maximal 400, was ja auch normal ist.
Wenn ich jetzt aber ein Kabel (ohne irgendwas) in A0 reinstecke bekomme ich wieder 1023 und der Schlater wird fälschlicherweise als gedrückt angezeigt :fearful:

Und wieso muss das unbedingt analog sein?

Du kannst wie gesagt auch digitalRead(A0) machen. Das ist einigen Leuten nicht klar. Aber auch da brauchst du in diesem Fall einen Pulldown Widerstand, sonst tritt das gleiche Problem auf. Oder die internen Pullups aktiveren und den Taster gegen Masse schalten.

Der Analog Read muss immer ein definiertes Potential sein entweder die der "Analog Quelle" oder ein z.B. 100KOhm Widerstand gegen GND.
Oder wie gesagt den digital auslesen mit digitalRead(14) oder digitalRead(A0),

Gruß
Der Dani

niclasonline:
Also ich habe ein Projekt, bei dem ein Taster angeschlossen ist also:
5V---|Taster|----A0

Das ist generell eine FALSCHE BESCHALTUNG, weil im Falle eines offenen Tasters dann auch ein "offener Eingang" vorliegt.

Offene Eingänge haben keinen definierten Pegel, sie sind "schwebend".
Schwebende Eingänge können beliebige und von Zufälligkeiten und der elektrischen Umgebung abhängige Pegel annehmen.

Bitte arbeite das grundlegende "Button" Beispiel durch:
http://arduino.cc/en/tutorial/button

Beim Anschluß eines Tasters muß immer ein "Pull"-Widerstand den Pegel im Falle des offenen Tasters auf einen bestimmten Wert ziehen, entweder als "PullUp"-Widerstand (zieht Pegel auf 5V) oder als "PullDown"-Widerstand (zieht Pegel auf GND).

Analog-Pins an AVR-Controllern kannst Du übrigens auch wie Digital-Pins verwenden, das Button-Beispiel funktioniert also auch mit:

const int buttonPin = A0;

Und: Der Widerstand in der Schaltung muß nicht verbaut werden, wenn Du den "internen PullUp" Widerstand des Pins am Atmega-Controller aktivierst.

Dir fehlen absolut die Grundlagen zu:

  • Beschaltung eines Tasters
  • PullUp- und PullDown-Widerstände
  • ggf.: Verwendung der internen PullUp-Widerstände in Atmega-Controllern

Vielleicht liest Du Dir erstmal was an und probierst fertige Beispiele aus, um die Grundlagen zu verstehen.
Bevor Du dann - mit dem notwendigen Verständnis - selbst etwas zusammenschaltest und programmierst.