本章主要讲述简便实现物联网,我们需要使用树莓派作为控制主板,使用python flask实现web服务器挂载,通过驱动板控制电机正反转,微信小程序作为远程控制终端,一起渐入IoT佳境吧!
起初,我们需要为购买一张SD卡为树莓派烧录系统,这步操作网上有很多教程,在此不赘述。 一般烧录系统后的树莓派是有python环境的,如果没有的话,执行如下代码:
1.下载
wget https://www.python.org/ftp/python/3.7.0/Python-3.7.0.tgz
2.解压Python-3.7.0.tgz
tar -zxvf Python-3.7.0.tgz
3、建立一个空文件夹,用于存放python3程序
mkdir /usr/local/python3
4、执行配置文件,编译,编译安装
cd Python-3.7.0
./configure --prefix=/usr/local/python3
make && make install
安装完成没有提示错误便安装成功了
5、建立软连接
ln -s /usr/local/python3/bin/python3.7 /usr/bin/python3
ln -s /usr/local/python3/bin/pip3.7 /usr/bin/pip3
6、测试一下python3是否可以用
[root@mini Python-3.7.0]# python3
Python 3.7.0 (default, Jul 28 2018, 22:47:29)
[GCC 4.8.5 20150623 (Red Hat 4.8.5-28)] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> print("hello world!")
hello world!
>>> exit()
[root@mini Python-3.7.0]# pip3 --version
pip 10.0.1 from /usr/local/python3/lib/python3.7/site-packages/pip (python 3.7)
ok,写一段python小程序,没问题的话python就安装成功了。
当我进入硬件环节的时候,对电机的了解及选配一筹莫展,得知此消息的同事奋不顾身拆开了自家电扇,囊中取物一般把他的罩极异步电机奉献给我(如下图)
对比我后入手的28BYJ-48电机
显然,这台沙包大小的电机沦为过客,暂时不会和它发生任何故事,随即把它还给了风扇。
树莓派、电机、驱动器三端用杜邦线连接。
树莓派引脚图:
驱动器和电机连接很简单,四口线对接即可,这里要注意的是驱动器和树莓派连接:
可以通过上图看出 PIN02是我们要的正极5v电,然后负极接到Groud PIN06
注:PIN对应树莓派的引脚编号,in1~in4为驱动器引脚
思路:(可参考前言模型图)
树莓派:核心主板兼服务提供者,需部署python flask搭建的web服务器,通过内网服务发布api接口,api接口中包含对硬件的一系列指令。
微信小程序:服务消费层,对接微型主板提供的程序操控api接口,以参数形式改变硬件设备的状态。
发布在树莓派上的python服务代码:
from flask import Flask, request
import json
import RPi.GPIO as GPIO
import time
app = Flask(__name__)
#对应引脚
IN1 = 35 # pin11
IN2 = 36
IN3 = 38
IN4 = 40
def setStep(w1, w2, w3, w4):
GPIO.output(IN1, w1)
GPIO.output(IN2, w2)
GPIO.output(IN3, w3)
GPIO.output(IN4, w4)
#停转
def stop():
setStep(0, 0, 0, 0)
#电机反转
def backward(delay, steps):
for i in range(0, steps):
setStep(0, 0, 0, 1)
time.sleep(delay)
setStep(0, 0, 1, 0)
time.sleep(delay)
setStep(0, 1, 0, 0)
time.sleep(delay)
setStep(1, 0, 0, 0)
time.sleep(delay)
#电机正转
def forward(delay, steps):
for i in range(0, steps):
setStep(1, 0, 0, 0)
time.sleep(delay)
setStep(0, 1, 0, 0)
time.sleep(delay)
setStep(0, 0, 1, 0)
time.sleep(delay)
setStep(0, 0, 0, 1)
time.sleep(delay)
def setup():
GPIO.setwarnings(False)
GPIO.setmode(GPIO.BOARD) # Numbers GPIOs by physical location
GPIO.setup(IN1, GPIO.OUT) # Set pin's mode is output
GPIO.setup(IN2, GPIO.OUT)
GPIO.setup(IN3, GPIO.OUT)
GPIO.setup(IN4, GPIO.OUT)
def loop():
while True:
print("backward...")
forward(0.003, 360) # 512 steps --- 360 angle
# print
# "stop..."
# stop() # stop
# time.sleep(3) # sleep 3s
#
# print
# "forward..."
# forward(0.005, 512)
#
# print
# "stop..."
# stop()
# time.sleep(3)
def destroy():
GPIO.cleanup() # Release resource
#提供服务核心代码
@app.route("/action", methods=["GET"])
def index():
setup()
if int(request.args.get("state"))==0 :
loop()
print(request.args.get("state"))
return "当前装置状态为开"
else :
destroy()
return "当前装置状态为关"
if __name__ == '__main__':
app.run(port='80',debug=True,host='0.0.0.0')
发布后即可通过链接 http://192.168.56.1/action (这里是我的内网ip,需要替换成自己的ip) 访问服务。
实现层微信小程序架构图:
只包含两个文件,学过前端的同学一目了然,这里可以理解成HTML和JavaScript
index.html 代码:
<!--index.wxml-->
class="container">
class="userinfo">
index.js 代码:
//index.js
//获取应用实例
const app = getApp()
Page({
data: {
motto: 'Hello World',
userInfo: {
},
hasUserInfo: false,
textState:'打开设备',
oneState: '关'
},
//主要函数
changeState:function(e){
var state =0;
let that = this;
if (that.data.oneState=='关'){
state=0;
that.setData({
oneState:'开',
textState:'关闭设备'
})
}else{
that.setData({
oneState: '关',
textState: '打开设备'
})
state=1;
}
wx.request({
url: 'http://192.168.56.1/action?state='+state,
success: function(res) {
console.log("状态为:" +state)
console.log(res)
}
})
}
})
树莓派实现物联网
当它转起来的时候,你能感受到世界是美好的