Go Down

Topic: "gelöst" Probleme mit der Programmierung einer LCD Ausgabe - wer kann helfen? (Read 1 time) previous topic - next topic

Gelegenheitsbastler

Jul 19, 2013, 05:11 pm Last Edit: Jul 19, 2013, 06:39 pm by Gelegenheitsbastler Reason: 1
Ich möchte 0 - 30 Volt mit einer Nachkommastelle auf dem LCD ausgeben. Das funktioniert auch soweit. Nun ist es aber so, dass sowohl die einstelligen als auch die zweistelligen Zahlen bei 0,0 beginnen. Damit springt die Anzeige dann beim Wechsel von 9,9 auf 10,0 immer eine Stelle vor und zurück. Das würde ich gerne ändern. Wenn der angezeigte Wert kleiner 10 ist, soll ein Leerzeichen auf 0,0 geschrieben werden.

Das bekomme ich einfach nicht hin. Anbei mal mein Sketch. Die betreffenden Zeilen sind 213 ff. Das Leerzeichen auf 0,0 wird fortwährend angezeigt. Was mache ich falsch?

Wegen der Begrenzung auf 9500 Zeichen habe ich den Sketch um die zur Zeit unproblematischen Zeilen gekürzt. Die betreffende Zeile ist jetzt 139 und beginnt mit: "float nVolt0 = (voltage[0] * DIV_1);...."


Code: [Select]


// Konstante Werte definieren für die Temperatur
#define ONE_WIRE_BUS  4                              // D4 pin, verbunden mit DS18B20 DQ-pin
#define waitTime      0                              // Aktualisierungszeit in ms
#define Tmax          35.0                           // max. Temperatur
#define Tmin          22.0                           // min. Temperatur
#define FAN1          5                              // D5 PWM pin
#define FAN2          6                              // D6 PWM pin
#define FAN3          9                              // D9 PWM pin
#define FAN4         -1                              // Kein PWM pin

//************************************************************************************************************
// I²C Display

#define BACKLIGHT_PIN  7
#define En_pin  4
#define Rw_pin  5
#define Rs_pin  6
#define D4_pin  0
#define D5_pin  1
#define D6_pin  2
#define D7_pin  3

#define  LED_OFF  0
#define  LED_ON  1

#define MAX_SENSORS 4
//************************************************************************************************************
// Spannung und Strom

#define NUM_SAMPLES 20                            // number of analog samples to take per reading, per channel
#define DIV_1    6.07472661                       // voltage divider calibration values
#define DIV_2    20.5847
//#define V_REF    5.014                            // ADC reference voltage / calibration value des Uno
#define V_REF    4.993                            // ADC reference voltage / calibration value des Mega

//************************************************************************************************************

//Bibliotheken einbinden
#include <OneWire.h>  
#include <DallasTemperature.h>
#include <Wire.h>
#include <LCD.h>
#include <LiquidCrystal_I2C.h>
#include <Time.h>
#include <DS1307.h>

//************************************************************************************************************

//Pins zuordnen
LiquidCrystal_I2C  lcd0(0x20,En_pin,Rw_pin,Rs_pin,D4_pin,D5_pin,D6_pin,D7_pin);
LiquidCrystal_I2C  lcd1(0x27,En_pin,Rw_pin,Rs_pin,D4_pin,D5_pin,D6_pin,D7_pin);

//************************************************************************************************************

//Objekte initialisieren
OneWire oneWire(ONE_WIRE_BUS);                       // OneWire initialisierung
DallasTemperature sensors(&oneWire);                 // DallasTemperature initialisierung

float   Temperature;                                 // Temperatur Variable
int     FanSpeed;                                    // Luefter Geschwindigkeit
int     FANarray[] = {FAN1, FAN2, FAN3, FAN4};       // FAN4 muss aufgefuehrt sein, weil es 4 Sensoren sind

int sum[2] = {0};                                    // sums of samples taken
unsigned char sample_count = 0;                      // current sample number
float voltage[2] = {0.0};                            // calculated voltages
char l_cnt = 0;                                      // used in 'for' loops


//************************************************************************************************************

void setup() {
Serial.begin(57600);                                // Serielle Schnittstelle(USB) initialisieren


lcd0.begin (20,4);                                  // LCD Größe angeben
lcd0.setBacklightPin(BACKLIGHT_PIN,NEGATIVE);
lcd0.setBacklight(LED_ON);

lcd1.begin (20,4);                                  // LCD Größe angeben
lcd1.setBacklightPin(BACKLIGHT_PIN,NEGATIVE);
lcd1.setBacklight(LED_ON);

sensors.begin();                                    // Temperatur-Biblitothek starten

                                                    //Luefter Einzelfunktionspruefung
lcd0.print("L");
lcd0.print((char)245);
lcd0.print("ftertest");
lcd1.print("L");
lcd1.print((char)245);
lcd1.print("ftertest");
for (int i=0;i<4;i++)
{
 pinMode(FANarray[i], OUTPUT);  
 digitalWrite(FANarray[i], HIGH);                    // Volle Lueftergeschwindigkeit setzen
 delay(1000);
 digitalWrite(FANarray[i], LOW);                     // Luefter auschalten
}
lcd0.clear();
lcd1.clear();

}

//************************************************************************************************************


void loop() {
 lcd0.home();
 lcd0.backlight();  //Backlight ON if under program control
 lcd1.home();
 lcd1.backlight();  //Backlight ON if under program control
peed);               // PWM Geschwindigkeit setzen
 }
 delay(waitTime);  
 
//************************************************************************************************************

// Ab hier kommt der Teil für Strom und Spannung

    while (sample_count < NUM_SAMPLES)               // take a number of analog samples and add them up
   {                                                 // sample each channel A0 to A1
                                                     
       for (l_cnt = 0; l_cnt < 2; l_cnt++) {        // die Zahl 2 gibt die Summe der Eingänge an
           sum[l_cnt] += analogRead(A2 + l_cnt);
       }
       sample_count++;
       delay(60);
   }
   
   for (l_cnt = 0; l_cnt < 2; l_cnt++)             // calculate the voltage for each channel
   {
       voltage[l_cnt] = ((float)sum[l_cnt] / (float)NUM_SAMPLES * V_REF) / 1024.0;
   }
                                                   // display voltages on LCD
                                                   // each voltage is multiplied by the resistor network
                                                   // division factor to calculate the actual voltage
                                                   // voltage 1 - A (pin A2)
  float nVolt0 = (voltage[0] * DIV_1);
 
  lcd1.setCursor(0, 0);
  if (nVolt0 < 10);
    lcd1.print(" ");
   lcd1.print(nVolt0, 1);
 
   lcd1.print(" V ");
   lcd1.setCursor(8, 0);
   lcd1.print(voltage[1] * DIV_2, 1);
   lcd1.print(" A ");
   lcd1.setCursor(0, 1);
   lcd1.print((voltage[0] * DIV_1) * (voltage[1] * DIV_2), 0);
   lcd1.print(" W ");
   lcd1.setCursor(8, 1);
   lcd1.print((0.111) * ((voltage[0] * DIV_1) * (voltage[1] * DIV_2)), 0);
   lcd1.print(" % ");

   sample_count = 0;                                 // reset count and sums
   for (l_cnt = 0; l_cnt < 2; l_cnt++) {
       sum[l_cnt] = 0;
   }

//************************************************************************************************************

// Uhr
 {
 int nHour = RTC.get(DS1307_HR,true);
 int nMinute = RTC.get(DS1307_MIN,false);
 int nDate = RTC.get(DS1307_DATE,false);
 int nMTH = RTC.get(DS1307_MTH,false);
   lcd1.setCursor(0, 4);
   
   if (nHour < 10)
      lcd1.print("0");
   lcd1.print(nHour);
   lcd1.print(":");
   if (nMinute < 10)
      lcd1.print("0");
   lcd1.print(nMinute);
//    lcd1.print(":");
//    lcd1.print(RTC.get(DS1307_SEC,false));
   lcd1.print("  ");    

// Kein Platz mehr auf dem Display

//    byte dayofweek = weekday(); // Der Wochentag soll mit ausgegeben werden, allerdings in der deutschen Version
//  switch(dayofweek)           //Vorgesehen ist nur eine Ausgabe oder Zahlen 01 - 07 (Sonntag-Samstag)

//{
//   case 01:
//    lcd1.print("So. ");
//     break;
//   case 02:
//    lcd1.print("Mo. ");
//     break;
//   case 03:
//     lcd1.print("Di. ");
//     break;
//   case 04:
//     lcd1.print("Mi. ");
//     break;  
//   case 05:
//     lcd1.print("Do. ");
//     break;
//   case 06:
//    lcd1.print("Fr. ");
//     break;
//   case 07:
//     lcd1.print("Sa. ");
//     break;
//}
   if (nDate < 10)
     lcd1.print("0");
   lcd1.print(RTC.get(DS1307_DATE,false));
   lcd1.print(".");
   if (nMTH < 10)
     lcd1.print("0");    
   lcd1.print(RTC.get(DS1307_MTH,false));
   lcd1.print(".");
   lcd1.print(RTC.get(DS1307_YR,false));
//    lcd1.println();

 
 }

//************************************************************************************************************


}





Frank
Anfänger, der sich am Mega versucht. (Wegen Pin-Mangel bin ich vom Uno auf den Mega umgestiegen) Aktuelles Projekt: http://mfc-wittgenstein.

uwefed

Code: [Select]
if (nVolt0 < 10);
Der Strichpunkt nach der Kammer schließt die if-Bedingung ab. Es ist darum die Zeile
Code: [Select]
lcd1.print(" ");
nicht durch die if bedingt sondern wird in jedem Fall ausgeführt.

Laß den Strichpunkt weg:
Code: [Select]
if (nVolt0 < 10) lcd1.print(" ");

Grüße Uwe

jurs


Das bekomme ich einfach nicht hin. Anbei mal mein Sketch. Die betreffenden Zeilen sind 213 ff. Das Leerzeichen auf 0,0 wird fortwährend angezeigt. Was mache ich falsch?


Wenn Du eine Gleitkommazahl mit einer festen Stellenzahl formatieren und rechtsbündig ausgeben möchtest, dann formatierst Du die Zahl mit der Library-Funktion "dtostrf" und gibst sie Stelle für Stelle aus.

Info "dtostrf":
http://www.nongnu.org/avr-libc/user-manual/group__avr__stdlib.html#ga060c998e77fb5fc0d3168b3ce8771d42

Gelegenheitsbastler

Der Einfachheit halber habe ich mit der Version "Strichpunkt weglassen" angefangen, bevor ich mich dem zweiten Zuschlag widme.
Es läuft! Vielen Dank. Wieder etwas gelernt.

Frank
Anfänger, der sich am Mega versucht. (Wegen Pin-Mangel bin ich vom Uno auf den Mega umgestiegen) Aktuelles Projekt: http://mfc-wittgenstein.

Go Up