Forum: Mikrocontroller und Digitale Elektronik Batteriespannung mit Arduino auslesen


von Dan (Gast)


Angehängte Dateien:

Lesenswert?

Hallo, ich möchte mit meinem Arduino die Spannung einer 9V-Blockbatterie 
analog einlesen und bei Unterschreitung von ca. 7,5V soll eine LED 
aufleuchten.(Schaltplan siehe im Anhang)

Ich gehe davon aus, dass eine neue Batterie ca. 9,5 Volt hat.
da die maximale Spannung beim analogen Input 5V sind, habe ich einen 
Spannungsteiler, bei dem ich als maximale Spannung ca.4,75V habe.
Durch entsprechende Umrechnung von meiner Spannung zur Bitauflösung 
komme ich auf folgendes Programm:

int battery = A0;
int ledpin = 13;
int batteryValue = 0;

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

void loop()
{
  batteryValue = analogRead(battery);

  if (batteryValue < 768 && batteryValue > 0)
  {
    digitalWrite( ledpin , HIGH);
  }
}

Ich programmiere zum ersten mal mit Arduino...könnt ihr mir bitte sagen, 
ob das so stimmt?

Danke im Voraus... :-)

von Philipp G. (geiserp01)


Lesenswert?

Dan schrieb:
> (batteryValue < 768 && batteryValue > 0)

<=

und

1024 / 2 = 512

sonst gut.

: Bearbeitet durch User
von Ingo L. (corrtexx)


Lesenswert?

Dan schrieb:
> könnt ihr mir bitte sagen,
> ob das so stimmt?
Wenn deine ADC-Referenz 5V beträgt, ja. Aber soll die LED niemals wieder 
aus gehen?

von Dan (Gast)


Lesenswert?

Philipp G. schrieb:
> 1024 / 2 = 512
>
> sonst gut.

Ja ich weiß. Und deshalb:
7,5V / 2 = 3,75V entspricht 768 Bit (Das ist mein Unterschreitungswert)

P.S: komischerweise lässt sich das Programm nicht auf den uC 
aufspielen?!

von Harald W. (wilhelms)


Lesenswert?

Dan schrieb:

> Hallo, ich möchte mit meinem Arduino die Spannung einer 9V-Blockbatterie
> analog einlesen und bei Unterschreitung von ca. 7,5V soll eine LED
> aufleuchten.(Schaltplan siehe im Anhang)

Dafür nehme ich immer einen (IC-)Komparator. Der kann das besser.

von Dan (Gast)


Lesenswert?

Ingo L. schrieb:
> Dan schrieb:
>> könnt ihr mir bitte sagen,
>> ob das so stimmt?
> Wenn deine ADC-Referenz 5V beträgt, ja. Aber soll die LED niemals wieder
> aus gehen?

Die LED soll erst dann ausgehen, wenn ich die Batterie austausche und 
damit wieder einen Wert von über 7,5 Volt habe.

von Ingo L. (corrtexx)


Lesenswert?

Skaliere am Besten auf Volt:
1
 batteryValue = ((int32_t)analogRead(battery) * 1000l)/1023;
2
 if (batteryValue < 750 && batteryValue > 0)
3
 ...

> Die LED soll erst dann ausgehen, wenn ich die Batterie austausche und
> damit wieder einen Wert von über 7,5 Volt habe.
OK

: Bearbeitet durch User
von Ingo L. (corrtexx)


Lesenswert?

Harald W. schrieb:
> Dafür nehme ich immer einen (IC-)Komparator. Der kann das besser.
Gähn, heute werden Spannungsteiler und alles was geht gefälligst 
programmiert...

von Philipp G. (geiserp01)


Lesenswert?

Dan schrieb:
> 7,5V / 2 = 3,75V entspricht 768 Bit (Das ist mein Unterschreitungswert)

Wie kommst Du darauf?

Gehen die 9V an den Eingang 'Power Plug'? Falls ja, wird aus den 9V 
intern 5V.

5V entspricht dann einem Wert von 1024. 2.5V 512. Rechne.

von Dan (Gast)


Lesenswert?

Ingo L. schrieb:
> batteryValue = ((int32_t)analogRead(battery) * 1000l)/1023;
>  if (batteryValue < 750 && batteryValue > 0)

Da komm ich nicht ganz mit:
was bedeutet ((int32_t)analogRead(battery) * 1000l)/1023 ?

von Ingo L. (corrtexx)


Lesenswert?


von Einer K. (Gast)


Lesenswert?

Harald W. schrieb:
> Dafür nehme ich immer einen (IC-)Komparator. Der kann das besser.
Ein Komparator ist eingebaut.
Warum noch einen daneben setzen?

Um Spannungen zu messen verwendet man die interne Referenz.
Nach einer Kalibrierung ist das Ergebnis meist genauer, als mit Vcc als 
Referenz.

Vcc als Referenz, eignet sich gut für ratiometrische Messungen, eher 
nicht für absolute.

von Ingo L. (corrtexx)


Lesenswert?

Philipp G. schrieb:
> Gehen die 9V an den Eingang 'Power Plug'? Falls ja, wird aus den 9V
> intern 5V.
Laut Plan nicht, dort gibt es extern 2 Widerstände und einen Schalter...

von Einer K. (Gast)


Lesenswert?

Philipp G. schrieb:
> Gehen die 9V an den Eingang 'Power Plug'? Falls ja, wird aus den 9V
> intern 5V.
Will ich schwer hoffen, denn sonst wird es Rauch geben und die Batterie 
wird SEHR schnell leer.

von Dan (Gast)


Lesenswert?

Philipp G. schrieb:
> Dan schrieb:
>> 7,5V / 2 = 3,75V entspricht 768 Bit (Das ist mein Unterschreitungswert)
>
> Wie kommst Du darauf?
>
> Gehen die 9V an den Eingang 'Power Plug'? Falls ja, wird aus den 9V
> intern 5V.
>
> 5V entspricht dann einem Wert von 1024. 2.5V 512. Rechne.

Ich habe ja einen Spannungsteiler(siehe Anhang).
d.h. ich greife max. 4,75V ab.

von Philipp G. (geiserp01)


Lesenswert?

Er muss über den internen Spannungsregler vom Arduino. Also hat er 5V am 
Eingang liegen.

1024(dec) entspricht dann 5V am Eingang für den Ardu.

4.5V entspricht den zu messenden 9V.

Also, 921 = 9V.

: Bearbeitet durch User
von MaWin (Gast)


Lesenswert?

Dan schrieb:
> die Spannung einer 9V-Blockbatterie analog einlesen und bei
> Unterschreitung von ca. 7,5V soll eine LED aufleuchten.

Richtig, unter 7.5V funktioniert der Arduino nicht mehr unbedingt. Aber 
die Batterie ist noch halbvoll, deren Kapazität geht bis 5.6V. Wirfst du 
die ungenutze Batterie dann weg ? Suche lieber nach einem Arduino mit 
LowDrop Regler und setze die Minimalspannung dann passend runter.

Auch würde ich das Programm betriebssicherer machen: nicht dass ein 
einziger (eventuell Fehlmessung, z.b. der allererste) Messwert die LED 
immer einschaltet.

von Ingo L. (corrtexx)


Lesenswert?

Dan schrieb:
> if (batteryValue < 768 && batteryValue > 0)
Jetzt check ich es erst
1
&& batteryValue > 0
Damit die Messung erst gültig ist, wenn du den Schalter S2 schließt? Da 
würde ich etwas mehr Abstand zur 0 geben.
1
batteryValue > 10

von Philipp G. (geiserp)


Lesenswert?

die 768 sind dennoch 6.6v

von Dan (Gast)


Lesenswert?

Ingo L. schrieb:
> Jetzt check ich es erst&& batteryValue > 0
> Damit die Messung erst gültig ist, wenn du den Schalter S2 schließt?

Richtig. genauso ist es.

Ingo L. schrieb:
> batteryValue > 10

den gleichen Gedanken hatte zuerst auch...hab mich dann aber im Beitrag 
für die Null entschieden, damit es euch nicht verwirrt...war wohl falsch 
gedacht.

von Dan (Gast)


Lesenswert?

Markus H. schrieb:
> die 768 sind dennoch 6.6v

Sicher? Wie gesagt, ich gehe von einer vollen Batterie mit 9,5 Volt 
aus...

von Ingo L. (corrtexx)


Lesenswert?

Markus H. schrieb:
> die 768 sind dennoch 6.6v
Unsinn. 7,5/(2*URef) * 1024

von Philipp G. (geiserp01)


Lesenswert?

s.o.

Der Arduino wird 1024 ausgeben wenn 5V anliegen.

von Ingo L. (corrtexx)


Lesenswert?

Philipp G. schrieb:
> Der Arduino wird 1024 ausgeben wenn 5V anliegen.
Das sollte mich wundern... 2^10 sind zwar 1024 aber 0...1023.

von Philipp G. (geiserp01)


Lesenswert?

Ingo L. schrieb:
>> die 768 sind dennoch 6.6v
> Unsinn. 7,5/(2*URef) * 1024

Fehler gefunden. Zwischen den Ohren.

von Ingo L. (corrtexx)


Lesenswert?

Philipp G. schrieb:
> Zwischen den Ohren.
Sehr häufiger Fehlerort

von Jörg R. (solar77)


Lesenswert?

Nur mal aus Interesse. Versorgst Du den Arduino tatsächlich mit einem 9 
Volt Block? Oder ist das nur zum testen?

von Philipp G. (geiserp01)


Lesenswert?

Jörg R. schrieb:
> Nur mal aus Interesse. Versorgst Du den Arduino tatsächlich mit einem 9
> Volt Block? Oder ist das nur zum testen?

Ist ja auch zulässig solange er den dafür vorgesehenen Eingang benutzt.

von Harald W. (wilhelms)


Lesenswert?

Philipp G. schrieb:

>> Nur mal aus Interesse. Versorgst Du den Arduino tatsächlich mit einem 9
>> Volt Block? Oder ist das nur zum testen?
>
> Ist ja auch zulässig solange er den dafür vorgesehenen Eingang benutzt.

Ja, es war schon immer etwas teurer, einen besonderen Geschmack zu 
haben.

von Philipp G. (geiserp01)


Lesenswert?

Harald W. schrieb:
>>> Nur mal aus Interesse. Versorgst Du den Arduino tatsächlich mit einem 9
>>> Volt Block? Oder ist das nur zum testen?
>>
>> Ist ja auch zulässig solange er den dafür vorgesehenen Eingang benutzt.
>
> Ja, es war schon immer etwas teurer, einen besonderen Geschmack zu
> haben.

?? Wie meinst Du das? Weil er die 4V überm Linearregler verbrät? Ist 
nicht mal ein 1/10 Watt.

von Harald W. (wilhelms)


Lesenswert?

Philipp G. schrieb:

> ?? Wie meinst Du das? Weil er die 4V überm Linearregler verbrät? Ist
> nicht mal ein 1/10 Watt.

Naja, 9V-Blöcke haben das schlechteste Preis/Energie-Verhältnis
von allen Standardbatterien.

von Philipp G. (geiserp01)


Lesenswert?

Harald W. schrieb:
>> ?? Wie meinst Du das? Weil er die 4V überm Linearregler verbrät? Ist
>> nicht mal ein 1/10 Watt.
>
> Naja, 9V-Blöcke haben das schlechteste Preis/Energie-Verhältnis
> von allen Standardbatterien.

Naja, dass die Schaltung nicht in der Curiosity eingebaut wird sollte ja 
klar sein.

von Wolfgang (Gast)


Lesenswert?

Ingo L. schrieb:
> Philipp G. schrieb:
>> Der Arduino wird 1024 ausgeben wenn 5V anliegen.
> Das sollte mich wundern... 2^10 sind zwar 1024 aber 0...1023.

So genau muss der Spannungsteiler erstmal sein, dass es sich lohnt, 
darüber zu diskutieren.

von Einer K. (Gast)


Lesenswert?

Wolfgang schrieb:
> So genau muss der Spannungsteiler erstmal sein, dass es sich lohnt,
> darüber zu diskutieren.

Falsche Sicht auf die Dinge!
Der Irrtum liegt tiefer.
Da helfen auch keine Nebelkerzen, oder sonstige Ablenkungsmanöver.

Fakt ist:
Der ADC wird niemals 1024 liefern.

Und nichts, absolut gar nichts, hat das mit irgendwelchen 
Spannungsteilern, oder ihrer Bemessung, zu tun.

von Jörg R. (solar77)


Lesenswert?

Ingo L. schrieb:
> Philipp G. schrieb:
>> Der Arduino wird 1024 ausgeben wenn 5V anliegen.
> Das sollte mich wundern... 2^10 sind zwar 1024 aber 0...1023.

Na ja, den Fehler hast du einen Betrag vorher doch auch gemacht!

Ingo L. schrieb:
> Markus H. schrieb:
>> die 768 sind dennoch 6.6v
> Unsinn. 7,5/(2*URef) * 1024

#####

Philipp G. schrieb:
> Jörg R. schrieb:
>> Nur mal aus Interesse. Versorgst Du den Arduino tatsächlich mit einem 9
>> Volt Block? Oder ist das nur zum testen?
>
> Ist ja auch zulässig solange er den dafür vorgesehenen Eingang benutzt.

Das war aber nicht der Hintergrund meiner Frage.

#####

Philipp G. schrieb:
> Harald W. schrieb:
>>> ?? Wie meinst Du das? Weil er die 4V überm Linearregler verbrät? Ist
>>> nicht mal ein 1/10 Watt.
>>
>> Naja, 9V-Blöcke haben das schlechteste Preis/Energie-Verhältnis
>> von allen Standardbatterien.

Die Antwort von Harald trifft es genau.

> Naja, dass die Schaltung nicht in der Curiosity eingebaut wird sollte ja
> klar sein.

Ne, woher sollte uns das klar sein? Besser wäre es wenn der TO die 
Fragen beantworten würde.

#####

Philipp G. schrieb:
> ?? Wie meinst Du das? Weil er die 4V überm Linearregler verbrät? Ist
> nicht mal ein 1/10 Watt.

Kommt auf den Strom an, den wir nicht kennen.

#####

Wolfgang schrieb:
> Ingo L. schrieb:
>> Philipp G. schrieb:
>>> Der Arduino wird 1024 ausgeben wenn 5V anliegen.
>> Das sollte mich wundern... 2^10 sind zwar 1024 aber 0...1023.
>
> So genau muss der Spannungsteiler erstmal sein, dass es sich lohnt,
> darüber zu diskutieren.

Der Einfluss der Umgebungstemperatur wurde noch nicht genannt;-)

: Bearbeitet durch User
von Manfred (Gast)


Lesenswert?

Philipp G. schrieb:
> 1024 / 2 = 512
> sonst gut.
Philipp G. schrieb:
> Rechne.

Wo lernt man, so schlecht zu rechnen und das falsche Ergebnis auch 
noch zu verteidigen?

-------

Dan schrieb:
> 7,5V / 2 = 3,75V entspricht 768 Bit (Das ist mein Unterschreitungswert)

Das kann man nachrechnen und passt - 1023 durch 5 mal 3,75.

> P.S: komischerweise lässt sich das Programm nicht auf den uC
> aufspielen?!

Schaue Dir die Fehlerausgabe der Arduino IDE an, der Fehler ist 
offensichtlich und kann von Dir eigenständig gefunden werden. Tipp: Ein 
"P".

Harald W. schrieb:
> Naja, 9V-Blöcke haben das schlechteste Preis/Energie-Verhältnis
> von allen Standardbatterien.

Damit hast Du zweifelsfrei recht, ich mag die auch nicht! Aber:
Dan schrieb:
> Ich programmiere zum ersten mal mit Arduino...

Unterstellen wir also, dass Dan erstmal Grundlagen bespielt, da finde 
ich diesen Aufbau vollkommen OK!

Im nächsten Schritt kann er den Wert auf Spannung umrechnen und über 
serial.print zum PC schicken, so und nicht anders fängt man an, zu 
lernen.

von Jörg R. (solar77)


Lesenswert?

Manfred schrieb:
> Harald W. schrieb:
>> Naja, 9V-Blöcke haben das schlechteste Preis/Energie-Verhältnis
>> von allen Standardbatterien.
>
> Damit hast Du zweifelsfrei recht, ich mag die auch nicht! Aber:
> Dan schrieb:
>> Ich programmiere zum ersten mal mit Arduino...
>
> Unterstellen wir also, dass Dan erstmal Grundlagen bespielt, da finde
> ich diesen Aufbau vollkommen OK!

Gerade wenn Dan mit dem Arduino anfängt ist der Hinweis auf eine 
"vernünftige" Stromversorgung sinnvoll. Die 9 Volt Batterie wird ihm bei 
den ersten Versuchen schnell einbrechen und für "Fehlmessungen" sorgen. 
Ob er da sofort an die Batterie denkt - oder den Fehler im Aufbau bzw. 
in der SW sucht?

Davon abgesehen wird er mit einer 9 Volt Batterie keine stabilen 
Messwerte erhalten. Bei dem Batterietyp kannst du zusehen wie die 
Spannung kontinuierlich absackt.
Die bleibt keine 15 Sekunden auf einem Wert stehen.

: Bearbeitet durch User
von Manfred (Gast)


Lesenswert?

Jörg R. schrieb:
> Gerade wenn Dan mit dem Arduino anfängt ist der Hinweis auf eine
> "vernünftige" Stromversorgung sinnvoll.

Einverstanden.

> Die 9 Volt Batterie wird ihm bei
> den ersten Versuchen schnell einbrechen und für "Fehlmessungen" sorgen.

Nö, der 1117 wird die internen 5V bis kurz über 6V Eingang noch recht 
ordentlich halten. Ob der aber 5,1 oder 4,9 Volt liefert - da muß dann 
das Multimeter ran und es wird hier erneut erklärt.

> Ob er da sofort an die Batterie denkt - oder den Fehler im Aufbau bzw.
> in der SW sucht?

Lerneffekt?

> Davon abgesehen wird er mit einer 9 Volt Batterie keine stabilen
> Messwerte erhalten. Bei dem Batterietyp kannst du zusehen wie die
> Spannung kontinuierlich absackt.
> Die bleibt keine 15 Sekunden auf einem Wert stehen.

Da bin ich nicht bei Dir. Ich habe diverse China-LED-DVM-Module, die 
sich aus der Meßspannung versorgen. So ein Ding zieht um 13..15mA und 
bietet sich an, mal fix einen 9V-Block zu testen. Du wunderst Dich, wie 
lange der Wert einigermaßen stabil ist, rechne mal 3 Volt Rückgang über 
50 Stunden.

von Einer K. (Gast)


Lesenswert?

Jörg R. schrieb:
> Gerade wenn Dan mit dem Arduino anfängt ist der Hinweis auf eine
> "vernünftige" Stromversorgung sinnvoll.
Natürlich!

Allerdings: Ein 9V Block funktioniert.
Wenn auch nur arg begrenzte Zeit.

Und für ein solches "Spannungsmessprojekt" schon fast ideal, denn man 
wird schnell Veränderungen sehen.
Naja...



Zur Spannungsmessung:
Ob es was mit der Arduino Denke zu tun hat, oder auch nicht, ist mir 
egal.
Ich würde es anders angehen!

Und zwar so, in etwa:
Vermutlich hat unser "Autor: Dan (Gast)" einen normalen Arduino mit 
16MHz und ATMega328P. Zumindest gehe ich hier davon aus.

Leitregel: (es mag Ausnahmen geben)
1. Vcc als Referenz für ratiometrische Messungen.
2. die interne Referenz für absolute Messungen

Dan möchte einen absoluten Wert messen.
Damit ist ein Irrtum im Entwurf erkannt.

Es ist die interne Referenz zu nutzen.

Die interne Referenz hat zwischen 1.00V und 1.20V, laut Datenblatt. Aber 
das recht stabil.
Um ein bisschen Reserve zu haben nimmt man Werte großzügig an.

Provisorische Festlegung:
Referenz 1.00V minimal
Batteriespannung 10.00V maximal

Also ist ein Spannungsteiler im Verhältnis 1k zu 9k voll ok, für die 
ersten Versuche. So bekommen wir jeden (voraussichtlich) möglichen 
Messwert im 10Bit Rahmen des ADC dargestellt.
Pingelige Perfektionisten, können das Verhältnis von mir aus noch 
verschönern/verbessern.
Höhere Widerstandswerte sind meiner Meinung nach nicht nötig, da ja nur 
bei Knopfdruck Strom fließt.

Verfahren: (Einpunktkalibrierung)
Primitiv Programm aufspielen, welches nur den ADC Wert aus gibt.
Dabei mit einem Voltmeter die Spannung am 9V Block messen.
Beide Werte merken, aufschreiben.

Daraus lässt sich die Steigung berechnen und mit Hilfe der Geraden 
Gleichung jedem ADC Wert eine Spannung zuordnen und ausgeben.
Das in Software gegossen, und  fertig ist die 9V Block Spannungsmessung.

Vorteil:
Kein großes Kümmern um die Toleranz der internen Referenz.
Auch die Toleranzen der Widerstände kümmert einen nicht.
Keine Rechnungen mit 1024 oder gar sinnloser Streit, ob jetzt 1023 oder 
1024, in der Rechnung stehen muss.

Den Kalibrierwert, kann man bei Einzelstücken ins Flash stecken.  In der 
Serie, mag das EEPROM die richtige Stelle sein.

von Jörg R. (solar77)


Lesenswert?

Manfred schrieb:
>> Die 9 Volt Batterie wird ihm bei
>> den ersten Versuchen schnell einbrechen und für "Fehlmessungen" sorgen.
>
> Nö, der 1117 wird die internen 5V bis kurz über 6V Eingang noch recht
> ordentlich halten. Ob der aber 5,1 oder 4,9 Volt liefert - da muß dann
> das Multimeter ran und es wird hier erneut erklärt.

Lt. DB von der Arduino Homepage benötigt der UNO min. 7 Volt wenn er 
über den Poweranschluss versorgt wird. Lt. DB ist vor dem 1117 noch eine 
Diode.


Arduino F. schrieb:
> Und für ein solches "Spannungsmessprojekt" schon fast ideal, denn man
> wird schnell Veränderungen sehen.

Die Frage ist ob der TO schnelle Veränderungen sehen will. Das vermute 
ich eher nicht. Aber da kann ich natürlich daneben liegen.

Mir ging es auch mehr darum das 9 Volt Blocks einfach eine schlechte und 
vergleichsweise teure Energiequelle sind.

Vorteil ist das sie klein ist und schnell kontaktiert werden kann.

Für erste Versuche in diese Richtung würde ich auch nicht die 
Batteriespannung messen. Ein Poti an Uref und GND, den Mittelabgriff an 
den ADC-Eingang.
Da hat man zum einen einen feststehen Wert - den man bei Bedarf aber 
schnell ändern kann.


> Ob er da sofort an die Batterie denkt - oder den Fehler im Aufbau bzw.
> in der SW sucht?

Lerneffekt?

Ja und Nein. Für erste Versuche kann es einen Neuling total in die Irre 
führen. Dann dreht man sich bei der Fehlersuche stundenlang im Kreis 
weil man nicht auf die Batterie als Ursache kommt.


Arduino F. schrieb:
> Keine Rechnungen mit 1024 oder gar sinnloser Streit, ob jetzt 1023 oder
> 1024, in der Rechnung stehen muss.

Korrekt;-)


Arduino F. schrieb:
> Vermutlich hat unser "Autor: Dan (Gast)" einen normalen Arduino mit
> 16MHz und ATMega328P. Zumindest gehe ich hier davon aus.

In der Zeichnung oben ist der UNO angegeben. Daher wirst Du mit deiner 
Vermutung richtig liegen.

: Bearbeitet durch User
von Philipp G. (geiserp01)


Lesenswert?

Jörg R. schrieb:
> Lt. DB von der Arduino Homepage benötigt der UNO min. 7 Volt wenn er
> über den Poweranschluss versorgt wird. Lt. DB ist vor dem 1117 noch eine
> Diode.

Das mag stimmen. Praxiserfahrung: Der UNO funzt sehr gut bis runter auf 
6V.

von Einer K. (Gast)


Lesenswert?

Philipp G. schrieb:
> Praxiserfahrung

Für die originalen UNOs wird wohl das gelten, was im Schaltplan zu 
finden ist.
Hoffen wir es mal..



Meine Praxiserfahrung:

Aber die Nachbauten...
Da findet man alles an Regler, was man überhaupt als Regler einsetzen 
kann.
Von daher sind irgendwelche "Praxiserfahrungen" nicht wirklich wertvoll. 
Nicht, weil sie falsch sind, sondern weil sie sich nicht (ungestraft) 
verallgemeinern lassen.
Und damit können sie Unbedarfte in die Irre leiten.

Bedenke:
Fehler, welche auf falschen Annahmen beruhen, sind meist schwer zu 
findende Fehler.

von Alex G. (dragongamer)


Lesenswert?

@ufuf
Du solltest vieleicht drüber nachdenken ein kurzes Tutorial zum Thema zu 
schreiben. Fehlt eigentlich nur noch ein Schaltplan.
Hab mir deinen Post jedenfalls mal in die bookmarks gelegt :)

: Bearbeitet durch User
von Ingo L. (corrtexx)


Lesenswert?

Jörg R. schrieb:
> Na ja, den Fehler hast du einen Betrag vorher doch auch gemacht!
Nö, Atmel sagt Vin/Vref * 1024. Wenn man keine Ahnung hat, einfach 
schweigen...

von Philipp G. (geiserp01)


Lesenswert?

Ingo hat völlig recht, der Range ist 1024 - rechnerisch ist das der 
Faktor. Gezählt wird aber von 0 - 1023.

Manfred schrieb:
>> 7,5V / 2 = 3,75V entspricht 768 Bit (Das ist mein Unterschreitungswert)
>
> Das kann man nachrechnen und passt - 1023 durch 5 mal 3,75.

1024!

: Bearbeitet durch User
von Einer K. (Gast)


Lesenswert?

Alex G. schrieb:
> @ufuf
> Du solltest vieleicht drüber nachdenken ein kurzes Tutorial zum Thema zu
> schreiben. Fehlt eigentlich nur noch ein Schaltplan.
> Hab mir deinen Post jedenfalls mal in die bookmarks gelegt :)

Einen herzlichen Dank, für die Blumen.

von Jörg R. (solar77)


Lesenswert?

Ingo L. schrieb:
> Jörg R. schrieb:
>> Na ja, den Fehler hast du einen Betrag vorher doch auch gemacht!
> Nö, Atmel sagt Vin/Vref * 1024.

Es ging darum das der Arduino keine 1024 als Ergebnis ausgibt.
Du solltest Zitate nicht aus dem Zusammenhang reißen.

> Wenn man keine Ahnung hat, einfach schweigen...
Geschenkt!

: Bearbeitet durch User
von Philipp G. (geiserp01)


Lesenswert?

Weder Ingo noch Jörg machen den Fehler, sondern:

> batteryValue = ((int32_t)analogRead(battery) * 1000l)/1023;
 if (batteryValue < 750 && batteryValue > 0)

und

>

> Das kann man nachrechnen und passt - 1023 durch 5 mal 3,75.

..Manfred.

von Jörg R. (solar77)


Lesenswert?

Philipp G. schrieb:
> Weder Ingo noch Jörg machen den Fehler, sondern:
>
>> batteryValue = ((int32_t)analogRead(battery) * 1000l)/1023;
>  if (batteryValue < 750 && batteryValue > 0)
>
> und
>
>>
>
>> Das kann man nachrechnen und passt - 1023 durch 5 mal 3,75.
>
> ..Manfred.

Egal wer einen Fehler gemacht hat. Ingo könnte es einfach und sachlich 
richtig stellen, ohne Seitenhieb. Es geht scheinbar nicht ohne....

von Philipp G. (geiserp01)


Lesenswert?

Das ist doch nix Neues in diesem Forum. Sowas nehme ich nicht mal mehr 
ernst.

von Manfred (Gast)


Lesenswert?

Jörg R. schrieb:
> Lt. DB von der Arduino Homepage benötigt der UNO min. 7 Volt wenn er
> über den Poweranschluss versorgt wird. Lt. DB ist vor dem 1117 noch eine
> Diode.

Ach ja, der dusselige Uno. Laut Schaltplan eine M7 = 1000 Volt-Typ in 
Sizilium.

Philipp G. schrieb:
> Das mag stimmen. Praxiserfahrung: Der UNO funzt sehr gut bis runter auf
> 6V.

Ob er dann noch die internen 5 Volt halten wird? In Dans Idee ist das ja 
seine Referenz und würde zu einem undefinierbaren Meßergebnis führen.

In einem Bastelaufbau hatte ich neulich einen Analogport über, den habe 
ich an die internen 3,3V geklemmt und rechne auf meine Ub zurück, mit 
recht mäßiger Genauigkeit.

In Anwendungen, wo ich tatsächlich messen will, nutze ich die interne 
Bandgap.

Philipp G. schrieb:
> Manfred schrieb:
>>> 7,5V / 2 = 3,75V entspricht 768 Bit (Das ist mein Unterschreitungswert)
>> Das kann man nachrechnen und passt - 1023 durch 5 mal 3,75.
> 1024!

Sehr gut, danke dass Du aufgepasst hast!

Arduino F. schrieb:
> Aber die Nachbauten...

In den im Internet gefundenen Schaltbildern "Uno mit CH340" sind Dioden 
eingezeichnet. Mein China-Board hat einen AMS1117-5 und keine Diode.

von Jörg R. (solar77)


Lesenswert?

Manfred schrieb:
> Jörg R. schrieb:
>> Lt. DB von der Arduino Homepage benötigt der UNO min. 7 Volt wenn er
>> über den Poweranschluss versorgt wird. Lt. DB ist vor dem 1117 noch eine
>> Diode.
>
> Ach ja, der dusselige Uno. Laut Schaltplan eine M7 = 1000 Volt-Typ in
> Sizilium

Jedenfalls hat Dan den UNO oben im Schaltbild.

Wenn die Schaltung steht - und eingesetzt wird - würde ich sowieso alles 
um den Atmega328P herumbauen. Ohne das UNO-Board....und ohne Diode.

: Bearbeitet durch User
von Manfred (Gast)


Lesenswert?

Jörg R. schrieb:
> Wenn die Schaltung steht - und eingesetzt wird - würde ich sowieso alles
> um den Atmega328P herumbauen. Ohne das UNO-Board....und ohne Diode.

Ich habe das als reines Übungsobjekt verstanden. Ich glaube, Dan hat's 
verschreckt, wie gut wir über eine triviale Anwendung streiten, der 
scheint hier weg zu sein.

von Jörg R. (solar77)


Lesenswert?

Manfred schrieb:
> Jörg R. schrieb:
>> Wenn die Schaltung steht - und eingesetzt wird - würde ich sowieso alles
>> um den Atmega328P herumbauen. Ohne das UNO-Board....und ohne Diode.
>
> Ich habe das als reines Übungsobjekt verstanden. Ich glaube, Dan hat's
> verschreckt, wie gut wir über eine triviale Anwendung streiten, der
> scheint hier weg zu sein.

Na ja, wir streiten nicht. Die Diskussion verläuft doch recht angenehm, 
im Vergleich zu anderen Threads sogar vorbildlich. Man muss auch nicht 
immer einer Meinung sein. Es sollte halt immer sachlich bleiben.

Das Dan scheinbar raus ist ist schade, aber auch normal. Viele TOs 
stellen Anfragen ein und reagieren dann nicht mehr. Es ist nur Schade um 
die Zeit derer die helfen wollten.

Ja, es ist wohl ein Übungsprojekt. Ansonsten könnte Dan mal genauer 
beschreiben was er machen möchte.

: Bearbeitet durch User
von Dan (Gast)


Lesenswert?

Manfred schrieb:
> Ich habe das als reines Übungsobjekt verstanden. Ich glaube, Dan hat's
> verschreckt, wie gut wir über eine triviale Anwendung streiten, der
> scheint hier weg zu sein.

Keine Sorge, ich bin nicht raus und mich hat auch niemand verschreckt. 
Ich war zeitlich verhindert.

Jörg R. schrieb:
> Das Dan scheinbar raus ist ist schade, aber auch normal. Viele TOs
> stellen Anfragen ein und reagieren dann nicht mehr. Es ist nur Schade um
> die Zeit derer die helfen wollten.

Ich war nur zeitlich verhindert, bin für alle Antworten und Hilfen sehr 
dankbar.

von Dan (Gast)


Lesenswert?

Manfred schrieb:
> Schaue Dir die Fehlerausgabe der Arduino IDE an, der Fehler ist
> offensichtlich und kann von Dir eigenständig gefunden werden. Tipp: Ein
> "P".

Das mit dem "P" habe ich kurz nachdem eröffnen des Threads gleich selber 
bemerkt und sofort ausgebessert. Das ist also leider nicht die Ursache 
dafür.
Aber evtl. hast du weitere Tips die mir helfen würden das Programm 
aufzuspielen ;-)

von Dan (Gast)


Lesenswert?

Ingo L. schrieb:
> (int32_t)analogRead(battery) * 1000l)/1023

Ich weiß leider immer noch nicht was das "int32_t" bedeutet und "1000l" 
?

von Einer K. (Gast)


Lesenswert?

>  (int32_t)
http://en.cppreference.com/w/cpp/types/integer
http://www.cplusplus.com/doc/tutorial/typecasting/

Du solltest alle Postings lesen.

Insbesondere diesen(meinen): 
Beitrag "Re: Batteriespannung mit Arduino auslesen"

Tipp:
Wäre der Beitrag falsch, hätte man mich hier erschlagen.
Und das geht hier ganz fix, wenn man Mist postet.


Das ist übrigens auch das einzige Verfahren, welches ich hier weiter, 
mit irgendwem, bespreche.

von Philipp G. (geiserp01)


Lesenswert?

Dan schrieb:
> Das mit dem "P" habe ich kurz nachdem eröffnen des Threads gleich selber
> bemerkt und sofort ausgebessert. Das ist also leider nicht die Ursache
> dafür.
> Aber evtl. hast du weitere Tips die mir helfen würden das Programm
> aufzuspielen ;-)

Welche Fehlermeldung kommt den? Mach doch mal einen Screenshot.

von Dan (Gast)


Lesenswert?

Jörg R. schrieb:
> Die Frage ist ob der TO schnelle Veränderungen sehen will. Das vermute
> ich eher nicht. Aber da kann ich natürlich daneben liegen.

Da hast du recht, ich will keine Änderungen sehen. Ich will lediglich, 
das die LED angeht wenn die Spannung der Batterie unter 7,5 Volt fällt. 
Nicht mehr und nicht weniger. Ich muss das nur als kleinen Lückenfüller 
in einem völlig anderem Projekt reinzwicken.

Ingo L. schrieb:
> batteryValue = ((int32_t)analogRead(battery) * 1000l)/1023;
>  if (batteryValue < 750 && batteryValue > 0)

Das hier lässt sich zwar auf den Arduino hochladen, allerdings 
funktioniert es nicht so wie es soll. Denn die LED leuchtet sofort und 
dauerhaft. Egal welche Spannung anliegt...

von Philipp G. (geiserp01)


Lesenswert?

Gib BatteryValue über den seriellen Port aus.

von Dan (Gast)


Lesenswert?

MaWin schrieb:
> Auch würde ich das Programm betriebssicherer machen: nicht dass ein
> einziger (eventuell Fehlmessung, z.b. der allererste) Messwert die LED
> immer einschaltet.

In diesem Punkt hast du vermutlich recht...die LED leuchtet dauerhaft. 
Wie könnte man das Programm betriebssicherer machen?

von Dan (Gast)


Lesenswert?

Philipp G. schrieb:
> Gib BatteryValue über den seriellen Port aus.

Wie meinst du das?

von Dan (Gast)


Angehängte Dateien:

Lesenswert?

Philipp G. schrieb:
> Gib BatteryValue über den seriellen Port aus.

schau mal bitte im anhang. seriellen port kann ich hier nicht auswählen

von bernte (Gast)


Lesenswert?

du hast das ding im falsche port stecken
stellt mal port 4 ein, stöpseln den arduino dann man and die front usb 
anschlüsse vom rechner
bei mir es es der obere der beiden, klappt aber auch nicht immer bei 
ersten mal

von Dan N. (noname88)


Lesenswert?

bernte schrieb:
> du hast das ding im falsche port stecken
> stellt mal port 4 ein, stöpseln den arduino dann man and die front usb
> anschlüsse vom rechner
> bei mir es es der obere der beiden, klappt aber auch nicht immer bei
> ersten mal

wieso? ich glaube hier liegt ein missverständnis vor. wie gesagt, das 
programm lässt sich einwandfrei aufspielen, nur leuchtet die LED 
dauerhaft.

Außerdem hab ich einen Laptop und verwende immer den gleiche USB-Port 
und das auspielen funktioniert immer

von Georg M. (g_m)


Lesenswert?

Dan N. schrieb:
> das programm lässt sich einwandfrei aufspielen, nur leuchtet die LED
> dauerhaft.

Und was zeigt der Serial Monitor?

https://www.arduino.cc/reference/en/language/functions/analog-io/analogread/

von Dan N. (noname88)


Lesenswert?

Georg M. schrieb:
> Dan N. schrieb:
>> das programm lässt sich einwandfrei aufspielen, nur leuchtet die LED
>> dauerhaft.
>
> Und was zeigt der Serial Monitor?
>
> https://www.arduino.cc/reference/en/language/funct...

hab jetzt leider keine zeit mehr...schau ich morgen.

von Erklärbärduino (Gast)


Lesenswert?

Dan schrieb:
> Philipp G. schrieb:
>> Gib BatteryValue über den seriellen Port aus.
>
> schau mal bitte im anhang. seriellen port kann ich hier nicht auswählen

(es sind solche Vorkommnisse welche Haareraufen und vermeintliche 
"Anfängerfeindlichkeit" d. Forums schüren...)

Schön von Anfang an, wie es aus der Grundlagendoku zu Arduino bereits zu 
erlernen ist:
Wenn der Arduino Uno / '328 uC "aus sich heraus guckt", sieht er eine 
Seriell asynchrone Schnittstelle (Pins Tx & Rx). Nach diesen ist 
Richtung PC (Entwicklungshost) ein USB-Seriell-Wandlerchip auf der 
Uno-Platine, damit Anschluss an zeitgenössische PCs möglich wird.

Wenn der PC durch sein USB auf den angesteckten Uno "rausguckt", sieht 
er letztlich auch eine Seriell asynchrone Schnittstelle.

Nach obigem Bildschirmbild eben 'COM4:' soweit alles passend & richtig.

Dieser Datenpfad PC-USB-seriell-uC dient nun mehreren Zwecke:
- identifikation des Uno als solcher am PC,
- download des kompilierten Programms PC->UNO [1]
- so das Programm auf dem Uno dafür geschrieben ist: Ausgabe vom Uno [2]
- so das Programm auf dem Uno dafür geschrieben ist: Eingabe an den Uno 
[2]

[1] nur in der kurzen Zeitspanne nach Reset d. Uno, solange der 
Bootloader d. Uno die Kontrolle hat; passiert das in dieser kurzen Zeit 
nicht so übergibt der Bootloader die Kontrolle über die Uno-HW an das 
Programm.

[2] siehe 'duino Beispiel 
<https://www.arduino.cc/en/Tutorial/ASCIITable>;


Doch noch die Gretchenfrage: warum muss das hier wiedermal vorgekaut 
werden, wo es doch bereits mehrfach anderswo nachzulesen ist?

von Philipp G. (geiserp01)


Lesenswert?

Dan schrieb:
>> Gib BatteryValue über den seriellen Port aus.
>
> Wie meinst du das?

Schreib im Loop das folgende:

Serial.println(batteryValue);

Dann compilieren und zu Laufzeit den Serial Monitor öffnen.

Eigentlich wundere ich mich, dass noch niemand das Thema Hysterese oder 
Temperaturkompensation hier eingeworfen hat. Ich meine, um den TO 
endgültig zu vergraulen. Jetzt ist es wieder eine Doktorarbeit geworden, 
dabei wollte er doch nur bei 7.5 eine LED leuchten lassen.

Nun, jetzt leuchtet die LED halt bei 7.48920343V @20C @60LH%

: Bearbeitet durch User
von Manfred (Gast)


Lesenswert?

Dan schrieb:
> Denn die LED leuchtet sofort und dauerhaft.

> if (batteryValue < 768 Lampe an.
Wo ist der Gegenstatus Lampe aus?

Dir fehlt also ein else größer 775 = Lampe aus.

Philipp G. schrieb:
> Eigentlich wundere ich mich, dass noch niemand das Thema Hysterese oder
> Temperaturkompensation hier eingeworfen hat. Ich meine, um den TO
> endgültig zu vergraulen.
> Nun, jetzt leuchtet die LED halt bei 7.48920343V @20C @60LH%

Könntest Du die Güte haben, aufzuhören, hier zu stänkern?

von Dan N. (noname88)


Lesenswert?

Manfred schrieb:
> Wo ist der Gegenstatus Lampe aus?
>
> Dir fehlt also ein else größer 775 = Lampe aus.

Theoretisch ist das nicht nötig, denn wo kein Signal ist leuchtet auch 
nichts. Aber ich habs rein interessehalber ausprobiert und trotzdem 
leuchtet die LED dauerhaft.

Philipp G. schrieb:
> Serial.println(batteryValue);

Auch das hilft leider nicht. LED leuchtet dauerhaft...


Hier mal mein aktuelles Programm:

int battery = A0;    // select the input pin for the battery
int ledPin = 13;      // select the pin for the LED
int batteryValue = 0;  // variable to store the value coming from the 
battery

void setup()
{
  pinMode(ledPin, OUTPUT);  // declare the ledPin as an OUTPUT
  pinMode(battery, INPUT);  // declare the battery as an INPUT
}

void loop()
{
  batteryValue = ((int32_t)analogRead(battery) * 1000l)/1023;

   Serial.println(batteryValue);

 if (batteryValue < 750 && batteryValue > 10)
  {
    digitalWrite( ledPin , HIGH);
  }
  else
  {
    digitalWrite(ledPin , LOW); //Kann meiner Meinung auch weggelassen 
werd
  }
}

von Schwarzseher (Gast)


Lesenswert?

Dan N. schrieb:
> batteryValue = ((int32_t)analogRead(battery) * 1000l)/1023;

Immer noch 1024.

0..1023 sind 1024 verschiedene Werte, 0 ist auch eine Zahl.

Ist zwar vom Ergebnis egal, aber warum falsch machen, wenn die richtige 
Lösung nicht mehr (eher weniger) kostet?


Bei Knoten im Gehirn: Gedankenexperiment mit einem 1-Bit, 2-Bit ADC 
machen, dann wird klar warum 2^x und nicht 2^x-1.

von Dan N. (noname88)


Lesenswert?

Hab jetzt noch Serial.begin(9600); beim void setup eingefügt.
Jetzt sehe ich im serial monitor durchlaufende Werte.

von Jörg R. (solar77)


Lesenswert?

Dan N. schrieb:
> Hab jetzt noch Serial.begin(9600); beim void setup eingefügt.
> Jetzt sehe ich im serial monitor durchlaufende Werte.

Welche?

von Dan N. (noname88)


Lesenswert?

Schwarzseher schrieb:
> Immer noch 1024.

Ja sorry...ist erledigt

Beitrag #5327645 wurde von einem Moderator gelöscht.
von Dan N. (noname88)


Lesenswert?

Jörg R. schrieb:
> Dan N. schrieb:
>> Hab jetzt noch Serial.begin(9600); beim void setup eingefügt.
>> Jetzt sehe ich im serial monitor durchlaufende Werte.
>
> Welche?

Verschiedene Werte zwischen 0 und 230. Und zwar völlig egal welche 
Spannung ich anlege. immer diese Werte

: Bearbeitet durch User
von Dieter F. (Gast)


Lesenswert?

Mach doch mal den Test von hier 
https://www.arduino.cc/en/Tutorial/ReadAnalogVoltage (leicht 
abgewandelt):
1
// the setup routine runs once when you press reset:
2
void setup() {
3
  // initialize serial communication at 9600 bits per second:
4
  Serial.begin(9600);
5
}
6
7
// the loop routine runs over and over again forever:
8
void loop() {
9
  // read the input on analog pin 0:
10
  int sensorValue = analogRead(A0);
11
  // Convert the analog reading (which goes from 0 - 1023) to a voltage (0 - 4,5V):
12
  float voltage = sensorValue * (4.5 / 1023.0);
13
  // print out the value you read:
14
  Serial.println(voltage);
15
}

und poste das Ergebnis.

Wenn das nicht geht hast Du ein Schaltungsproblem oder Dein Uno bzw. der 
Port haben ein Problem.

von Schwarzseher (Gast)


Lesenswert?

Dieter F. schrieb:
> float voltage = sensorValue * (4.5 / 1023.0);

Auch hier: 1024

Sh. oben.

Adc-Wert x bei einem n-Bit ADC bedeutet, dass die Analogspannung 
zwischen x*Ref/2^n und (x+1)*Ref/2^n liegt.


Für n=1 an den Fingern abzählen, für n=2 kontrollieren, für n=10 Glauben 
oder im Datenblatt nachlesen.

von Einer K. (Gast)


Lesenswert?

Schwarzseher schrieb:
> Auch hier: 1024
Unausrottbar!

Das ist keine Frage der Fakten, sondern des Gefühls.
Nach Faktenlage/Mathematisch, ist 1024 richtig.
Das Gefühl zieht einen nach 1023.

Und so hat jeder, für sich selber, die Pflicht, Gefühl und Realität, auf 
einen Nenner zu bringen.

Die fetteste Ursache für so viele schlechte Tutorials:
Der Anfänger an sich, ist bestrebt, das was er gerade gelernt hat, in 
die Welt zu posaunen. Denn der gerade erreichte Erkenntnisgewinn, 
verschafft einem eine tiefe innere Befriedigung, und daran möchte man 
den Rest der Welt großzügig teil haben lassen.
Außerdem festigt das wiederholen des gerade gelernten, das gerade 
gelernte.
Es ist also ganz normal/menschlich, so zu handeln.

von Dieter F. (Gast)


Lesenswert?

Schwarzseher schrieb:
> Für n=1 an den Fingern abzählen, für n=2 kontrollieren, für n=10 Glauben
> oder im Datenblatt nachlesen

Ja, lese mal im Datenblatt nach.

An n-bit single-ended ADC converts a voltage linearly between GND and V
REF in 2^n steps (LSBs). The lowest code is read as 0, and the highest 
code is read as 2^n-1.

Dann rechne mal "5V / 1024 * 1023" und berichte das Ergebnis (nicht 
gerundet).

von Einer K. (Gast)


Lesenswert?

Dieter F. schrieb:
> Ja, lese mal im Datenblatt nach.
In: 
http://ww1.microchip.com/downloads/en/DeviceDoc/Atmel-42735-8-bit-AVR-Microcontroller-ATmega328-328P_Datasheet.pdf
In "28.7. ADC Conversion Result" auf Seite 315 steht die Formel, und die 
darfst du auch gerne nach belieben umstellen.

Aber ich ahne jetzt schon was kommt:
Atmel ist doof
Die Formel ist falsch
Ihr seid sowieso alle doof
Nur ich habe recht.
IMMER.

Leitsatz:
> Irren ist menschlich
> Im Irrtum verharren ist Dummheit

(und jetzt darfst du den Boten töten)

von Dieter F. (Gast)


Lesenswert?

Arduino F. schrieb:
> IMMER.

Brauchst nicht rumzuschreien. Wenn Du nach der Formel rechnest wirst Du 
halt nie genau auf 5 V kommen - was ja nach dem ADC-Artikel auch korrekt 
sein soll:

"Hat die Spannung am Eingangskanal die Referenzspannung erreicht (stimmt 
nicht ganz), so liefert der ADC einen Wert von 1023."

von Dan N. (noname88)


Angehängte Dateien:

Lesenswert?

Also ich hab jetzt mal das Poti-Programm hochgeladen und im Anhang seht 
ihr die Ausgabe. Der Wert ist stabil. Also die Ports sind okay. Da hab 
ich ja die 5V vom Arduino verwendet.

Aber bei meinem Programm verwende ich ja zu Übungszwecken ein 
Labornetzteil.
Ich vermute mal, dass es an dem Netzteil liegt. Obwohl ich einen 
Externen Spannungsmesser dran habe und der zeigt mir einen stabilen Wert 
an. Aber im seriellen Monitor schwankt der Wert sehr stark.

Muss jetzt noch was ausprobieren...melde mich wieder.

von Schwarzseher (Gast)


Lesenswert?

Dieter F. schrieb:
> Dann rechne mal "5V / 1024 * 1023" und berichte das Ergebnis (nicht
> gerundet).

Ein bischen Runden muss ich schon,  4,995 V muss reichen. Punktlandung, 
Wunschergebnis.
Glatt 5V wäre falsch, dass ist nicht, was die Hardware macht.

Was du verstehen musst: Der ADC bildet eine unendliche Anzahl möglicher 
Analogwerte auf eine fixe Anzahl Digitalwerte ab. Deshalb entspricht 
jedem Digitalwert ein BEREICH von Analogwerten.

Im Fall von 0b1111111111 eben der Bereich von 4,995V … 5,000V
Im Fall von 0b0000000000 der Bereich von 0,000V … 0,0049V


Genau das kommt auch raus, wenn man hier
Schwarzseher schrieb:
> Adc-Wert x bei einem n-Bit ADC bedeutet, dass die Analogspannung
> zwischen x*Ref/2^n und (x+1)*Ref/2^n liegt.

n=10 und x=1023 oder x=0 einsetzt.

qed.


so: Wo sind deine Verständnisprobleme, @Dieter?
Oder bist du einer von denen, die nur Sachen glauben, die einem auf 
YouTube vorgetanzt werden?
Sorry. Zum Affen können sich andere machen.

von Georg M. (g_m)


Lesenswert?

Schwarzseher schrieb:
> 0..1023 sind 1024 verschiedene Werte, 0 ist auch eine Zahl.

Zwischen 0 und 1023 gibt es 1023 Abschnitte, nicht 1024.



Dieter F. schrieb:
> Dann rechne mal "5V / 1024 * 1023" und berichte das Ergebnis (nicht
> gerundet).

5V = 1024, nicht 1023. Daher die ganze Verwirrung. Das Maximum (hier 5V) 
ist mit 10 Bit nicht darstellbar.

von Georg M. (g_m)


Lesenswert?

Dan N. schrieb:
> Aber bei meinem Programm verwende ich ja zu Übungszwecken ein
> Labornetzteil.

GND zusammen?

von Schwarzseher (Gast)


Lesenswert?

Georg M. schrieb:
> Zwischen 0 und 1023 gibt es 1023 Abschnitte, nicht 1024.

du vergisst den Abschnitt ">1023".


Nachdem hier so viele Probleme mit großen Zahlen haben zu scheinen, 
nochmal mit nur einem Bit, Ref=5V .

ein 1-Bit ADC ist dann ein Komparator gegen 2.5V.

0.0V …  2.5V --> Bit=0
2.5V …  5.0V --> Bit=1


Größter Ausgabe Wert: 1 = 2^n-1
Anzahl verschiedene Werte: 2 = 2^n

Rückrechnen nach obiger Formel:

Schwarzseher schrieb:
> Adc-Wert x bei einem n-Bit ADC bedeutet, dass die Analogspannung
> zwischen x*Ref/2^n und (x+1)*Ref/2^n liegt.

Bit=0:
0*5V / 2 == 0V
(0+1)*5V / 2 == 2.5V

Bit=1
1*5V / 2 == 2.5V
(1+1)*5V / 2 == 5V


alles an einer Hand abrechenbar, keine Zahl > 5 dabei. Jetzt 
verständlich?

Schwarzseher schrieb:
> Für n=1 an den Fingern abzählen,
(check)

> für n=2 kontrollieren,

Hausaufgabe.
Bis auf "2^n" alles Grundschul-Mathe.

von Einer K. (Gast)


Lesenswert?

Schwarzseher schrieb:
> Nachdem hier so viele Probleme mit großen Zahlen haben zu scheinen,
Wie sagte ich eben?

Arduino F. schrieb:
> Unausrottbar!

Denn da ist mit Argumenten/Logik nichts zu erreichen.
Das kann nur der Betreffende mit sich selber abmachen.


Beispiel:

Da kommt die Ansage:
Dieter F. schrieb:
> Ja, lese mal im Datenblatt nach.

Und dann tut man das, findet seine Aussage bestätigt, teilt das mit, und 
es wird weiter dagegen gearbeitet.

> Ja, lese mal im Datenblatt nach.
Das eigene Argument, selbst entwertet.


--
Und das von einem Menschen, von dem ich weiß, dass er z.B. mit Arrays 
umgehen kann!
In Sachen Arrays hat man in etwa das gleiche Bild. Zumindest aus 
Mathematischer Sicht.
Ein Array mit dem höchsten Index, von 1023, hat 1024 Elemente.
Da kann er es rechnen.
Da würde einem ein Irrtum auch wohl deutlich auf die Füße fallen.

Hier ist es ein Tausendstel des Messwertes.
Das ist fast nichts, aber ist falsch.
Das Tausendstel wird nicht bemerkt, denn es geht im Rauschen unter.

von Manfred (Gast)


Lesenswert?

Dan N. schrieb:
> batteryValue = ((int32_t)analogRead(battery) * 1000l)/1023;
>
>  if (batteryValue < 750 && batteryValue > 10)

Der Sinn der Rechnung nach dem Auslesen erschließt sich mir nicht, da 
sollte doch nur batteryValue = analogRead(battery)stehen.

AnalogRead gibt einen Wert zwischen 0 und 1023 her, für 3,75V hatten wir 
die 768 errechnet.

768 * 10001 / 1023 = 7508, da muß die LED permanent aus bleiben - also 
raus mit der Umrechnung. Mit der Umrechnung würden Deine 230 einer 
Spannung von etwa 0,12V an A0 entsprechen.

Unbenommen dessen denke ich, dass da etwas in der Hardware faul ist.
Welche Spannung misst Du direkt am Uno zwischen A0 und GND?

von Dan N. (noname88)


Lesenswert?

Georg M. schrieb:
> Dan N. schrieb:
>> Aber bei meinem Programm verwende ich ja zu Übungszwecken ein
>> Labornetzteil.
>
> GND zusammen?

Oh verdammt! Fehler gefunden...naja Dummheit muss bestraft werden :-)
Hab total vergessen die Masse zusammenzuschalten!
Jetzt funktioniert es einwandfrei. Ab 7,4 Volt leuchtet die LED!

von Dan N. (noname88)


Lesenswert?

Eine Frage hab ich jetzt schon noch.

 batteryValue = ((int32_t)analogRead(battery) * 1000l)/1023;

Was bedeutet das "l" bei "1000l"  ??

Wenn ich das "l" weglasse, dann funktioniert es genauso.

von Einer K. (Gast)


Lesenswert?

Dan N. schrieb:
> Was bedeutet das "l" bei "1000l"  ??

l bedeutet long

(int32_t) ist auch ein Cast auf Long

Aus dem Grund:
Dan N. schrieb:
> Wenn ich das "l" weglasse, dann funktioniert es genauso.

Ich halte es meist für eine gute Idee, eine explizite Typekonvertierung 
zu verwenden. Damit gibt man dem Compiler keine Chance eigensinnig zu 
sein. Und man sieht ganz klar und ausgeschrieben, was passiert, bzw. 
passieren soll. (wenn man denn weiß, was l und Cast bewirken)

Bedenke, das heißt nicht, dass die interne/automatische/implizite 
Konvertierung schlecht wäre, oder gar fehlerhaft, sondern, dass der 
Programmierer sich nicht immer 100% darüber im klaren ist, was da 
passiert. Schlampigkeiten schleichen sich an solchen Stellen recht 
schnell ein, und rächen sich dann zu späterer Zeit.

von Dan N. (noname88)


Lesenswert?

Dankeschön, gut erklärt!

von Dan N. (noname88)


Lesenswert?

Danke nochmal an alle Beteiligten!

Ich habe dadurch mein Problem lösen können und zusätzlich einiges 
dazugelernt!

von Manfred (Gast)


Lesenswert?

Arduino F. schrieb:
>> Was bedeutet das "l" bei "1000l"  ??
> l bedeutet long
> (int32_t) ist auch ein Cast auf Long

Ich frage mich trotzdem was das soll!

Ich habe schon diverse Aufbauten gemacht, wo ich die Analogports des 
Arduino auslese - da mache ich analogRead und fertig, da kommt immer ein 
10_bit_integer raus.

von Einer K. (Gast)


Lesenswert?

Manfred schrieb:
> Ich frage mich trotzdem was das soll!

Die Rechenoperation(Multiplikation) würde ohne Cast oder/und Modifikator 
als Integer erfolgen, und damit einen Überlauf produzieren.
Und Überlaufe, können einem Streiche spielen.
Meist möchte man nicht, dass einem ein Überlauf einen Streich spielt.

von Manfred (Gast)


Lesenswert?

Arduino F. schrieb:
> Die Rechenoperation(Multiplikation) würde ohne Cast oder/und Modifikator
> als Integer erfolgen, und damit einen Überlauf produzieren.

> Und Überlaufe, können einem Streiche spielen.
> Meist möchte man nicht, dass einem ein Überlauf einen Streich spielt.

Solche "Streiche" haben mich schon viel Zeit gekostet, will man nicht 
haben.

Trotzdem bleibt offen, weshalb Du überhaupt rechnest. Dan will bei 
Unterspannung die LED schalten, da sehe ich keinerlei Bedarf an 
Rechnerei: AnalogRead, if Wert kleiner irgendwas Lampe an und fertig.

Würde man aus dem A/D-Wert einen lesbaren Spannungswert machen wollen, 
sähe das natürlich anders aus. Du hast es offenbar getan, mit dem Faktor 
1,023 komme ich auf die Zifernfolge 750.

von Einer K. (Gast)


Lesenswert?

Manfred schrieb:
> Trotzdem bleibt offen, weshalb Du überhaupt rechnest.

Ich?

DAS ist nicht meine Rechnung!
Ich distanziere mich ausdrücklich von solcher Art Rechnung!

Wenn ich jemals sowas publiziert haben sollte, dann möchte ich demütig 
um Verzeihung bitten.

Hier findest du das Lied, was ich dazu gesungen habe:
Beitrag "Re: Batteriespannung mit Arduino auslesen"

von Manfred (Gast)


Lesenswert?

Arduino F. schrieb:
> DAS ist nicht meine Rechnung!
> Ich distanziere mich ausdrücklich von solcher Art Rechnung!

Ich nehme alles zurück und behaupte das Gegenteil - diese (überflüsige) 
Berechnung stammt von
Ingo L. schrieb:
> Skaliere am Besten auf Volt:

> Wenn ich jemals sowas publiziert haben sollte, dann möchte ich demütig
> um Verzeihung bitten.

Hol' Dir 'n Bier und beruhige Dich wieder :-)

Die Sache mit dem "ell", was ich als "eins" gelesen hatte, behalte ich 
mal im Hinterkopf, bei solchen Rechnereien hat es mich schon 
angeschissen.

von Georg M. (g_m)


Lesenswert?


von Einer K. (Gast)


Lesenswert?

Manfred schrieb:
> behalte ich
> mal im Hinterkopf

Dann nimm bitte das große ell
Also z.B.: (4000L * 8000UL)
Dann leuchtet es etwas lauter.

von Alex G. (dragongamer)


Lesenswert?

Naja, zu Rechnen und auf Volt zu skalieren kann schon hilfreich sein, 
wenn man später mal den Wert schwind sinnvoll ändern will...
Der Compiler wird den Großteil davon sowieso wahrscheinlich 
wegoptimieren.

: Bearbeitet durch User
von Einer K. (Gast)


Lesenswert?

Alex G. schrieb:
> Naja, zu Rechnen und auf Volt zu skalieren kann schon hilfreich sein,
> wenn man später mal den Wert schwind sinnvoll ändern will..
Nett, dass du auch meiner Meinung bist!

Aber trotzdem lasse ich mich nicht dazu überreden, die 1024 in der 
Rechnung zu verwenden.
Auch nicht die falsche 1023.

von Jörg R. (solar77)


Lesenswert?

Manfred schrieb:
> Die Sache mit dem "ell", was ich als "eins" gelesen hatte, behalte ich
> mal im Hinterkopf, bei solchen Rechnereien hat es mich schon
> angeschissen.

Oje, darauf bin ich auch reingefallen?

von Joachim B. (jar)


Lesenswert?

Arduino F. schrieb:
> Dann nimm bitte das große ell

das ist angebracht wenn evtl. Werte Konstanten in ein Byte aka uint8_t 
passen würden aber die Rechnung den Wertebereich überschneidet und 
uint16_t oder gar uint32_t gebraucht wird.

hier wäre das "L" eher angebracht bei 1-200, denn 1000 und 4000 sind ja 
schon mal passend für uint16_t da würde der Compiler kaum ein uint8_t 
wählen.

Aber sicherer ist das L im Zweifel immer für Konstanten mit denen man 
rechnet.

Zur ADC Rechnung, vergesst doch die 1024 oder 1023 und auch die VCC

nehmt einfach die interne Ref. 1,1V oder 2,56V ein Poti von AREF nach 
GND und ermittelt die Spannung für ADC Wert 1000 und die Spannung für 
ADC Wert 10.
Dann feststellen der Steigung m und des Offset b (Geradengleichung)
https://de.wikipedia.org/wiki/Geradengleichung

m hier immer noch Steigung und Offset hier n genannt (ich kannte es noch 
als b)

wer dann noch den Mittelwert aus einigen ADC Messungen nimmt liegt schon 
mal deutlich besser und hat den Stress mit der 1024/1023 nicht mehr.

Größere Spannungen als die interne REF werden erst vor dem ADC per 
Spannungsteiler runter geteilt.

von Keller (Gast)


Lesenswert?

schau hier  etwa bei Minute 05.00
https://youtu.be/AgJegJ30Pj4

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.