【发布时间】:2018-07-26 17:45:10
【问题描述】:
我正在使用 Raspberry Pi 和带 I2C 的 16x2 LCD 显示屏来显示日期、时间(包括秒数)和设备的 IP 地址。
脚本位于 cron 表中,并计划每分钟运行一次。在脚本本身内,秒数会每秒重新加载。
代码只工作了整整五分钟,然后显示的文本开始中断。我对 Python 不是很熟悉,因此我感谢任何反馈,以使此代码更正确。
cron 表项只是:
* * * * * python /home/pi/display.py
我主要只是操纵了代码的底部:
#!/usr/bin/env python
import time
import smbus
import socket
import fcntl
import struct
BUS = smbus.SMBus(1)
def write_word(addr, data):
global BLEN
temp = data
if BLEN == 1:
temp |= 0x08
else:
temp &= 0xF7
BUS.write_byte(addr ,temp)
def send_command(comm):
# Send bit7-4 firstly
buf = comm & 0xF0
buf |= 0x04 # RS = 0, RW = 0, EN = 1
write_word(LCD_ADDR ,buf)
time.sleep(0.002)
buf &= 0xFB # Make EN = 0
write_word(LCD_ADDR ,buf)
# Send bit3-0 secondly
buf = (comm & 0x0F) << 4
buf |= 0x04 # RS = 0, RW = 0, EN = 1
write_word(LCD_ADDR ,buf)
time.sleep(0.002)
buf &= 0xFB # Make EN = 0
write_word(LCD_ADDR ,buf)
def send_data(data):
# Send bit7-4 firstly
buf = data & 0xF0
buf |= 0x05 # RS = 1, RW = 0, EN = 1
write_word(LCD_ADDR ,buf)
time.sleep(0.002)
buf &= 0xFB # Make EN = 0
write_word(LCD_ADDR ,buf)
# Send bit3-0 secondly
buf = (data & 0x0F) << 4
buf |= 0x05 # RS = 1, RW = 0, EN = 1
write_word(LCD_ADDR ,buf)
time.sleep(0.002)
buf &= 0xFB # Make EN = 0
write_word(LCD_ADDR ,buf)
def init(addr, bl):
global LCD_ADDR
global BLEN
LCD_ADDR = addr
BLEN = bl
try:
send_command(0x33) # Must initialize to 8-line mode at first
time.sleep(0.005)
send_command(0x32) # Then initialize to 4-line mode
time.sleep(0.005)
send_command(0x28) # 2 Lines & 5*7 dots
time.sleep(0.005)
send_command(0x0C) # Enable display without cursor
time.sleep(0.005)
send_command(0x01) # Clear Screen
BUS.write_byte(LCD_ADDR, 0x08)
except:
return False
else:
return True
def clear():
send_command(0x01) # Clear Screen
def openlight(): # Enable the backlight
BUS.write_byte(0x27,0x08)
BUS.close()
def write(x, y, str):
if x < 0:
x = 0
if x > 15:
x = 15
if y <0:
y = 0
if y > 1:
y = 1
# Move cursor
addr = 0x80 + 0x40 * y + x
send_command(addr)
for chr in str:
send_data(ord(chr))
def get_ip_address(ifname):
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
return socket.inet_ntoa(fcntl.ioctl(
s.fileno(),
0x8915,
struct.pack('256s', ifname[:15])
)[20:24])
if __name__ == '__main__':
init(0x27, 1)
write(0, 1, 'IP: ' + get_ip_address('wlan0'))
write(0, 0, time.strftime('%b')) #month
write(4, 0, time.strftime('%d')) #day of month
write(8, 0, time.strftime('%H:')) #hour
write(11, 0, time.strftime('%M:')) #minute
while True:
write(14, 0, time.strftime('%S'))#second
time.sleep(1)
【问题讨论】:
-
请在问题本身中包含代码,而不是粘贴库
-
你需要cron,还是你的代码中的无限while循环好吗?
-
cron 不会超过分钟,所以你需要以不同的方式来做。
-
他的代码里面有一个无限循环...
-
是的,我希望这个脚本在 Pi 启动时运行,所以我把它放在 crontable 中。
标签: python cron raspberry-pi