Go Down

Topic: Universelles Netzgerät mit Arduino & Co (Read 2126 times) previous topic - next topic

autuino

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: http://www.neuhold-elektronik.at/catshop/product_info.php?products_id=4222) 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  :smiley-yell: 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 ;-)


Code: [Select]

/***************************************
*                                      *
*    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);
}
 

BerndJM

Hi,

ganz simpel (vielleicht zu simpel?):
ich würde einfach am Anfang des Loops mittels lcd.clear() das Display immer wieder komplett löschen ...

Grüßle Bernd
Theoretisch gibt es keinen Unterschied zwischen Theorie und Praxis ...

mkl0815

Der einfachste Weg ist, bei Werten <10 einfach zwei Leerzeichen und bei Werten < 100 ein Leerzeichen nach dem letzten Zeichen anzuzeigen. Damit wird dann immer das letzte "klebende" Zeichen überschrieben. lcd.cleaer() führt ggf. zum Flackern auf dem LCD, jenachdem wie oft Du aktualisierts.
Wie misst Du denn den Strom? Über einen Shunt?
Mario.

autuino

Hallo Bernd,

das mit dem lcd.clear() habe ich schon probiert, das Ergebnis ist, wie Mario sagt: es flackert so stark, dass die Texte teilweise überhaupt nicht mehr zu lesen sind.

Hallo Mario,
ich dachte auch schon daran, den Wert zu vergleichen und dann die letzte(n) mit Space zu überschreiben.
Wie ich den Strom messe, weiß ich nocht nicht so genau. Einerseits würde sich, wie du sagst, ein Shunt relativ gut (und einfach  XD) funktionieren, andererseits gebe es auch sog. "Durchsteckwandler" mit denen auch eine reine DC-Spannung messbar ist. Zu was ich mich hier entscheide, weiß ich aber noch nicht.

Aber Danke für eure Tipps, vl. fällt noch jemanden was dazu ein, wie man das Display-Problem lösen kann.

Gute Nacht  :), Bernd (auch ich heiße so)

mkl0815


ich dachte auch schon daran, den Wert zu vergleichen und dann die letzte(n) mit Space zu überschreiben.

Und was stimmt mit dieser Lösung nicht? Da Du nach weiteren Lösungen fragst, scheint auch das für Dein Projekt nicht zu funktionieren?


Wie ich den Strom messe, weiß ich nocht nicht so genau. Einerseits würde sich, wie du sagst, ein Shunt relativ gut (und einfach  XD) funktionieren, andererseits gebe es auch sog. "Durchsteckwandler" mit denen auch eine reine DC-Spannung messbar ist. Zu was ich mich hier entscheide, weiß ich aber noch nicht.

Durchsteckwandler messen nur Wechselströme, soweit ich weiss, da sie wie ein Trafo arbeiten und auf ein sich änderndes Magnetfeld angewiesen sind. Außerdem messen sie Strom und keine Spannung. Dem Titel des Threads und Deinen Fragen nach scheint es, dass Du Netzstrom / -spannung (230V AC) messen willst. Deine Unsicherheit bei den Begriffen läßt aber darauf schliessen, dass Du noch nicht so viel Erfahrung hast. (Sorry falls ich mich irre). Daher der dringende Rat von Arbeiten am "normalen" Stromnetz abzusehen. Keine Bastelidee ist es wert sein Leben oder gar das Anderer zu gefährden.
Wenn Du da was messen willst, dann nur "berührungslos".
Beschreib doch mal, was Dein Projekt am Ende genau machen soll.
Mario.

ardubu

hallo autoino

ich habe dir mal die anzeige für ma und Leistung geändert und ein delay eingefügt, damit die letzte stelle nicht so rum zappelt.
die Probleme mit den klebenden zeichen bekommst du aber auch bei Spannung und Strom wenn du die 10 über und unterschreitest.

gruß ardubu

Code: [Select]
[#include <Wire.h>
#include <LiquidCrystal_I2C.h>

LiquidCrystal_I2C lcd(0x20,20,4);  // set the LCD address to 0x20 for a 16 chars and 2 line display

void setup()
{
 
  lcd.init();                      // initialize the lcd
  lcd.backlight();
  Wire.begin();
 
 
  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.clear();
  lcd.setCursor(0, 0);
  lcd.print("Spannung:");
  lcd.setCursor(10, 0);
  lcd.print("[V]  ");
  lcd.setCursor(14, 0);
  lcd.print(u);
  lcd.setCursor(0, 1);
  lcd.print("Strom:");
  lcd.setCursor(10, 1);
  lcd.print("[A]  ");
  lcd.setCursor(14, 1);
  lcd.print(i);
  lcd.setCursor(0, 2);
  lcd.print("");
  lcd.setCursor(9, 2);
  lcd.print("[mA] ");
  lcd.setCursor(14, 2);
  lcd.print("      ");
  lcd.setCursor(14, 2);
  lcd.print(i_mil);
  lcd.setCursor(0, 3);
  lcd.print("Leistung:");
  lcd.setCursor(10, 3);
  lcd.print("[W]  ");
  lcd.setCursor(14, 3);
  lcd.print("      ");
  lcd.setCursor(14, 3);
  lcd.print(p);
  delay(200);
}
/code]

michael_x

Eigentlich willst du auch kein angefügtes Leerzeichen rechts, sondern links, damit der Wert nicht vor/zurück springt.
Da hilft eigentlich eher
Code: [Select]

  lcd.setCursor(0, 3);
  lcd.print("Leistung: [W]       ");
  if (p < 10.0) lcd.write(' ');
  lcd.print(p,1); // nur Werte zwischen "0.0" und "24.9" mit 3 oder 4 Zeichen
  delay(200) ; // damit es nicht so zappelt, in echt natürlich wie "Blink Without Delay")


... oder dtostrf

autuino

@mkl0815:

soll jetzt kein vorwurf sein, dass mit dem "nicht so viel Erfahrung haben", --> ich habe eine abgeschlossene lehre als mess- und regelungstechniker sowie eine matura (= abitur) in anlagentechnik und industrieller elektronik (soll heißen: ich bin ingenieur), und arbeite seit nun mittlerweile 12 jahren als instandhalter, macht aber nichts :) , kann man ja nicht wissen. was ich außerdem noch "verheimlicht" habe: ich befasse mich erst seit relativ kurzer zeit (ca. 3 monate) mit µc-systemen, und da speziell mit dem arduino. nichts für ungut, kannst du ja nicht schmecken

zu dem durchsteckwandlern: wir haben solche teile auf lager (muss erst nachschauen, wer die liefert), mit denen sowohl ein gleichstrom gemessen werden kann. wie die genau funktionieren, hab ich mir noch nie angeschaut, weil ich dachte, dass ich die teile nie verwenden werde. aber wenn sie schon da sind, warum nicht...
ich vermute, dass das solche halleffekt-wandler wie diese http://www.ime-messgeraete.de/ime-d-nt-pdf/NT500.pdf sind. ausserdem gäbe es da ja immernoch die möglichkeit mit dem shunt.

nun zur funktion:
das netzgerät verfügt über eine einspeisung von:
230VAC/50Hz

ausgangsseitig (komplett galvanisch vom netz getrennt, eh klar):
konst. +/-15 volt für die versorgung von opv's
konst. 5 volt für z.b. arduino ;-)
konst. 24 volt zum testen von industrie(-taulichen) komponenten wie relais, schütz, auswertekarten,...
einstellbare spannung von 0...40 volt (1,2...37 mit dem lm317t),

die ausgangsströme sind im "vernünftigen" bereich, d.h. für die 5/15 volt reichen jeweils 300...500ma,  (sollts wegen der 78xx-reihe 1 ampere max werden, bin ich auch nicht böse)
die 24-volt-seite kann ich mit einem "handelsüblichen" netzteil, welche wir auch in unseren anlagen verbauen, realisieren.
die regelbare spannung kann je nach lm bis zu 2,2 amps ( sagt zumindest dieser dantewisch, wenn ich mich nicht verlesen habe: http://pdf1.alldatasheet.com/datasheet-pdf/view/53577/FAIRCHILD/LM317T.html ), aber auch die brauch ich nicht voll ausnutzen, ich will ein labornetzteil, kein kleinkraftwerk  :) .
zur einstellung des lm möchte ich jedoch kein poti (im konventionellen sinn) sondern vielleicht ein "digitales potentiometer" wie diese da: http://www.intersil.com/en/products/data-converters/digital-potentiometers--dcps-.html .
dann kann man die spannung so schön mittels taster rauf- und runterstellen, eventuell die werte auch mittels pc-interface verändern.

gemessen werden sollen bei diesem spektakel jedoch nur strom und spannung der variablen spannung, d.h. die max. 37v sowie die ~2amp. die leistung wird, wie in den vorhergehenden posts schon beschrieben, ja berechnet.

so, genug der worte,
nochmals, ich will hier niemanden zu nahe treten, auch dir nicht, mkl0815 aka. mario, ich wollte mit meinem 2. post lediglich die frage in den raum stellen, ob vielleicht noch jemand anderes eine weitere idee hat, wie man verschiedene sachen verwirklichen kann.

es sei nocheinmal gesagt, dass ich jeden vorschlag, der dieses thema betrifft, dankbar annehme und auch AUSPROBIERE.

danke euch nochmal und wünsche einen schönen abend ;-)
mfg bernd

mkl0815


@mkl0815:
soll jetzt kein vorwurf sein, dass mit dem "nicht so viel Erfahrung haben", --> ich habe eine abgeschlossene lehre als mess- und regelungstechniker sowie eine matura (= abitur) in anlagentechnik und industrieller elektronik (soll heißen: ich bin ingenieur), und arbeite seit nun mittlerweile 12 jahren als instandhalter, macht aber nichts :) , kann man ja nicht wissen. was ich außerdem noch "verheimlicht" habe: ich befasse mich erst seit relativ kurzer zeit (ca. 3 monate) mit µc-systemen, und da speziell mit dem arduino. nichts für ungut, kannst du ja nicht schmecken

Stimmt, das kann hier keiner wissen. (außer vielleicht Uwe mit seiner Kristallkugel  ;) )
Leider hatten wir hier im Forum schon häufiger Anfragen die mit einer recht großen Naivität und Unwissenheit Fragen nach diversen, potentiell gefährlichen Bastelarbeiten gestellt haben (Eingriff in KFZ-Elektrik und Motorsteuerung, Schalten von Netzstrom, etc.) Daher ist es immer besser einmal mehr zu warnen, als einmal zu wenig. Ich verstehe Deine Antwort daher auch nicht als Vorwurf. Schön das Du auf dem E-Technik Gebiet Erfahrung hast. Der Rest findet sich dann schon und Hilfe bezüglich Programmierung gibt es hier auf jeden Fall.


zu dem durchsteckwandlern: wir haben solche teile auf lager (muss erst nachschauen, wer die liefert), mit denen sowohl ein gleichstrom gemessen werden kann. wie die genau funktionieren, hab ich mir noch nie angeschaut, weil ich dachte, dass ich die teile nie verwenden werde. aber wenn sie schon da sind, warum nicht...

Das würde mich dann auch interessieren. Falls Du da Datenblätter ausgraben kannst, dann poste mal die Links dazu. Also von dem was Du dann verbaut hast. Falls es nicht doch ein Shunt wird  :)


nun zur funktion:
das netzgerät verfügt über eine einspeisung von:
230VAC/50Hz
... ich will ein labornetzteil, kein kleinkraftwerk  :) .


Ahh, jetzt verstehe ich das  :D
Mein erster Gedanke war, das Du ein Energiemessgerät (sowas wie ein Stromzähler) bauen willst. Soll der Strom auch begrenzt werden wie bei einer KSQ, oder nur der Gesamtstrom der fliesst gemessen werden?


so, genug der worte,
nochmals, ich will hier niemanden zu nahe treten, auch dir nicht, mkl0815 aka. mario, ich wollte mit meinem 2. post lediglich die frage in den raum stellen, ob vielleicht noch jemand anderes eine weitere idee hat, wie man verschiedene sachen verwirklichen kann.

Bist Du nicht. Der Hinweis von michael_x, das (die) Leerzeichen in abhängigkeit der Länge der Zahlen VOR die Zahl zu schreiben ist ja schon so ein Hinweis in diese Richtung. Dann stehen Einer- und Zehner-Stellen immer an der gleichen Stelle, egal wie groß die Zahl ist.
Mario.

dlca

#9
Jan 10, 2013, 08:32 am Last Edit: Jan 10, 2013, 05:41 pm by dlca Reason: 1
seit wann ist man mit einer abgeschlossenen Lehre und einem Abitur Ingenieur?  :smiley-eek: Bei uns muss man immernoch ein Studium abschließen um sich so nennen zu dürfen...

So jetzt btt:
Guck mal hier: http://arduino.cc/forum/index.php?topic=128885.0. Da wurde so ein Projekt schonmal finalisiert. Der Erbauer ist auch recht aktiv hier im Forum. Könnte mir vorstellen, dass er einige nützliche Infos hat.

greetings
Nils

Webmeister

Da Beispiel von dlca ist eine wirklich gute und einfache Lösung und kann so einfach ausgelagert werden.

Ein zweites Arduino-Board kann dann die Sollwert-Eingabe und weitere Aufgaben übernehmen.

Zum Projekt Universelles Netzgerät:
Ich bin der Autor vom Buch "Arduino Praxiseinstieg" in welchem ich den Aufbau eines digitalen Netzeiles beschreibe. Digital dabei ist natürlich nur die Sollwerteingabe über eine Minitastatur (Keypad). Das Arduino-Board liest dabei das Keypad ein und wandelt den Wert in einen digitalen Wert um welcher dann über eine einfache Digital/Analog-Wandler-Schaltung in ein Signal von 0-5 Volt umgewandelt wird.

http://arduino-praxis.ch/projekte-2/

Ein paar Bilder sind hier zu finden:
http://www.flickr.com/photos/woodpeckerweblog/sets/72157630449966654/

Tip:
falls du das Buch noch nicht in deinem Büchergestell hast, kann bei Amazon.de ein Blick ins Buch geworfen werden. Einzelne Seiten des Netzteilprojektes sind auch auffindbar.

kurti

Hallo,

zum Thema Strommessung schau Dir doch mal die ICs an:
ACS709, ACS712, ACS714

gibt es auch als Breakout-Board

http://www.ebay.de/itm/5A-Range-ACS712T-ELC-05B-Module-Current-Sensor-Module-Special-Price-For-Sale-/150920477389?pt=LH_DefaultDomain_0&hash=item23238fbacd
http://www.ebay.de/itm/20A-Range-ACS712-Module-Current-Sensor-Module-Special-Price-For-Sale-/160898013274?pt=LH_DefaultDomain_0&hash=item257644d85a
http://www.ebay.de/itm/30A-Range-ACS712-Module-Current-Sensor-Module-Special-Price-For-Sale-/160898013303?pt=LH_DefaultDomain_0&hash=item257644d877

Gruss
kurti
Zitat Jurs: falsche Verkabelung ist sowieso immer wenig förderlich für das Funktionieren der Hardware



hier könnte Ihre Werbung stehen

autuino

n'abend

wahnsinn...
das hat wohl ein deutliches echo rausgebracht  :D

@dlca: in AT bekommt man nach abschluss einer höheren technischen bundeslehranstalt (=htbl) und 3-jähriger praxis (= tätigkeit, bei welcher das in der anstalt gelernten und gelehrten wissens angewendet werden muss/soll) und nach einer anfrage sowie einem kleinen obulus am bundesministerium für wirtschaft, familie und jugend (vormals bm für wirtschaft und arbeit) die standesbezeichnung ing. verliehen und ist somit auch zum tragen dieser standesbezeichnung berechtigt (näheres siehe hier: https://www.bmwfj.gv.at/Berufsausbildung/Ingenieurwesen/Seiten/Ingenieurtitel.aspx ) --> aber vielleicht wusste das der uwe schon  :P

aber: danke für den link zum post von erni-berni, das werde ich mir mal zu gemüte führen;

@webmeister und kurti: danke für eure links, sobald ich zeit habe, werd ich mich auch da einlesen bzw. weiter informieren;

@all: sobald es einen prototypen gibt (und der auch funktioniert) werde ich mich natürlich auch bemühen, eine fotostrecke einzustellen.

danke nochmals für eure hilferichen posts und einen schönen abend
gruß, bernd

Go Up