Pages: [1]   Go Down
Author Topic: Laufschrift auf SainSmart LCD Keypad Shield  (Read 832 times)
0 Members and 1 Guest are viewing this topic.
Offline Offline
Newbie
*
Karma: 0
Posts: 2
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Hallo ich habe folgendes Problem.

Ich habe einen Arduino Uno und ein "SainSmart LCD Keypad Shield"
2 Zeilen je 16 Zeichen

Ich bin totaler Neuling.  smiley-roll-blue

Ich möchte eine Laufschrift auf dem Display laufen lassen.
Das Funktioniert auch soweit.  smiley-cool
Nur es laufen immer beide Zeilen.
Wie kann ich denn nur die erste Zeile laufen lassen, und den Text in der zweiten Zeile stehen lassen?
Die erste Zeile soll laufen, und die zweite soll stehen bleiben.


Hier mal mein Code evtl.kann mir jemand weiterhelfen.
Danke für die Hilfe

Wally


Code:
// include the library code:
#include <LiquidCrystal.h>

// initialize the library with the numbers of the interface pins
LiquidCrystal lcd(8, 9, 4, 5, 6, 7);

void setup() {
// set up the LCD's number of columns and rows:
lcd.begin(16, 2);
// Print a message to the LCD.

lcd.setCursor(0, 0);
lcd.print(" Diese Zeile soll scrollen ");


lcd.setCursor(2, 1);
lcd.print (" Nicht Scrollen ");
}

void loop() {
for (int positionCounter = 0; positionCounter < 1; positionCounter++) {
// scroll one position left:
lcd.scrollDisplayLeft();
// wait a bit:
delay(350);
}
}
« Last Edit: July 10, 2013, 04:30:19 pm by uwefed » Logged

Offline Offline
Faraday Member
**
Karma: 80
Posts: 2740
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Die eingebaute Scroll-Funktion scrollt das ganze Display. Das liegt am Controller und geht nicht anders. Das ist auch bei anderen Displays so, da die praktisch alle den gleichen Controller haben:
http://www.dfrobot.com/image/data/TOY0046/HD44780.pdf

Wenn du nur eine Zeile scrollen willst musst das per Hand nachbilden indem du die Zeile entsprechend neu beschreibst. Text Löschen macht man indem man ein Leerzeichen (0x20) drauf schreibt. Du musst also zumindest die erste Text-Stelle löschen (daher diese Position in einer Variablen merken). Dann den Text Zeichen für Zeichen (nicht als ganzes) nochmal drauf schreiben, aber am Ende der Zeile aufhören, sonst schreibt er glaube ich in der nächsten Zeile weiter (da die Adresse bei jedem Schreibzugriff automatisch inkrementiert).
Also den Text in einen c-string (char-array) und dann in einer for-Schleife darüber iterieren. Oder eventuell zwei verschachtelte (die äußere für die Displayzeile und die Anfangsposition - und die innere für den String und die End-Position). Genau müsste ich das jetzt auch erst mal ausprobieren.

EDIT:
Sollte auch viel einfacher gehen. Du scrollst das Display einmal und schreibst dann die zweite Zeile neu! smiley
Vorher musst da auch die Zeile löschen, aber das ist immer noch viel einfacher als die erste Version.
« Last Edit: July 10, 2013, 01:48:36 pm by Serenifly » Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 2
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Oh je!

Alles klar.
Danke für die schnelle Antwort...!
Logged

Offline Offline
Faraday Member
**
Karma: 80
Posts: 2740
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Wie gesagt, die zweite Lösung ist recht einfach. Am Anfang wieder gleich zu kompliziert gedacht smiley

Hiermit kannst du einfach die Zeile löschen:
Code:
lcd.setCursor(2, 1);
lcd.print ("                    "); //<--- hier 16 Leerzeichen machen

Dann das:
Code:
lcd.scrollDisplayLeft();
lcd.setCursor(2, 1);
lcd.print (" Nicht Scrollen ");
« Last Edit: July 10, 2013, 01:48:19 pm by Serenifly » Logged

Germany S-H
Offline Offline
Edison Member
*
Karma: 117
Posts: 2449
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Ich möchte eine Laufschrift auf dem Display laufen lassen.
Das Funktioniert auch soweit.  smiley-cool
Nur es laufen immer beide Zeilen.
Wie kann ich denn nur die erste Zeile laufen lassen, und den Text in der zweiten Zeile stehen lassen?
Die erste Zeile soll laufen, und die zweite soll stehen bleiben.

Wenn die Library-Funktionen nicht weiterhelfen, kann man sich eigene Funktionen selberschreiben.

An den Library-Funktion scrollDisplayRight() und scrollDisplayLeft() ist es schon mal völlig verwarzt, dass die laut Programmierbeispiel mit Delay zwischen den einzelnen Scroll-Schritten laufen sollen. Jedes in einem Programm verwendete Delay, das länger als einen Wimpernschlag lang dauert, ist in einem Controllerprogramm ein großer Mist und daher zu vermeiden!

Ich habe Dir hier mal meine selbstgeschriebenen Scrollfunktionen rauskopiert und auf das Keypad-Shield umgeschrieben. Code für LCD-Displays mit I2C-Anschluß ist auskommentiert.

Bei meiner Scroll-Logik kannst für jede LCD-Zeile einzeln festlegen, ob sie scrollen soll, ob von rechts nach links oder umgekehrt und mit welchem Tempo. So dass Du bei zwei Zeilen auch die eine Zeile von links nach rechts, die zweite Zeile von rechts nach links und beide mit unterschiedlichem Tempo laufen haben kannst. Das ginge mit Delay überhaupt nicht.

Die Scrollfunktion für jede Zeile wird einfach in der loop aufgerufen, die mit maximaler Drehzahl laufen muß (also nirgends im Programm Delay verwenden!), und die Verwaltung des nächsten Scrollschritts übernimmt die Funktion selbst anhand des Stands des millis() Timers.

Natürlich kann der Scrolltext auch viel länger sein als die LCD-Zeile lang ist, damit man längere Texte darstellen kann. Es können wahlweise konstante Texte übergeben werden oder Text in Char-Array Variablen beliebiger Länge.

Viel Spaß damit!

Code:
// LCD Scrolltext by 'jurs' for German Arduino Forum
// define the chars in one LED line
#define LEDLINE 16 


// Folgende zwei Zeilen Code für Sainsmart LCD Keypad Shield
#include <LiquidCrystal.h>
LiquidCrystal lcd(8, 9, 4, 5, 6, 7); // Sainsmart keypad LCD


// Folgende zwei Zeilen Code für I2C Display
// #include <LiquidCrystal_I2C.h>
// LiquidCrystal_I2C lcd(0x20,16,2);  // set the LCD address to 0x20 for a 16 chars and 2 line display


// define scrolling speed for two LED lines
const int ledScrollSpeed[2]={225,450};
// define scrolling direction for two LED lines (true means right-to-left scrolling)
const boolean ledScrollDir[2]={true,false};

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[2];
  static int positionCounter[2];
  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() {
  // put your setup code here, to run once:
  lcd.begin(16,2);
}

void loop() {
  // Scroll text in line number 0
   task_text("Das hier scrollt in Zeile-1",0);
  // Scroll text in line number 1
   task_text("Zeile-2",1); 
}
Logged

Offline Offline
Full Member
***
Karma: 1
Posts: 118
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Linpo

sagt: Vielen Dank ...
Logged

العشب أخضر، أن الكرة مستديرة،

Pages: [1]   Go Up
Jump to: