云天 发表于 2022-2-19 00:11:07

DFRduino UNO R3-EDU+OBLOQ+红外+小度=智能空气净化器

本帖最后由 云天 于 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数据。大家可自行下载附件安装。

【获取红外遥控器编码】

红外接收模块接在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


模拟测试

真机测试配置
【演示视频】


https://www.bilibili.com/video/BV1UL411K7Ev?share_source=copy_web



因Arduino程序中访问微数据库前等待了5秒(微数据库网站可能有限制,频繁访问会被拒绝),所以命令响应有些不及时。解决方法,可使用物联网,如DF的Easy Iot。
改进:
【物联网Easy Iot】
物联网信息

Mind+程序OBLOQ mqtt模块配置
监听物联网指令,红外发送指令完整程序



为避免与系统指令冲突,将意图进行修改,均增加净化器。


因使用到物联网库,所以要在配置服务中使用“百度云CFC”,并进行入服务配置。




创建函数


上传函数压缩包
压缩包中,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,粘回:


保存


【小度物联网演示视频】

https://www.bilibili.com/video/BV1k44y1J7iH?share_source=copy_web
除了每次说指令前,需要说“小度 小度 打开净化器技能”,其它的完美!

RRoy 发表于 2022-2-23 17:21:10

赞!{:5_179:}

yangjumei 发表于 2022-3-7 14:35:56

天猫一样可以吧?

小企鹅 发表于 2022-3-16 16:43:11

666666666666666
页: [1]
查看完整版本: DFRduino UNO R3-EDU+OBLOQ+红外+小度=智能空气净化器