Craftbeerpi - LCD Ansteuerung HD44780 16x2

Antworten
Benutzeravatar
aalhuhnsuppe
Posting Freak
Posting Freak
Beiträge: 508
Registriert: Donnerstag 14. Mai 2015, 14:48
Wohnort: Potsdam

Craftbeerpi - LCD Ansteuerung HD44780 16x2

#1

Beitrag von aalhuhnsuppe »

Diser Thread ist als Unterthread zu Raspberry Pi Steuerung gedacht. Wenn es den geneigten Admin gefällt, bitte ich darum beide in einen entsprechenden Unterordner zu verschieben. Ich versichere das noch weiter Unterthreads zu diesem Thema aufploppen werden. Die Ergebnisse sollen die Arbeit von Manuel83 bereichern, der sich um die Grundssoftware Craftbeerpi kümmert.

In diesem Tröt soll es also um den Anschluss eines LCD (hier 16 Zeichen x 2 Zeilen) gehen. Über diesen sollen ergänzende Informationen an den Nutzer übertragen werden. Z.B. die IP-Adresse, damit in einem fremden Netzwerk die Anwahl mittels Browser klappt. Später sollte z.B. mittel Knopfdruck ein Wechsel zwischen Temperatur / Schaltzustand des Heaters und der IP möglich sein. Aber auch andere Konfigurationen sind denkbar. Auch ein flotter Spruch beim einschalten (hallo welt) ist immer wieder Anlass zur Freude.
Ich wollte in diesem Tröt also nach Gleichgesinnten und Erfahreneren Bastlern suchen, um den CraftbeeerPi mit LCD-Lösungen zu schmücken. Hier könnten Codezeilen veröffentlicht werden und weitere Diskussionen nur zum Thema LCD stattfinden.

Ich bin definitiv kein Elektrotechniker, bastel aber gerne mit wechselndem Erolg im Niederspannungsbereich.

Edith mahnt die Rechtschreibung an.....
Herzliche Grüße
aalhuhnsuppe

-------------------------------------------------------
Wer einen Fehler findet, der darf ihn behalten.
Benutzeravatar
aalhuhnsuppe
Posting Freak
Posting Freak
Beiträge: 508
Registriert: Donnerstag 14. Mai 2015, 14:48
Wohnort: Potsdam

Re: Craftbeerpi - LCD Ansteuerung HD44780 16x2

#2

Beitrag von aalhuhnsuppe »

Ok, hier ist die erste Frage zu einer einfachen Testanzeige:


Folgende Anschlüsse finden sich an meinem LCD
1 Gnd
2 +5V
3 Contrast auf Gnd
4 RS auf GPIO 7
5 RW auf Gnd
6 E auf GPIO 6
7 leer
8 leer
9 leer
10 leer
11 Data 4 auf GPIO 25
12 Data 5 auf GPIO 24
13 Data 6 auf GPIO 23
14 Data 7 auf GPIO 18
15 +5V über Poti zum Dimmen der Helligkeit
16 auf Gnd

Ich benutze ein Raspbian Jessie Lite (aktuelle Version) auf einem Raspi 1 Model B (kleine GPIO-Leiste, 512MB)
Die weiteren Komponenten am Raspi sind:
- 1 Buzzer auf GPIO 22
- 1 SSR-Relais, schaltet 230V auf eine später hinzukommende Hendi auf GPIO 17
- 1 DS18B20 Thermofühler auf GPIO 4

Später soll ein weiteres SSR Relais ran (weil ich es hier liegen habe).

Freie GPIOs sind demnach noch:
2
3
14
15
27
22
10
9
11

An das LCD habe ich eine Steckerleiste gelötet, bei Anschluss zeigt mir die obere Reihe lauter ausgefüllte Kästchen an. Was auf einen korrekten Anschluss hindeutet. Bei diversen Versuchen mit einfachen Testprogrammen in Python habe ich wechselnde Erfolge zu verzeichnen.

Ich verwende einfachhalber zur Zeit diesen Code:

#####################################Code Anfang##############################################
#!/usr/bin/python
import time
import RPi.GPIO as GPIO
GPIO.setwarnings(False)

# Zuordnung der GPIO Pins (ggf. anpassen)
DISPLAY_RS = 7
DISPLAY_E = 8
DISPLAY_DATA4 = 25
DISPLAY_DATA5 = 24
DISPLAY_DATA6 = 23
DISPLAY_DATA7 = 18

DISPLAY_WIDTH = 16 # Zeichen je Zeile
DISPLAY_LINE_1 = 0x80 # Adresse der ersten Display Zeile
DISPLAY_LINE_2 = 0xC0 # Adresse der zweiten Display Zeile
# (bei 4x20-Displays lauten die Adressen der dritten und vierten Zeile: 0x94 und 0xD4)

DISPLAY_CHR = True
DISPLAY_CMD = False
E_PULSE = 0.0005
E_DELAY = 0.0005

def main():
GPIO.setmode(GPIO.BCM)
GPIO.setup(DISPLAY_E, GPIO.OUT)
GPIO.setup(DISPLAY_RS, GPIO.OUT)
GPIO.setup(DISPLAY_DATA4, GPIO.OUT)
GPIO.setup(DISPLAY_DATA5, GPIO.OUT)
GPIO.setup(DISPLAY_DATA6, GPIO.OUT)
GPIO.setup(DISPLAY_DATA7, GPIO.OUT)

display_init()

lcd_byte(DISPLAY_LINE_1, DISPLAY_CMD)
lcd_string("TESTANZEIGE")
lcd_byte(DISPLAY_LINE_2, DISPLAY_CMD)
lcd_string("123 456 789 0")

time.sleep(5)

lcd_byte(DISPLAY_LINE_1, DISPLAY_CMD)
lcd_string("Dein Display")
lcd_byte(DISPLAY_LINE_2, DISPLAY_CMD)
lcd_string("funktioniert! :)")

time.sleep(5)

def display_init():
lcd_byte(0x33,DISPLAY_CMD)
lcd_byte(0x32,DISPLAY_CMD)
lcd_byte(0x28,DISPLAY_CMD)
lcd_byte(0x0C,DISPLAY_CMD)
lcd_byte(0x06,DISPLAY_CMD)
lcd_byte(0x01,DISPLAY_CMD)

def lcd_string(message):
message = message.ljust(DISPLAY_WIDTH," ")
for i in range(DISPLAY_WIDTH):
lcd_byte(ord(message),DISPLAY_CHR)

def lcd_byte(bits, mode):
GPIO.output(DISPLAY_RS, mode)
GPIO.output(DISPLAY_DATA4, False)
GPIO.output(DISPLAY_DATA5, False)
GPIO.output(DISPLAY_DATA6, False)
GPIO.output(DISPLAY_DATA7, False)
if bits&0x10==0x10:
GPIO.output(DISPLAY_DATA4, True)
if bits&0x20==0x20:
GPIO.output(DISPLAY_DATA5, True)
if bits&0x40==0x40:
GPIO.output(DISPLAY_DATA6, True)
if bits&0x80==0x80:
GPIO.output(DISPLAY_DATA7, True)
time.sleep(E_DELAY)
GPIO.output(DISPLAY_E, True)
time.sleep(E_PULSE)
GPIO.output(DISPLAY_E, False)
time.sleep(E_DELAY)
GPIO.output(DISPLAY_DATA4, False)
GPIO.output(DISPLAY_DATA5, False)
GPIO.output(DISPLAY_DATA6, False)
GPIO.output(DISPLAY_DATA7, False)
if bits&0x01==0x01:
GPIO.output(DISPLAY_DATA4, True)
if bits&0x02==0x02:
GPIO.output(DISPLAY_DATA5, True)
if bits&0x04==0x04:
GPIO.output(DISPLAY_DATA6, True)
if bits&0x08==0x08:
GPIO.output(DISPLAY_DATA7, True)
time.sleep(E_DELAY)
GPIO.output(DISPLAY_E, True)
time.sleep(E_PULSE)
GPIO.output(DISPLAY_E, False)
time.sleep(E_DELAY)

if __name__ == '__main__':
main()
#####################################Code Ende##############################################

Gestern gings, heute nicht. Wieso nur?
Herzliche Grüße
aalhuhnsuppe

-------------------------------------------------------
Wer einen Fehler findet, der darf ihn behalten.
Antworten