本帖最后由 云天 于 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,粘回: 
 
  
保存 
 
 
【小度物联网演示视频】 
 
 
除了每次说指令前,需要说“小度 小度 打开净化器技能”,其它的完美!  
 |