# -*- coding: utf-8 -*-
import thread
# 显示屏
from datetime import *
import time
import Adafruit_GPIO.SPI as SPI
import Adafruit_SSD1306
import Image
import ImageDraw
import ImageFont
import os
import unicodedata
import traceback
# 加载库文件
import sys
sys.path.append(os.path.split(os.path.realpath(__file__))[0] + "/Adafruit_BMP085")
# 标准化编码
reload(sys)
sys.setdefaultencoding("utf-8")
# 温度,气压
from Adafruit_BMP085 import BMP085
# 温度,湿度
import Adafruit_DHT
import Adafruit_DHT.Raspberry_Pi_2 as platform
# PM2.5
import ZhyuIoT_GP2Y10
import ZhyuIoT_GP2Y10.Raspberry_Pi as gp2y10
# 发音单元
sys.path.append(os.path.split(os.path.realpath(__file__))[0] + "/Web_TTS")
from Web_TTS import TTS
# LED 控制单元
sys.path.append(os.path.split(os.path.realpath(__file__))[0] + "/RGB_LED")
from RGB_LED import RGBLED
# 思科 路由器状态
sys.path.append(os.path.split(os.path.realpath(__file__))[0] + "/CISCO_Smart")
from CISCO_Smart import CISCO
# 彩云天气
sys.path.append(os.path.split(os.path.realpath(__file__))[0] + "/Caiyun_APP")
from CAIYUN import CAIYUN
# 按钮操作
import RPi.GPIO as GPIO
# 初始化语音引擎
tts = TTS()
chinese_week = ["周一", "周二", "周三", "周四", "周五", "周六", "周日"]
# 初始化 led 控制单元
led = RGBLED(26, 13, 19)
# 初始化思科单元
cicso_smart = CISCO()
# 初始化彩云天气
caiyun = CAIYUN()
lonlat = '116.7261,23.3778' # 地理坐标 '120.1829,30.2435' #
caiyun_text = ''
# 初始化继电器 针脚定义
GPIO_RELAY = 21
# 0.96 oled spi 显示屏 针脚定义
RST = 17
DC = 27
SPI_PORT = 0
SPI_DEVICE = 0
# bmp085 参数定义
bmp = BMP085(0x77)
# AM2302 参数定义
sensor = Adafruit_DHT.DHT22
pin = 4
# 全局变量 传感器参数
humidity = 0.0
density = 0.0
temp = 0.0
pressure = 0.0
attemp_DHT = datetime(1900, 1, 1)
attemp_GP2Y10 = datetime(1900, 1, 1)
# 退出线程标志
thread_run = True
# 整点报时标志
attemp_hour = -1
# 按时间段控制播报音量
# 晚上 10 点 - 早上 8 点前,播报音量 30%;白天音量大
def volume_with_time():
time_hour = datetime.now().hour
if ((time_hour < 8) or (time_hour > 22)):
return -25
else:
return 10
def cleanup():
# 释放资源,不然下次运行是可能会收到警告
print('clean up')
GPIO.cleanup()
def load_sensor():
global attemp_DHT, attemp_GP2Y10
global humidity, density, temp, pressure
time_now = datetime.now()
# 每 2 秒读一次
# 读取 dht 湿度,温度;bmp085 温度,气压
if (time_now - attemp_DHT).seconds > 10:
attemp_DHT = time_now
# humidity, temperature = Adafruit_DHT.read_retry(sensor, pin) # 时间间隔两秒
# adafruit dht 库有问题,反复执行 pi_version 函数,open('/proc/cpuinfo', 'r') 会导致出错
humidity, temperature = Adafruit_DHT.read_retry(sensor, pin, 15, 2, platform) # 时间间隔两秒
temp = (bmp.readTemperature() + temperature) / 2
pressure = bmp.readPressure()
# 读取 pm2.5浓度,每 5 秒读一次
if (time_now - attemp_GP2Y10).seconds > 30:
attemp_GP2Y10 = time_now
density = ZhyuIoT_GP2Y10.read(ZhyuIoT_GP2Y10.GP2Y1051A, 5, gp2y10) # if density is None: attemp = 1 ATTEMPS = 5
def start_sensor():
while thread_run:
try:
load_sensor()
except:
print "sensor except: ", traceback.print_exc()
time.sleep(1)
# 读取传感器参数线程
def thread_sensor():
thread.start_new_thread(start_sensor, ())
# 128x64 display with hardware SPI:
disp = Adafruit_SSD1306.SSD1306_128_64(rst=RST, dc=DC, spi=SPI.SpiDev(SPI_PORT, SPI_DEVICE, max_speed_hz=8000000))
# Initialize library.
disp.begin()
# Clear display.
disp.clear()
# 显示内容
# Create blank image for drawing.
# Make sure to create image with mode '1' for 1-bit color.
width = disp.width
height = disp.height
image = Image.new('1', (width, height))
# Get drawing object to draw on image.
draw = ImageDraw.Draw(image)
# Load default font.
font = ImageFont.truetype(os.path.split(os.path.realpath(__file__))[0] + "/simsun.ttf", 12)
# OLED 显示
def oled_display():
global humidity, temperature, density, temp, pressure
global attemp_hour
global cisco_text, cisco_time
global caiyun_text
datetime_now = datetime.now()
padding = 0
top = 0
left = 0
# Clear image buffer by drawing a black filled box.
draw.rectangle((0,0,width,height), outline=0, fill=0)
if (datetime_now - cisco_time).seconds < 20:
# 显示路由器提示信息
today = cisco_text
today = unicode(today, 'UTF-8')
else:
# 显示时间
today = datetime_now.strftime('%m月%d日 %H:%M:%S') + " " + chinese_week[datetime_now.weekday()]
today = unicode(today, 'UTF-8')
# 显示天气
if len(caiyun_text) > 0:
today += " " + unicode(caiyun_text, 'UTF-8') + "\n\n"
txt = today
# 计算文本长度,实现滚动跑马字
font_width, font_height = font.getsize(txt)
# 文字小于 128 像素,无需执行跑马灯
if font_width < width:
draw.text((left, top), txt, font=font, fill=255)
else:
txt += txt
text_left = int((time.time() * 35) % font_width)
draw.text((-text_left, top), txt, font=font, fill=255)
top = top + 16
txt = unicode("温度:%.1f ℃" % temp, "UTF-8")
draw.text((left, top), txt, font=font, fill=255)
top = top + 16
txt = unicode("湿度:%.1f %%" % humidity, "UTF-8")
draw.text((left, top), txt, font=font, fill=255)
top = top + 16
txt = unicode("PM2.5:%.1f ug/m³" % density, "UTF-8")
draw.text((left, top), txt, font=font, fill=255)
# Display image.
disp.image(image)
disp.display()
if attemp_hour != datetime_now.hour:
attemp_hour = datetime_now.hour
txt = '现在时间 %s %s,%s, 温度%.1f摄氏度,湿度百分之%.1f ,气压%.1f帕,PM2.5浓度%.1f微克每立方米' % (datetime.now().strftime('%H:%M'),
chinese_week[datetime.now().weekday()],
caiyun_text,
temp,
humidity,
(pressure / 100.0),
density)
print datetime.now().strftime('%H:%M:%S >> ') + txt
tts.raspberryTalk(txt, volume_with_time())
def start_oled():
while thread_run:
try:
oled_display()
except:
print "oled except: ",traceback.print_exc()
time.sleep(0.1)
# 读取传感器参数线程
def thread_oled():
thread.start_new_thread(start_oled, ())
def start_led():
while thread_run:
try:
#led.test(8, 0.008)
led.breath(1, 0.012)
except:
print "led except: ", traceback.print_exc()
time.sleep(0.5)
# 读取传感器参数线程
def thread_led():
thread.start_new_thread(start_led, ())
# 路由状态提示
cisco_text = ""
cisco_time = datetime(1900, 1, 1)
# 处理在线用户状态
def cisco_callback(friendlyName, userDeviceName, new_status):
global cisco_text, cisco_time
friendlyName = friendlyName.replace('android-', '').replace('iphone-', '')
print friendlyName, userDeviceName, new_status
# 开门,提示灯,声音提示
if new_status == 1:
# 执行开门
if userDeviceName == True:
# 定制用户,红灯提醒
led.setLight(0xff0000, 20)
txt = "注意:" + friendlyName + " 来了"
else:
# 普通用户,蓝灯提醒
led.setLight(0x0000ff, 20)
txt = friendlyName + " 来了"
# 执行开门操作,继电器闭合
GPIO.setup(GPIO_RELAY, GPIO.OUT)
elif new_status == 0:
# 用户走了,绿灯提习惯
led.setLight(0x00ff00, 20)
txt = friendlyName + " 走了"
# 屏幕提示
cisco_text = txt
cisco_time = datetime.now()
# 语音提示
print datetime.now().strftime('%H:%M:%S >> ') + txt
tts.raspberryTalk(txt, volume_with_time())
# 继电器停止
GPIO.setup(GPIO_RELAY, GPIO.IN)
def start_cisco():
while thread_run:
try:
cicso_smart.online_devices(cisco_callback)
except:
print "cisco except: ", traceback.print_exc()
time.sleep(1)
# 读取路由器在线
def thread_cisco():
thread.start_new_thread(start_cisco, ())
def get_caiyun():
global caiyun_text, l
没有合适的资源?快使用搜索试试~ 我知道了~
温馨提示
基于 树莓派 的项目,天气实况、天气预报,实时温度、湿度、空气污染指数,自带中文语音播报,根据思科 EA 系列路由器,实现自动门禁功能。.zip嵌入式优质项目,资源经过严格测试可直接运行成功且功能正常的情况才上传,可轻松copy复刻,拿到资料包后可轻松复现出一样的项目。 本人单片机开发经验充足,深耕嵌入式领域,有任何使用问题欢迎随时与我联系,我会及时为你解惑,提供帮助。 【资源内容】:包含完整源码+工程文件+说明,项目具体内容可查看下方的资源详情。 【附带帮助】: 若还需要嵌入式物联网单片机相关领域开发工具、学习资料等,我会提供帮助,提供资料,鼓励学习进步。 【本人专注嵌入式领域】: 有任何使用问题欢迎随时与我联系,我会及时解答,第一时间为你提供帮助,CSDN博客端可私信,为你解惑,欢迎交流。 【建议小白】: 在所有嵌入式开发中硬件部分若不会画PCB/电路,可选择根据引脚定义将其代替为面包板+杜邦线+外设模块的方式,只需轻松简单连线,下载源码烧录进去便可轻松复刻出一样的项目 【适合场景】: 相关项目设计中,皆可应用在项目开发、毕业设计、课程设计、期末/期中/大作业、工程实训、大创等学科竞赛比赛、初期项目立项、学习/练手等方面中 可借鉴此优质项目实现复刻,也可以基于此项目进行扩展来开发出更多功能
资源推荐
资源详情
资源评论
收起资源包目录
基于 树莓派 的项目,天气实况、天气预报,实时温度、湿度、空气污染指数,自带中文语音播报,根据思科 EA 系列路由器,实现自动门禁功能。.zip (15个子文件)
Archie1000
screenshots
microMsg.1437207433457.jpg 2.26MB
20150720_152030.jpg 3.11MB
20150717_101210.jpg 2.49MB
20150720_150132.jpg 3.51MB
20150720_152059.jpg 2.78MB
.gitattributes 378B
master
Adafruit_BMP085
Adafruit_BMP085.py 8KB
CISCO_Smart
CISCO_Smart.py 3KB
Web_TTS
Web_TTS.py 3KB
tts.mp3 33KB
alert.mp3 40KB
RGB_LED
RGB_LED.py 3KB
PiBox.py 9KB
simsun.ttf 10.01MB
.gitignore 3KB
共 15 条
- 1
资源评论
阿齐Archie
- 粉丝: 1w+
- 资源: 2303
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功