Batteriespannung mit Arduino auslesen

Gast #5324081
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... :-)
Angehängte Dateien:
Gast #5324118
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.
Gast #5324131
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.
Gast #5324137
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.
#5324389
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.
Gast #5324544
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.
#5324624
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;-)
Gast #5324726
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.
#5324737
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.
Gast #5324776
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.
Gast #5324827
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.
#5324860
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.
Gast #5325309
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.
#5325682
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....
Gast #5325947
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.
#5325987
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.
Gast #5326094
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.
#5326107
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.
Gast #5326379
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.
Gast #5326386
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 ;-)
Gast #5326450
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.
Gast #5326474
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...
Gast #5326509
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?
Gast #5326586
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
#5326590
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
Gast #5326725
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?
#5326729
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%
Gast #5327240
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?
#5327630
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
  }
}
Gast #5327636
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.
Beitrag #5327645 wurde von einem Moderator gelöscht.
Gast #5327658
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.
Gast #5327669
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.
Gast #5327724
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.
Gast #5327740
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).
Gast #5327769
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)
Gast #5327798
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."
#5327801
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.
Angehängte Dateien:
Gast #5327802
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.
Gast #5327820
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.
Gast #5327827
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.
Gast #5328060
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?
Gast #5328147
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.
Gast #5328406
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.
Gast #5328425
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.
Gast #5328485
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.
Gast #5328500
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.
Gast #5328520
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.
#5328552
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren