吾爱破解 - LCG - LSG |安卓破解|病毒分析|www.52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 13187|回复: 73
收起左侧

[Python 转载] Python+树莓派制作IoT(物联网)门控设备

  [复制链接]
python8215 发表于 2018-3-5 13:42
本帖最后由 python8215 于 2018-3-5 13:54 编辑

今天就和大家分享一个正在制作的物联网开关门监控设备。
1.jpg
因为考虑需要在户外使用这套物联网门控设备,所以利用树莓派完成这个设备有两个问题需要解决,
第一是需要解决树莓派和相关模块的供电问题。
第二就是需要户外没有宽带网络情况下的信号传输问题。
只要解决这两个问题那么剩下来的问题就是编程方面的了,针对以上两个问题,这里我们采用比较大众化的方式解决,设备的供电问题我们使用太阳能配合蓄电池进行实现7X24小时供电,信号的传输问题我们使用一块叫做SIM868的通讯模块来实现。下面来介绍一下设备制作的材料准备、制作过程以及程序的编写和调试。
1.准备材料及工具
1.树莓派(Raspberry Pi 3B) 数量:1块
2.jpg
2.SIM868通讯模块(这里使用的是适配树莓派的微雪电子的SIM868通讯模块) 数量:1块
3.jpg
3.电磁感应磁条(常开常闭型) 数量:1组4.SIM868模块外接天线 数量:1根(根据现场安设实际情况确定)5.树莓派T型扩展板 数量:1块6.实验面包板 数量:1块7.杜邦线(公对公,公对母) 数量:若干8.太阳能板 数量:1块9.带保护板的锂电池 数量:2组(根据电池使用的性能情况可适当增加)10.电压电流转换板 数量:1块11.连接电线 数量:(根据现场安设实际情况确定)12.两芯屏蔽线 数量:10米(0.3粗即可根据现场安设实际情况确定)13.防爆箱 (防尘、防雾) 数量:1个(规格根据实际情况确定)14.Micro USB充电线 数量:2根15.SIM卡(移动和联通均可,模块暂不支持电信CDMA) 数量:1张16.电烙铁及焊锡
4.jpg
2.设备供电及模块链接说明
(1)供电原理:设备的供电依靠太阳能板配合锂电池进行供电,需要一块可以将太阳能板和锂电池的输出电压和电流转换成树莓派和SIM868通讯模块工作电压和电流的转换板,设备供电链接图如图。
实现效果,白天可以通过太阳能负责给树莓派及通讯模块供电并同时给锂电池充电。晚上将由充电完毕的锂电池负责给设备供电。

5.jpg
(2)设备链接:树莓派的GPIO PIN# 2针脚(5V)和 PIN# 23针脚 链接电磁感应模块的引线。负责接收电磁感应模块的开关状态,树莓派的GPIO PIN# 4(5V),PIN# 6(Ground) ,PIN# 8(TX),PIN# 10(RX)分别链接SIM868通讯模块的5V,ground,串口TX和RX,负责实现模块的树莓派与SIM868通讯模块的串口通讯和供电链接,并将信号树莓派的接收到的电磁感应磁条开关信号,通过SIM868通讯模块出输出去(这里采用的是http传输协议,具体实现方法见程序编码部分)
6.jpg
3.程序代码:
(1)python程序源码:

import  RPi.GPIO as GPIO
import time
import serial
def gpio_init():
    GPIO.setwarnings(False)
    GPIO.setmode(GPIO.BOARD)
    GPIO.setup(23,GPIO.OUT)
def send_data(param):
    W_http_6='AT+HTTPPARA="URL","http://**************/iot.php?status='+param+'"\r\n'
    ser.write(W_http_6)
    time.sleep(2)
    W_http_7='AT+HTTPACTION=0\r\n'
    ser.write(W_http_7)
    time.sleep(3)
if __name__ == '__main__':
    ser = serial.Serial("/dev/ttyS0",115200)
    W_http_1='AT+HTTPTERM\r\n'
   ser.write(W_http_1)
    time.sleep(3)
    W_http_2='AT+SAPBR=3,1,"CONTYPE","GPRS"\r\n'
   ser.write(W_http_2)
    time.sleep(3)
    W_http_3='AT+SAPBR=3,1,"APN","CMNET"\r\n'
    ser.write(W_http_3)
    time.sleep(3)
    W_http_4='AT+SAPBR=1,1\r\n'
    ser.write(W_http_4)
    time.sleep(3)
    W_http_5='AT+HTTPINIT\r\n'
    ser.write(W_http_5)
    time.sleep(3)
    gpio_init()
    status=1
    while True:
        if GPIO.input(23) == True:
            if status==1:
                send_data(2)
                status=2
                print "门的状态:关闭"
            else:
                pass
        else:
            if status==2:
                send_data(1)
                status=1
                print "门的状态:打开"
            else:
                pass
        time.sleep(3)
    GPIO.cleanup()
(2)php程序源码:
    require_once("../../func/dbaccess.php");
    if (doConnect($cn) == false) {
        return false;
   }
    $strSQL = "insert into iot_tbl (position,status,create_time) values ("'.第一号门.'",'". $_GET['status']."',now())";
    doInsertUpdate($strSQL);
    doClose($cn);
4.代码解析:
这里使用的Python版本号为2.7.9

import  RPi.GPIO as GPIO
import time
import serial
引用了python的3个类库GPIO,time以及串口调试库serial,为实现程序的调试可编写,在使用serial串口调试库前,要实现树莓派的串口配置和Linux系统下的串口调试工具minicom的安装。
ser=serial.Serial("/dev/ttyS0",115200)
W_http_1='AT+HTTPTERM\r\n'
ser.write(W_http_1)
time.sleep(3)
W_http_2='AT+SAPBR=3,1,"CONTYPE","GPRS"\r\n'
ser.write(W_http_2)
time.sleep(3)
W_http_3='AT+SAPBR=3,1,"APN","CMNET"\r\n'ser.write(W_http_3)
time.sleep(3)
W_http_4='AT+SAPBR=1,1\r\n'ser.write(W_http_4)
time.sleep(3)
W_http_5='AT+HTTPINIT\r\n'ser.write(W_http_5)
time.sleep(3)
以上代码实在通过调用serial库,设置树莓派串口通信的波特率为115200,并使用 ser.write()函数向串口写入可操作SIM868模块进行通讯的AT指令,这里的AT指令是对SIM868进行HTTP通讯前的配置,具体AT指令的含义在这里不再赘述,可自行百度查找。这是使用time.sleep()函数控制程序执行的等待时间,确保串口写入数据成功。
def gpio_init():
    GPIO.setwarnings(False)
   GPIO.setmode(GPIO.BOARD)
    GPIO.setup(23,GPIO.OUT)
gpio_init()函数是实现对接收电磁感应模块的GPIO PIN#23针脚的初始化配置。
status=1
    while True:
        if GPIO.input(23) == True:
           if status==1:
               send_data(2)
               status=2
               print "门的状态:关闭"
            else:  
              pass
       else:
           if status==2:
               send_data(1)
                status=1
                print "门的状态:打开"
            else:
                pass
        time.sleep(3)
这里使用status变量初始化门的状态为1表示门已打开,并使用while True循环分割三秒钟(time.sleep(3))检测GPIO PIN#23 号针脚的电流状态,从而判断门的开关状态,并调用send_data()函数进行数据的发送。
def send_data(param):
    W_http_6='AT+HTTPPARA="URL","http://**************/iot.php?status='+param+'"\r\n'
    ser.write(W_http_6)
    time.sleep(2)
    W_http_7='AT+HTTPACTION=0\r\n'
    ser.write(W_http_7)
    time.sleep(3)
这里将门的状态status变量的值当做参数传送给你个send_data()函数,在添加到HTTP请求的URL中,在服务器端写了个PHP程序iot.php(程序源码j解析如下)用以接收SIM868通讯模块发送过来的HTTP请求,并使用GET的方式获得到HTTP请求URL中传入的status值,并插入到MySQL数据库中。
    require_once("../../func/dbaccess.php");//封装链接操作MySQL数据库的函数
   if (doConnect($cn) == false) {           //链接数据库
        return false;   
}   
$strSQL = "insert into iot_tbl (position,status,create_time) values ("'.第一号门.'",'".$_GET['status']."',now())";  //将数据插入MySQL数据库的SQL语句
    doInsertUpdate($strSQL);                 //执行SQL
    doClose($cn);                            //关闭数据库链接
4.程序拓展:
以上程序完成的是对开关门信号的检测、发送和接收数据,属于整个设备接收和处理数据的核心部分,对接收到的数据,还要做进一步的展示,这里我采用了HTML+JQuery+AJAX的方式,并配合在HTML中播放音频文件和刷新开关门状态图表,来动态展示开关门的效果。实现原理是使用AJAX操作PHP程序循环实时读取MySQL数据库,查看当前门的开关状态,并循环局部刷新HTML页面播放音频和刷新html页面图标,对门的开关效果进行动态展示。每个人的需求不同,展示部分的代码就不做说明,也参照上诉方案自行编写。
新人贴,请大家多多支持!

免费评分

参与人数 23吾爱币 +25 热心值 +23 收起 理由
99910369 + 1 + 1 用心讨论,共获提升!
52P + 1 + 1 鼓励转贴优秀软件安全工具和文档!
la2364 + 1 + 1 用心讨论,共获提升!
sophieqd + 1 + 1 谢谢@Thanks!
此心安处既吾乡 + 1 + 1 谢谢@Thanks!
过河卒。 + 1 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
yangld + 1 + 1 谢谢@Thanks!
sahara + 1 + 1 谢谢@Thanks!
我乐逍遥 + 1 + 1 用心讨论,共获提升!
路漫长 + 1 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
doywb + 1 + 1 用心讨论,共获提升!
叫我管儿 + 1 + 1 谢谢@Thanks!
hyh0101 + 1 + 1 我好像在树莓派实验室 看到这个
灰色老K + 1 + 1 谢谢@Thanks!
菊花朝墙 + 1 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
读远 + 1 + 1 我很赞同!
ywjian + 1 + 1 用心讨论,共获提升!
wushaominkk + 3 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
zhxiaobo2lu + 1 + 1 热心回复!
大亮 + 1 + 1 我很赞同!
笙若 + 1 + 1 谢谢@Thanks!
stuc + 1 + 1 热心回复!厉害啊!大神
hlink1021 + 1 + 1 热心回复!

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

 楼主| python8215 发表于 2018-3-5 16:57
netCheney 发表于 2018-3-5 14:57
谢谢楼主了,代码很详细,不过感觉中间用于数据库查询php代码也可以换成Python的,Python有orm,如果需要可 ...

Django刚刚接触不久,不是太熟练,服务器上一直跑着PHP了,所以就用的PHP链接MySQL,有机会向你请教Django
netCheney 发表于 2018-3-5 18:57
python8215 发表于 2018-3-5 16:57
Django刚刚接触不久,不是太熟练,服务器上一直跑着PHP了,所以就用的PHP链接MySQL,有机会向你请教Djang ...

刚接触不就就能写的这么好,神人啊,我很菜的,还要多向你学习啊
夏虫语冰 发表于 2018-3-5 14:53
netCheney 发表于 2018-3-5 14:57
谢谢楼主了,代码很详细,不过感觉中间用于数据库查询php代码也可以换成Python的,Python有orm,如果需要可视化后台的话,Django也会是不错的选择,新手意见,还望斧正
hlink1021 发表于 2018-3-5 15:03

谢谢楼主了,代码很详细
wangbiao54qc 发表于 2018-3-5 15:22
很不错啊 楼主
 楼主| python8215 发表于 2018-3-5 16:54
夏虫语冰 发表于 2018-3-5 14:53
动手能力太强了吧!!!

过奖,过奖
 楼主| python8215 发表于 2018-3-5 16:58
hlink1021 发表于 2018-3-5 15:03
谢谢楼主了,代码很详细

喜欢就好,谢谢
 楼主| python8215 发表于 2018-3-5 16:59

谢谢夸奖
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则 警告:本版块禁止灌水或回复与主题无关内容,违者重罚!

快速回复 收藏帖子 返回列表 搜索

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-6-1 11:59

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表