物联网工程必备!!!
![](https://ywhao.bitworkshop.cn/wp-content/uploads/2022/08/BDFBCB37B7F5D8B482FDE556C74355E7.jpg)
引脚示意图
![](https://ywhao.bitworkshop.cn/wp-content/uploads/2022/08/image-3.png)
1.前端
![](https://ywhao.bitworkshop.cn/wp-content/uploads/2022/07/E3DD14D020132141B9470E8E52855DC0-scaled-1.jpg)
<!-- 纵向flex -->
<view class="body mg16" wx:for="{{parameter}}" wx:key="id" wx:for-item="item" wx:for-index="index">
<!-- 上半部分 -->
<view class="text mg4">
<view class="mg4">{{item.name}}</view>
</view>
<!-- 下半部分,横向flex -->
<view class="flex mg8">
<button type="primary" size="mini" bindtap="handleTap" data-operation="{{1}}" data-index="{{index}}">+</button>
<view class="input"><input class="mgt4" value="{{item.inital_value}}" bindinput="handleInputInit" data-index="{{index}}"/></view>
<button type="primary" size="mini" bindtap="handleTap" data-operation="{{0}}" data-index="{{index}}">-</button>
</view>
</view>
<view class="flex mg64">
<button type="primary" size="mini" class="button mgt32" bindtap="Switch">开关</button>
<button type="primary" size="mini" class="button mgt32" bindtap="Mode">图像</button>
</view>
<view class="flex mg64">
<button type="primary" size="mini" class="button mgt32" bindtap="Get">获取</button>
<button type="primary" size="mini" class="button mgt32" bindtap="Reset">重置</button>
</view>
<view class="flex mg64">
<button type="primary" size="mini" class="button mgt32" bindtap="Light1">点灯</button>
<button type="primary" size="mini" class="button mgt32" bindtap="Light2">急闪</button>
</view>
// pages/control/control.js
const app = getApp()
Page({
/**
* 页面的初始数据
*/
data: {
parameter:[
{
id: 1,
name:"",
inital_value: null,
bujin: null,
range: null,
}
],
mode:0,
},
handleInputInit(e){
// console.log(e);
var inital_value = e.detail.value
var index = e.currentTarget.dataset.index
let parameter0=this.data.parameter[index]
parameter0.inital_value=String(inital_value)
this.data.parameter[index]=parameter0 // 赋值
console.log(this.data.parameter[index])
},
handleTap(e){
// console.log(e);
var index = e.currentTarget.dataset.index
var op = e.currentTarget.dataset.operation
let parameter=this.data.parameter
let parameter0=this.data.parameter[index]
var bujin = parameter0.bujin
var inital_value = Number(parameter0.inital_value)
if(op==1){
if(parseInt(String(inital_value))==parseFloat(String(inital_value))){
parameter0.inital_value=String(inital_value+bujin)
}
else{
parameter0.inital_value=(parseFloat(inital_value)+bujin).toFixed(1)
}
}
if(op==0){
if(parseInt(String(inital_value))==parseFloat(String(inital_value))){
parameter0.inital_value=String(inital_value-bujin)
}
else{
parameter0.inital_value=(parseFloat(inital_value)-bujin).toFixed(1)
}
}
this.setData({
parameter:parameter
})
// console.log(parameter);
// control实时控制
wx.request({
url: 'https://feedback.ywhao.bitworkshop.cn/command',
// url: 'http://127.0.0.1:8088/command',
data: {
openid: app.user.openid,
command: JSON.stringify(parameter0),
port: app.port
},
header: {
"Content-Type": "application/x-www-form-urlencoded"
},
dataType: "json",
method: "POST",
success: (result) => {
console.log(result);
// 云端保存数据
wx.request({
url: 'https://feedback.ywhao.bitworkshop.cn/parameter',
// url: 'http://127.0.0.1:8001/parameter',
data: {
parameter: JSON.stringify(parameter), // JSON.stringify()对象转字符串
wxname: app.user.userInfo.nickName,
openid: app.user.openid,
cookie: app.user.cookie,
// wxname: "Dandan心魅かれてく",
// openid: "o1AFS5ImQTOhpuhCe7lU6Jw_7Fco",
// cookie: "RODSW1O3",
port: app.port
},
header: {
"Content-Type": "application/x-www-form-urlencoded"
},
dataType: "json",
method: "POST",
success: (result) => {
console.log(result);
}
}) // parameter
}
}) // control
},
Get(e){
// command实时控制
wx.request({
url: 'https://feedback.ywhao.bitworkshop.cn/command',
// url: 'http://127.0.0.1:8088/command',
data: {
openid: app.user.openid,
command: 'b',
},
header: {
"Content-Type": "application/x-www-form-urlencoded"
},
dataType: "json",
method: "POST",
success: (result) => {
console.log(result);
var parameter_value = JSON.parse(result.data.parameter);
let parameter0=this.data.parameter
console.log(parameter_value);
var len = parameter_value.length
for(var i=0;i<len;i++){
parameter0[i].inital_value = parameter_value[i]
}
console.log(parameter0);
this.setData({
parameter:parameter0
})
}
}) // command
},
Light2(e){
// command实时控制
wx.request({
url: 'https://feedback.ywhao.bitworkshop.cn/command',
// url: 'http://127.0.0.1:8088/command',
data: {
openid: app.user.openid,
command: 'f',
},
header: {
"Content-Type": "application/x-www-form-urlencoded"
},
dataType: "json",
method: "POST",
success: (result) => {
console.log(result);
}
}) // command
},
Light1(e){
// command实时控制
wx.request({
url: 'https://feedback.ywhao.bitworkshop.cn/command',
// url: 'http://127.0.0.1:8088/command',
data: {
openid: app.user.openid,
command: 'e',
},
header: {
"Content-Type": "application/x-www-form-urlencoded"
},
dataType: "json",
method: "POST",
success: (result) => {
console.log(result);
}
}) // command
},
Reset(e){
// command实时控制
wx.request({
url: 'https://feedback.ywhao.bitworkshop.cn/command',
// url: 'http://127.0.0.1:8088/command',
data: {
openid: app.user.openid,
command: 'd',
},
header: {
"Content-Type": "application/x-www-form-urlencoded"
},
dataType: "json",
method: "POST",
success: (result) => {
console.log(result);
}
}) // command
},
Mode(e){
// command实时控制
var mode = this.data.mode
wx.request({
url: 'https://feedback.ywhao.bitworkshop.cn/command',
// url: 'http://127.0.0.1:8082/command',
data: {
openid: app.user.openid,
port: app.port,
command: 'c',
},
header: {
"Content-Type": "application/x-www-form-urlencoded"
},
dataType: "json",
method: "POST",
success: (result) => {
console.log(result);
}
}) // command
},
Change(e){
// command实时控制
wx.request({
url: 'https://feedback.ywhao.bitworkshop.cn/command',
// url: 'http://127.0.0.1:8088/command',
data: {
openid: app.user.openid,
command: 'g',
},
header: {
"Content-Type": "application/x-www-form-urlencoded"
},
dataType: "json",
method: "POST",
success: (result) => {
console.log(result);
}
}) // command
},
Switch(e){
// command实时控制
wx.request({
url: 'https://feedback.ywhao.bitworkshop.cn/command',
// url: 'http://127.0.0.1:8088/command',
data: {
openid: app.user.openid,
command: 'a',
},
header: {
"Content-Type": "application/x-www-form-urlencoded"
},
dataType: "json",
method: "POST",
success: (result) => {
console.log(result);
}
}) // command
},
/**
* 生命周期函数--监听页面加载
*/
onLoad(options) {
this.setData({
parameter: app.parameter
})
wx.request({
url: 'https://feedback.ywhao.bitworkshop.cn/getparameter',
// url: 'http://127.0.0.1:8001/getparameter',
data: {
openid: app.user.openid,
cookie: app.user.cookie,
// openid: "o1AFS5ImQTOhpuhCe7lU6Jw_7Fco",
// cookie: "RODSW1O3"
},
header: {
"Content-Type": "application/x-www-form-urlencoded"
},
dataType: "json",
method: "POST",
success: (result) => {
console.log(result);
if(result.data.parameter!=""){
var parameter = JSON.parse(result.data.parameter)
var port = result.data.port
this.setData({
parameter: JSON.parse(result.data.parameter), // JSON.parse()字符串转对象
port: port
})
app.parameter=parameter
app.port=port
}
else{
wx.reLaunch({
url: '../parameter/parameter',
})
}
}
}) // getparameter
},
})
2.后端
![](https://ywhao.bitworkshop.cn/wp-content/uploads/2022/08/image-5.png)
def command(request):
if request.method == "POST":
try:
openid = request.POST["openid"]
parameter = request.POST["parameter"]
if(parameter):
ob = Command.objects.get(openid=openid)
ob.parameter_state = 1
ob.parameter = parameter
ob.save()
content = {"state": "200", "parameter": parameter}
return JsonResponse(content)
except:
print()
try:
openid = request.POST["openid"]
cmd = request.POST["command"]
except:
content = {"state": "201"}
return JsonResponse(content)
allow_openid = ["o1AFS5ImQTOhpuhCe7lU6Jw_7Fco"]
if(openid not in allow_openid):
print("{}无权限".format(openid))
content = {"state": "202"}
return JsonResponse(content)
else:
ob = Command.objects.filter(openid=openid)
parameter = 0
if list(cmd)[0] == "{":
cmd = eval(cmd)
cmd = "{"+"{}:{}".format(cmd["id"]-1, int(eval(cmd["inital_value"])*100))+"}"
print(cmd)
if ob:
ob = Command.objects.get(openid=openid)
ob.state = 1
ob.command = cmd
ob.save()
if ob.parameter_state:
ob.parameter_state = 0
ob.save()
parameter = ob.parameter
else:
Command.objects.create(state=1, openid=openid, command=cmd)
content = {"state": "200", "command": cmd, "parameter": parameter}
print(content)
return JsonResponse(content)
else:
content = {"state": "203"}
return JsonResponse(content)
def getcommand(request):
if request.method == "POST":
try:
openid = request.POST["openid"]
secret = request.POST["secret"]
except:
content = {"state": "201"}
return JsonResponse(content)
allow_people = ["ywh"]
if(secret not in allow_people):
print("{}无权限".format(secret))
content = {"state": "202"}
return JsonResponse(content)
else:
OB = Command.objects.filter(openid=openid)
if(OB):
ob = Command.objects.get(openid=openid)
if(ob.state):
cmd = ob.command
ob.state = 0
ob.save()
content = {"state": "200", "command": cmd}
else:
content = {"state": "200.5"}
return JsonResponse(content)
else:
Command.objects.create(state=0, openid=openid)
content = {"state": "200.5"}
return JsonResponse(content)
else:
content = {"state": "203"}
return JsonResponse(content)
3.TCP通信
与ESP8266建立TCP连接,有接收和请求两个线程。
接收线程:负责接收ESP8266发送的信息
请求线程:请求后端接口,不断查询是否有新的指令command
import socket, time, os, random
import requests
import json, threading, base64
picture0 = [0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X80,0XC0,0X00,0X00,0X00,0X00,0X00,
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0XC0,0X40,0X40,0X40,0X40,0X40,0X7C,
0X18,0X30,0X20,0X20,0X30,0X18,0X0C,0X06,0X03,0X01,0XFF,0X00,0X00,0X00,0X00,0X00,
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0XF0,0X80,0X80,0X00,0XF0,0XA0,0XF0,0X00,
0X70,0X50,0XF0,0X00,0XF0,0X00,0XF0,0X90,0XF0,0X00,0X00,0X00,0X00,0XF0,0X90,0X90,
0X00,0XF0,0X90,0XF0,0X00,0XF0,0X80,0XF0,0X00,0X80,0XF0,0X80,0X00,0XF0,0X80,0X80,
0X00,0XF0,0X90,0XF0,0X00,0XF0,0X10,0X00,0XF0,0X10,0X00,0XF0,0X90,0XD0,0X00,0XF0,
0X80,0X80,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
0X00,0X00,0X00,0XF0,0XF0,0XF0,0XF0,0XF0,0XF0,0XFF,0XE0,0XC0,0X80,0X00,0X00,0X00,
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0XFF,0X00,0X00,0X00,0X00,0X00,
0X00,0X00,0X00,0X00,0X00,0X00,0X08,0X0C,0X0E,0X0E,0X0E,0X0E,0X0E,0X0E,0X0E,0X0E,
0XFE,0XFE,0XFE,0XFE,0XFE,0XFE,0XFE,0X00,0X0E,0X1E,0X3E,0X7E,0XFE,0XFE,0XFE,0XFE,
0XFE,0XEE,0XCE,0X8E,0X0E,0X0E,0X0E,0X0E,0X0E,0X0E,0X0E,0X0C,0X08,0X00,0XFE,0XFE,
0XFE,0XFE,0XFE,0XFE,0XCE,0X8E,0X0E,0X0E,0X0E,0X0E,0X0E,0X0E,0XFE,0XFE,0XFE,0XFC,
0XF8,0XF0,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X02,
0X06,0X8E,0XDE,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFE,0XFC,
0XF8,0XF0,0XE0,0XC0,0X80,0X00,0X00,0X00,0X00,0X00,0X07,0X1C,0X30,0XE0,0X80,0X00,
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X00,0X00,0X00,0X00,0X00,0X00,0X01,0X03,0X07,
0X0F,0X1F,0X3F,0X7F,0XFF,0XFE,0XFC,0XF8,0XF0,0XE0,0XC0,0X80,0X00,0X00,0XFF,0XFF,
0XFF,0XFF,0XFF,0XFF,0X03,0X07,0X0F,0X1E,0X3C,0X78,0XF0,0XE0,0XFF,0XFF,0XFF,0XFF,
0XFF,0XFF,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X10,0X18,0X1C,0X1E,
0X1F,0X1F,0X1F,0X1F,0X1F,0X1F,0X1F,0X1F,0X1F,0X1F,0X1F,0X1F,0X1F,0X1F,0X1F,0X1F,
0X3F,0X7F,0XFF,0XFF,0XFF,0XFF,0XFE,0XFC,0XF8,0XF0,0XE0,0XC0,0X80,0X00,0X01,0X07,
0X0C,0X38,0X20,0X30,0X18,0X0C,0XFE,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
0X1F,0X1F,0X1F,0X1F,0X1F,0X1F,0X1F,0X00,0X00,0X1C,0X1C,0X1C,0X1C,0X1C,0X1C,0X1C,
0X1C,0X1C,0X1C,0X1C,0X1C,0X1F,0X1F,0X1F,0X1F,0X1F,0X1F,0X1F,0X00,0X00,0X1F,0X1F,
0X1F,0X1F,0X1F,0X1F,0X1C,0X1C,0X1C,0X1C,0X1C,0X1C,0X1C,0X1D,0X1F,0X1F,0X1F,0X1F,
0X1F,0X1F,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
0X00,0X00,0X00,0X00,0X01,0X03,0X03,0X07,0X8F,0XCF,0XFF,0XFF,0XFF,0XFF,0XFE,0XFC,
0XF8,0XF0,0XE0,0XC0,0X80,0X00,0X1F,0X70,0XC0,0X80,0X00,0X00,0X00,0X00,0X00,0X00,
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
0X00,0X00,0X00,0X00,0X00,0X00,0X02,0X03,0X03,0X03,0X03,0X03,0X03,0X03,0X03,0X03,
0X03,0X03,0X03,0X07,0X0F,0X0F,0X1E,0X3C,0X38,0X73,0X66,0XDC,0XF0,0XE0,0X80,0X00,
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X01,0X01,0X03,0X07,
0X04,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,]
picture1 = [ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,
0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0xC0,0xC0,0xE0,
0xF0,0xF0,0xF0,0xF8,0xF8,0xF8,0xFC,0x7C,0x3E,0x3E,0x1E,0x1E,0x1E,0x1F,0x3F,0xFF,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xC7,0x81,0x81,0x01,
0x01,0x81,0x81,0xC3,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0xFF,0x3F,0x1E,0x1E,0x1E,0x1E,0x3C,0x3C,0x7C,0xFC,0xF8,0xF8,0xF0,0xF0,0xF0,0xE0,
0xC0,0x80,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x80,0xF0,0xF0,0xFC,0xFE,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x7C,0x70,0x70,0x30,0x30,0x30,0x30,0x78,0x7F,
0x7F,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x3F,0x1F,0x1F,0xCF,0xC7,0xC7,0xE7,
0xE3,0xE7,0xE7,0xC7,0x8F,0x8F,0x1F,0x3F,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFE,
0xFE,0x78,0x70,0x30,0x30,0x30,0x78,0x78,0x7E,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF,0xFE,0xFE,0xFC,0xF8,0xE0,0xE0,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x80,0x80,0x80,0x80,0xC0,
0xC0,0x80,0x00,0x00,0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0xFF,0x3F,0x3F,0x03,0xF1,0xF1,0xF8,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFC,
0xFC,0xF8,0xE3,0x8F,0x8F,0x3F,0xF7,0xF7,0xE0,0xFC,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xF0,0xF1,0xF1,0x7F,0x0F,0x0F,0xC3,0xF9,0xFC,
0xFC,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFC,0xFC,0xF1,0xF1,0x03,0x1F,0x1F,0xFF,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x1C,0x00,0x00,0x80,0x80,0x80,
0x80,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x04,0x7C,0x7C,0xFE,0xFE,0xFE,0xE8,0x80,0x1F,0x1F,0x7D,0x7F,0x7F,0x3D,0x2F,0xBF,
0xBF,0xFF,0xFE,0xE0,0xE0,0xC0,0x87,0x87,0x0F,0x3F,0x7F,0x7F,0xFF,0xFF,0xFF,0xFF,
0xFF,0xFC,0xFC,0xC0,0x9F,0x9F,0x3F,0x7F,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x7F,
0x7F,0x3F,0x0F,0xCF,0xCF,0xFC,0xF0,0xF0,0xC7,0x9F,0x3F,0x3F,0x7F,0xFF,0xFF,0xFF,
0xFF,0xFF,0xFF,0x7F,0x3F,0x3F,0x9F,0xC7,0xF1,0xF1,0xFC,0xEF,0xEF,0x0F,0x3F,0x7F,
0x7F,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x7F,0x3F,0x1F,0x1F,0xC0,0xF8,0xF8,0xFF,
0xFF,0xFF,0xFF,0x7F,0x3F,0x3F,0x1F,0x87,0xC1,0xC1,0xF0,0xBE,0xBE,0xBF,0x3F,0x7F,
0x7F,0x7F,0x7F,0x7F,0x7F,0x86,0x00,0x00,0xE4,0xFC,0xFC,0xFC,0x3C,0x04,0x04,0x00,
0x00,0x00,0x00,0x03,0x03,0x03,0x0F,0x3F,0x7F,0x7F,0xF8,0xF0,0xF0,0xC2,0xC7,0x9F,
0x9F,0xBF,0x7F,0x3F,0x3F,0x1F,0x9F,0x9F,0x8F,0x96,0xF0,0xF0,0xF0,0xF1,0xF1,0xF1,
0xC3,0x87,0x87,0x07,0x8F,0x8F,0x8E,0x1E,0x1C,0x1C,0x3C,0x3C,0x3C,0x3C,0x7C,0x7E,
0x7E,0x7E,0x7F,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFE,0xFC,0xFC,0xFC,
0xFC,0xFC,0xFC,0xFE,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x7F,0x7F,0x7F,0x7E,0x7C,
0x7C,0x7C,0x38,0x38,0x38,0x98,0x9C,0x9C,0x8C,0x8E,0xCF,0xCF,0xE7,0xE3,0xE3,0xD3,
0xF1,0xF0,0xF0,0xE0,0x26,0x26,0x0F,0x1F,0x3F,0x3F,0x7F,0x7F,0x7F,0x0F,0xEF,0xE6,
0xE6,0x20,0xF0,0xF8,0xF8,0x7F,0x3F,0x3F,0x0F,0x03,0x01,0x01,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x03,0x03,0x0D,
0x0D,0x1E,0x1B,0x3C,0x3C,0x7E,0xF9,0xF9,0xE1,0xE1,0xF0,0xF0,0xCF,0xCF,0xCF,0x80,
0x80,0x08,0x08,0x3B,0x3F,0x3F,0x7F,0x7F,0x3F,0x3F,0x3F,0x0F,0x0F,0x02,0xBC,0xBE,
0xBE,0xFE,0xFC,0xFC,0xFC,0xEC,0x6C,0x6C,0x00,0x00,0xF8,0xF8,0xA8,0xFC,0xFC,0xFC,
0xA8,0xF8,0xF8,0xF8,0x00,0x00,0x4C,0x4C,0xFC,0xFC,0xF4,0xFC,0xFC,0xFE,0x6E,0x00,
0x00,0x0F,0x7F,0x7F,0x7F,0x5F,0x7D,0x7D,0x7F,0x3F,0xBC,0xBC,0xC1,0xC3,0xC3,0xC7,
0xCE,0xCD,0xCD,0xE3,0xE3,0xE3,0xF8,0x78,0x78,0x78,0x7C,0x7E,0x7E,0x1E,0x06,0x01,
0x01,0x01,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x03,0x03,0x0F,
0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x1E,0x1E,0x1E,0x1E,0x1C,0x1C,0x1C,0x1E,0x3C,0x39,
0x39,0x39,0x39,0x39,0x39,0x7D,0x7D,0x7D,0x78,0x78,0x00,0x00,0x00,0x79,0x79,0x5B,
0x5B,0x79,0x79,0x73,0x78,0x78,0x70,0x79,0x79,0x79,0x3D,0x39,0x39,0x39,0x38,0x3C,
0x3C,0x3C,0x1C,0x1C,0x1C,0x1F,0x1E,0x1E,0x0E,0x0E,0x04,0x04,0x03,0x06,0x06,0x03,
0x03,0x01,0x01,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,]
picture = [picture0, picture1]
def request():
while True:
time.sleep(0.1)
url = "https://feedback.ywhao.bitworkshop.cn/getcommand"
# url = "http://127.0.0.1:8088/getcommand"
headers = {
"Cache-Control": "max-age=0",
"Upgrade-Insecure-Requests": "1",
"Origin": "https://feedback.ywhao.bitworkshop.cn",
"referer": "https://feedback.ywhao.bitworkshop.cn/getcommand",
"Content-Type": "application/x-www-form-urlencoded",
"Accept": "*/*",
}
data = {
"secret": "ywh",
"openid": "o1AFS5ImQTOhpuhCe7lU6Jw_7Fco",
}
response = eval(requests.post(url=url, headers=headers, data=data).content.decode())
if(response["state"]=="200"):
command = response["command"]
print("command:", command)
dataSocket.send(command.encode("utf-8"))
if(command == "c"):
pic = picture[random.randint(0,1)]
# time.sleep(1)
lens = len(pic)
for i in range(lens):
data = hex(pic[i])[2:]
length = len(data)
if (length < 2):
data = '0' + data
data = bytes.fromhex(data)
dataSocket.send(data)
print("Over!!!")
def request2(parameter):
url = "https://feedback.ywhao.bitworkshop.cn/command"
# url = "http://127.0.0.1:8088/command"
headers = {
"Cache-Control": "max-age=0",
"Upgrade-Insecure-Requests": "1",
"Origin": "https://feedback.ywhao.bitworkshop.cn",
"referer": "https://feedback.ywhao.bitworkshop.cn/command",
"Content-Type": "application/x-www-form-urlencoded",
"Accept": "*/*",
}
data = {
"secret": "ywh",
"openid": "o1AFS5ImQTOhpuhCe7lU6Jw_7Fco",
"parameter": parameter,
}
response = eval(requests.post(url=url, headers=headers, data=data).content.decode())
print(response)
def recv():
while True:
get_data = dataSocket.recv(1024)
if get_data:
info = get_data.decode("utf-8")
print("{}:{}".format(ip2, info))
try:
info = info.split(":")
if(info[0]=="Send"):
info = info[1]
request2(info)
except:
print()
# def send_picture():
def picture2base(path):
"""
压缩图片数据
"""
with open(path, 'rb') as img:
b64encode = base64.b64encode(img.read())
# 返回base64编码字符串
return b64encode.decode('utf-8')
def main():
global dataSocket, ip2
# ip = socket.gethostbyname(socket.gethostname())
ip = "0.0.0.0"
# ip = "127.0.0.1"
port = 8081
tcp_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
tcp_socket.bind((ip, port))
tcp_socket.listen(5)
print("服务端{}:{}启动成功,正在等待客户端连接...".format(ip, port))
dataSocket, ip2 = tcp_socket.accept()
print("已连接ip:{} port:{}".format(ip2[0], ip2[1]))
# 多线程
recv_thread = threading.Thread(target=recv)
recv_thread.start()
request_thread = threading.Thread(target=request)
request_thread.start()
if __name__ == '__main__':
main()
4.CCS项目
4.1ESP8266初始化
ESP8266的AT指令,要实现通信,必须开启透传模式。发送AT对方成功接收表示透传模式开启。
#include <headfile.h>
/*
* esp.c
*
* Created on: 2022年7月23日
* Author: ywh
*/
void ESP_Init() //ESP8266初始化
{
// UART_printf(USCI_A1_BASE, "AT+CWMODE=1\r\n");
//// delay5ms(400);
// UART_printf(USCI_A1_BASE,"AT+RST\r\n"); //重启模块
// delay5ms(400);
// UART_printf(USCI_A1_BASE,"AT+CIFSR\r\n"); // 获取IP信息
// delay5ms(400);
// UART_printf(USCI_A1_BASE,"AT+CWJAP=\"dxxy16-406\",\"dxxy16-406\"\r\n");
// delay5ms(400);
UART_printf(USCI_A1_BASE,"AT+CIPSTART=\"TCP\",\"124.222.154.177\",8081\r\n"); // 124.222.154.177:3333
delay5ms(1000);
UART_printf(USCI_A1_BASE, "AT+CIPMODE=1\r\n");
delay5ms(1000);
UART_printf(USCI_A1_BASE, "AT+CIPSEND\r\n");
delay5ms(1000);
UART_printf(USCI_A1_BASE, "ESP_Init OK\r\n");
delay5ms(1000);
esp=1;
}
4.2ESP串口接收
/******************************************************************************
USCI_A1中断
在uart.h内初始化串口就打开中断
******************************************************************************/
#pragma vector=USCI_A1_VECTOR
__interrupt void UartISR_2(void){
static unsigned short Flag_PID,i,j,l;
switch(_even_in_range(UCA1IV,4))
{
case 2:{ // Vector 2 - RXIFG
while (!(UCA1IFG&UCTXIFG));
///**************************************************************************
//说明: APP调参
//入口参数:无
//返回值 : 无
//作 者 : ywh
//参考 :平衡小车之家
//**************************************************************************/
//串口参数
if(esp){
if(Debug_key==3)Pictrue_Buf[Pictrue_Buf_index++] = UCA1RXBUF;
if(Pictrue_Buf_index>=1024){memset(Pictrue_Buf, 0, sizeof(uint8_t)*1024);Pictrue_Buf_index=0;}
else{
UartRcvBuf[UartRcvBufIndex++] = UCA1RXBUF ;
if(UartRcvBufIndex>=128){memset(UartRcvBuf, 0, sizeof(uint8_t)*128);UartRcvBufIndex=0;}
Usart_Receive=UCA1RXBUF;
Usart2_Receive=UCA1RXBUF;
}
}
//调试界面下方的按键
if(Usart_Receive>=97&&Usart_Receive<=105) //a~o 15个按键指令
{
switch(Usart_Receive)
{
case 0x61:
if(Debug_key){Debug_key=0;break;}
else{Debug_key=1;break;} //a
case 0x62: Debug_key=2; break; //b
case 0x63: OLED_Clear();Debug_key=3; break; //c
case 0x64: Debug_key=4;KP=5;Kp=5;KI=10;Ki=10;KD=0;Kd=0;Set_PID(&PID_left,KP,KD,KI);Set_PID(&PID_right,Kp,Kd,Ki);duoji=7.5;Target_L=25;Target_R=25;PID_SetPoint(&PID_left,Target_L);PID_SetPoint(&PID_right,Target_R); break; //d
case 0x65: Debug_key=5;
if(led1){led1=0;break;}
else{led1=1;}break; //e
case 0x66: Debug_key=6;
if(led1){led1=0;break;}
else{led1=2;}break; //f
case 0x67: OLED_Clear();Debug_key=7; break; //g
case 0x68: Debug_key=8; break; //h
case 0x69: Debug_key=9; break; //i
case 0x6A: Debug_key=10; break; //j
case 0x6B: Debug_key=11; break; //k
case 0x6C: Debug_key=12; break; //l
case 0x6D: Debug_key=13; break; //m
case 0x6E: Debug_key=14; break; //n
case 0x6F: Debug_key=15; break; //o
}
}
//*************************调试界面9通道按键**********************************************//
if(Usart2_Receive==0x7B) Flag_PID=1; //指令{==帧头-起始位
if(Usart2_Receive==0x7D&&UartRcvBuf[UartRcvBufIndex]!=0x7D) Flag_PID=2;l=i; //指令}==帧尾-停止位
if(Flag_PID==1){Receive[i]=Usart2_Receive,i++;} //记录参数
if(Flag_PID==2) //解析数据
{
if (Receive[3]==0x50) PID_Send=1; //指令P==获取设备参数,在APP_Show()中调用
else if(Receive[3]==0x57) Flash_Send=1; //指令W==掉电保存参数
else if(Receive[1]!=0x23) //指令#==更新PID参数
{
for(j=l;j>=4;j--)
{
Data+=(Receive[j-1]-48)*pow(10,l-j);
}
// Data=((float)(int)((Data+0.005)*100))/100;
switch(Receive[1])
{
case 0x30: KP=Data/100;Kp=Data/100;break; //参数1
case 0x31: KD=Data/100;Kd=Data/100;break; //参数2
case 0x32: KI=Data/100;Ki=Data/100;break; //参数3
case 0x33: duoji=Data/100;break; //参数4 6.7~8.4
case 0x34: Target_L=Data/100;Target_R=Data/100;break; //参数5
case 0x35: break; //参数6
case 0x36: break; //参数7
case 0x37: break; //参数8
case 0x38: break; //参数9
}
UART_printf(USCI_A1_BASE, "Data:%.1f\n",Data);
duoji_pwm_update(duoji);
Set_PID(&PID_left,KP,KD,KI);
Set_PID(&PID_right,Kp,Kd,Ki);
PID_SetPoint(&PID_left,Target_L);
PID_SetPoint(&PID_right,Target_R);
}
Flag_PID=0; //标志位清零
i=0;j=0;l=0;
Data=0;
memset(Receive, 0, sizeof(unsigned short)*50);
}
//*************************************************************************************//
}
break;
case 4:{
// Vector 4 - TXIFG
}break;
default: break;
}
}
4.3main.c
if(led1==0){GPIO_setOutputLowOnPin(GPIO_PORT_P1,GPIO_PIN0);}
if(led1==1){GPIO_setOutputHighOnPin(GPIO_PORT_P1,GPIO_PIN0);} // p1.0常亮
if(led1==2){GPIO_toggleOutputOnPin(GPIO_PORT_P1,GPIO_PIN0);} // p1.0闪烁
if(!Debug_key){
pwm_duty_update(left_Z, 0);
pwm_duty_update(right_Z, 0);
}
if(Debug_key==1){run();}
if(Debug_key==2){get_parameter();Debug_key=0;}
if(Debug_key==3){OLED_DrawBMP(0, 0, 127, 7,Pictrue_Buf);}
void get_parameter()
{
UART_printf(USCI_A1_BASE, "Send:[%.2f,%.2f,%.2f,%.2f,%.2f]",(float)(PID_left.Proportion),(float)(PID_left.Integral),(float)(PID_left.Derivative),(float)(duoji),(float)(Target_L));
}
Comments NOTHING