Guten Abend gewünscht!
Es gibt einige Neuigkeiten zum Thema: also, auf WinXP funktioniert nur die IDE 1.0.6 einigermaßen zufriedenstellend. Au meinem Win10-Rechner kann ich ebenfalls nur die 1.0.6 verwenden, obwohl die 1.8.1 beim Kompilieren keine Fehler meldet. Allerdings "verschluckt" der kompilierte Code so ziemlich alles, was ausgegeben werden soll(VFD 4 Zeilen a 20 Zeichen, kompatibel zu allen üblichen LCD's, angesteuert durch I²C-Bus): Zeile 0 soll der Wochentag stehen...korrekt mit der 1.0.6, die 1.8.1 gibt nur den 1. Buchstaben aus, Zeile 1, in die Mitte gerückt mit setCursor(x,x), das Datum im Format Tag. Monat(sname) Jahr, auch hier "verschluckt die 1.8.1 den Rest außer dem 1. Zeichen. Zeile 2 scrollt von rechts nach links(Ticker), im mom nur einen frei gewählten Text, funktioniert mit der 1.0.6 Problemlos, 1.8.1 gibt wieder nur das erste Zeichen und scrollt nicht. Zeile 3 wie gehabt, dort soll die Zeit stehen hh:mm:ss...aber wieder nur die erste Zahl, der Rest "verschluckt".
Aber OK, mit der 1.0.6 funzt es ja. Was ich allerdings gern machen würde: statt des freien Textes würde ich gern Umweltdaten scrollen, Temperatur, Luftdruck und Feuchte. Diese Programmteile sind schon fertig, allerdings in meinem Beispiel noch nicht eingebunden. Kann mir jemand einen Tip geben, wie ich eine Variable, und eine solche wird es ja werden Temp...Druck...Humidy, in die Textausgabezeile bringe, so daß diese, wie der Text, gescrollt wird?
Hier der Scetch:
// Einstellen der Uhrzeit der RTC DS3231
// Die aktuelle Zeit wird in Setup() eingestellt und beim Start übertragen
// Dazu wird das Programm ca. 4 Sekunden vor der eingestellten Zeit übersetzt
// und übertragen, dann ist es rechtzeitig fertig
//
// Matthias Busse 7.11.2016 Version 1.0
// modifiziert von Steffen Kaersten 03.02.2017 für ein VFD-Display von Noritake
// 20 Zeichen je 4 Zeilen
// einbinden der Bibliotheken
#include <LiquidCrystal_I2C.h>
#include <Wire.h>
// Definitionen
#define LEDLINE 20
#define DS3231_ADDRESSE 0x68 //Adresse der RTC 0x68
// setzen der LCD-Adresse auf 0x27, 40 Zeichen, 4 Zeilen
LiquidCrystal_I2C lcd(0x27,20,4);
// definieren der Scrollgeschwindigkeiten Zeile 0...4
const int ledScrollSpeed[4]={500,500,125,500};
// definieren der Scrollrichtung ('true' bedeutet von rechts nsch links, 'false' in die andere Richtung)
const boolean ledScrollDir[4]={true,true,true,true};
char charAt(char *text, int pos)
// scrolling-logic coded here
{
if (pos<LEDLINE) return ' '; // scroll in
else if (pos>=LEDLINE && pos<LEDLINE+strlen(text))
return text[pos-LEDLINE]; // scroll text
else return ' '; // scroll out
}
void task_text(char *text, byte line)
// scroll the LED lines
{
char currenttext[LEDLINE+1];
static unsigned long nextscroll[4];
static int positionCounter[4];
int i;
if (millis()>nextscroll[line])
{
nextscroll[line]=millis()+ledScrollSpeed[line];
for (i=0;i<LEDLINE;i++)
currenttext[i]=charAt(text,positionCounter[line]+i);
currenttext[LEDLINE]=0;
lcd.setCursor(0,line);
lcd.print(currenttext);
if (ledScrollDir[line])
{
positionCounter[line]++;
if (positionCounter[line]==strlen(text)+LEDLINE) positionCounter[line]=0;
}
else
{
positionCounter[line]--;
if (positionCounter[line]<0) positionCounter[line]=strlen(text)+LEDLINE-1;
}
}
}
void setup() {
lcd.init();
Wire.begin();
// aktuelle Zeit sek min std wt tag mon jahr
//einstellenDS3231zeit(00, 27, 14, 1, 30, 01, 17);
}
void loop() {
// Scroll text in Zeile 2
task_text("Das hier scrollt in Zeile-3 und bringt auch einen ueberlangen Text mit :)",2);
zeigeZeit(); // Zeit ausgeben
// Scroll text in Zeile 1
//task_text("Zeile-2",1);
}
void einstellenDS3231zeit(byte sekunde, byte minute, byte stunde, byte wochentag, byte tag, byte monat, byte jahr) {
// Datum und Uhrzeit einstellen
Wire.beginTransmission(DS3231_ADDRESSE);
Wire.write(0);
Wire.write(decToBcd(sekunde)); // Sekunden einstellen
Wire.write(decToBcd(minute)); // Minuten einstellen
Wire.write(decToBcd(stunde));
Wire.write(decToBcd(wochentag));
Wire.write(decToBcd(tag));
Wire.write(decToBcd(monat));
Wire.write(decToBcd(jahr)); // 0...99
Wire.endTransmission();
}
void leseDS3231zeit(byte *sekunde, byte *minute,byte *stunde, byte *wochentag, byte *tag, byte *monat, byte *jahr) {
Wire.beginTransmission(DS3231_ADDRESSE);
Wire.write(0); // DS3231 Register zu 00h
Wire.endTransmission();
Wire.requestFrom(DS3231_ADDRESSE, 7); // 7 Byte Daten vom DS3231 holen
*sekunde = bcdToDec(Wire.read() & 0x7f);
*minute = bcdToDec(Wire.read());
*stunde = bcdToDec(Wire.read() & 0x3f);
*wochentag = bcdToDec(Wire.read());
*tag = bcdToDec(Wire.read());
*monat = bcdToDec(Wire.read());
*jahr = bcdToDec(Wire.read());
}
void zeigeZeit(){
byte sekunde, minute, stunde, wochentag, tag, monat, jahr;
leseDS3231zeit(&sekunde, &minute, &stunde, &wochentag, &tag, &monat, &jahr); // Daten vom DS3231 holen
//Wochentagsausgabe
lcd.setCursor(0,0);
if (wochentag == 1) {lcd.print("Montag ");}
if (wochentag == 2) {lcd.print("Dienstag ");}
if (wochentag == 3) {lcd.print("Mittwoch ");}
if (wochentag == 4) {lcd.print("Donnerstag");}
if (wochentag == 5) {lcd.print("Freitag ");}
if (wochentag == 6) {lcd.print("Samstag ");}
if (wochentag == 7) {lcd.print("Sonntag ");}
//lcd.clear();
//Curserposition für Datum
lcd.setCursor(3,1);
// Datumsausgabe
lcd.print(tag);
lcd.print(".");
if (monat == 1) { lcd.print("Januar");}
if (monat == 2) { lcd.print("Februar");}
if (monat == 3) { lcd.print("März");}
if (monat == 4) { lcd.print("April");}
if (monat == 5) { lcd.print("Mai");}
if (monat == 6) { lcd.print("Juni");}
if (monat == 7) { lcd.print("Juli");}
if (monat == 8) { lcd.print("August");}
if (monat == 9) { lcd.print("September");}
if (monat == 10) { lcd.print("Oktober");}
if (monat == 11) { lcd.print("November");}
if (monat == 12) { lcd.print("Dezember");}
//lcd.print(monat);
lcd.print(" 20");
lcd.print(jahr);
//Cursorposition für Zeit
lcd.setCursor(12,3);
if (stunde < 10) { lcd.print("0");}
lcd.print(stunde, DEC);
lcd.print(":");
if (minute < 10) { lcd.print("0");}
lcd.print(minute, DEC);
lcd.print(":");
if (sekunde < 10) { lcd.print("0"); }
lcd.print(sekunde, DEC);
} byte decToBcd(byte val) {
// Dezimal Zahl zu binary coded decimal (BCD) umwandeln
return((val/10*16) + (val%10));
}
byte bcdToDec(byte val) {
// BCD (binary coded decimal) in Dezimal Zahl umwandeln
return((val/16*10) + (val%16));
}