云天 发表于 2019-12-5 22:29:24

微信小程序+OneNET物联+掌控板

本帖最后由 云天 于 2019-12-5 22:32 编辑


    要实现,通过微信小程序语音控制掌控板。语音识别可通过微信小程序中加载官方推出微信同声传译插件实现。在掌控板上亮灯及显示相应控制指令。

https://www.dfrobot.com.cn/images/upload/Image/20190621154900y29j5q.jpg暂未控制电机,因发现mPython X不能使用掌控板扩展板(也许是自己不会用,请各位指教)。那么如何使用该款插件呢?开发者可登录小程序后台管理,依次选择【设置】【第三方服务】【添加插件】输入“同声传译”或者“语音识别”、“翻译”等搜索关键字搜索插件即可添加。
https://ask.qcloudimg.com/http-save/developer-news/7oxn305dbi.jpeg?imageView2/2/w/1620
只要你添加了该款插件,便能利用该插件开放的语音识别接口、语音合成接口、文本翻译接口实现小程序的语音功能。
1、index.js中代码
//index.js
//获取应用实例
const app = getApp()
Page({
data: {
button:'语音识别',
tts:''
},
//事件处理函数

OneNet: function (ml) {//向掌控板下发命令
    wx.request({
      url: 'https://api.heclouds.com/cmds?device_id=566544929', //接口地址,自己设备ID
      header: {
      'api-key': 'wVCSX14SwmBSuS=DIU2M=eHqVb0=' // 填写自己设备ID的'api-key'

    },
      method: 'POST',
      data: ml,
      success(res) {
      console.log(res.data)
      }
    })
},

tts:function(){
var that = this;
if(that.data.button==="语音识别"){
    that.setData({
       button: "退出语音"
    });

var plugin = requirePlugin("WechatSI")//在app.json中加载“微信同声传译”插件
let manager = plugin.getRecordRecognitionManager()
manager.onRecognize = function (res) {//语音识别过程中,判断是否出现控制指令,如“向左”
    console.log("current result", res.result)
if (res.result != "" || res.result !=NULL){
    if(res.result.indexOf("向左")!=-1){//下达控制指令时,可以使用如“向左转”、“向前进”等,增加识别率
      that.setData({
      tts: "向左"
      });
      that.OneNet("向左");
      manager.stop();
    }
    if (res.result.indexOf("向右") != -1) {
      that.setData({
      tts: "向右"
      });
      that.OneNet("向右");
      manager.stop();
    }
    if (res.result.indexOf("前进") != -1) {
      that.setData({
      tts: "前进"
      });
      that.OneNet("前进");
      manager.stop();
    }
    if (res.result.indexOf("后退") != -1) {
      that.setData({
      tts: "后退"
      });
      that.OneNet("后退");
      manager.stop();
    }
    if (res.result.indexOf("停止") != -1) {
      that.setData({
      tts: "停止"
      });
      that.OneNet("停止");
      manager.stop();
    }
    if (res.result.indexOf("退出") != -1) {
      that.setData({
      tts: "退出"
      });
      manager.stop();
    }
   }
}
manager.onStop = function (res) {//在识别完成时,判断是退出还是进行下一次语音识别,这样可连续识别,也可通过“退出”指令结束语音识别。
    console.log("record file path", res.tempFilePath);
    console.log("result", res.result)
    if (res.result != "" || res.result != NULL) {
   
      if (res.result.indexOf("退出")===-1){
      manager.start({ duration: 30000, lang: "zh_CN" })
       }
       else{
      that.setData({
          button: "语音识别"
      });
       }
    }
    else{
      manager.start({ duration: 30000, lang: "zh_CN" })
    }
}
manager.onStart = function (res) {
    console.log("成功开始录音识别", res)
}
manager.onError = function (res) {
    console.error("error msg", res.msg)
    manager.start({ duration: 30000, lang: "zh_CN" })
}
manager.start({ duration: 30000, lang: "zh_CN" })
}
else {
    that.setData({
      button: "语音识别"
    });
}
}

})


2、页面布局
<!--index.wxml-->
<view class="container">
<view class="userinfo">
    <text class="user-motto">语音结果:{{tts}}</text>
</view>
<view class="usermotto">
          <button bindtap="tts"> {{button}} </button>
</view>
</view>



3、插件加载,app.json
{
"pages": [
    "pages/index/index",
    "pages/logs/logs"
],
"window": {
    "backgroundTextStyle": "light",
    "navigationBarBackgroundColor": "#fff",
    "navigationBarTitleText": "小程序语音控制掌控板",
    "navigationBarTextStyle": "black"
},
"style": "v2",
"sitemapLocation": "sitemap.json",


"plugins": {
   
    "WechatSI": {
      "version": "0.0.7",
      "provider": "wx069ba97219f66d99"
      }
    }

}


4、微信小程序开发平台

5、mPython x代码
from mpython import *
import time
import network
from umqtt.simple import MQTTClient
from machine import Timer
import machine
import ubinascii
my_wifi = wifi()
my_wifi.connectWiFi("sxs", "smj080823")
def OneNET_recv(_msg):pass
_OneNET_msg_list = []
def OneNET_callback(_topic, _msg):
    global _OneNET_msg_list
    try: _msg = _msg.decode('utf-8', 'ignore')
    except: print(_msg);return
    OneNET_recv(_msg)
    if _msg in _OneNET_msg_list:
      eval('OneNET_recv_' + bytes.decode(ubinascii.hexlify(_msg)) + '()')
tim14 = Timer(14)
_iot_count = 0
def timer14_tick(_):
    global _iot, _iot_count
    _iot_count = _iot_count + 1
    if _iot_count == 1000: _iot.ping(); _iot_count = 0
    try: _iot.check_msg()
    except: machine.reset()
_iot = None
def OneNET_setup():
    global _iot
    _iot = MQTTClient("566544929", "183.230.40.39", 6002, "292081", "wVCSX14SwmBSuS=DIU2M=eHqVb0=", keepalive=300)
    _iot.set_callback(OneNET_callback)
    if 1 == _iot.connect(): print('Successfully connected to MQTT server.')
    tim14.init(period=200, mode=Timer.PERIODIC, callback=timer14_tick)
def OneNET_recv(_msg):
    oled.fill(0)
    oled.DispChar(_msg, 42, 22, 1)
    oled.show()
_OneNET_msg_list.append('向左')
def OneNET_recv_e59091e5b7a6():
    rgb.fill( (0, 0, 0) )
    rgb.write()
    time.sleep_ms(1)
    rgb = (int(255/30), int(0/30), int(0/30))
    rgb.write()
    time.sleep_ms(1)
    oled.DispChar("向左", 42, 22, 1)
_OneNET_msg_list.append('向右')
def OneNET_recv_e59091e58fb3():
    rgb.fill( (0, 0, 0) )
    rgb.write()
    time.sleep_ms(1)
    rgb = (int(255/30), int(0/30), int(0/30))
    rgb.write()
    time.sleep_ms(1)
    oled.DispChar("向右", 42, 22, 1)
_OneNET_msg_list.append('向前')
def OneNET_recv_e59091e5898d():
    rgb.fill( (0, 0, 0) )
    rgb.write()
    time.sleep_ms(1)
    rgb = (int(255/30), int(0/30), int(0/30))
    rgb.write()
    time.sleep_ms(1)
    rgb = (int(255/30), int(0/30), int(0/30))
    rgb.write()
    time.sleep_ms(1)
    oled.DispChar("向前", 42, 22, 1)
_OneNET_msg_list.append('向后')
def OneNET_recv_e59091e5908e():
    rgb.fill( (0, 0, 0) )
    rgb.write()
    time.sleep_ms(1)
    rgb = (int(255/30), int(0/30), int(0/30))
    rgb.write()
    time.sleep_ms(1)
    oled.DispChar("向后", 42, 22, 1)
_OneNET_msg_list.append('停止')
def OneNET_recv_e5819ce6ada2():
    rgb.fill( (0, 0, 0) )
    rgb.write()
    time.sleep_ms(1)
    oled.DispChar("停止", 42, 22, 1)

rgb.fill( (0, 0, 0) )
rgb.write()
time.sleep_ms(1)
while not my_wifi.sta.isconnected():
    pass
oled.fill(0)
oled.DispChar("Wifi_OK", 0, 0, 1)
oled.show()
OneNET_setup()
oled.fill(0)
oled.DispChar("OneNet_OK", 42, 22, 1)
oled.show()
图形代码


6、演示视频
https://v.youku.com/v_show/id_XNDQ1OTQ1NjQ0NA==.html?x&sharefrom=android&sharekey=4951817fc71535a562e7d7ff50821f3a8

rzegkly 发表于 2019-12-6 08:08:01

很棒的文章

rzyzzxw 发表于 2019-12-6 09:15:24

X还不支持DF的扩展板,你懂的。
不过mpython将来会开放接口,高手自己写就可以了。{:5_178:}

mztgXql8 发表于 2019-12-15 20:51:24

如果电机不用控制转速,可以直接接到引脚上,前几天做远程控制风扇就是直接接到引脚上的

gada888 发表于 2019-12-30 08:04:39

支持一下
页: [1]
查看完整版本: 微信小程序+OneNET物联+掌控板