Volt, Ampere, Watt, Temperatur (und evtl. Uhrzeit) auf LCD ausgeben

Um mich mit der Materie vertraut zu machen, möchte ich einem Labornetzteil ein 20 x 4 Display spendieren. Darauf sollen Volt, Ampere, Watt, 2 x Temperatur und wenn es trotzdem noch übersichtlich bleibt, auch die Uhrzeit angezeigt werden. Ich möchte ungern das Rad neu erfinden. Daher möchte ich eine bereits funktionierende Lösung kopieren.

Hierzu habe ich mit der großen Suchmaschine nach passenden Seiten gesucht, auf denen sowohl ein Sketch als auch die benutzte Hardware, so wie deren Anschluss an den Arduino gezeigt werden. Leider bin ich nicht fündig geworden. Entweder wurde nur die Software so wie das Ergebnis auf dem Display oder es wurde der Anschluss an den Arduino gezeigt.

Kennt ihr eine Seite (möglichst deutschsprachig), auf der mal beides gezeigt wird? So wie ich das bisher verstanden habe, könnte ich mehrere Sketches miteinander kombinieren, so dass ich mir die Lösungen von verschiedenen Seiten zusammen suchen kann.

Bestellt habe ich mir für das Projekt bisher einen Arduino Uno, ein Display, ein paar DS 18S20 und ein paar LM 35 DZ (weniger als 0 und mehr als 100 Grad werde ich nicht messen müssen). Steckboard, Verkabelung, Widerstände, Spannungsversorgung, Transistoren, etc. sind vorhanden. Multimeter, Oszilloskop, etc. ebenfalls.

An welchen Pins darf ich überhaupt externe Spannungen anlegen (A5 ? ) und wie hoch dürfen die sein??

Wie immer empfehle ich den Einstieg als Neuling - egal in welchem Forum - mit einem freundlichen "Hallo".
Des weiteren empfehle ich die Beispielsketches aus der IDE, die weisen Dir schon den Weg.
Dazu noch eine Portion Theorie und Du weißt wo es langgeht. Da werden dann auch solche Fragen erschöpfend erläutert "wie messe ich Analogspannungen und wie hoch dürfen die sein".
Der arduino Playground ist eine große Fundgrube für Dich, da muss hier niemand copy/paste machen.

Als Gelegenheitsbastler sollten Dir die Grundlagen eh klar sein, also Vin nicht größer als Vcc ...

Grüße
Klaus

Hallo Gelegenheitsbastler,

bevor Du das ganze angehst, solltes Du Dich mit der Schaltung des zu verwendenden Netzteils befassen!

Es gibt nämlich auch Netzteilschaltungen mit schwebender Masse, die kannst Du dann schon nicht mehr direkt mit dem Arduino verbinden, da benötigst Du dann eine galvanische Trennung, am besten dann über SPI und Induktivkoppler mit externen A/D-Wandlern (z.B. MCP3201 mit Induktivkoppler ADuM1401).

Des weiteren wirst Du das Signal des Fühlerwiderstands für den Strom verstärken müssen, sonst müsstest Du ja bei maximalem Strom einen Spannungsabfall von 5V über dem Fühlerwiderstand haben!

Als Display kannst Du evtl. auch ein grafisches Display mit KS0108-kompatiblem Controller ins Auge fassen, die können bei einer Auflösung von 128x64 Pixel bis zu 8 Zeilen zu 21 Zeichen darstellen, die GLCD-Library findet Du auf der Arduino-Seite.

Gruß

Martin

Hallo Klaus,

ja, das Hallo habe ich wohl vergessen, das muss ich zu meiner Schande gestehen. Zur Ehrenrettung sei erklärt, wie es dazu kam. Ich habe meinen ersten Beitrag (mit Hallo) noch viel länger geschrieben. Dann gab es Abendessen. Danach habe ich weiter getippt und gesendet. Ja, hätte ich vorher mal lieber den Text kopiert. Der Timeout sorgte dafür, dass ich alles nochmal tippen musste. Diesmal ist der Beitrag kürzer und ich habe das Hallo vergessen, da ich mich ziemlich geärgert habe. Das dazu.

Den von dir angegebenen arduino Playground habe ich völlig übersehen. Das steht oben links so klein, dass ich es wirklich... Vielen Dank für den Tip! Da stehen ja noch viel genialere Sachen drin als ich mir bisher so ausgedacht habe XD

Die Beispiele in der IDE habe ich mir angeschaut, aber nicht das Passende gefunden. Daher meine Frage nach einer passenden Seite. Es ist ja nun nicht so, dass ich sage "Ich hätte gerne... ...wer macht das für mich"

Ich werde mich jetzt erstmal ausgiebig im Playground umsehen. Aber da kommen dann sicher noch ganz andere Fragen als bisher :wink:

Frank

edit:
@Martin: Die Schaltung ist soweit bekannt. Das geht schon. Aber der Spannungsabfall über dem Shunt ist natürlich westentlich kleiner als 5 Volt, da darüber auch schon mal 50 A laufen. Das habe ich auch schon überlegt, wie ich die Spannung linear exakt anheben kann. Das mit dem Display werde ich mir morgen in Ruhe anschauen. Vielen Dank für die Tips!

Hallo Frank,

die Spannung über dem Shunt kannst Du ja mit einem OP verstärken.

Dazu empfiehlt sich dann ein Einfach-Typ mit herausgeführten Anschlüssen zum Nullpunktabgleich (z.B. TL071).

Die symmetrische Spannung für den OP kannst Du evtl. über einen kleinen Gleichspannungswandler aus der 5V-Versorgung des Arduino erzeugen, da brauchts ja nur ein paar Milliampere.
Am besten das ganze dann mit einstellbarer Verstärkung, dazu Spindeltrimmer verwenden.

Gruß

Martin

Wenn Du nicht unbedingt alle Werte ständig brauchst kannst Du auch ein preiswertes 2- oder 4-zeiliges LCD nehmen und dann die Werte abwechselnd anzeigen. Ist halt abhängig davon, was Du wie und in welcher Genauigkeit darstellen möchtest.
Bezüglich Einstieg: AnalogInput aus den Beispielsketches ist m.E. schon ein guter Start, Du wirst Deine Messgrößen ja als analoge Spannungen vorliegen haben?

Grüße
Klaus

Jeder Meßwert auf einem Display. Ich habe momentan 4 Stück für meine Temperaturmessungen an einem UNO. Alle über I2C.

Diese grafischen Displays überzeugen mich bezüglich der Lesbarkeit gar nicht. Ist alles so verwaschen, sprich wenig Kontrast und wenig konturenreich. Und das was schwarz sein soll ist so ein verwaschenes Grau.

Micky

Guten Morgen zusammen,

nachdem ich noch ein paar Stunden darüber (und Playground) gebrütet habe, was ich so alles mit dem Arduino anstellen werde, sind doch einige Änderungen zusammen gekommen. Ich werde nicht das Labornetzteil mit einem LCD bestücken, sondern eine Stromsenke. Die befindet sich noch im Rohbau, funktioniert aber schon. Folgendes werde ich versuchen umzusetzen:

1 ) 20 x 4 LCD an Arduino anbinden (bin mir noch nicht schlüssig, ob I2C oder nicht - verträgt sich das mit dem RTC Modul am gleichen Bus? )
2 ) RTC mit einem fertigen Modul anschließen und Uhrzeit auf LCD ausgeben (ebay 330868967962) [2 x analog, SDA, SCL]
3 ) 3 Stück DS18S20 anschließen und Werte über LCD ausgeben [1 x digital]
4 ) Spannung über Spannungsteiler ermitteln und auf LCD ausgeben [1 x analog]
5 ) Strom (Spannungsabfall über Shunt) über OP anheben und auf LCD ausgeben [1 x analog]
6 ) Daten zur grafischen Darstellung über USB an LogView übermitteln
7 ) Vorhandenes 10-Gang Poti durch digitales Poti MCP 4151 ersetzen (habe noch keine Idee, wie ich das anstellen soll. Die Spannung, die das bisherige Poti regelt beträgt 12 Volt und nicht änderbar) [2 x digital]
8 ) Feste Szenarien (z. B. X-Sekunden 5 A, Y-Sekunden 10 A, etc.) programmieren, mit denen die Stromsenke die Geräte/Akkus belastet
9 ) Buzzer anschließen, der ertönt, sobald vorgegebene Werte überschritten werden [1 x analog]
.
.

@Martin:
Über der Lösung mit dem OP brüte ich noch. In der Schaltung ist ein 4fach OP verbaut, bei dem noch zwei OPs frei sind.

@Klaus:
Ich hoffe, dass alles auf ein 20 x 4 Display passt, ohne umschalten zu müssen. Das könnte dann beispielhaft (die Bindestriche sollen Leerzeichen werden) so aussehen:

14:32--01.01.2013
12,45 V--10,7 A
133 Watt
34 'C--35 'C--34'C

@Micky
Ich bezweifle ebenfalls, ob die (bezahlbaren) grafischen Displays einen so guten Kontrast haben wie die einfachen LCD Displays. Daher werde ich auch erst einmal beim einfachen 20 x 4 Display anfangen. Wie ich oben schon geschrieben habe, bin ich mir nur noch nicht schlüssig, wie ich es ansteuern soll. Grob überschlagen müsste ich für meine Anwendungen für beide Anschlussoptionen genügend Pins haben. Präventiv habe ich mir schon mal eine kleine PCB zum Anlöten an das Display geordert, um es via I2C anzusprechen.

Frank

Gelegenheitsbastler:
1 ) 20 x 4 LCD an Arduino anbinden (bin mir noch nicht schlüssig, ob I2C oder nicht - verträgt sich das mit dem RTC Modul am gleichen Bus? )

Sicher. Dafür ist I2C ja da. Die ICs haben unterschiedliche Adressen und kommen sich dadurch nicht in die Quere. Ist einfach schöner anzuschließen.

Du könntest theoretisch sogar mehrere Displays am gleichen Bus anschließen solange man die Adressen ändern kann. Bei meinem I2C Display geht das.

Über der Lösung mit dem OP brüte ich noch. In der Schaltung ist ein 4fach OP verbaut, bei dem noch zwei OPs frei sind.

Verwende dafür am Besten einen etwas besseren OP und nicht ein einfaches 741-Derivat (z.B. LMx24). Der OP-08 z.B hat schon von Haus aus eine sehr geringe Offset-Spannung. Rail-to-rail wäre natürlich auch praktisch wenn man nur mit 5V arbeitet.

Mit ein bißchen löten kann man bei den I2C Adaptern, die man direkt auf das LCD Display steckt, mehrere verschiedene Adressen einstellen.

Ich habe vier LCD Displays an einem UNO laufen. Für jeden Meßwert eins.

Micky

Könntest du mal ein Foto von deinem Gerät einstellen? Inzwischen denke ich, dass das gar keine so schlechte Idee ist, mehrere Display zu nutzen. Die Adapter habe ich bestellt. Aber da es günstig sein sollte, dauert es jetzt 3-4 Wochen. Derweil muss ich mich mit dem 2zeiligen und 16stelligen Display begnügen, dass ich hier habe.

Es gibt eine erste Erfolgsmeldung -> s. Anhang :slight_smile:

Damit sind Punkt 1 und 2 schon mal erledigt. Wobei ich es gerne noch etwas anders hätte. Vor dem Datum soll der Wochentag stehen. Laut dieser Beschreibung Arduino Playground - Time geht das aber nicht. Das einzige, was ich hin bekommen habe, ist eine 05 für Donnerstag. Ich hätte aber gerne ein Do. dort stehen. Wie kann man das Problem lösen? Ich bin absoluter Frischling was das Programmieren angeht und noch nicht viel weiter als "Hello World" gekommen, daher hoffe ich um etwas Nachsicht. Die ursprünglichen Idee habe ich von hier macherzin.net und dann so lange abgeändert, bis es so aussah, wie es jetzt ist.

Frank

Die RTC zählt die Tage nur so mit (z.B. So = 1, Mo = 2...). Da musst du dir einfach eine Routine schreiben die dir Nummern in Strings umsetzt. Das ginge z.B. über ein String array. Oder einfach eine Switch-Anweisung die je nach der Nummer einen anderen String aufs Display schreibt. Oder if/else wenn dir das lieber/verständlicher ist.

int dayofweek = weekday();

switch(dayofweek)
{
    case 1:
      lcd.print("So");
      break;
    case 2:
      lcd.print("Mo");
      break;
.
.
.
}

Das ist nur ein übersichtlicherer Weg um eine lange if/else Reihe zu schreiben:
http://arduino.cc/en/Reference/SwitchCase

Genial, das funktioniert! Danke! Allerdings war noch ein kleiner Fehler drin. Ich habe es jetzt so gemacht:

.
.
.
{
   case 01:
    lcd.print("So. ");
     break;
   case 02:
     lcd.print("Mo. ");
     break;
.
.
.

Morgen gehts weiter. Gute N8.

Frank

Ja, das hatte ich auch gerade gesehen. Die Time Library definiert 1 als Sonntag und 7 als Samstag. Bei mir verwende ich das nicht, und es gibt auch RTC Klassen die Sonntag als 0 haben.

Da gibt es auch ein enum, das aber nirgends verwendet wird:

typedef enum {
    dowInvalid, dowSunday, dowMonday, dowTuesday, dowWednesday, dowThursday, dowFriday, dowSaturday
} timeDayOfWeek_t;

Die führende Null hast du übrigens nur bekommen weil du das wahrscheinlich über lcd.printDigits ausgegeben hast. Das ist eigentlich dazu da die führenden Nullen bei Zeit und Datum zu erzeugen, damit die Ausgabe immer gleich breit ist. Für andere Ausgaben solltest du einfach lcd.print nehmen.

Guten Morgen zusammen,

da ich die Abkürzungen der Wochentage gerne auf deutsch haben möchte, kann es ruhig so bleiben, wie es ist.

Weil die Temperatursensoren noch nicht geliefert sind, habe ich mich an der Wiedergabe von Spannungen versucht. Das war bisher leider nicht sehr erfolgreich. Ich möchte einen Spannungsbereich von 0 bis etwa 30 Volt darstellen. Dazu habe ich mir testweise einen Spannungsteiler (ca. 25K und 2,5K) gebaut. Als Sketch habe ich diesen verwendet: Measuring Voltage with Arduino

Leider schwankt die 5 V Spannung etwas. Sie ist ohne Display höher als mit. Ich habe die 5V-Spannung mit Display gemessen und den Wert in den Sketch eingegeben. Ebenso habe ich den Multiplikator mit Vin und Vout ermittelt und eingegeben. Danach habe ich eine Referenzspannungsquelle (2.5, 5.0, 7.5, 10.0 V) angeschlossen. Bei 2,5 Volt passt die Anzeige im Monitor. Aber je höher die Spannung ist, desto mehr driftet die Anzeige noch oben ab. Bei 10 Volt wurden 10,2xx Volt angezeigt. Die Referenzspannungsquelle ist recht genau. Daran liegt es nicht. Die Fluke-Multimeter sind zwar älter aber zeigen bis auf die letzte der 4 1/2 Stellen den gleichen Wert an. Daran liegt es also auch nicht, denke ich.

Dann habe ich nach einer Lösung im Netz gesucht und das hier gefunden: http://klaas.homeip.net/ArduinoWiki/doku.php?id=arduino:sensoren:spannung

Die Ausgabe auf dem Monitor zeigt exakt 1,10 Volt ohne Schwankungen an. Damit hätte ich schon mal eine genaue Referenz. Aber wie bringe ich dem Prozessor bei, dass er meine Spannung aus dem Spannungsteiler auf diese Referenz beziehen soll? Trotz langer Suche habe ich keinen passenden Sketch gefunden. Kennt von euch jemand einen passenden Link?

Frank

Das scheint mehr ein elektronisches Problem zu sein.

Betreibst du das an USB? Damit ist leider die Betriebsspannung nur etwa 4,88V. Am besten daher mit Netzteil betreiben wenn man den ADC verwendet. Da ist die Spannung wahrscheinlich generell auch stabiler.

Dann lese dir nochmal den ersten Link durch. Da ist dein Problem möglicherweise erklärt. Erhöhe mal die Werte der Widerstände. z.B. auf die 1M/100k wie in dem Beispiel. Wenn du im Endeffekt einen belasteten Spannungsteiler hast wird dessen Kennlinie nicht-linear, was genau dein Problem zu sein scheint.

Du kannst ruhig bei dem Code aus dem ersten Link bleiben. Der ist besser. Wenn du auf die 1.1V Referenz umsteigen willst, kannst du das auch dort einbauen (du musst dann aber den Spannungsteiler anpassen so dass die maximale Messspannung nur 1.1V ist). Du musst danach nur diese Zeile anpassen (die erste Zahl ist die Referenzspannung):
voltage = ((float)sum / (float)NUM_SAMPLES * 5.015) / 1024.0;

Und in dieser Zeile muss der genaue Quotient von Uein/U2 rein:
Serial.print(voltage * 11.132);

Ideal wären das bei 1M/100k genau 11. Aber da sieht man dass die Widerstände abweichen. Die haben eine gewisse Toleranz von 1-5%. Für ganz genaue Messungen gibt es daher Präzisionswiderstände mit nur 0,1% Toleranz.

Ansonsten sind kleine Spannungsschwankung bei Messungen u.U. nicht ungewöhnlich, da du im mV-Bereich misst. Dass kann man minimieren indem man mehrere Messungen durchführt und einem Mittelwert bildet. Das wird in dem ersten Sketch in der while-Schleife gemacht. Das hat aber nichts damit zu tun, dass der Wert bei höheren Spannungen immer mehr abweicht.

Ich habe den "Versuchsaufbau" mit den hochohmigeren Widerständen nochmal komplett neu gemacht. Die Werte im Sketch hatte ich bereits durch meine Werte ersetzt. Ich habe den Arduino jetzt zwar am USB-Port hängen, aber parallel dazu mit 10 Volt versorgt. Die Spannung an Pin 5V ist jetzt ziemlich stabil und wurde im Sketch geändert. Den Divisor vom Spannungsteiler habe ich nochmals überprüft. Das erste Ergebnis wurde bestätigt.

Ich habe alle Pins, die im Steckboard stecken nochmals gesäubert. Nach einer kurzen Testmessung habe ich das Multimeter entfernt. Dann ein Neustart und siehe da: Jetzt passen die Spannungen.

Woran auch immer es gelegen hat... Jetzt läuft es :slight_smile: Ein Aufspielen des Sketches zur Darstellung der Daten auf dem Display zeigte mir dann auch eine nicht mehr ganz so zappelige Voltanzeige. Die Durchschnittsdarstellung habe ich testweise mal von 10 auf 50 erhöht. Das macht die Anzeige ruhiger und das Ergebnis wahrscheinlich auch etwas genauer. Der Nachteil ist, dass schnelle Spannungsänderungen nicht so gut verfolgt werden können. Aber die treten bei meinem Projekt (eigentlich) nicht auf. Damit ist Punkt 4 auf meiner Liste erledigt. Punkt 5 ist so gut wie fertig. Am Wochenende kamen die "Thermometer". Das wird dann der nächste Punkt werden.

Frank

Hallo Zusammen,

ich hätte eine Frage bezüglich zu dem was marau geschrieben hat.

marau:
bevor Du das ganze angehst, solltes Du Dich mit der Schaltung des zu verwendenden Netzteils befassen!

Es gibt nämlich auch Netzteilschaltungen mit schwebender Masse, die kannst Du dann schon nicht mehr direkt mit dem Arduino verbinden, da benötigst Du dann eine galvanische Trennung, am besten dann über SPI und Induktivkoppler mit externen A/D-Wandlern (z.B. MCP3201 mit Induktivkoppler ADuM1401).

Des weiteren wirst Du das Signal des Fühlerwiderstands für den Strom verstärken müssen, sonst müsstest Du ja bei maximalem Strom einen Spannungsabfall von 5V über dem Fühlerwiderstand haben!

Und zwar, wie realisiere ich sowas? Ich habe nämlich auch das Problem, dass ich mit dem Arduino z.B. Spannungen von externen Batterien messen kann, aber nicht die Spannung von meinem Netzteil. Wieso ist mir auch nicht wirklich klar.

Kann mir das vielleicht jemand erklären? Ich bin Azubi zum Informationselektroniker für Geräte und Systemtechnik, aber so ganz verstehen tue ich das mit der schwebenden Masse nicht.

Schon mal Vielen Dank und Grüße

Peter