Sainsmart LCD Keypad Library

vom 2012-10-14

Auf Ebay und Amazon taucht es massenweise auf: Das SainSmart 1602 LCD Keypad Shield.

Sainsmart LCD KeypadArduino Verpackung

Meist wird es im Paket mit einem Sainsmart Mega oder Uno angeboten. Diese Mega- und Uno-Boards entsprechen ziemlich genau den Arduino-Boards und lassen sich auch mit der Arduino IDE (Programmiersoftware) programmieren, was dank der OpenSource Politik von Arduino auch so gewollt ist. Die Sainsmart-Produkte sind zwar billiger, dafür unterstützt man beim Kauf eines echten Arduino die dahinter stehende Arbeit, bekommt ein „Thank-you-for-supporting“-Heft, eine schicke Verpackung und 6 Aufkleber.

Worum es hier jedoch eigentlich gehen soll: Die Firma Sainsmart bietet auf ihrer Webseite eine Bibliothek zum Ansteuern des Tastenfelds des LCD Keypad Shields an. Diese Bibliothek ist leider wirklich, wirklich schlimm, wenn nicht sogar falsch programmiert, weshalb ich hier jetzt gerne ein wenig bashing betreiben würde. Stattdessen gibt es hier aber nur den Ausweg: Unter https://github.com/Phaiax/sainsmartkeypad gibt es eine Bibliothek (für Arduino1.0), die es hoffentlich viel Besser macht. Please Fork!

Ein Beispiel ist nie verkehrt (ich werde es auch gleich mal auf Github hochladen). Erstellt einfach zwei neue Dateien im Arduino-Sketch (der Pfeil ganz rechts in der Dateileiste) mit den Namen sainsmartkeypad.h und sainsmartkeypad.cpp und kopiert den Code der entsprechenden Dateien von Github in diese Dateien. Schau in den Quellcode der Headerdatei um die erweiterten Einstellungsmöglichkeiten kennenzulernen. Die Hauptdatei könnte dann Beispielsweise so aussehen:

#include <LiquidCrystal.h>

#include "Arduino.h"

// github.com/Phaiax/sainsmartkeypad
#include "sainsmartkeypad.h"

LiquidCrystal lcd(8, 9, 4, 5, 6, 7);
SainsmartKeypad keypad(0);
int value = 0;
uint8_t key;

void setup() {
  lcd.begin(16, 2);
  lcd.setCursor(0,0);
  lcd.print("Keypad Example");
}

void loop() {
  key = keypad.getKey_fastscroll();

  // Try the other possibilities:
  // (Only one at a time.
  //  fastscroll, waitrelease and periodic
  //  won't work next to each other.)

  //key = keypad.getKey_waitrelease(); // without fastscroll but usable
  //key = keypad.getKey_periodic(); // not quite usable
  //key = keypad.getKey_instant(); // not quite usable

  if(key != SAMPLE_WAIT) // Do not refresh screen every loop
  {
     switch(key)
     {
       case UP_KEY:
        value++;
        break;
       case DOWN_KEY:
        value--;
        break;
     }
     lcd.setCursor(5,1);
     lcd.print(value);
     lcd.print("        ");
  }
}

∎

Kommentare

bobschrieb am 2012-12-02

Ich nutze es (normalerweise kommentiere ich ja grundsätzlich nicht (: )

ich auchschrieb am 2013-01-07

Ich benutze es auch! Vielen Dank!

Stefanschrieb am 2013-01-18

Prima Bibliothek um den Einstieg mit dem Sainsmart LCD Keypad Shield zu finden. Dankesehr! :)

Blauschischrieb am 2013-02-01

Ohne dieser Bibliothek wäre es mir als Neueinsteiger sicher nicht gelungen mit dem Tastenfeld etwas anzufangen. Herzlichen Dank für die Vorarbeit!!

danielschrieb am 2013-02-12

Danke für die Bibliothek! Wir verwenden sie bei unserem Projekt.

http://www.halecker.de/kameraslider/2013/02/12/lcd-keypad-shield/

Lesejensschrieb am 2013-09-06

Danke für die Library! Bei mir hatten zuerst nicht alle Taster zuverlässig funktioniert. Das Fehlerbild war bei meinen beiden Unos (Arduino und Sainsmart)gleich.

Ich habe die erlaubte Bandbreite für die Analogwerte pauschel von 15 auf 50 erhöht.

//static int DEFAULT_THRESHOLD = 15;

static int DEFAULT_THRESHOLD = 50;

Jetzt gehts auch bei 35°C im Zimmer.

Nochmals Danke!

AlbertoBonnschrieb am 2014-03-13

Danke für den coolen Tip. Läuft bestens!

brantherschrieb am 2014-07-10

Prima Sache, vielen Dank.

Kleiner Verbesserungsvorschlag:

Ich habe oft INT-Werte einzugeben, leider dauert das ewig bis 32000 auf dem Display steht.

Kann man das ganze eventuell noch erweitern, wobei die Zeit der gedrückten Taste abgefragt und je länger sie gedrückt wird das Increment um 1, 10, 100 oder 500 addiert wird?

Bsp:

kurz Drücken, Zähler um eins dec./inc..

länger drücken, zähler sichtbar! hochzählen

noch länger drücken, zähler schneller hochzählen

usw...

irgendwie alle 5sec schnellerwerden lassen.

beste grüße

branther

deskischrieb am 2014-11-18

Dank Lesejens Tip läuft alles perfect!

War mein erster versuch mit Arduino und ich dachte die Taste bis auf UP und Reight sind def.. b.z.w. der Wiederstand.

Hab dann DEFAULT_THRESHOLD auch auf 50 erhöht und somit läuft es bei 23,8°C sicher.

Danke für die lib! Da die Module hier Scheibenweise einfliegen, werde ich derweil mal in ruhe weiterlesen.

maxschrieb am 2016-07-05

verzweifele schon am Seutpd des Displayshields, egal welche Sketche ich hochlade, werden in der ersten zeile nur vierecke angezeigt, in der zweiten nichts...

maxschrieb am 2016-07-06

funktioniert...

habe mich nicht getraut, das shield fest genug aufzusetzen ;)

Davidschrieb am 2017-05-30

Ich habe lange nach dem Problem gesucht, das dazu führte, dass mehrere getestete LCD/Keypad Shields beim betätigen egal welcher taste dazu übergingen sinnloses anzuzeigen oder auf weiße Rechtecke umzuspringen.

Einige Displays zeigten auch garnichts oder schon ab dem Start nur rechtecke.

Falls noch jemand verzweifelt den Fehler im code sucht hier eine mögliche Lösung:

Ich habe festgestellt, dass bei UNO und Mega-Boards mit USB Typ-B Buchse die Kante des Blechgehäuses der Buchse die hervorstehenden Pins des LCDs auf der Unterseite der Platine kurzschließen kann. Bei einigen permanent, bei anderen bleibt ein minimaler Spalt, sodass der Kurzschluss erst beim Betätigen einer Taste entsteht.

Überkleben mit Isolierband (am Besten mehrlagig) und Abfeilen der spitzen Pins löst das Problem.