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