tzabbi
Goto Top

Raspberry Pi mittels Python auf 1602-LCD und Rotary Encoder Menü durchblättern

Hallo Admins,

ich habe mich einen neuen Projekt gewidmet. Ich möchte mittels Raspberry Pi 3, einem Rotary Encoder und einem LCD1602, ein kleines Menü bauen, was man auf dem LCD sieht und welches über den Rotary Encoder durchgeblättert werden kann. Wenn man den richtigen Menüeintrag hat und den Knopf des Rotary Encoders betätigt, dann sollen die entsprechenden Informationen angezeigt werden. Das ganze schreibe ich in Python 3.

Einzeln klappt es bereits und derzeit befinde ich mich in der Implementierung, von beiden Teilen.

Jedoch kommt bei mir der Fehler:

/bin/python3 /home/pi/allInOne.py
Traceback (most recent call last):
  File "/home/pi/allInOne.py", line 153, in <module>  
    lcd.message = 'Start Program'  
  File "/usr/local/lib/python3.7/dist-packages/adafruit_character_lcd/character_lcd.py", line 360, in message  
    self.cursor_position(col, line)
  File "/usr/local/lib/python3.7/dist-packages/adafruit_character_lcd/character_lcd.py", line 246, in cursor_position  
    self._write8(_LCD_SETDDRAMADDR | (column + _LCD_ROW_OFFSETS[row]))
  File "/usr/local/lib/python3.7/dist-packages/adafruit_character_lcd/character_lcd.py", line 507, in _write8  
    self._pulse_enable()
  File "/usr/local/lib/python3.7/dist-packages/adafruit_character_lcd/character_lcd.py", line 517, in _pulse_enable  
    self.enable.value = False
  File "/usr/local/lib/python3.7/dist-packages/digitalio.py", line 164, in value  
    self._pin.value(1 if val else 0)
  File "/usr/local/lib/python3.7/dist-packages/adafruit_blinka/microcontroller/bcm283x/pin.py", line 58, in value  
    GPIO.output(self.id, val)
RuntimeError: The GPIO channel has not been set up as an OUTPUT


Dazu noch das Programm:

#!/usr/bin/env python3

# this program is a simple test that all components work togehter
# import all libs
import RPi.GPIO as GPIO
import time
import board
import csv
from datetime import datetime
import digitalio
import csv
import adafruit_character_lcd.character_lcd as characterlcd
import os

# program startpoint

# change working directory
# determine directory of the program
abspath = os.path.abspath(__file__)
dname = os.path.dirname(abspath)
# set working directory to the directory of the program
os.chdir(dname)

# display data -------------------------------------------------
lcd_columns = 16
lcd_rows = 2

# define digital outputs ---------------------------------------------
lcd_rs = digitalio.DigitalInOut(board.D22)
lcd_en = digitalio.DigitalInOut(board.D17)
lcd_d4 = digitalio.DigitalInOut(board.D25)
lcd_d5 = digitalio.DigitalInOut(board.D24)
lcd_d6 = digitalio.DigitalInOut(board.D23)
lcd_d7 = digitalio.DigitalInOut(board.D18)

# initilize lcd -----------------------------------------------
lcd = characterlcd.Character_LCD_Mono(lcd_rs, lcd_en, lcd_d4,
                                      lcd_d5, lcd_d6,lcd_d7,
                                      lcd_columns,lcd_rows)

# initilize rotary encoder
GPIO.setmode(GPIO.BCM)

# define pins
PIN_CLK = 16
PIN_DT = 17
BUTTON_PIN = 27

GPIO.setup(PIN_CLK, GPIO.IN, pull_up_down=GPIO.PUD_UP)
GPIO.setup(PIN_DT, GPIO.IN, pull_up_down=GPIO.PUD_UP)
GPIO.setup(BUTTON_PIN, GPIO.IN, pull_up_down=GPIO.PUD_UP)

Counter = 0
ShowDetails = False
PIN_CLK_LETZTER = 0
PIN_CLK_AKTUELL = 0
delayTime = 0.01
Headers = 
Values = 

# Initiales Auslesen des Pin_CLK
PIN_CLK_LETZTER = GPIO.input(PIN_CLK)

# define functions of rotary encoder
def ausgabeFunktion(null):
    global Counter

    PIN_CLK_AKTUELL = GPIO.input(PIN_CLK)
    if PIN_CLK_AKTUELL != PIN_CLK_LETZTER:

        if GPIO.input(PIN_DT) != PIN_CLK_AKTUELL:
            Counter += 1
        else:
            Counter -= 1
        if Counter < 0:
            Counter = 2
        if Counter > 2:
            Counter = 0
        if Counter == 0:
            lcd.clear()
            lcd.message = 'current Date'  
        elif Counter == 1:
            lcd.clear()
            lcd.message = 'current Time'  
        elif Counter == 2:
            lcd.clear()
            lcd.message = 'humidity and temp'  
        else:
            print('Error just wait 2s')  
            time.sleep(2)
            Counter = 0
            lcd.clear()
            lcd.message = 'current Date'  

def CounterReset(null):
    global Counter
    global ShowDetails
    global Headers
    global Values

    if ShowDetails == True and Counter == 0:
        ShowDetails = False
        lcd.clear()
        lcd.message = 'current Date'  

    elif ShowDetails == True and Counter == 1:
        ShowDetails = False
        lcd.clear()
        lcd.message = 'current Time'  
    elif ShowDetails == True and Counter == 2:
        ShowDetails = False
        lcd.clear()
        lcd.message = 'humidity and temp'  

    if ShowDetails == False and Counter == 0:
        ShowDetails = True
        lcd.clear()
        lcd.message = 'current Date:'  
        lcd.message = datetime.now().strftime('\n   %d %b %y')  

    elif ShowDetails == False and Counter == 1:
        ShowDetails = True
        lcd.clear()
        lcd.message = 'current Time:'   
        while Counter == 1:
            lcd.clear()
            lcd.message = datetime.now().strftime('\n   %H:%M:%S')  
            time.sleep(1)

    elif ShowDetails == False and Counter == 2:
        with open("DHT22.csv", "r") as csv_file:  
            csv_reader = csv.reader(csv_file, delimiter=',')  
            # count lines
            lines = 0
            # write data in array
            for row in csv_reader:
                if lines == 0:
                    Headers = row
                else:
                    Values = row
                lines += 1
            # display data on screen
            
        #for i in range(lines):
        lcd.clear()
        lcd.message = Headers + ": " + Values  
        lcd.message = '\n' + Headers + ": " + Values  


GPIO.add_event_detect(PIN_CLK, GPIO.BOTH, callback=ausgabeFunktion, bouncetime=1000)
GPIO.add_event_detect(BUTTON_PIN, GPIO.FALLING, callback=CounterReset, bouncetime=1000)

lcd.message = 'Start Program'  

try:
    while True:
        time.sleep(delayTime)

except KeyboardInterrupt:
    GPIO.cleanup()

Ich bin leider nicht erfahren genug, um die Fehlermeldung richtig zu deuten und den Fehlergrund zu erkennen.
Könnt Ihr mir bitte weiterhelfen und sagen, was genau der Fehler ist und wie man ihn beseitigen kann?

Ein schönes Wochenende euch und Gruß
tzabbi

Content-ID: 657022

Url: https://administrator.de/contentid/657022

Ausgedruckt am: 19.12.2024 um 12:12 Uhr

Lochkartenstanzer
Lösung Lochkartenstanzer 28.02.2021 um 10:25:54 Uhr
Goto Top
Moin,

Die Fehlermeldung impliziert, daß Du vergessen hast, den betreffenden GPIO-Kanal als Out zu deklarieren.

lks
tzabbi
tzabbi 28.02.2021 um 10:38:43 Uhr
Goto Top
Ich habe gerade bemerkt, dass ich einen Pin falsch gesteckt habe.

Vielen Dank!