01搖搖杯計數器
(2016.12.28)
今天利用滾珠開關(傾斜開關)製作了一個史上最便宜的「小夜燈」,同時又發現有人利用「水銀開關」製作「咖啡杯計數器」,覺得很有趣,也適合做成一個獨立教具,因此興起了利用「滾珠開關」來製作這個題目的念頭!(對於國小學生,這是一個不錯的題目,簡單又好玩!)
- 說明:搖動杯子一次則計數一次
- 硬體接法:只用到一顆滾珠開關(傾斜開關)來控制,所以接法非常簡單,開關的一支腳接A0、一支腳接GND
- 滾珠開關(傾斜開關)構造,透過傾斜角度讓滾珠碰到兩支針腳則形成通路,滾珠沒有碰到兩支針腳則形成斷路
- 啟動Trandformer並進入Scratch2.0
- Scratch 2.0程式
- 舞台及角色
- 杯子的程式
- 數字程式
- 個位數
- 十位數
- 百位數
- 測試結果:慢慢搖動則沒有問題,但搖動很快時會有遲鈍現象!!
題目二:離線版搖搖杯
這個題目做了好久,第一次發現滾珠開關的使用沒有像之前Transformer下直接利用類比連接的方式,這可能會有問題!因此向MotoDuino的Dennis Chen求救,因此改為本題目的作法!另外,計數器的4位數7格顯示器在MotoBlockly只支援TM1637的晶片,這可向MotoDuino網站購買,也可到淘寶去找找~
- 說明:找一個咖啡杯,上面安裝兩個【按鍵】,一個可設定時間、另一個按鍵是【啟動鍵】,當按下啟動鍵後,會在4位數的7格顯示器上顯示搖動次數!
- 所需材料:
- Arduino控制板 X 1
- 4位數七段顯示器模組 X 1 (注意:目前Motoblockly 只支援TM1637晶片驅動7段顯示器,淘寶購買)
- 按鍵 X 2 (腳位使用 input_PULLUP 的宣告)
- 無源蜂鳴器 X 1
- 傾斜開關 X1 (含10K電阻(棕黑橙金)一個)
- 小型麵包板 X 1
- 9V電池及電池扣 X 1 (離線工作用)
- 杜邦線
- 咖啡杯 X 1 (改裝成視力保健機)
- 硬體部分:
- 4位數七段顯示器模組 (CLK:D2、DATA:D3、VCC:5V、GND:GND)
- 按鍵 (一腳:D13(D12)、另一腳:GND)
- 無源蜂鳴器 (一腳:D7、另一腳:GND)
- 傾斜開關 (參考下方說明,主要接D5)
- 傾斜開關接線說明(參考資料:https://learn.adafruit.com/tilt-sensor/using-a-tilt-sensor)
- 軟體部分,進入Moto Blockly (檔案於附件)
- 轉成Arduino語言,其中下方的紅字部分,要記得手動修改!!
- 註:MotoBlockly的積木沒有宣告「輸入(pull-in)」的功能,所以到Arduino IDE下要再手動修改
- #include <motoTM1637.h>
- int setstarttime;
- int checkstarttime;
- int checkgo;
- int counter;
- long starttime;
- long remaintime;
- TM1637 tm1637led_2_3(2,3);
- void setup()
- {
- pinMode(2, OUTPUT);
- pinMode(3, OUTPUT);
- pinMode(13, INPUT_PULLUP);
- pinMode(12, INPUT_PULLUP);
- pinMode(5, INPUT);
- pinMode(7, OUTPUT);
- setstarttime = 20;
- checkstarttime = 0;
- checkgo = 0;
- counter = 0;
- starttime = 0;
- remaintime = setstarttime;
- tm1637led_2_3.display(setstarttime);
- }
- void loop()
- {
- if (digitalRead(13) == 0 && checkstarttime == 0) {
- setstarttime = setstarttime + 10;
- tm1637led_2_3.display(setstarttime);
- delay(500);
- if (setstarttime > 180) {
- setstarttime = 0;
- }
- }
- if (digitalRead(12) == 0 && checkgo == 0) {
- starttime = millis();
- counter = 0;
- checkstarttime = 1;
- checkgo = 1;
- tm1637led_2_3.display(counter);
- }
- remaintime = (millis() - starttime) / 1000;
- if (remaintime <= setstarttime && checkgo == 1) {
- if (digitalRead(5) == 0) {
- delay(100);
- if (digitalRead(5) == 1) {
- counter = counter + 1;
- tm1637led_2_3.display(counter);
- }
- }
- }
- if (remaintime > setstarttime && checkgo == 1) {
- for (int count = 0; count < 3; count++) {
- tone(7,255,300);
- delay(500);
- }
- checkstarttime = 0;
- checkgo = 0;
- }
- }
- 測試成功