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... :-)
Dan schrieb: > (batteryValue < 768 && batteryValue > 0) <= und 1024 / 2 = 512 sonst gut.
:
Bearbeitet durch User
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?
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.
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
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 ?
Dan schrieb: > Da komm ich nicht ganz mit: https://www.mikrocontroller.net/articles/Festkommaarithmetik
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.
:
Bearbeitet durch User
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.
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 |
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.
Markus H. schrieb: > die 768 sind dennoch 6.6v Sicher? Wie gesagt, ich gehe von einer vollen Batterie mit 9,5 Volt aus...
Philipp G. schrieb: > Der Arduino wird 1024 ausgeben wenn 5V anliegen. Das sollte mich wundern... 2^10 sind zwar 1024 aber 0...1023.
Ingo L. schrieb: >> die 768 sind dennoch 6.6v > Unsinn. 7,5/(2*URef) * 1024 Fehler gefunden. Zwischen den Ohren.
Nur mal aus Interesse. Versorgst Du den Arduino tatsächlich mit einem 9 Volt Block? Oder ist das nur zum testen?
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;-)
:
Bearbeitet durch User
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.
:
Bearbeitet durch User
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.
:
Bearbeitet durch User
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 :)
:
Bearbeitet durch User
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!
:
Bearbeitet durch User
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!
:
Bearbeitet durch User
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....
Das ist doch nix Neues in diesem Forum. Sowas nehme ich nicht mal mehr ernst.
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.
:
Bearbeitet durch User
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.
:
Bearbeitet durch User
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 ;-)
Ingo L. schrieb: > (int32_t)analogRead(battery) * 1000l)/1023 Ich weiß leider immer noch nicht was das "int32_t" bedeutet und "1000l" ?
> (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.
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?
Philipp G. schrieb: > Gib BatteryValue über den seriellen Port aus. schau mal bitte im anhang. seriellen port kann ich hier nicht auswählen
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 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/
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.
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%
:
Bearbeitet durch User
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.
Hab jetzt noch Serial.begin(9600); beim void setup eingefügt. Jetzt sehe ich im serial monitor durchlaufende Werte.
Dan N. schrieb: > Hab jetzt noch Serial.begin(9600); beim void setup eingefügt. > Jetzt sehe ich im serial monitor durchlaufende Werte. Welche?
Beitrag #5327645 wurde von einem Moderator gelöscht.
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
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.
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).
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)
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.
Dan N. schrieb: > Aber bei meinem Programm verwende ich ja zu Übungszwecken ein > Labornetzteil. GND zusammen?
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.
Danke nochmal an alle Beteiligten! Ich habe dadurch mein Problem lösen können und zusätzlich einiges dazugelernt!
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.
Manfred schrieb: > behalte ich > mal im Hinterkopf Dann nimm bitte das große ell Also z.B.: (4000L * 8000UL) Dann leuchtet es etwas lauter.
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
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.