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... :-)
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?!
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.
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.
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...
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.
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 ?
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.
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...
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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;-)
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.
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.
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.
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.
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.
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.
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.
@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 :)
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...
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!
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.
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!
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.
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....
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.
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.
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.
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.
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.
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 ;-)
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.
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...
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?
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
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
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?
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%
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?
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
}
}
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.
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
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.
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.
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).
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."
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.
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.
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.
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.
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.
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?
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!
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.
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.
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.
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.
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.
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"
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.
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.
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.
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?
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.