本帖最后由 云天 于 2022-2-19 10:39 编辑
通过DFRduino UNO R3-EDU主板+OBLOQ物联网模块+红外接收发送模块+小度音箱实现智能控制空气净化器(自带红外遥控功能)。
小度音箱通过微数据库TinyWebDB与DFRduino UNO R3-EDU主板进行信息沟通。
【微数据库TinyWebDB配置】
TinyWebDB网络数据库,每个用户可以申请一个甚至多个数据库地址。由于每一个地址都包含用户名和用户名的密钥,相互独立,互不影响,数据库的安全性比较高。除此以外,每个数据库都可以独立管理,支持使用API进行增删查改操作。
网址:TinyWebDB服务器 - APPInventor网络微数据库
1、注册
2、登陆后,可查看相关参数
3、新建
因Post的action操作中,只有“更新update、读取get、删除delete、计数count、查询search”,所以无法远程新建“变量”。要通过“数据浏览”中“修改”操作来“新建”。
【UART OBLOQ - IoT物联网模块】
本项目使用UART OBLOQ - IoT物联网模块连网并访问TinyWebDB网络数据库进行相应操作。
(OBLOQ插在DFRduino UNO R3_EDU主板的UART接口上)
OBLOQ是一款基于ESP8266设计的串口转WIFI物联网模块,用以接收和发送物联网信息。尺寸紧凑,价格低,接口简单,即插即用,适用于3.3V~5V的控制系统。软件编程简单,无需复杂的基础知识,就能迅速搭建出一套物联网应用。
【Mind+程序——TinyWebDB配置】
1、在Mind+上传模式中,添加通信模块——OBLOQ物联网模块
2、使用Obloq http模块
WIFI相关参数填写自己的Wifi信息,IP地址为:tinywebdb.appinventor.space;端口:80。
3、通过串口显示变量“jsq”值,形式为:{"jsq": "0"}。注意:下载程序时,要将Obloq http模块拔下(占用TX,RX引脚)。
通过自己编写的模块来处理接收到的JSON数据。大家可自行下载附件安装。
yuntian-json-thirdex-V0.0.2.zip
【获取红外遥控器编码】
红外接收模块接在DFRduino UNO R3_EDU主板的D2引脚上。
Mind+添加通信模块——红外接收模块。
利用串口输出各按键的编码。
【红外发射程序】
1、Mind+添加通信模块——红外发射模块
2、从TinyWebDB接收到指令,再通过红外发射模块发射相应指令。
【硬件安装】
【小度开放平台配置】
DuerOS开放平台 (baidu.com)
创建新技能
自定义新技能
从头开始新技能
填写相应信息,后面我将调用名称修改为:净化器技能。
创建意图
填写意图
创建多个意图
配置服务-代码编辑
语言选择:Python2.7
-
- #!/usr/bin/env python2
- # -*- encoding=utf-8 -*-
- import sys
- from dueros.Bot import Bot
- from dueros.card.TextCard import TextCard
- import urllib2,json
- reload(sys)
- sys.setdefaultencoding('utf8')
-
- class DuerOSBot(Bot):
-
- def launch_request(self):
- """
- 打开技能
- """
- self.wait_answer()
- card = TextCard('欢迎使用技能')
- return {
- 'card': card,
- 'outputSpeech': r'欢迎使用技能'
- }
-
- def ended_request(self):
- """
- 关闭技能
- """
- self.wait_answer()
- return {
- 'outputSpeech': r'感谢您的使用'
- }
-
- def __init__(self, request_data):
- super(DuerOSBot, self).__init__(request_data)
- self.add_launch_handler(self.launch_request)
- self.add_session_ended_handler(self.ended_request)
- self.add_intent_handler('open', self.open_intent)
- self.add_intent_handler('close_me', self.close_me_intent)
- self.add_intent_handler('speed', self.speed_intent)
- self.add_intent_handler('Anion', self.Anion_intent)
- self.add_intent_handler('intelligence', self.intelligence_intent)
- self.add_intent_handler('disinfect', self.disinfect_intent)
- self.add_intent_handler('time', self.time_intent)
- self.add_intent_handler('sleep', self.sleep_intent)
- def open_intent(self):
- response = urllib2.urlopen('http://tinywebdb.appinventor.space/api?user=yuntian23&secret=be430126&action=update&tag=jsq&value=0')
- html = json.loads(response.read())
- if(html['status']=='success'):
- card = TextCard('已为您打开净化器')
- return {
- 'card': card,
- 'outputSpeech': r'已为您打开净化器'
- }
- def close_me_intent(self):
- response = urllib2.urlopen('http://tinywebdb.appinventor.space/api?user=yuntian23&secret=be430126&action=update&tag=jsq&value=0')
- html = json.loads(response.read())
- if(html['status']=='success'):
- card = TextCard('已为您关闭净化器')
- return {
- 'card': card,
- 'outputSpeech': r'已为您关闭净化器'
- }
- def speed_intent(self):
- response = urllib2.urlopen('http://tinywebdb.appinventor.space/api?user=yuntian23&secret=be430126&action=update&tag=jsq&value=1')
- html = json.loads(response.read())
- if(html['status']=='success'):
- card = TextCard('已为您调整净化速度')
- return {
- 'card': card,
- 'outputSpeech': r'已为您调整净化速度'
- }
- def Anion_intent(self):
- response = urllib2.urlopen('http://tinywebdb.appinventor.space/api?user=yuntian23&secret=be430126&action=update&tag=jsq&value=2')
- html = json.loads(response.read())
- if(html['status']=='success'):
- card = TextCard('已为您开启负离子')
- return {
- 'card': card,
- 'outputSpeech': r'已为您开启负离子'
- }
- def intelligence_intent(self):
- response = urllib2.urlopen('http://tinywebdb.appinventor.space/api?user=yuntian23&secret=be430126&action=update&tag=jsq&value=3')
- html = json.loads(response.read())
- if(html['status']=='success'):
- card = TextCard('已为您开启智能模式')
- return {
- 'card': card,
- 'outputSpeech': r'已为您开启智能模式'
- }
- def disinfect_intent(self):
- response = urllib2.urlopen('http://tinywebdb.appinventor.space/api?user=yuntian23&secret=be430126&action=update&tag=jsq&value=4')
- html = json.loads(response.read())
- if(html['status']=='success'):
- card = TextCard('已为您开启杀菌模式')
- return {
- 'card': card,
- 'outputSpeech': r'已为您开启杀菌模式'
- }
- def time_intent(self):
- response = urllib2.urlopen('http://tinywebdb.appinventor.space/api?user=yuntian23&secret=be430126&action=update&tag=jsq&value=5')
- html = json.loads(response.read())
- if(html['status']=='success'):
- card = TextCard('已为您开启定时')
- return {
- 'card': card,
- 'outputSpeech': r'已为您开启定时'
- }
- def sleep_intent(self):
- response = urllib2.urlopen('http://tinywebdb.appinventor.space/api?user=yuntian23&secret=be430126&action=update&tag=jsq&value=6')
- html = json.loads(response.read())
- if(html['status']=='success'):
- card = TextCard('已为您开启睡眠模式')
- return {
- 'card': card,
- 'outputSpeech': r'已为您开启睡眠模式'
- }
- def handler(event, context):
-
- bot = DuerOSBot(event)
- result = bot.run()
- return result
-
复制代码
模拟测试
真机测试配置
【演示视频】
因Arduino程序中访问微数据库前等待了5秒(微数据库网站可能有限制,频繁访问会被拒绝),所以命令响应有些不及时。解决方法,可使用物联网,如DF的Easy Iot。
改进:
【物联网Easy Iot】
物联网信息
Mind+程序OBLOQ mqtt模块配置
监听物联网指令,红外发送指令完整程序
智能净化器.zip
为避免与系统指令冲突,将意图进行修改,均增加净化器。
因使用到物联网库,所以要在配置服务中使用“百度云CFC”,并进行入服务配置。
创建函数
上传函数压缩包MQTT_4769faef-cda7-412f-a335-7bbe65cb77b9.zip
压缩包中,dueros\paho\mqtt中client.py文件修改,物联网用户名及密码。
-
- #!/usr/bin/env python2
- # -*- encoding=utf-8 -*-
- import sys
- from dueros.Bot import Bot
- from dueros.card.TextCard import TextCard
- import urllib2,json
- import dueros.paho.mqtt.client as mqtt
- reload(sys)
- sys.setdefaultencoding('utf8')
-
- class DuerOSBot(Bot):
-
- def launch_request(self):
- """
- 打开技能
- """
- self.wait_answer()
- card = TextCard('欢迎使用智能净化器技能')
- return {
- 'card': card,
- 'outputSpeech': r'欢迎使用智能净化器技能'
- }
-
- def ended_request(self):
- """
- 关闭技能
- """
- self.wait_answer()
- return {
- 'outputSpeech': r'感谢您的使用'
- }
-
- def __init__(self, request_data):
- super(DuerOSBot, self).__init__(request_data)
- self.add_launch_handler(self.launch_request)
- self.add_session_ended_handler(self.ended_request)
- self.add_intent_handler('open', self.open_intent)
- self.add_intent_handler('close_me', self.close_me_intent)
- self.add_intent_handler('speed', self.speed_intent)
- self.add_intent_handler('Anion', self.Anion_intent)
- self.add_intent_handler('intelligence', self.intelligence_intent)
- self.add_intent_handler('disinfect', self.disinfect_intent)
- self.add_intent_handler('time', self.time_intent)
- self.add_intent_handler('sleep', self.sleep_intent)
- def open_intent(self):
- on_publish("5n92uqBMg", "0", 0)#0代表保存在服务器上
- card = TextCard('已为您打开净化器')
- return {
- 'card': card,
- 'outputSpeech': r'已为您打开净化器'
- }
- def close_me_intent(self):
- on_publish("5n92uqBMg", "0", 0)#0代表保存在服务器上
- card = TextCard('已为您关闭净化器')
- return {
- 'card': card,
- 'outputSpeech': r'已为您关闭净化器'
- }
- def speed_intent(self):
- on_publish("5n92uqBMg", "1", 0)#0代表保存在服务器上
- card = TextCard('已为您调整净化速度')
- return {
- 'card': card,
- 'outputSpeech': r'已为您调整净化速度'
- }
- def Anion_intent(self):
- on_publish("5n92uqBMg", "2", 0)#0代表保存在服务器上
- card = TextCard('已为您开启负离子')
- return {
- 'card': card,
- 'outputSpeech': r'已为您开启负离子'
- }
- def intelligence_intent(self):
- on_publish("5n92uqBMg", "3", 0)#0代表保存在服务器上
- card = TextCard('已为您开启智能模式')
- return {
- 'card': card,
- 'outputSpeech': r'已为您开启智能模式'
- }
- def disinfect_intent(self):
- on_publish("5n92uqBMg", "4", 0)#0代表保存在服务器上
- card = TextCard('已为您开启杀菌模式')
- return {
- 'card': card,
- 'outputSpeech': r'已为您开启杀菌模式'
- }
- def time_intent(self):
- on_publish("5n92uqBMg", "5", 0)#0代表保存在服务器上
- card = TextCard('已为您开启定时')
- return {
- 'card': card,
- 'outputSpeech': r'已为您开启定时'
- }
- def sleep_intent(self):
- on_publish("5n92uqBMg", "6", 0)#0代表保存在服务器上
- card = TextCard('已为您开启睡眠模式')
- return {
- 'card': card,
- 'outputSpeech': r'已为您开启睡眠模式'
- }
- MQTTHOST = "182.254.130.180"
- MQTTPORT = 1883
- mqttClient = mqtt.Client()
-
-
- # 连接MQTT服务器
- def on_mqtt_connect():
- mqttClient.connect(MQTTHOST, MQTTPORT, 60)
- mqttClient.loop_start()
-
-
- # publish 消息
- def on_publish(topic, payload, qos):
- mqttClient.publish(topic, payload, qos)
- #print(topic)
-
- # 消息处理函数
- def on_message_come(lient, userdata, msg):
- pass
- #print(msg.topic + " " + ":" + str(msg.payload))
-
-
- # subscribe 消息
- def on_subscribe():
- mqttClient.subscribe("5n92uqBMg", 1)
- mqttClient.on_message = on_message_come # 消息到来处理函数
- def handler(event, context):
-
- bot = DuerOSBot(event)
- result = bot.run()
- return result
-
复制代码
index.py文件内容
在“在线编辑”中可查看并编辑代码,
创建DuerOS触发器
并复制brn:bce:cfc:bj:22e9c36dc8536918a55386dc914811e1:function:jinghuaqi:$LATEST,粘回:
保存
【小度物联网演示视频】
除了每次说指令前,需要说“小度 小度 打开净化器技能”,其它的完美!
|