AnalogRead gibt nicht das gewollte aus-Einsteigerfrage

Moin,

ich hoffe hier bin ich richtig. Habe zu Weihnachten einen MEGA 2560 bekommen und probiere momentan ein wenig rum. Jetzt hänge ich fest, ich habe ein LCD angeschlossen und wollte auf diesem nun den Analogwert von A0 anzeigen lassen. Geht auch so weit, wenn ich A0 mit 5V verbinde zeigt er mir 1023 an. Aber wenn ich A0 über einen 10k Widerstand an 5V anschließe, zeigt er auch 1023 an, und an Masse zeigt er einen zufälligen Wert an. Kann mir jemand meinen Fehler erläutern?

#include <LiquidCrystal.h>
LiquidCrystal LCD(12, 11, 5, 4, 3, 2);
void setup() {
  LCD.begin(16, 2);
  LCD.print("ANALOGWERT A0");
  
}
void loop() {
  LCD.setCursor(6, 1);
  LCD.print(analogRead(A0));
  
}

Frohe Weihnachten und LG

Ole

Im Thread Frage zu AnalogRead() - Deutsch - Arduino Forum ist genau dein Problem beschrieben.

Oh sorry, war wohl nicht genau genug beim suchen. Vielen Dank für den Link

Also brauche ich immer einen Spannungsteiler? Habe es schon mit dem Befehl analogRefernce(DEFAULT) versucht, brachte mir aber nichts :frowning:

LG Ole

Ja, wenn Du mit einem veränderlichen Widerstand messen willst, dann brauchst Du immer einen Spannungsteiler. Es gibt aber auch Sensoren, die bereits eine sich ändernde Spannung liefern, die kannst Du dann direkt anschließen. Zumindest solange die Spannung positiv und nicht über Vref liegt.
Mario.

Vielen Dank.

Habe es jetzt geschafft, habe mal mit einem lichtempfindlichen Widerstand probiert. Geht soweit, aber er zeigt mir die Werte zwingend als 4 stellig an, also Werte unter tausend zeigt er als xxx0 an. Kann man dies entfernen, sodass er nur soviel Stellen anzeigt wie er benötigt?

LG ole

Du meinst auf dem LCD?
Ja, das Problem hatte ich auch:
Wenn ich einmal einen Wert über 999 anzeigen lies, habe ich in die 4. Stelle auf dem LCD eine Ziffer geschrieben.
Die bleibt da auch, auch wenn du jetzt wieder einen Wert unter 1000 anzeigen lässt. So lange nicht zwischen drin ein LCD.clear gemacht wird.

Weiß jetzt spontan allerdings nicht mehr, wie ich das gelöst hatte.

Der zeigt dir die Stellen schon korrekt an. Die 4. Stelle stammt von dem vorherigen Wert.

Mach es einfach so:

LCD.setCursor(6, 1);
LCD.print("    ");      //sollten 4 Leerzeichen sein
LCD.setCursor(6, 1);
LCD.print(analogRead(A0));

Man könnte auch abfragen wie viele Stellen die Zahl hat und entsprechend Leerzeichen am Ende ausgeben, aber das ist mehr Aufwand.

Du solltest auch vielleicht ein kurzes Delay in loop() machen, da die LCDs nicht schnell genug sind um ständig neu beschrieben zu werden.

oder alternativ den gemessenen Wert speichern und nur dann auf das LCD schreiben, wenn er sich ändert. Das reduziert den Traffic auf dem Bus und das Display hat genügend Zeit zum Zeichnen. Wenn das Analog-Signal so sehr rauscht, dass bei jedem Einlesen ein anderer Wert raus kommt, kann man ggf. noch einen Durchschnittswert bilden oder zum Beispiel Änderungen in einem gewissen Bereich (z. B. +/- 5) ignorieren. Dann "springt" die Anzeige auch nicht so oft.

Vielen Dank, eure Einwände werde ich nachher einbauen. Ich habe in der Zwischenzeit mal weiter gebastelt und wollte mir den Wert auch in Ohm anzeigen lassen. Also habe ich kurz einen 100 Ohm Widerstand gemessen, dort kam 1014 raus. Weil der Wert größer wird wenn der Widerstand kleiner wird, habe ich zur Errechnung in Ohm 101400 / Messwert genommen. Dort gibt er mir aber als Ergebnis bei dem 100 Ohm Widerstand -29 an. Habe als Kontrolle den anderen Wert auch noch eingeblendet.

#include <LiquidCrystal.h>
LiquidCrystal LCD(12, 11, 5, 4, 3, 2);
int WERT;
int var;
int a;
void setup() {
  LCD.begin(16, 2);
  LCD.print("ANALOGWERT OHM");
}
void loop() {
  LCD.setCursor(0, 1);
  var = 101400;
  a = analogRead(A0);
  WERT = var / a;
  LCD.print(WERT);
  LCD.setCursor(8, 1);
  LCD.print(analogRead(A0));
  delay(500);
 }

Wieso zeigt er mir nicht 100 wie gewollt, sondern -29 an??

LG Ole

var ist ein signed int und der geht nur bis 32767:
http://arduino.cc/de/Reference/Int

Dir läuft dann einfach die Variable über. Mach daraus einen long. Oder einfach als Literal:
int wert = 101400L / a;

Die Variablen Deklarationen müssen übrigens nicht global sein.

So, geht schon mal soweit, hier nochmal mein aktueller Code.

#include <LiquidCrystal.h>
LiquidCrystal LCD(12, 11, 5, 4, 3, 2);
int WERT;
int a;
void setup() {
  LCD.begin(16, 2);
  LCD.print("ANALOGWERT OHM");
}
void loop() {
int WERT = 101400L / analogRead(A0);
  LCD.setCursor(6, 1);
  LCD.print("           ");   
  LCD.setCursor(6, 1);
  LCD.print(WERT);
  delay(500);
 }

Jetzt habe ich aber das Problem, dass bei einem 1k Widerstand das Programm 108 ausgibt. Die Rechnung hat er richtig gemacht, 101400 / 932 sind 108. Deshalb stimmt mein Therm nicht. Also kurz überschlagen und rausgekommen ist
WERT = -20 * analogRead(A0) + 20000L
Leider ein wenig ungenau, ca. 400 Ohm Toleranz. Aber ich bin soweit gekommen wie ich kommen wollte. Das kommt wohl daher, dass ich diese 5V/1023 als 0,005 angenommen habe, um leichter rechnen zu können :slight_smile:

  1. richtiges Übungsprojekt abgeschlossen :slight_smile:

Vielen Dank allen Helfern :slight_smile:

LG Ole