【raspberry】(五) 四位数码管F3461BH
#!/usr/bin/env python# encoding: utf-8import RPi.GPIOimport time# 定义单个数码管各段led对应的GPIO口LED_A = 26LED_B = 19LED_C = 13LED_D = 6LED_E = 5LED_F = 11LED_G = 9LED_DP = 10# 定义1到4号数码管阳极对应的GPIO
关于这个四位数码管:
这个器件是和树莓派主板一起买的,节约了邮费,这个数码管一个有12个片脚,都是gpio接口,一起组合控制的,高电平3.3V,树莓派的GPIO正好满足这个要求,硬件图:
同时数码管从数码管的原理图上看,如下,可以按照对应的硬件图连接GPIO口,8个GPIO端口控制A、B、C、D、E、F、G、DP这八个灯管,另外四个GPIO端口用来选择四个数码管的其中一个字符,也 就是这个四位的数码管,原理图中1~12代表数码管的片脚,我们只要把树莓派上的12个GPIO端口一一的连接上就可以了,需要注意的是树莓派主板上的GPIO序号
搞清楚原理后,发现了一个问题,按照图上来说同一个时刻点只能显示一位数字啊,这可是这个可是四位数码管,怎么做到四位数据同时显示呢?
这个和人眼结构有关,其实人眼的接受频率没有计算机频率那么快,所以只要我们在0.1秒之内能够在四位数码管上都显示数据,而且不停的显示,这样我们看起来这个四个数码管就是在同一时刻显示的了
code:
因为我的面包板上有一个温度显示器,我也想把这个问题显示器读取到的数据显示出来,所以我添加了一个按键,作为时间、日期和温度的切换,主要程序如下:
**********************************************
python 写的,下次我准备用c写,因为python不能把所有的东西连接起来
**********************************************
#!/usr/bin/env python
#### encoding: utf-8
import RPi.GPIO
import time
PIN_DATA = 24
### 定义单个数码管各段led对应的GPIO
LED_A = 5
LED_B = 26
LED_C = 17
LED_D = 3
LED_E = 2
LED_F = 6
LED_G = 27
LED_DP = 4
### 定义1到4号数码管阳极对应的GPIO
DIGIT1 = 16
DIGIT2 = 13
DIGIT3 = 19
DIGIT4 = 22
### 定义按钮输入的GPIO
btn = 20
RPi.GPIO.setmode(RPi.GPIO.BCM)
RPi.GPIO.setup(LED_A, RPi.GPIO.OUT)
RPi.GPIO.setup(LED_B, RPi.GPIO.OUT)
RPi.GPIO.setup(LED_C, RPi.GPIO.OUT)
RPi.GPIO.setup(LED_D, RPi.GPIO.OUT)
RPi.GPIO.setup(LED_E, RPi.GPIO.OUT)
RPi.GPIO.setup(LED_F, RPi.GPIO.OUT)
RPi.GPIO.setup(LED_G, RPi.GPIO.OUT)
RPi.GPIO.setup(LED_DP, RPi.GPIO.OUT)
RPi.GPIO.setup(DIGIT1, RPi.GPIO.OUT)
RPi.GPIO.setup(DIGIT2, RPi.GPIO.OUT)
RPi.GPIO.setup(DIGIT3, RPi.GPIO.OUT)
RPi.GPIO.setup(DIGIT4, RPi.GPIO.OUT)
RPi.GPIO.output(DIGIT1, True)
RPi.GPIO.output(DIGIT2, True)
RPi.GPIO.output(DIGIT3, True)
RPi.GPIO.output(DIGIT4, True)
RPi.GPIO.setup(btn, RPi.GPIO.IN, pull_up_down=RPi.GPIO.PUD_UP)
def showDigit(no, num, showDotPoint):
# 先将正极拉低,关掉显示
RPi.GPIO.output(DIGIT1, False)
RPi.GPIO.output(DIGIT2, False)
RPi.GPIO.output(DIGIT3, False)
RPi.GPIO.output(DIGIT4, False)
if (num == 0) :
RPi.GPIO.output(LED_A, False)
RPi.GPIO.output(LED_B, False)
RPi.GPIO.output(LED_C, False)
RPi.GPIO.output(LED_D, False)
RPi.GPIO.output(LED_E, False)
RPi.GPIO.output(LED_F, False)
RPi.GPIO.output(LED_G, True)
RPi.GPIO.output(LED_DP, not showDotPoint)
elif (num == 1) :
RPi.GPIO.output(LED_A, True)
RPi.GPIO.output(LED_B, False)
RPi.GPIO.output(LED_C, False)
RPi.GPIO.output(LED_D, True)
RPi.GPIO.output(LED_E, True)
RPi.GPIO.output(LED_F, True)
RPi.GPIO.output(LED_G, True)
RPi.GPIO.output(LED_DP, not showDotPoint)
elif (num == 2) :
RPi.GPIO.output(LED_A, False)
RPi.GPIO.output(LED_B, False)
RPi.GPIO.output(LED_C, True)
RPi.GPIO.output(LED_D, False)
RPi.GPIO.output(LED_E, False)
RPi.GPIO.output(LED_F, True)
RPi.GPIO.output(LED_G, False)
RPi.GPIO.output(LED_DP, not showDotPoint)
elif (num == 3) :
RPi.GPIO.output(LED_A, False)
RPi.GPIO.output(LED_B, False)
RPi.GPIO.output(LED_C, False)
RPi.GPIO.output(LED_D, False)
RPi.GPIO.output(LED_E, True)
RPi.GPIO.output(LED_F, True)
RPi.GPIO.output(LED_G, False)
RPi.GPIO.output(LED_DP, not showDotPoint)
elif (num == 4) :
RPi.GPIO.output(LED_A, True)
RPi.GPIO.output(LED_B, False)
RPi.GPIO.output(LED_C, False)
RPi.GPIO.output(LED_D, True)
RPi.GPIO.output(LED_E, True)
RPi.GPIO.output(LED_F, False)
RPi.GPIO.output(LED_G, False)
RPi.GPIO.output(LED_DP, not showDotPoint)
elif (num == 5) :
RPi.GPIO.output(LED_A, False)
RPi.GPIO.output(LED_B, True)
RPi.GPIO.output(LED_C, False)
RPi.GPIO.output(LED_D, False)
RPi.GPIO.output(LED_E, True)
RPi.GPIO.output(LED_F, False)
RPi.GPIO.output(LED_G, False)
RPi.GPIO.output(LED_DP, not showDotPoint)
elif (num == 6) :
RPi.GPIO.output(LED_A, False)
RPi.GPIO.output(LED_B, True)
RPi.GPIO.output(LED_C, False)
RPi.GPIO.output(LED_D, False)
RPi.GPIO.output(LED_E, False)
RPi.GPIO.output(LED_F, False)
RPi.GPIO.output(LED_G, False)
RPi.GPIO.output(LED_DP, not showDotPoint)
elif (num == 7) :
RPi.GPIO.output(LED_A, False)
RPi.GPIO.output(LED_B, False)
RPi.GPIO.output(LED_C, False)
RPi.GPIO.output(LED_D, True)
RPi.GPIO.output(LED_E, True)
RPi.GPIO.output(LED_F, True)
RPi.GPIO.output(LED_G, True)
RPi.GPIO.output(LED_DP, not showDotPoint)
elif (num == 8) :
RPi.GPIO.output(LED_A, False)
RPi.GPIO.output(LED_B, False)
RPi.GPIO.output(LED_C, False)
RPi.GPIO.output(LED_D, False)
RPi.GPIO.output(LED_E, False)
RPi.GPIO.output(LED_F, False)
RPi.GPIO.output(LED_G, False)
RPi.GPIO.output(LED_DP, not showDotPoint)
elif (num == 9) :
RPi.GPIO.output(LED_A, False)
RPi.GPIO.output(LED_B, False)
RPi.GPIO.output(LED_C, False)
RPi.GPIO.output(LED_D, False)
RPi.GPIO.output(LED_E, True)
RPi.GPIO.output(LED_F, False)
RPi.GPIO.output(LED_G, False)
RPi.GPIO.output(LED_DP, not showDotPoint)
if (no == 1) :
RPi.GPIO.output(DIGIT1, True)
elif (no == 2) :
RPi.GPIO.output(DIGIT2, True)
elif (no == 3) :
RPi.GPIO.output(DIGIT3, True)
elif (no == 4) :
RPi.GPIO.output(DIGIT4, True)
def getTemperature_humidity():
data = []
j = 0
time.sleep(1)
RPi.GPIO.setup(PIN_DATA, RPi.GPIO.OUT)
RPi.GPIO.output(PIN_DATA, RPi.GPIO.LOW)
time.sleep(0.02)
RPi.GPIO.output(PIN_DATA, RPi.GPIO.HIGH)
RPi.GPIO.setup(PIN_DATA,RPi.GPIO.IN)
while RPi.GPIO.input(PIN_DATA) == RPi.GPIO.LOW:
continue
while RPi.GPIO.input(PIN_DATA) == RPi.GPIO.HIGH:
continue
while j < 40:
k = 0
while RPi.GPIO.input(PIN_DATA) == RPi.GPIO.LOW:
continue
while RPi.GPIO.input(PIN_DATA) == RPi.GPIO.HIGH:
k += 1
if k > 100:
break
if k < 8:
data.append(0)
else:
data.append(1)
j += 1
print "sensor is work"
print data
humidity_bit = data[0:8]
humidity_point_bit = data[8:16]
temperature_bit = data[16:24]
temperature_point_bit = data[24:32]
check_bit = data [32:40]
humidity = 0
humidity_point = 0
temperature = 0
temperature_point = 0
check = 0
for i in range(8):
humidity += humidity_bit[i] * 2 ** (7 - i)
humidity_point += humidity_point_bit[i] * 2 ** (7 - i)
temperature += temperature_bit[i] * 2 ** (7 - i)
temperature_point += temperature_point_bit[i] * 2 ** (7-i)
check += check_bit[i] * 2 ** (7 - i)
tmp = humidity + humidity_point + temperature + temperature_point
if check == tmp:
print "temperature :",temperature,",humidity: ", humidity
else:
print "wrong"
print "temperature :",temperature,",humidity: ", humidity,",check: ", check,",tmp:",tmp
return (temperature,humidity)
try:
t=0.003
count = 0
status = 0
while True:
if (RPi.GPIO.input(btn) == 1):
status = 0
if (RPi.GPIO.input(btn) == 0 and status == 0):
status =1
count += 1
count %= 3
#time.sleep(0.3)
RPi.GPIO.output(DIGIT1, False)
RPi.GPIO.output(DIGIT2, False)
RPi.GPIO.output(DIGIT3, False)
RPi.GPIO.output(DIGIT4, False)
print "count =", count
if (count == 0):
time.sleep(t)
showDigit(1, int(time.strftime("%M",time.localtime(time.time()))) / 10, False)
time.sleep(t)
showDigit(2, int(time.strftime("%M",time.localtime(time.time()))) % 10, True)
time.sleep(t)
showDigit(3, int(time.strftime("%S",time.localtime(time.time()))) / 10, False)
time.sleep(t)
showDigit(4, int(time.strftime("%S",time.localtime(time.time()))) % 10, False)
elif (count == 1):
time.sleep(t)
showDigit(1, int(time.strftime("%m",time.localtime(time.time()))) / 10, False)
time.sleep(t)
showDigit(2, int(time.strftime("%m",time.localtime(time.time()))) % 10, True)
time.sleep(t)
showDigit(3, int(time.strftime("%d",time.localtime(time.time()))) / 10, False)
time.sleep(t)
showDigit(4, int(time.strftime("%d",time.localtime(time.time()))) % 10, False)
elif (count == 2):
T,H = getTemperature_humidity()
time.sleep(t)
showDigit(1, T / 10, False)
time.sleep(t)
showDigit(2, T % 10, True)
time.sleep(t)
showDigit(3, H / 10, False)
time.sleep(t)
showDigit(4, H % 10, False)
print "ok"
except KeyboardInterrupt:
pass
### 清理GPIO口
RPi.GPIO.cleanup()
****************************************************************************************
实际显示图片如下,还是
更多推荐
所有评论(0)