Hallo ersteinmal,
wie schon im Titel erkennbar, möchte ich mir ein Universalnetzgerät bauen, also so eins, wo ich die Spannung mittels LM317 usw. einstellen kann. Das Schaltungstechnische ist hierbei nicht das Problem, wohl aber die Darstellung der zu messenden Werte.
Ich möchte auf einem 20x4-LCD (dieses: Neuhold Elektronik die Fundgrube für den Hobby-Elektroniker STN-Display 4x20 Zeichen) die Werte Spannung (in Volt), Strom (in Ampere und mA) sowie die Leistung (in Watt) ausgeben.
Ich habe die Analogeingänge A0 und A1 ersteinmal provisorisch an ein Poti angeschlossen, um irgendwelche Werte in den Arduino einzulesen. Die Skalierung auf 0...5V läuft auch, wo es hapert, ist die Ausgabe der Leistung sowie der mA.
Es wird zwar ein Zahlenwert angezeigt, der auch stimmt, jedoch habe ich das Problem, dass, wenn z.B. der Leistungswert ansteigt (>9,99), sich die Anzeige nach rechts verschiebt, soweit kein Problem. Verringert sich die Leistung wieder (auf einen Wert <10,0), so wird der Wert wieder um 1 Stelle nach links verschoben. Jedoch bleibt der letzte Wert sozusagen "picken", d.h. auch wenn die Leistung auf 0,00 geht, steht an der dritten Stelle, (die es eigentlich gar nicht geben darf) der letzte aktive Zahlenwert. Dann bleiben 0,006 Watt oder ähnliches stehen. DAS WILL ICH NICHT Ebenso ergehts mir bei den Milliampere.
Hat wer eine Idee, wie man das lösen könnte?
Anbei der Code (bitte nicht schimpfen, ist sehr eigenwilliger Programmierstil), der kommt auch so nicht in das fertige Programm XD
Schonmal Danke im Voraus
/***************************************
* *
* Programm: LCD-Anzeige für UNG *
* *
* Autor: autuino *
* *
* Datum: 2013_01_09 *
* *
* Version: 1.0 *
* *
***************************************/
#include <LiquidCrystal.h>
// Initialisierung des LCD
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
void setup() {
// Obligatorische Werbung nach dem Einschalten der Versorgungsspannung
lcd.begin(20, 4);
lcd.print("UNG");
lcd.setCursor(0, 1);
lcd.print("Universelles");
lcd.setCursor(0, 2);
lcd.print("Netz-");
lcd.setCursor(0, 3);
lcd.print("Geraet");
// Löschen der Werbung nach der vorgegebenen Zeit
lcd.cursor();
delay(2500);
lcd.clear();
}
void loop() {
// Einlesen der Spannung
int voltage = analogRead(A0);
// Skalierung des Eingangssignals auf die maximal möglichen 5V bei einer Auflösung von 10 bit
float u = voltage * (5.0 / 1023.0);
// Einlesen des Stromes
int current = analogRead(A1);
// Skalierung des Eingangssignals auf die maximal möglichen 5A bei einer Auflösung von 10 bit
float i = current * (5.0 / 1023.0);
int i_mil = i * 1000;
// Berechnen der Leistung nud Multiplikation mit 1,0 für die Darstellung auf 2 Kommastellen
float p = u * i;
// Ausgane an das LCD --> 1.: Stelle; 2.: Reihe
lcd.setCursor(0, 0);
lcd.print("Spannung:");
lcd.setCursor(10, 0);
lcd.print("[V] ");
lcd.print(u);
lcd.setCursor(0, 1);
lcd.print("Strom:");
lcd.setCursor(10, 1);
lcd.print("[A] ");
lcd.print(i);
lcd.setCursor(0, 2);
lcd.print("");
lcd.setCursor(10, 2);
lcd.print("[mA] ");
lcd.print(i_mil);
lcd.setCursor(0, 3);
lcd.print("Leistung:");
lcd.setCursor(10, 3);
lcd.print("[W] ");
lcd.print(p);
}