2017年12月13日 星期三

arduino溫濕度計輸出LCD(四) 雙偵測器顯示

一個DHT11可以,那是否可以設定兩個以上的溫濕度計呢?
看到有人問這個問題,不過我google不到成品,那就自己設計看看
反正應該不難,就是給他貼兩倍就對了
在#define這邊增加一個 DHT2PIN 4 ,設定是pin4,所以第一個DHT插pin2,第二個插pin4
增加DHT dht2(DHT2PIN, DHTTYPE); 其實我也不知道這個在幹嘛,不過總覺得要增加

這部分增加一組可以存數據的h2、t2、f2(其實f是華氏溫度根本也沒用到其實可以刪...)
  //第二個sensor
  // Reading temperature or humidity takes about 250 milliseconds!
  // Sensor readings may also be up to 2 seconds 'old' (its a very slow sensor)
  float h2 = dht2.readHumidity();
  // Read temperature as Celsius (the default)
  float t2 = dht2.readTemperature();
  // Read temperature as Fahrenheit (isFahrenheit = true)
  float f2 = dht2.readTemperature(true);

這一段我看不懂也不知道怎麼改,於是我沒複製兩份
  // Compute heat index in Fahrenheit (the default)
  float hif = dht.computeHeatIndex(f, h);
  // Compute heat index in Celsius (isFahreheit = false)
  float hic = dht.computeHeatIndex(t, h, false);

然後覺得跑出來的數字有小數點,但是這個DHT11根本無法測量小數點差異,於是加了int()將讀到的數字取整數(這個部分如果沒問小P老師我找半天找不到...)

  lcd.print(int(h));  //int(h)取h的整數
  lcd.print("% ");

以下是修改後的程式碼,應該可以順利運作才是,而且拔除其中一個還能顯示!error!,完成這個雙溫濕度計偵測器的方案。不過DHT11感覺在濕度不是很精準,我買了很多個每個插上去數值都不太一樣,可能還是需要校正或是注意一下。
成品長這樣




// Example testing sketch for various DHT humidity/temperature sensors
// Written by ladyada, public domain

#include "DHT.h"

#define DHTPIN 2     // what digital pin we're connected to
#define DHT2PIN 4    // what digital2 pin we're connected to

// Uncomment whatever type you're using!
#define DHTTYPE DHT11   // DHT 11
//#define DHTTYPE DHT22   // DHT 22  (AM2302), AM2321
//#define DHTTYPE DHT21   // DHT 21 (AM2301)

#include <Wire.h>
#include <LiquidCrystal_I2C.h>

// 設定 LCD I2C 位址
//LED_Fundino紅色板子用
//LiquidCrystal_I2C lcd(0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);
//LED_MH黑色板子用
LiquidCrystal_I2C lcd(0x3F, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);

DHT dht(DHTPIN, DHTTYPE);
DHT dht2(DHT2PIN, DHTTYPE);

void setup() {
  // 初始化 LCD,一行 16 的字元,共 2 行,預設開啟背光
  lcd.begin(16, 2);
  //
  Serial.begin(9600);
  dht.begin();
  // 閃爍兩次
  for (int i = 0; i < 1; i++) {
    lcd.backlight(); // 開啟背光
    delay(250);
    lcd.noBacklight(); // 關閉背光
    delay(250);
  }
  lcd.backlight();

  // 輸出初始化文字
  lcd.setCursor(0, 0); // 設定游標位置在第一行行首
  lcd.print("Hello, Maker!");
  delay(500);
  lcd.setCursor(0, 1); // 設定游標位置在第二行行首
  lcd.print("thermometer*2");
  delay(1000);
  lcd.clear(); //顯示清除
}
void loop() {
  // Wait a few seconds between measurements.
  delay(100);

  // Reading temperature or humidity takes about 250 milliseconds!
  // Sensor readings may also be up to 2 seconds 'old' (its a very slow sensor)
  float h = dht.readHumidity();
  // Read temperature as Celsius (the default)
  float t = dht.readTemperature();
  // Read temperature as Fahrenheit (isFahrenheit = true)
  float f = dht.readTemperature(true);

  //第二個sensor
  // Reading temperature or humidity takes about 250 milliseconds!
  // Sensor readings may also be up to 2 seconds 'old' (its a very slow sensor)
  float h2 = dht2.readHumidity();
  // Read temperature as Celsius (the default)
  float t2 = dht2.readTemperature();
  // Read temperature as Fahrenheit (isFahrenheit = true)
  float f2 = dht2.readTemperature(true);

  // Compute heat index in Fahrenheit (the default)
  float hif = dht.computeHeatIndex(f, h);
  // Compute heat index in Celsius (isFahreheit = false)
  float hic = dht.computeHeatIndex(t, h, false);

  lcd.setCursor(0, 0); // 設定游標位置在第一行行首
  lcd.print("sensor1 sensor2");
  lcd.setCursor(0, 1); // 設定游標位置在第二行行首
   
  // 如果拔除sensor1出現error
  if (isnan(h) || isnan(t) || isnan(f)) {
    lcd.print("!error!");
    return;
  }
  lcd.print(int(h));  //int(h)取h的整數
  lcd.print("% ");
  lcd.print(int(t));
  lcd.print("C ");
  
  // 如果拔除sensor2出現error
  if (isnan(h2) || isnan(t2) || isnan(f2)) {
    lcd.print("!error!");
    return;
  }
  lcd.print(int(h2));
  lcd.print("% ");
  lcd.print(int(t2));
  lcd.print("C");
}

arduino溫濕度計輸出LCD(三) 溫濕度計數據顯示於LCD

接下來要整合兩個文章,就可以將DHT11溫濕度計讀到的數據傳給LCD
首先要知道溫濕度計裡的程式碼代表的意思
Serial.print()  是把數據傳給電腦
lcd.print() 就是把數據傳給LCD
lcd.print("%   "); 這個是印出"雙引號中的文字",僅限於英數與符號

這樣我們就可以結合兩個程式讓數據輸出到LCD了,以下是我修改後的程式碼


#include "DHT.h"
#define DHTPIN 2     // what digital pin we're connected to

// Uncomment whatever type you're using!
#define DHTTYPE DHT11   // DHT 11
//#define DHTTYPE DHT22   // DHT 22  (AM2302), AM2321
//#define DHTTYPE DHT21   // DHT 21 (AM2301)

#include <Wire.h>
#include <LiquidCrystal_I2C.h>
// 設定 LCD I2C 位址
//LED_Fundino紅色PCF8574T板子用
//LiquidCrystal_I2C lcd(0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);
//LED_MH黑色PCF8574A1板子用
LiquidCrystal_I2C lcd(0x3F, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);

DHT dht(DHTPIN, DHTTYPE);

void setup() {
  // 初始化 LCD,一行 16 的字元,共 2 行,預設開啟背光
  lcd.begin(16, 2);
  //
  Serial.begin(9600);
  dht.begin();
  // 閃爍兩次
  for (int i = 0; i < 1; i++) {
    lcd.backlight(); // 開啟背光
    delay(250);
    lcd.noBacklight(); // 關閉背光
    delay(250);
  }
  lcd.backlight();

  // 輸出初始化文字
  lcd.setCursor(0, 0); // 設定游標位置在第一行行首
  lcd.print("Hello, Maker!");
  delay(500);
  lcd.setCursor(0, 1); // 設定游標位置在第二行行首
  lcd.print("thermometer");
  delay(1000);
  lcd.clear(); //顯示清除
}
void loop() {
  // Wait a few seconds between measurements.
  delay(100);

  // Reading temperature or humidity takes about 250 milliseconds!
  // Sensor readings may also be up to 2 seconds 'old' (its a very slow sensor)
  float h = dht.readHumidity();
  // Read temperature as Celsius (the default)
  float t = dht.readTemperature();
  // Read temperature as Fahrenheit (isFahrenheit = true)
  float f = dht.readTemperature(true);

  // Compute heat index in Fahrenheit (the default)
  float hif = dht.computeHeatIndex(f, h);
  // Compute heat index in Celsius (isFahreheit = false)
  float hic = dht.computeHeatIndex(t, h, false);
  lcd.setCursor(0, 0); // 設定游標位置在第一行行首
  lcd.print("Humidity Temp.");
  lcd.setCursor(0, 1); // 設定游標位置在第二行行首
   
  // 如果拔除sensor1出現error
  if (isnan(h) || isnan(t) || isnan(f)) {
    lcd.print("!error!");
    return;
  }
  lcd.print(h);  //int(h)取h的整數
  lcd.print("%   ");
  lcd.print(t);
  lcd.print("C ");
}


這樣就可以做出一個簡單的溫濕度計並且顯示在LCD螢幕上了
如果插上行動電源就可以帶著走完全沒問題。


arduino溫濕度計輸出LCD(二) LCD顯示Hello World!

LCD輸出真得很折騰...
試了很多次無法成功,因為不同廠牌的I2C程式碼有點不同,可能要注意

一樣丟關鍵字餵狗"LCD arduino"
【自造學堂】Arduino如何透過I2C控制LCD模組
Arduino 使用 1602 IIC(I2C) LCD 點陣液晶模組   (這個文章的輸入部份我試不出來)

先按圖索驥接好裝置

開啟arduino程式→草稿碼→匯入程式庫→管理程式庫搜尋"newliquidcrystal" →選第一個"Newliquidcrystal_1.3.5"→ 安裝

根據第一篇文章修改成以下樣子,上傳到板子就可以了

// Arduino IDE 內建
#include <Wire.h>
// LCD I2C Library,從這裡可以下載:
// https://bitbucket.org/fmalpartida/new-liquidcrystal/downloads
#include <LiquidCrystal_I2C.h>

// Set the pins on the I2C chip used for LCD connections:
//                    addr, en,rw,rs,d4,d5,d6,d7,bl,blpol
// 設定 LCD I2C 位址,兩種不同晶片有不同設定方式,如果第一個不行請改第二個
LiquidCrystal_I2C lcd(0x3F, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);
//LiquidCrystal_I2C lcd(0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);

void setup() {
  // 初始化 LCD,一行 16 的字元,共 2 行,預設開啟背光
  lcd.begin(16, 2);
  // 閃爍三次
  for(int i = 0; i < 3; i++) {
  lcd.backlight(); // 開啟背光
  delay(250);
  lcd.noBacklight(); // 關閉背光
  delay(250);
  }
  lcd.backlight();
  // 輸出初始化文字
  // 設定游標位置在第一行行首
  lcd.setCursor(0, 0);
  lcd.print("LCDtest");
  delay(1000);
  // 設定游標位置在第二行行首
  lcd.setCursor(0, 1);
  lcd.print("Hello, World!");
  delay(6000);
  // 顯示清除
  lcd.clear();
}

void loop() {
  // 設定游標位置在第一行行首
  lcd.setCursor(0, 0);
  lcd.print("count");
  // 設定游標位置在第二行行首
  lcd.setCursor(0, 1);
  lcd.print(millis()/1000);
}



注意這兩行,會根據板子要設定成不一樣的程式
// 設定 LCD I2C 位址,兩種不同晶片有不同設定方式,如果第一個不行請改第二個
LiquidCrystal_I2C lcd(0x3F, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);
//LiquidCrystal_I2C lcd(0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);
我買的兩塊板子就有不同

上面那塊要設定成LiquidCrystal_I2C lcd(0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);
下面那塊要設定成LiquidCrystal_I2C lcd(0x3F, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);
如果設定錯誤還是可以上傳到板子,不過LCD完全沒有反應,所以可能在這邊要注意一下。

2017年12月12日 星期二

arduino溫濕度計輸出LCD(一)電腦上輸出DHT11溫濕度計數據

這次終於有心想突破:溫濕度數據顯示於LCD 這件事情
以下是我的學習記錄,這文章會記錄從無到有的學習歷程,所以可能會比較繁瑣,不過我想詳細的記錄自己搜尋資料、解決問題、運算思維等後設認知部分,以利未來學習其他流程時也能簡化成這個學習模組。

我想要攻克的任務流程如下,如果想跳到結果得可以選擇以下文章
(一) 電腦上輸出DHT11溫濕度計數據
(四) 雙偵測器顯示,修改成自己喜歡的顯示模式

首先先蒐集資料,發現我的溫濕度計是DHT11
於是丟"dht11 arduino"進去餵google,找到這些文章

Arduino範例19:利用DHT11抓取溫度和濕度

知道要將DHT11的+接5V,-接GND,out接D2腳位

開啟arduino程式草稿碼匯入程式庫管理程式庫


 搜尋"DHT11"選第一個"DHT sensor liberary"安裝
安裝完才可以開始寫程式

第一個可以運行的程式長這樣

// Example testing sketch for various DHT humidity/temperature sensors
// Written by ladyada, public domain

#include "DHT.h"

#define DHTPIN 2     // what digital pin we're connected to

// Uncomment whatever type you're using!這裡可以改成不同的DHT偵測器
#define DHTTYPE DHT11   // DHT 11
//#define DHTTYPE DHT22   // DHT 22  (AM2302), AM2321
//#define DHTTYPE DHT21   // DHT 21 (AM2301)

DHT dht(DHTPIN, DHTTYPE);

void setup() {
  Serial.begin(9600);
  Serial.println("DHTxx test!");

  dht.begin();
}

void loop() {
  // Wait a few seconds between measurements.等待時間,越短讀取數據越快,但DHT11儀器有極限值
  delay(2000);

  // Reading temperature or humidity takes about 250 milliseconds!抓取溫濕度計的數據,存入h,t,f三個數值裡面
  // Sensor readings may also be up to 2 seconds 'old' (its a very slow sensor)
  float h = dht.readHumidity();
  // Read temperature as Celsius (the default)
  float t = dht.readTemperature();
  // Read temperature as Fahrenheit (isFahrenheit = true)
  float f = dht.readTemperature(true);

  // Check if any reads failed and exit early (to try again).檢察是否錯誤的程式碼
  if (isnan(h) || isnan(t) || isnan(f)) {
    Serial.println("Failed to read from DHT sensor!");
    return;
  }

  // Compute heat index in Fahrenheit (the default)這邊看不懂...
  float hif = dht.computeHeatIndex(f, h);
  // Compute heat index in Celsius (isFahreheit = false)
  float hic = dht.computeHeatIndex(t, h, false);

  //輸出給電腦以下資訊
  Serial.print("濕度: ");
  Serial.print(h);
  Serial.print(" %\t");
  Serial.print("溫度: ");
  Serial.print(t);
  Serial.print(" oC   ");
  Serial.print(f);
  Serial.println(" oF\t");
}

成功之後就可以讀出這樣的數據了


如果出現錯誤訊息,無法灌給arduino板子的話,我除錯的方法有1.重插板子2.重新安裝DHT sensor liberary,這樣就突破第一關了。

2017年9月14日 星期四

關於高中職升學的建議-戰略、戰術與戰法

關於高中職升學的建議

恭喜你進入國三階段,今年最重要的事情是面對人生中第一次的大考,而考試本身的重點不僅是在於考多少分數,更重要的是培養:如何面對不能逃避的戰爭的能力,這些能力包含心態、作息、方法與後設認知(知道自己怎麼知道的認知),這些能力是會跟著你一輩子的,而這次升學也會決定你人生的某個方向。

對國中生而言,你從小到大的生活圈可能不會超過2公里,你的同學也大多是從他們的2公里生活圈過來的,不過升上高中職之後,你的同學可能就是以縣市為單位,集合到這所學校,所以你可能會遇到不同生活形態與文化的衝擊,高中職會匯集讀書能力接近、智力智商接近,甚至於社經地位接近的同縣市同學,這對你未來發展中一定具有很大影響力的,這生活圈的範圍可能擴展到大約10公里。
而高中職的下一步:大學科大,就會從全台灣集中到你的學校,你會看到更多元的樣態,這些具有不同人生經歷的同儕,會型塑出不一樣的文化與環境,直接的影響你人生未來與心態。
大抵上來說,人生的精采與豐富的程度,跟他能夠觸及的生活圈有很大關係,雖然現在網路或書籍資源有漸漸迎向一個沒有界線的生活圈,但其實多數人還是畫地自限在一個小範圍內,這對於生命而言是非常可惜的一件事情,請好好的拓展你的生活界線與視野,在未來能夠展翅高飛。這就是為什麼要打好這一仗的關係。

而我們將面對考試這件事情分成三個層面:戰略、戰術與戰法
「戰略」就是為誰而戰,為何而戰,你的目的與願景是什麼?
高中職升學考試對於一個國中生而言,可能是為了自己更美好的未來、為了尋求知識能力同溫層的未來同儕、為了父母師長念書、為了光宗耀祖、為了跟喜歡的人念同一所學校、為了高中職校風校服的夢幻泡泡、為了不想輸等等……
如果你能知道自己為了什麼要念書,應該要趁這次機會培養怎樣的能力,這樣你就可以時常用這個原因堅定自己的腳步,也就是所謂的:莫忘初衷。

立定了方向後,你必須開始規劃需要做的事情,也就是行事曆與課表,這就是所謂的「戰術」層面。
把國中三年的課本疊起來吧!你會發現國中課本只有5*6學期=30本,而且這30本書其實不會很厚,內容其實也不多,所以不要擔心,你一定可以完成的。
請記得:計畫總是趕不及變化,但沒有計畫就一事無成。計畫是用來落後的,心態是用來調整的。知道死線deadline,才能更主動的推動自己。
在安排課表的時候,有個重要的觀念要提醒你,最重要的課表內容是:玩樂、休息、空白與運動的時間,請一定記得放在你的課表之中。
課表是以一周七天、每個小時為單位,一到五大概有10-15個小時可以運用,三上可能還用不到星期日這天,星期天就好好休息吧,100天左右在考慮規劃周日課表,下面是簡單的課表形式。


































午休


































19:00-20:00







20:00-21:00







21:00-22:00







當你確實按表操課,你的長輩家人也會更尊重你的安排與信任你的能力,要展現自己的決心與規劃,才有本錢不受他人耳語的撩擾。當他人說:為什麼你現在不去看書,你只要堅定地回答:這個小時是我休息玩樂的時間即可。
空白時間可以用來捕這周的不足,讓你趕不上的計畫有緩衝的餘地(無論是課程進度或是心情都可以緩衝)。這個星期哪個科目沒有達標呢?我的心情狀況如何呢?有沒有需要調整的地方?都可以運用這個空白時間來規劃調整。
運動與規律的作息有助於記憶與學習,每周安排至少3個小時的運動,讓身體流汗,把壓力跟負擔通通排掉,至少需要睡眠6小時以上(其實最好是7小時),睡覺是大腦清除無用垃圾、將短期記憶轉換成長期記憶的重要時刻,甚至於做夢可以有跨腦區的連結,啟發你的創意思考,這些讓身體更健康的作為,絕對也會讓你的成績正向的發展,作戰時最忌諱拖延,請確實地按表操課,一年下來,你一定可以學到新的技能,也能更肯定自己有能力可以做好面對未來挑戰的能力,請把這次的大考當作人生的第一戰,然後凱旋歸來吧!


「戰法」部分,就是各科面對的不同方式與解題技巧,這部分留給下回「讀書心法篇」分曉吧。

2017年2月2日 星期四

arduino-蜂鳴器練習

參考書籍:數位時代的端士刀來了:Arduino開創物聯網大局

好久沒有寫網誌了,也好久沒有寫程式了(從大四跨系選修程式語言到現在)
準備要玩arduino,就記錄一下學習新事物的過程吧

要發出聲音需要蜂鳴器,蜂鳴器分成有源蜂鳴器、無源蜂鳴器兩種
有源蜂鳴器只能發出單頻率的聲音,可以拿來寫警告音或是練習摩斯密碼
無源蜂鳴器就可以發出不同頻率的聲音了


這次在修改程式的時候遇到幾個問題
  1. 升半音的頻率是多少?
    查了資料發現升降半音的頻率是原頻率*2^(1/12)  [原頻率乘於2的12分之1次方]
  2. 想要定義節拍長度該如何?
    在22行int time[]={   };    //輸入節拍,設定聲響時間長度
  3. 不發出聲音的休止符要怎麼處理?
    一開始我是設定#define O1 000  頻率為0,結果發現蜂鳴器會發出雜音,後來在程式中加入了is else的函數,可是還是有缺陷,因為這樣就不能設定休止符拍子數了,目前剩下這個bug無法解決
    if(time[i]>0)                        //判斷時間是否為不發聲的0,如果不是發聲
         delay(time[i]*250);
    else{                                 //判斷時間是否為不發聲的0,如果是不發聲
          noTone(p);
          delay(250);
          }
  4. 變調該如何處理
    第一首「給愛麗絲」前段問題解決了,結果第二首的「恭喜恭喜」出現了變調...,還變了兩次,所以我又要學會讀五線譜上變調時的拍子怎麼讀,可是最後還是卡在變太多種了,我無法解決0.5拍的問題...(其實只要換成整數倍就好了,不過我懶惰惹...)
總之學習就是這樣,一直解決問題,運用舊經驗、google、書籍學到新東西,附上這次修改的三個函數


以下是我改寫的函數部分,歌曲是 給愛麗絲 的前半段,也就是垃圾車的音樂啦

-----  程式分隔線  -----
//定義音階常數
#define C41 262  //1 Do
#define D41 294  //2 Re
#define E41 330  //3 Mi
#define F41 349  //4 Fa
#define G41 392  //5 Sol
#define G42 415  //#5 #Sol
#define A41 440  //6 La
#define B41 494  //7 Si
#define C51 523  //1 Do_h
#define D51 587  //2 Re_h
#define D52 622  //#2 #Re_h
#define E51 659  //3 Mi_h
#define F51 698  //4 Fa_h
#define G51 784  //5 Sol_h
#define A51 880  //6 La_h
#define B51 988  //7 Si_h
#define O1 000  //休止符
//要學習升降半音的方式是:頻率*2^(1/12)
int p=10;
int scale[]={E51,D52,E51,D52,E51,B41,D51,C51,A41,O1,E41,A41,B41,E41,G42,B41,C51,E41,E51,D52,E51,D52,E51,B41,D51,C51,A41,O1,E41,A41,B41,E41,C51,B41,A41};  //輸入歌曲音調
int time[]={1,1,1,1,1,1,1,1,3,0,1,1,3,1,1,1,3,1,1,1,1,1,1,1,1,1,3,0,1,1,3,1,1,1,3};    //輸入節拍,設定聲響時間長度
int length;

void setup() {
  pinMode(p,OUTPUT);                      //設定針腳輸出模式
  length=sizeof(scale)/sizeof(scale[0]);  //取得曲譜陣列的長度
}

void loop() {
  for(int i=0;i<length;i++){
    tone(p,scale[i]);
 
    if(time[i]>0)                        //判斷時間是否為不發聲的0,如果不是發聲
      delay(time[i]*250);
    else{                                 //判斷時間是否為不發聲的0,如果是不發聲
      noTone(p);
      delay(250);
      }
    noTone(p);
    delay(0);
  }
  delay(1000);
}

-----  下一首是恭喜恭喜  -----
//定義音階常數
#define G40 196  //5 Sol
#define G402 208  //#5 #Sol
#define A40 220  //6 La
#define B40 247  //7 Si
#define C41 262  //1 Do
#define D41 294  //2 Re
#define E41 330  //3 Mi
#define F41 349  //4 Fa
#define G41 392  //5 Sol
#define G42 415  //#5 #Sol
#define A41 440  //6 La
#define B41 494  //7 Si
#define C51 523  //1 Do_h
#define D51 587  //2 Re_h
#define D52 622  //#2 #Re_h
#define E51 659  //3 Mi_h
#define F51 698  //4 Fa_h
#define G51 784  //5 Sol_h
#define A51 880  //6 La_h
#define B51 988  //7 Si_h
#define O1 000  //0
//要學習升降半音的方式是:頻率*2^(1/12)
int p=10;
int scale[]={A40,B40,C41,D41,F41,E41,E41,E41,A41,A41,E41,E41,D41,D41,D41,F41,E41,D41,D41,C41,C41,C41,B40,A40,G402,A40,A40,D41,E41,C41,E41,B40,E41,A40,E41,D41,E41,C41,E41,B40,E41,A40};  //輸入歌曲音調
int time[]={1,1,1,1,1,1,2,1,1,1,1,1,1,2,1,1,1,1,1,1,2,1,1,1,1,2,2,2,1,2,1,2,1,2,1,2,1,2,1,3,3,2};    //輸入節拍,設定聲響時間長度
int length;

void setup() {
  pinMode(p,OUTPUT);                      //設定針腳輸出模式
  length=sizeof(scale)/sizeof(scale[0]);  //取得曲譜陣列的長度
}

void loop() {
  for(int i=0;i<length;i++){
    tone(p,scale[i]);
 
    if(time[i]>0)                        //判斷時間是否為不發聲的0,如果不是發聲
      delay(time[i]*250);
    else{                                 //判斷時間是否為不發聲的0,如果是不發聲
      noTone(p);
      delay(250);
      }
    noTone(p);
    delay(0);
  }
  delay(1000);
}

-----  下一個是有源蜂鳴器的摩斯密碼  -----

int b=10;    //蜂鳴器針腳
int s=300;   //基準時間
void dot();  //宣告點訊號
void dash(); //宣告劃訊號
void wait(); //宣告字母間隔

void setup() {
  pinMode(b,OUTPUT);    //設定針腳模式為輸出
}
//交替向針腳輸出高低電壓
void loop() {
  dot();dot();dot();    //呼叫dot()函數發送3個點訊號
  wait();
  dash();dash();dash(); //呼叫dash()函數發送3個劃訊號
  wait();
  dot();dot();dot();    //呼叫dot()函數發送3個點訊號
  delay(3000);
}

//定義dot()函數
void dot(){
  digitalWrite(b,HIGH);
  delay(s);
  digitalWrite(b,LOW);
  delay(s*2);
}
//定義dash()函數
void dash(){
  digitalWrite(b,HIGH);
  delay(s*3);
  digitalWrite(b,LOW);
  delay(s*2);
}
//定義wait()函數
void wait(){
  delay(s*7);
}