zoukankan      html  css  js  c++  java
  • 树莓派自动播报温湿度到QQ空间、微博

    原文链接 https://aoaoao.me/951.html

    这是个比较无聊的应用。。。灵感来自于一个叫做“古城钟楼”的微博账号,此账号每天都会定点报时,除此之外没有其他任何内容,以此吸引了近50万粉丝!

    报时什么的太无聊了,不如每天定时读取室内温度、湿度并自动发说说、微博播报温度,在成为网红的道路上迈开第一步Cache_-647e6a9dd5a8048a.

    最终实现的效果:

    硬件相关

    需要的硬件:

    树莓派,DHT11传感器(DHT22也可以,温度测量范围更大,但要贵一些)

    推荐购买像这样的DHT11模块,电阻什么都弄好了,插上就能用

     

    DHT11模块有三个引脚:VCC供电,DAT数据,GND接地,参考树莓派引脚图,VCC接pin2或pin4,DAT接pin12(GPIO18),GND接pin6,接好后如果电源指示灯亮了应该就没什么问题了。

    如果你购买的是不带集成板的裸模块,还需要在VCC和DAT之间串一个电阻(应该是串吧。。物理不好),像这样(图来自网络)

    开始写代码

    Python发说说是件让人头疼的试,QQ空间登录加密机制比较繁琐,好在Github上有个针对python3的QQlib项目完美解决了这个问题。

    1.安装必要组件

    由于我们将在Python3中实现这个应用,而树莓派默认Python版本是2,但可以通过“python3”命令召唤Python3,在以下的步骤中请分清Python 和Python3.

    先su一下

    安装setuptools:直接执行 自动安装:

    wget https://bootstrap.pypa.io/ez_setup.py -O - | python3

    安装requests:

    git clone git://github.com/kennethreitz/requests.git
    cd requests
    python3 setup.py install

    安装rsa:

    git clone https://github.com/sybrenstuvel/python-rsa.git
    cd python-rsa
    python3 setup.py install

    安装QQlib:

    git clone https://github.com/JetLua/qqlib.git
    cd qqlib
    python3 setup.py install

    所需组件就这些,接下来要写代码了。代码我已经托管到Github,可以直接Clone下来用:https://github.com/HFO4/pi-temperature

    这里给出核心脚本的注释版本:

    Python
    #!/usr/bin/python
    import RPi.GPIO as GPIO
    import time
    import qqlib
    import urllib
    import os
    #设置DAT口的GPIO编号
    channel = 18
    #下面的依次是QQ号、QQ密码、微博账号、微博密码
    QQnum=""
    QQpass=""
    weiboUm=""
    weiboPass=""
    #历史上的今天
    def histoday():
    #注意 这里是我自用的接口,里面会有点奇怪的东西,推荐(必须)更换为自己的!!
    content = urllib.request.urlopen('https://aoaoao.me/api/today.php').read()
    return (content.decode('utf-8'))
    #读取昨日温度、计算温差、写入今日温度
    def old_text(temperature):
    #注意!这里请更改为你自己的目录
    file_r = open('/home/pi/shuo/log.txt')
    data_old = file_r.read()
    file_r.close( )
    log_text = str(temperature)
    file_object = open('log.txt','w')
    file_object.write(log_text)
    file_object.close()
    if(temperature>int(data_old)):
    return "今天的温度相比昨日此时高了"+str(temperature-int(data_old))+""
    elif(temperature == int(data_old)):
    return "今天的温度与昨日此时持平哦"
    else:
    return "今天的温度相比昨日此时低了"+str(int(data_old)-temperature)+""
    #获取传感器数据
    def getdata(channel):
    data = []
    j = 0
    while GPIO.input(channel) == GPIO.LOW:
    continue
    while GPIO.input(channel) == GPIO.HIGH:
    continue
    while j < 40:
    k = 0
    while GPIO.input(channel) == GPIO.LOW:
    continue
    while GPIO.input(channel) == GPIO.HIGH:
    k += 1
    if k > 100:
    break
    if k < 8:
    data.append(0)
    else:
    data.append(1)
    j += 1
    return (data)
    check = 0
    tmp = 1
    #因为DHT11常常抽风,温度跳到40多度,这里做一个判断,一直读,直到读对
    while (check !=tmp):
    GPIO.setmode(GPIO.BCM)
    time.sleep(1)
    GPIO.setup(channel, GPIO.OUT)
    GPIO.output(channel, GPIO.LOW)
    time.sleep(0.02)
    GPIO.output(channel, GPIO.HIGH)
    GPIO.setup(channel, GPIO.IN)
    data = getdata(channel)
    print (data)
    tmp = 1
    check = 0
    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
    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
    GPIO.cleanup()
    #歇一歇
    time.sleep(1)
    #播报文字
    s="【温度自动播报】当前室内温度为:"+str(temperature)+"℃ (来自DHT11传感器) 相对空气湿度:"+str(humidity)+"% ,"+old_text(temperature)+"
    【历史上的今天】
    "+histoday()+"
    (本消息由我家树莓派自动发送)"
    #注意!这里请更改为你自己的目录
    file_object1 = open('/home/pi/shuo/t.txt','w')
    file_object1.write(s)
    file_object1.close()
    #登录QQ空间
    qq = qqlib.QQ(QQnum, QQpass)
    #发说说
    qq.feed(s)
    #执行weibo.py发微博
    os.system("python weibo/weibo.py "+weiboUm+" "+weiboPass)
    print(s)

    如果懒得看这些代码,直接执行:

    git clone https://github.com/HFO4/pi-temperature.git
    cd pi-temperature

    然后打开shuo.py修改第7行为你的DAT口的GPIO编号,第8-11行为QQ、微博账号密码,第16行、88行改成你自己的路径(要为绝对路径),进入weibo目录,修改weibo.py第92行为你自己的路径。

    然后执行

    python3 shuo.py

    如果看到下面提示,说明一切正常,再检查说说、微博是不是发出去了

    设置定时任务

    我想要每天早上7点树莓派自动播报,这需要添加Cron定时任务。在此之前先执行date命令看看时间对不对,树莓派默认有自动的联网校对时间,但我们还要设置一下时区,执行tzselect,输入5 回车

    输入9 选择中国回车 输入1 选择北京 回车即可 再执行date看看时间是不是正确了了?

    然后设置定时任务。执行crontab -e
    在最后一行加上

    0 7 * * * sh 你自己的目录/do.sh >/dev/null 2>&1

    这表示每天7点整执行一次do.sh. 然后执行/etc/init.d/cron restart重启cron服务。

    继续来到刚刚的pi-temperature目录,编辑do.sh,将其中的路径改为你自己的
    至此,此应用就算是配置完成了。
    坐等粉丝破万成为网红 哈哈哈

  • 相关阅读:
    nyoj 17 单调递增最长子序列
    nyoj 18 The Triangle
    nyoj 712 探 寻 宝 藏
    nyoj 61传纸条(一)
    nyoj 269 VF
    nyoj 44 子串和
    nyoj 252 01串
    nyoj 42 一笔画问题
    nyoj 756 重建二叉树
    Table 样式设置
  • 原文地址:https://www.cnblogs.com/linuxde/p/8718068.html
Copyright © 2011-2022 走看看