Skip to content

Commit 8230095

Browse files
committed
Add the stage 7 check
1 parent cd895b9 commit 8230095

4 files changed

Lines changed: 133 additions & 5 deletions

File tree

msg/stages/07/zh-hans.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
MSG.title = "Webduino Blockly 关卡 7:平交道管制";
22
MSG.subTitle = "关卡 7:平交道管制";
3-
MSG.demoDescription = "利用开发板控制超音波、三色灯、伺服马达与蜂鸣器";
4-
MSG.stageHelp = "使用积木及模拟器,当超音波侦测到小于 50 公分时,让伺服马达旋转 90 度,三色 LED 灯呈现红、黄灯交替闪烁,蜂鸣器配合三色 LED 闪烁时发出声音,测试区显示超音波侦测到的距离。";
3+
MSG.demoDescription = "利用开发版控制超音波、三色灯 、伺服马达与蜂鸣器";
4+
MSG.stageHelp = "使用积木及模拟器,测试区显示超音波侦测到的距离。当超音波侦测到小于 50 公分时,让伺服马达旋转 90 度,三色 LED 灯呈现红、黄灯交替闪烁,蜂鸣器配合三色 LED 闪烁时发出声音。侦测距离超过 50 公分时,伺服马达旋转角度为 0,三色 LED 停止闪烁,蜂鸣器不发出声音。";
55
MSG.demoTitle = "网页互动区";

msg/stages/07/zh-hant.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
MSG.title = "Webduino Blockly 關卡 7:平交道管制";
22
MSG.subTitle = "關卡 7:平交道管制";
33
MSG.demoDescription = "利用開發版控制超音波、三色燈 、伺服馬達與蜂鳴器";
4-
MSG.stageHelp = "使用積木及模擬器,當超音波偵測到小於 50 公分時,讓伺服馬達旋轉 90 度,三色 LED 燈呈現紅、黃燈交替閃爍,蜂鳴器配合三色 LED 閃爍時發出聲音,測試區顯示超音波偵測到的距離。";
4+
MSG.stageHelp = "使用積木及模擬器,測試區顯示超音波偵測到的距離。當超音波偵測到小於 50 公分時,讓伺服馬達旋轉 90 度,三色 LED 燈呈現紅、黃燈交替閃爍,蜂鳴器配合三色 LED 閃爍時發出聲音。偵測距離超過 50 公分時,伺服馬達旋轉角度為 0,三色 LED 停止閃爍,蜂鳴器不發出聲音。";
55
MSG.demoTitle = "網頁互動區";

simulator

Submodule simulator updated from 6f15ced to b6a1bec

stageCheck.js

Lines changed: 129 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,8 @@
1212
'stages/03': stage3,
1313
'stages/04': stage4,
1414
'stages/05': stage5,
15-
'stages/06': stage6
15+
'stages/06': stage6,
16+
'stages/07': stage7
1617
};
1718

1819
demoDoc_ = demo.contentDocument;
@@ -381,7 +382,134 @@
381382

382383
}
383384

385+
/**
386+
* 檢查
387+
* 1. 網頁互動區的數值,是否和超音波的數值一致
388+
* 2. 超音波數值小於 50 時,蜂鳴器要發出聲音,並且三色 LED 有顏色變化,及伺服馬達要有 90 度的變化
389+
* 3. 超音波數值超過 50 時,蜂鳴器無聲,三色 LED 無變化,伺服馬達恢復 0 度
390+
* 做法:
391+
* 1. 蜂鳴器的發聲與否,以 2 筆資料為準,有 2 筆以上,判斷發聲
392+
* 2. 三色 led,變化與否,看儲存的顏色是否超過 1 筆
393+
*/
394+
function stage7() {
395+
var ultrasonics = engine_.list().ultrasonic;
396+
var buzzers = engine_.list().buzzer;
397+
var rgbLeds = engine_.list().rgbled;
398+
var servos = engine_.list().servo;
399+
var showEl = demoDoc_.querySelector('#show');
400+
var buzzerData = {};
401+
var rgbData = {};
402+
var curDistance = void 0;
403+
var check = [false, false];
404+
var isPassed = false;
384405

406+
if (!ultrasonics.length) return;
407+
if (!buzzers.length) return;
408+
if (!rgbLeds.length) return;
409+
if (!servos.length) return;
410+
411+
ultrasonics.forEach(function (us) {
412+
us.setSendHandler(send);
413+
});
414+
415+
buzzers.forEach(function (bz) {
416+
bz.setCmdHandler(cmd);
417+
});
418+
419+
rgbLeds.forEach(function (rgbLed) {
420+
rgbLed.state(state);
421+
});
422+
423+
// 當超音波距離不同時,做檢查,並建立 array 來儲存蜂鳴器命令發送的時間
424+
function send(distance) {
425+
// 檢查超音波偵測到的距離,是否和畫面相同
426+
if (Number(distance) !== Number(showEl.textContent)) return;
427+
428+
// 把之前的記錄清除,以便正確判斷蜂鳴器發聲的記錄
429+
if (curDistance && curDistance !== distance) {
430+
buzzerData[curDistance] = [];
431+
rgbData[curDistance] = {};
432+
}
433+
434+
buzzerData[distance] = buzzerData[distance] || [];
435+
rgbData[distance] = rgbData[distance] || {};
436+
curDistance = distance;
437+
438+
if (curDistance < 50) {
439+
checkPoint1();
440+
} else {
441+
checkPoint2();
442+
}
443+
444+
checking();
445+
}
446+
447+
// 儲存蜂鳴器送出命令的時間
448+
function cmd() {
449+
if (curDistance) {
450+
buzzerData[curDistance] && buzzerData[curDistance].push(Date.now());
451+
}
452+
}
453+
454+
// 儲存三色 led 狀態
455+
function state(r, g, b) {
456+
if (curDistance) {
457+
rgbData[curDistance]["[" + r + "," + g + "," + b + "]"] = true;
458+
}
459+
}
460+
461+
function checkPoint1 () {
462+
if (check[0]) return;
463+
if (buzzerData[curDistance].length < 2) return;
464+
if (Object.keys(rgbData[curDistance]).length < 2) return;
465+
466+
check[0] = servos.some(function (servo, idx, ary) {
467+
return servo.getAngle() === 90;
468+
});
469+
}
470+
471+
function checkPoint2 () {
472+
if (check[1]) return;
473+
if (buzzerData[curDistance].length > 2) return;
474+
if (Object.keys(rgbData[curDistance]).length > 1) return;
475+
476+
check[1] = servos.some(function (servo, idx, ary) {
477+
return servo.getAngle() === 5;
478+
});
479+
}
480+
481+
function checking() {
482+
if (isPassed) return;
483+
484+
isPassed = check.reduce(function (acc, val) {
485+
return acc && val;
486+
}, true);
487+
488+
if (isPassed) {
489+
checkOver();
490+
491+
// 考量畫面有些動畫未完成,所以延遲 1 秒執行
492+
setTimeout(function () {
493+
alert('第 7 關 過關!');
494+
}, 1000);
495+
}
496+
}
497+
498+
function checkOver() {
499+
ultrasonics.forEach(function (us) {
500+
us.setSendHandler(null);
501+
});
502+
503+
buzzers.forEach(function (bz) {
504+
bz.setCmdHandler(null);
505+
});
506+
507+
rgbLeds.forEach(function (rgbLed) {
508+
rgbLed.state(null);
509+
});
510+
}
511+
512+
}
385513

386514

387515
Code.stageCheck = {

0 commit comments

Comments
 (0)