INFO: Dieses Forum nutzt Cookies...
Cookies sind für den Betrieb des Forums unverzichtbar. Mit der Nutzung des Forums erklärst Du dich damit einverstanden, dass wir Cookies verwenden.

Es wird in jedem Fall ein Cookie gesetzt um diesen Hinweis nicht mehr zu erhalten. Desweiteren setzen wir Google Adsense und Google Analytics ein.

Antwort schreiben 
 
Themabewertung:
  • 0 Bewertungen - 0 im Durchschnitt
  • 1
  • 2
  • 3
  • 4
  • 5
LCD Aktualisieren
21.09.2013, 20:18
Beitrag #1
LCD Aktualisieren
Hallo,
ich bin ein neuer in euer Forum
leider kam bei der Suche nichts gescheites heraus
Ich benutze die Arduino zum Loggen meiner Solarfelder
Das Skript wurde von jemand aus einen anderen Forum zur Verfügung gestellt
Ich selber habe keine Ahnung zur Programmierung des Arduino
Das Arduino mist die Spannung und Leistung, und errechnet dadurch den Ertrag
Jetzt habe ich zusätzlich ein LCD angeschlossen, um die Daten live zu sehen
Nur leider flackert das Display, weil es zu häufig Aktualisiert wird
Wie kann ich ermöglichen, das das Display nur alle 10 sec, Aktualisiert wird
Gruß Mike

#include <LiquidCrystal.h>
LiquidCrystal lcd(12,11,10,7,6,5,4);

int ledPin = 13; // LED an digital Pin 13
int impulsPin = 2; // Impulsausgang an digital Pin 2
int voltPin = 0; // Spannungsmessung an Pin 0
int amperePin = 1; // Strommessung an Pin 1

int analogVolt = 0;
int analogAmpere = 0;
float volt = 0;
float ampere = 0;
float voltMultiplier = (float)1/10000*333000; // Faktor für die Umrechnung in richtige Spannung
float ampereMultiplier = (float)1000/90; // Faktor für Strom
float ampX = 6.35; // noch ein Faktor für Strom (könnte man vereinbachen)
float ampY = 0.58; // Offset für Strom-Messung: y = 1,413x - 0,5021
float wattSekunden = 0;
int loopCount = 0;

void setup() // run once, when the sketch starts
{
lcd.begin(20,4);
analogReference(EXTERNAL); // use external voltage reference
pinMode(ledPin, OUTPUT); // sets the digital pin as output
pinMode(impulsPin, OUTPUT); // sets the digital pin as output
Serial.begin(115200);
Serial.println("*** Init ***");
SetupTimer();



}

void SetupTimer(){
//http://www.instructables.com/id/Arduino-Timer-Interrupts/
cli(); //stop interrupts
//set timer1 interrupt at 10Hz
TCCR1A = 0;// set entire TCCR1A register to 0
TCCR1B = 0;// same for TCCR1B
TCNT1 = 0;//initialize counter value to 0
// set compare match register for 10hz increments
OCR1A = 1561;// = (16*10^6) / (10*1024) - 1 (must be <65536)
// turn on CTC mode
TCCR1B |= (1 << WGM12);
// Set CS10 and CS12 bits for 1024 prescaler
TCCR1B |= (1 << CS12) | (1 << CS10);
// enable timer compare interrupt
TIMSK1 |= (1 << OCIE1A);
sei(); //allow interrupts
}

void loop() // run over and over again
{
// Spannung messen
analogVolt = analogRead(voltPin);
float v = (float)2.45 / 1024 * analogVolt * voltMultiplier;
// Messwert in die vorherigen Werte "integrieren" (zur Glättung)
volt = volt * 0.995 + v * 0.005;
// Strom messen
analogAmpere = analogRead(amperePin);
if (analogAmpere > 1020) analogAmpere = 0; // unplausible Werte kompensieren
float a = (float)2.45 / 1024 * analogAmpere * ampereMultiplier;
ampere = ampere * 0.99 + a * 0.01; // integrieren
// Messwert in die vorherigen Werte "integrieren" (zur Glättung)
delay(2);
}

//timer compare interrupt service routine: every 100 ms
ISR(TIMER1_COMPA_vect){
loopCount += 1;
// Impulspin wird in jedem Durchlauf zunächst auf 0 gestellt (spart das explizite Rücksetzen)
digitalWrite(impulsPin, LOW); // S0 = off
digitalWrite(ledPin, digitalRead(ledPin) ^ 1); // blink
float ampere2 = ampere;
ampere2 = ampere2 - ampY; // Spannungs-Offset subtrahieren
if (ampere2 < 0.13) ampere2 = 0; // Rauschen um 0 eleminieren
else ampere2 = ampere2 * ampX + 0.1; // Korrekturfaktor
float watt = volt * ampere2;
wattSekunden += watt * 0.1;




Serial.print(volt);
Serial.print(" V\t");
Serial.print(ampere2);
Serial.print(" A\t");
Serial.print(watt);
Serial.println(" W\t");
//Serial.print(wattSekunden);
//Serial.println(" ws\t");
// ein Impuls alle 1800 Wattsekunden = 2000 Impulse pro kWh
while (wattSekunden >= 1800) {
Serial.println("*** Impuls ***");
//float watt = (float)1/(loopCount/10)*3600;
//Serial.print(watt);
//Serial.print(" Watt (");
//Serial.print(loopCount/2);
//Serial.println(" Sekunden)");
//loopCount = 0;
digitalWrite(impulsPin, HIGH); // S0 = on
wattSekunden -= 1800;
}
{
lcd.setCursor(0,0);
lcd.print(" Morningstar 45 ");
lcd.setCursor(0,1);
lcd.print("Volt");
lcd.setCursor(8,1);
lcd.print(volt);
lcd.setCursor(0,2);
lcd.print("Ampere");
lcd.setCursor(9,2);
lcd.print(ampere2);
lcd.setCursor(0,3);
lcd.print("Watt");
lcd.setCursor(9,3);
lcd.print(watt);
}
}
[/quote]
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
21.09.2013, 21:27
Beitrag #2
RE: LCD Aktualisieren
Hy gismomike,

aller einfachster weg ein delay(10000); zum schluss. Dann wartet der Arduino am ende sozusagen 10 sec und fängt dann wieder mit seim loop an.
In der Klammer stehen keine Sekunden sondern Millisekunden ergo 1000 millis = 1 Sec Wink

{
lcd.setCursor(0,0);
lcd.print(" Morningstar 45 ");
lcd.setCursor(0,1);
lcd.print("Volt");
lcd.setCursor(8,1);
lcd.print(volt);
lcd.setCursor(0,2);
lcd.print("Ampere");
lcd.setCursor(9,2);
lcd.print(ampere2);
lcd.setCursor(0,3);
lcd.print("Watt");
lcd.setCursor(9,3);
lcd.print(watt);
}
delay(10000);
}

Hoffe geholfen zu haben...greez Wampo
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
21.09.2013, 22:44
Beitrag #3
RE: LCD Aktualisieren
Moin,

ohne genau den Code gelesen zu haben, würde ich jedoch nicht mit delay arbeiten.
Wie Wampo schon sagt, wartet der Ardu dann und führt keinerlei Code aus. Dass das so gewollt ist wage ich mal anzuzweifeln.
Ich würde eher so rangehen, dass die Werte nur ausgegeben werden wenn sie sich ändern. Also etwa so:
while(1) // Dauerschleife
{
- Wert messen und auf Var
- wieder Wert messen und vergleichen mit Var
- Wenn Wert ungleich Var, dann anzeigen und diesen Wert auf Var
}

Grüße Ricardo
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
21.09.2013, 23:23
Beitrag #4
RE: LCD Aktualisieren
Ok, wieder was gelernt! Aber wenn doch dann die while(1) schleife sich immer und immer wieder ändert dann flackert auch sein Display weiter oder seh ich das falsch...?!
Ich glaube nämlich das seine Werte auch immer wieder "Springen" und somit muss ja auch wieder jedes mal das Display aktualisiert werden, oder?!
Wo soll er denn dann diese While bedingung einfügen?! Könnte für meine LCD Wetterstation evtl auch sowas gebrauchen!Wink

Zudem hab ich gerade noch gesehen das in dem Code kein lcd.clear(); vorhanden ist, war bei meinen Codes immer n dickes problem, da irgendwann sich die zeichen überlagert haben.

Greez Wampo
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
22.09.2013, 08:25
Beitrag #5
RE: LCD Aktualisieren
Hallo und danke erst mal
Wampo das mit der delay im ganzen Skript geht leider nicht
Dann haut die Berechnung die das Arduino ausführen soll nicht mehr hin
Ricardo das ist ja das Problem, das sich die Werte permanent ändern
Und dadurch das flackern entsteht
Heute Morgen haben sich tatsächlich die Zeichen überlagert das sich das Display nicht mehr ablesen lies
Gruß Mike
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
22.09.2013, 09:44
Beitrag #6
RE: LCD Aktualisieren
Moin,
auch wenn ich den Code nicht wirklich verstehe, glaube ich zwei Dinge erkannt zu haben:
1. gemessen wird alle 100 ms, also mit einer Abtastrate von 10 Hz?
2. jeder gemessene Wert soll irgendwie dargestellt werden?
Wenn ja, dann gibt's nur zwei Möglichkeiten:
1. die Häufigkeit der Messungen verringern, oder
2. die Häufigkeit der Darstellung der gemessenen Werte verringern.
Ich glaube nicht, dass das Auge mit Änderungen der Darstellung im 10 Hz Takt was anfangen kann, noch dass es bei diesem Projekt sinnvoll ist den Ertrag in dieser Frequenz zu messen, wenn die Daten nicht wirklich irgendwo aufgezeichnet und später ausgewertet werden sollen.
@Wampo
Die while(1) - Schleife müsste um den LCD-Abschnitt geschrieben werden, aber du hast recht, da die Werte so schnell reinkommen, würde das nicht viel ändern.
@gismomike
Ich würde die LCD Ausgabe für die Bereiche die reinen Text enthalten nur einmal machen. ZB. diesen:
Code:
lcd.setCursor(0,0);
lcd.print(" Morningstar 45 ");
lcd.setCursor(0,1);
lcd.print("Volt");
Für die Bereiche die Werte enthalten würde ich vorher immer Leerzeichen ausgeben. ZB:
Code:
lcd.setCursor(8,1);
lcd.print("      ";
lcd.setCursor(8,1);
lcd.print(volt);
Und dann unter Beachtung des oben gesagten die Ausgabe- und evtl. auch Messfrequenz verringern.
Wäre schon mal interessant zu wissen welches Display du verwendest. Dann könnte man mal in die Datenblätter schauen wie schnell das Teil überhaupt schreiben kann.

Grüße Ricardo
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
22.09.2013, 09:48
Beitrag #7
RE: LCD Aktualisieren
Das mit fem überlagern hat wie gesagt mit fen lcd clear zu tun!
Füge einfach bevor die lcd ausgabe anfängt ein lcd.clear(); ein.

Zum bleistift so hier:

lcd.clear();
lcd.setCursor(0,0);
lcd.print(" Morningstar 45 ");
lcd.setCursor(0,1);
lcd.print("Volt");
lcd.setCursor(8,1);
lcd.print(volt);
lcd.setCursor(0,2);
lcd.print("Ampere");
lcd.setCursor(9,2);
lcd.print(ampere2);
lcd.setCursor(0,3);
lcd.print("Watt");
lcd.setCursor(9,3);
lcd.print(watt);
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
Antwort schreiben 


Gehe zu:


Benutzer, die gerade dieses Thema anschauen: 1 Gast/Gäste