欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

掌控板抢答器功能实验

程序员文章站 2022-04-04 11:14:03
...

掌控板抢答器实验

一、实验目的及要求

实现掌控板抢答器功能。

二、实验原理与内容

基于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平台上的一一对应;②数据库的设计是否合理,标签值的读取是否正确;③整个抢答系统的逻辑要捋顺;④保证网络通畅。总体下来,实验完成那一刻还是很兴奋的,是对自己知识很好的一次总结。