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)
  • 轉成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;
    • }
    • }
  • 測試成功