掌控板抢答器功能实验
掌控板抢答器实验
一、实验目的及要求
实现掌控板抢答器功能。
二、实验原理与内容
基于TinywebDB实现云数据库出题
基于掌控板实现按键抢答和判题
基于MQTT实现多端同步通讯
三、实验软硬件环境
硬件:掌控板
软件:Mind+
四、实验过程(实验步骤、记录、数据、分析)
请概括出题、抢答、判题等过程(包括操作逻辑和实现效果截图等)
(一)实验前准备:WI-FI连接、设置服务器参数、MQTT初始化参数、TingWebDB数据库的数据录入。
源码:
// 主程序开始
void setup() {
mPython.begin();
dfrobotRandomSeed();
myIot.setMqttCallback(topic_2, "错", whenTopic2Received0);
myIot.setMqttCallback(topic_2, "对", whenTopic2Received1);
myIot.wifiConnect("hui", "8puutak84mnc5");
while (!myIot.wifiStatus()) {yield();}
display.setCursorLine(1);
display.printLine(myIot.getWiFiLocalIP());
mydb.setServerParameter("http://tinywebdb.appinventor.space/api", "xxcxxc","bf58c259");
myIot.init("iot.dfrobot.com.cn","EHkTFbAMg","","EHkTKxAGRz",topics,1883);
myIot.connect();
while (!myIot.connected()) {yield();}
display.setCursorLine(1);
display.printLine("mqtt ok");
DF_QiangDaFang();
}
(二)裁判出题
定义一个裁判方函数和计时函数,负责掌控整个答题过程。裁判按下A键后,读取数据库标签值并从1~5题目中随机出题,按下B键则开始计时。
裁判方源码:
void DF_CaiPanFang() {
display.setCursorLine(2);
display.printLine("请按下A键开始出题");
while (!(buttonA.isPressed())) {yield();}
display.fillScreen(0);
mind_n_SuiJiTiMu = (random(1, 5+1));
mydb.updateTagValue("q", (String("q") + String((String(mind_n_SuiJiTiMu).toInt()))));
display.setCursorLine(1);
display.printLine("出题成功!");
display.setCursorLine(2);
display.printLine(mydb.getTag(mydb.getTag("q")));
display.setCursorLine(1);
display.printLine("按下B键开始计时");
while (!(buttonB.isPressed())) {yield();}
mydb.updateTagValue("ok", "1");
}
计时器源码:
void DF_JiShiQi() {
mind_n_flag = 1;
mind_n_my_float_variable = millis();
while (1) {
if ((mind_n_flag==1)) {
mind_n_now = (millis() - mind_n_my_float_variable);
mind_n_ms = (((int)mind_n_now) % ((int)1000));
mind_n_s = (((int)(mind_n_now / 1000)) % ((int)60));
mind_n_min = (floor(((mind_n_now / 1000) / 60)));
display.setCursor(37, 22);
display.print((String((String((String((String(mind_n_min).toInt())) + String(":"))) + String((String((String(mind_n_s).toInt())) + String(":"))))) + String((String(mind_n_ms).toInt()))));
}
(三)抢答者
定义一个抢答方函数,负责抢题(裁判不参与抢题)。待裁判出完题后,抢答者的掌控板上会显示题目以及时间计时。如果抢答者将按钮A+B同时按下,则开始抢答,若有一位选手抢答成功,该名选手掌控板三个会亮绿灯,并且屏幕出现选项提示(触摸按键Y为是,触摸N按键为否),而其他选手的掌控板则出现“抢答失败!”提示,不亮灯。
抢答方源码:
void DF_QiangDaFang() {
display.setCursorLine(1);
display.printLine("待裁判出题完成后");
display.setCursorLine(2);
display.printLine("按P键刷新");
while (!(touchPadP.isTouched())) {yield();}
display.fillScreen(0);
display.setCursorLine(1);
display.printLine("当前题目是:");
display.setCursorLine(2);
display.printLine(mydb.getTag(mydb.getTag("q")));
while (!((String(mydb.getTag("ok")).toInt())==1)) {yield();}
display.fillScreen(0);
display.setCursorLine(1);
display.printLine((String(mydb.getTag("q")) + String("抢答开始!")));
DF_JiShiQi();
}
if ((buttonAB.isPressed())) {
mind_n_flag = 0;
myIot.publish(topic_0, (String((String((String((String(mind_n_min).toInt())) + String(":"))) + String((String((String(mind_n_s).toInt())) + String(":"))))) + String((String(mind_n_ms).toInt()))));
if (((String(mydb.getTag("PID")).toInt())==1)) {
mydb.updateTagValue("PID", "0");
display.fillScreen(0);
display.setCursorLine(1);
display.printLine("抢答成功!");
display.setCursor(37, 22);
display.print((String((String((String((String(mind_n_min).toInt())) + String(":"))) + String((String((String(mind_n_s).toInt())) + String(":"))))) + String((String(mind_n_ms).toInt()))));
rgb.write(-1, 0x00FF00);
display.setCursorLine(2);
display.printLine(mydb.getTag(mydb.getTag("q")));
display.setCursorLine(3);
display.printLine("(Y键为是,O键为否)");
}
else {
display.fillScreen(0);
display.setCursorLine(1);
display.printLine("抢答失败!");
}
while (!(touchPadY.isTouched())) {yield();}
myIot.publish(topic_2, "是");
rgb.write(-1, 0x000000);
display.fillScreen(0);
display.setCursorLine(1);
display.printLine("回答成功!");
display.setCursorLine(2);
display.printLine("请等待结果...");
while (!(touchPadH.isTouched())) {yield();}
myIot.publish(topic_2, "否");
rgb.write(-1, 0x000000);
display.fillScreen(0);
display.setCursorLine(1);
display.printLine("回答成功!");
display.setCursorLine(2);
display.printLine("请等待结果...");
}
yield();
}
(四)裁判判题
待抢答成功的选手选择选项之后,该名选手的掌控板会将选项信息发送到Easy Iot工作平台,裁判可以在平台上判断选手回答是否正确并给予回复,当选手的掌控板收到结果后,正确灯会亮绿色,错误则会亮红色。
(1)Easy Iot显示各选手抢答时间
(2)裁判判题并给出回复
(3)选手掌控板显示(回答正确亮绿灯)
(4)选手回答错误亮红色
五、实验结论与体会
此次实验是结合了前面几个实验的知识,更加的系统性,当然难度也加大了不少。在做计时的这一部分的时候,就反反复复调整了几遍,但整个实验觉得最难的部分是关于选手的抢答,总是无法同时进行,在这部分需要注意的是:①各选手的掌控板的topic是否与Easy Iot平台上的一一对应;②数据库的设计是否合理,标签值的读取是否正确;③整个抢答系统的逻辑要捋顺;④保证网络通畅。总体下来,实验完成那一刻还是很兴奋的,是对自己知识很好的一次总结。
上一篇: Java基础编程-1.Java语言概述
下一篇: Python—入门速成题目练习十五
推荐阅读