"gelöst" Probleme mit der Programmierung einer LCD Ausgabe - wer kann helfen?

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);...."

// 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

if (nVolt0 < 10);

Der Strichpunkt nach der Kammer schließt die if-Bedingung ab. Es ist darum die Zeile

 lcd1.print(" ");

nicht durch die if bedingt sondern wird in jedem Fall ausgeführt.

Laß den Strichpunkt weg:

if (nVolt0 < 10) lcd1.print(" ");

Grüße Uwe

Gelegenheitsbastler:
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

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