物联网 实验3 Mind+ 掌控板 抢答器实验

一、实验目的及要求

二、实验原理与内容

三、实验软硬件环境

四、实验过程(实验步骤、记录、数据、分析)

六、实验结论与体会


一、实验目的及要求

实现掌控板抢答器功能。

二、实验原理与内容

基于TinywebDB实现云数据库出题

基于掌控板实现按键抢答和判题

基于MQTT实现多端同步通讯

三、实验软硬件环境

硬件:掌控板

软件:Mind+

四、实验过程(实验步骤、记录、数据、分析)

  1. 请概括出题、抢答、判题等过程(包括操作逻辑和实现效果截图等)

①博客地址:

https://aliza.blog.csdn.net/article/details/111052119

②源码仓库地址:

https://gitee.com/cai_wan_feng/mind

 

设计抢答器相比之前的实验相对来说比较复杂,所花时间比较长,但是如果我们理清思路,就会发现,抢答器无非就是把我们之前做实验所学所用到的东西结合在了一起。

 

(1)首先,我们需要在Easy IOT上创立三个topic,一个topic负责做“主持”发送抢答题目以及计时。另外两个topic负责充当“抢答方”,如果他们抢答成功的话,抢答快的他的信息会发到“主持人”的掌控板上。

2)设计题库
我们可以通过之前用过的Tiny WebDB创建自己的数据库来解决这个问题。
登录网址http://tinywebdb.appinventor.space/注册账户

注册成功后,点击上方数据浏览,创建数据库。

通过增加标签,值填写相关题目信息,如下图所示,我们的抢答器题库完成了。

3)在Mind+写代码
首先在Mind+点击扩展,在网络服务那里添加以下模块。

这是主持人模块代码

  

相关参数:

核心代码展示:

/*!

 * MindPlus

 * mpython

 *

 */

#include <MPython.h>

#include <DFRobot_Iot.h>

#include <mPython_tinywebdb.h>

 

// 动态变量

String         mind_s_QiangDaXinXi, mind_s_WenTi;

volatile float mind_n_KaiShiJiShi, mind_n_XiTongJiShi, mind_n_JingDu, mind_n_Miao,

               mind_n_Fen, mind_n_YaoYiYao, mind_n_XianZhi, mind_n_JiShiZhuangTai;

// 函数声明

void DF_XianShiShiJian();

void obloqMqttEventT2(String& message);

// 静态常量

const String topics[5] = {"5OF5bCdGg","a1EcxCdGg","uN6GuA1MR","",""};

const MsgHandleCb msgHandles[5] = {NULL,NULL,obloqMqttEventT2,NULL,NULL};

// 创建对象

DFRobot_Iot       myIot;

mPython_TinyWebDB mydb;

 

 

// 主程序开始

void setup() {

     mPython.begin();

     dfrobotRandomSeed();

     myIot.setMqttCallback(msgHandles);

     myIot.wifiConnect("cai", "12345678");

     while (!myIot.wifiStatus()) {yield();}

     display.setCursorLine(1);

     display.printLine("Wi-Fi连接成功");

myIot.init("iot.dfrobot.com.cn","F6DO7poMR","","F6DdntoMRz",topics,1883);

     myIot.connect();

     while (!myIot.connected()) {yield();}

     display.setCursorLine(1);

     display.printLine("MQTT连接成功");

mydb.setServerParameter("http://tinywebdb.appinventor.space/api", "aliza","123456");

     mind_n_YaoYiYao = 0;

     mind_n_XianZhi = 0;

     mind_s_QiangDaXinXi = mydb.getTag("0");

     mind_s_WenTi = mydb.getTag((String((random(0, 10+1)))));

     display.setCursor(84, 13);

     display.print("00");

     display.setCursor(36, 13);

     display.print(":");

     display.setCursor(52, 13);

     display.print("00");

     display.setCursor(68, 13);

     display.print(".");

     display.setCursor(20, 13);

     display.print("00");

     mind_n_JiShiZhuangTai = 1;

     mind_n_XianZhi = 0;

}

void loop() {

     if ((buttonA.isPressed())) {

           display.setCursorLine(3);

           display.printLine(mind_s_WenTi);

           mind_n_YaoYiYao = 1;

           mind_n_KaiShiJiShi = millis();

           display.setCursor(36, 13);

           display.print(":");

           display.setCursor(68, 13);

           display.print(".");

           while (!(mind_n_JiShiZhuangTai==0)) {

                if ((buttonB.isPressed())) {

                     myIot.publish(topic_0, mind_s_QiangDaXinXi);

                     myIot.publish(topic_1, mind_s_WenTi);

                }

                DF_XianShiShiJian();

                yield();

           }

     }

}

 

 

// 自定义函数

void DF_XianShiShiJian() {

     display.setCursor(84, 13);

     display.print("");

     display.setCursor(52, 13);

     display.print("");

     display.setCursor(20, 13);

     display.print("");

     mind_n_XiTongJiShi = (millis() - mind_n_KaiShiJiShi);

     mind_n_JingDu = (((int)(mind_n_XiTongJiShi / 10)) % ((int)100));

     if ((mind_n_JingDu<10)) {

           display.setCursor(84, 13);

        display.print((String("0") + String((((int)mind_n_JingDu) % ((int)100)))));

     }

     else {

           display.setCursor(84, 13);

           display.print(mind_n_JingDu);

     }

     mind_n_XiTongJiShi = ((millis() - mind_n_KaiShiJiShi) / 1000);

     mind_n_Miao = (((int)mind_n_XiTongJiShi) % ((int)60));

     if ((mind_n_Miao<10)) {

           display.setCursor(52, 13);

           display.print((String("0") + String((((int)mind_n_Miao) % ((int)100)))));

     }

     else {

           display.setCursor(52, 13);

           display.print(mind_n_Miao);

     }

     mind_n_Fen = (((int)(mind_n_XiTongJiShi / 60)) % ((int)60));

     if ((mind_n_Fen<10)) {

           display.setCursor(20, 13);

           display.print((String("0") + String((((int)mind_n_Fen) % ((int)100)))));

     }

     else {

           display.setCursor(20, 13);

           display.print(mind_n_Fen);

     }

}

 

// 事件回调函数

void obloqMqttEventT2(String& message) {

     if ((mind_n_XianZhi==0)) {

           mind_n_JiShiZhuangTai = 0;

           delay(2000);

           display.setCursorLine(4);

         display.printLine((String(message) + String("抢答成功!")));

           mind_n_XianZhi = 1;

     }

}

抢答方代码:

抢答方核心代码;

/*!

 * MindPlus

 * mpython

 *

 */

#include <MPython.h>

#include <DFRobot_Iot.h>

#include <mPython_tinywebdb.h>

 

// 动态变量

volatile float mind_n_KeYiQiangDa;

// 函数声明

void obloqMqttEventT0(String& message);

void obloqMqttEventT1(String& message);

void onButtonBPressed();

// 静态常量

const String topics[5] = {"5OF5bCdGg","a1EcxCdGg","uN6GuA1MR","",""};

const MsgHandleCb msgHandles[5] = {obloqMqttEventT0,obloqMqttEventT1,NULL,NULL,NULL};

// 创建对象

DFRobot_Iot       myIot;

mPython_TinyWebDB mydb;

 

 

// 主程序开始

void setup() {

     mPython.begin();

     myIot.setMqttCallback(msgHandles);

     buttonB.setPressedCallback(onButtonBPressed);

     myIot.wifiConnect("rayne", "1234567a");

     while (!myIot.wifiStatus()) {yield();}

     display.setCursorLine(1);

     display.printLine("WiFi连接成功");

myIot.init("iot.dfrobot.com.cn","F6DO7poMR","","F6DdntoMRz",topics,1883);

     myIot.connect();

     while (!myIot.connected()) {yield();}

     display.setCursorLine(2);

     display.printLine("MQTT连接成功");

mydb.setServerParameter("http://tinywebdb.appinventor.space/api", "aliza","a46a5f05");

}

void loop() {

 

}

 

// 事件回调函数

void obloqMqttEventT0(String& message) {

     display.fillScreen(0);

     display.setCursorLine(1);

     display.printLine(message);

     if ((message==String("请开始抢答"))) {

           display.setCursorLine(2);

           display.printLine("抢答开始!");

           mind_n_KeYiQiangDa = 1;

     }

}

void obloqMqttEventT1(String& message) {

     display.setCursorLine(3);

     display.printLine(message);

}

void onButtonBPressed() {

     myIot.publish(topic_2, "蔡婉芬");

}

到目前为止,我们的抢答器基本完成了。

五、测试/调试及实验结果分析

上传后主持人的掌控板

开始提问问题

这是抢答方掌控板

主持人掌控板显示抢答成功

Easy IOT数据显示

六、实验结论与体会

这个实验需要耗费的时间是稍微有点长,因为需要我们综合并运用过去学过的知识才能很好地理解抢答器的功能原理,比如我们之前使用过的mqtt以及TinyWebDB就派上用场了,还有通过这次实验,我学会了编程实现计时器的功能,我认为要很好完成此次实验,除了要巩固之前的知识,还要有细心与耐心,确保每一方的数据参数要保持一致,这样会节省很多时间,总之是一次让人受益匪浅的实验。

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐