Форум сайта python.su
0
Нужно подключить к Raspberry Pi текстовый экран с разрешением 16x2 (HD44780), в одной строке выводить дату и время, в другой температуру ЦП, ну или еще что-нибудь, не суть важно.
Почему-то ругается на функцию ljust.
Запускал командами sudo python ll.py, sudo python3 ll.py, sudo idle3 python ll.py Код программы:
import RPi.GPIO as GPIO import os import socket import fcntl import struct import time from time import gmtime, strftime def getCPUtemperature(): res = os.popen("vcgencmd measure_temp").readline() return(res.replace("temp=","").replace("'C\n","")) def printDateTime(): textDate = strftime("%d %A %Y", gmtime()) textTime = strftime("%H:%M:%S", gmtime()) lcd_string(textDate,LCD_LINE_1) lcd_string(textTime,LCD_LINE_2) return def getInterfaceAddress(ifname): try: s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) return socket.inet_ntoa(fcntl.ioctl( s.fileno(), 0x8915, # SIOCGIFADDR struct.pack('256s', ifname[:15]) )[20:24]) except: return '' def getIP(): ipWlan = getInterfaceAddress('wlan0') if ipWlan: return ipWlan ipEth = getInterfaceAddress('eth0') if ipEth: return ipEth # Распиновка дисплея LCD_RS = 7 LCD_E = 8 LCD_D4 = 25 LCD_D5 = 24 LCD_D6 = 23 LCD_D7 = 18 LCD_WIDTH = 16 # Ширина строки дисплея LCD_CHR = True LCD_CMD = False LCD_LINE_1 = 0x80 # LCD RAM адрес первой строки LCD_LINE_2 = 0xC0 # LCD RAM адрес второй строки E_PULSE = 0.0005 E_DELAY = 0.0005 def main(): GPIO.setwarnings(False) GPIO.setmode(GPIO.BCM) # GPIO.setup(LCD_E, GPIO.OUT) # E GPIO.setup(LCD_RS, GPIO.OUT) # RS GPIO.setup(LCD_D4, GPIO.OUT) # DB4 GPIO.setup(LCD_D5, GPIO.OUT) # DB5 GPIO.setup(LCD_D6, GPIO.OUT) # DB6 GPIO.setup(LCD_D7, GPIO.OUT) # DB7 # Инициализация дисплея lcd_init() while True: # Дата и время index = 0 while index < 5: printDateTime() time.sleep(1) index += 1 # Температура ЦП lcd_string("CPU temperature:",LCD_LINE_1) textCPU = getCPUtemperature()+"C" lcd_string(textCPU,LCD_LINE_2) time.sleep(3) lcd_string("IP:",LCD_LINE_1) textIP = getIP() lcd_string(textIP,LCD_LINE_2) time.sleep(3) def lcd_init(): # Инициализация дисплея lcd_byte(0x33,LCD_CMD) # 110011 lcd_byte(0x32,LCD_CMD) # 110010 lcd_byte(0x06,LCD_CMD) # 000110 lcd_byte(0x0C,LCD_CMD) # 001100 lcd_byte(0x28,LCD_CMD) # 101000 lcd_byte(0x01,LCD_CMD) # 000001 time.sleep(E_DELAY) def lcd_byte(bits, mode): GPIO.output(LCD_RS, mode) GPIO.output(LCD_D4, False) GPIO.output(LCD_D5, False) GPIO.output(LCD_D6, False) GPIO.output(LCD_D7, False) if bits&0x10==0x10: GPIO.output(LCD_D4, True) if bits&0x20==0x20: GPIO.output(LCD_D5, True) if bits&0x40==0x40: GPIO.output(LCD_D6, True) if bits&0x80==0x80: GPIO.output(LCD_D7, True) lcd_toggle_enable() GPIO.output(LCD_D4, False) GPIO.output(LCD_D5, False) GPIO.output(LCD_D6, False) GPIO.output(LCD_D7, False) if bits&0x01==0x01: GPIO.output(LCD_D4, True) if bits&0x02==0x02: GPIO.output(LCD_D5, True) if bits&0x04==0x04: GPIO.output(LCD_D6, True) if bits&0x08==0x08: GPIO.output(LCD_D7, True) lcd_toggle_enable() def lcd_toggle_enable(): time.sleep(E_DELAY) GPIO.output(LCD_E, True) time.sleep(E_PULSE) GPIO.output(LCD_E, False) time.sleep(E_DELAY) def lcd_string(message,line): message = message.ljust(LCD_WIDTH," ") lcd_byte(line, LCD_CMD) for i in range(LCD_WIDTH): lcd_byte(ord(message[i]),LCD_CHR) if __name__ == '__main__': try: main() except KeyboardInterrupt: pass finally: lcd_byte(0x01, LCD_CMD) lcd_string("Goodbye!",LCD_LINE_1) GPIO.cleanup()
Traceback (most recent call last): File "ll.py", line 228, in <module> main() File "ll.py", line 148, in main lcd_string(textIP,LCD_LINE_2) File "ll.py", line 218, in lcd_string message = message.ljust(LCD_WIDTH," ") AttributeError: 'NoneType' object has no attribute 'ljust'
Отредактировано Giffr (Фев. 28, 2016 09:29:02)
Офлайн
6
Ругается, потому что переменная textIP пустая. Не работает функция getIP() почему то.
Офлайн
568
У вас в этой функции
def getIP(): ipWlan = getInterfaceAddress('wlan0') if ipWlan: return ipWlan ipEth = getInterfaceAddress('eth0') if ipEth: return ipEth
Офлайн