痞酷網_PIGOO

 找回密碼
 立即註冊
!!! [系統偵測到廣告阻擋軟體] !!!

如果您覺得痞酷網對您有些許幫助,或者您認同痞酷網的理想,

那麼希望您將痞酷網設定為白名單.

並請在上論壇的時候,動動您的手指,用行動支持我們.

謝謝!
查看: 4926|回復: 11

ARDUINO程式請教

[複製鏈接]
發表於 2014-4-18 23:18:30 | 顯示全部樓層 |閱讀模式
請教各位大大
小弟以前從未學過軟體,最近剛涉及ARDUINO的軟體設計,有些問題想請教各位先進
小弟想撰寫一個瓦斯洩漏警報器,當偵測到有瓦斯洩漏時,LED亮0.5秒滅0.5秒持續閃爍,而嚮笛持續嚮1分鐘,
1分鐘之後嚮笛停止,但LED須持續閃爍,直到瓦斯味道消除為止,若瓦斯再次洩漏,則重複以上動作

以下是小弟撰寫的程式,但嚮笛的部分,小弟想不出應該如何讓它嚮1分鐘後停止,而LED還能持續閃爍
還請各位大大能教小弟如何撰寫 謝謝

int snr = 2;           //設定第2腳為snr
int led = 13;         //設定第13腳為led
int buzzer = 12;    //設定第12腳為嚮笛
void setup()
{
Serial.begin(9600);             //設定Serial傳輸速度
pinMode(led, OUTPUT);       //設定led腳為輸出模式
pinMode(snr, INPUT);          //設定snr腳為輸入模式
pinMode(buzzer, OUTPUT);        //設定buzzer腳為輸出模式
}

void loop()
{
int snrSate = digitalRead(snr);               //設snrSate為讀取數位輸入PIN腳snr的值
if(snrSate == 1)                                   //如果snrSate為高電位
{
Serial.println("Safe");                           //序列訊息顯示Safe
digitalWrite(led, LOW); // led滅
digitalWrite(buzzer, HIGH);                 //寫入嚮笛腳為高電位不叫
}
else
{
Serial.println("Get Fired");                   //序列訊息顯示 Get Fired
digitalWrite(buzzer, LOW);                //寫入嚮笛腳為低電位叫
digitalWrite(led, HIGH);                     // led亮
delay(500);                                     //持續點亮0.5秒
digitalWrite(led, LOW);                   //led滅
delay(500);                                   //熄滅0.5秒
}
}
發表於 2014-4-19 00:47:19 | 顯示全部樓層
試試看吧~ 我也是最近自己剛學習....
剛編譯是可以過的.  但我沒有實際硬體電路可以測試.

======================================================


int snr = 2;           //設定第2腳為snr
int led = 13;         //設定第13腳為led
int buzzer = 12;    //設定第12腳為嚮笛
int a;              //60秒旗標
void setup()
{
Serial.begin(9600);             //設定Serial傳輸速度
pinMode(led, OUTPUT);       //設定led腳為輸出模式
pinMode(snr, INPUT);          //設定snr腳為輸入模式
pinMode(buzzer, OUTPUT);        //設定buzzer腳為輸出模式
a=0;
}

void loop()
{
int snrSate = digitalRead(snr);               //設snrSate為讀取數位輸入PIN腳snr的值
if(snrSate == 1)                                   //如果snrSate為高電位
{
Serial.println("Safe");                           //序列訊息顯示Safe
digitalWrite(led, LOW); // led滅
digitalWrite(buzzer, HIGH);                 //寫入嚮笛腳為高電位不叫
a=0;
}
else
{  
  if(a==60)
  {
    Serial.println("Get Fired");                   //序列訊息顯示 Get Fired
    digitalWrite(buzzer, HIGH);               
    digitalWrite(led, HIGH);                     // led亮
    delay(500);                                     //持續點亮0.5秒
    digitalWrite(led, LOW);                   //led滅
    delay(500);            
  }
  else
  {
    Serial.println("Get Fired");                   //序列訊息顯示 Get Fired
    digitalWrite(buzzer, LOW);                //寫入嚮笛腳為低電位叫
    digitalWrite(led, HIGH);                     // led亮
    delay(500);                                     //持續點亮0.5秒
    digitalWrite(led, LOW);                   //led滅
    delay(500);                                   //熄滅0.5秒
    a=a++;
  }
}
}

評分

1

查看全部評分

發表於 2014-4-19 09:57:45 | 顯示全部樓層
本帖最後由 xiaolaba 於 2014-4-19 10:10 AM 編輯

你可以把每個工作都寫成一個 FUNCTION
然後在 LOOP 裡面再安排何時觸發及使用
例如,
  1. int alarm = 12; // alarm pin 12
  2. int LED = 13; //LED at pin 13

  3. void setup() {               
  4.   // initialize the digital pin as an output.
  5.   // Pin 13 has an LED connected on most Arduino boards:
  6.   pinMode(LED, OUTPUT);
  7.   pinMode(alarm, OUTPUT);
  8. }

  9. void loop() {
  10.   LED_on500ms;
  11.   alarm_on1000ms;
  12.   delay(3000);
  13. }


  14. void LED_on500ms () {
  15.   digitalWrite(LED, LOW);    // set the LED on, (LED+) = VCC, (LED-) = I/O pin
  16.   delay(500);
  17.   digitalWrite(LED, HIGH);    // set the LED off
  18.   delay(500);  
  19. }

  20. void alarm_on1000ms () {
  21.   digitalWrite(alarm, LOW);    // set alarm on
  22.   delay(1000);
  23.   digitalWrite(alarm, HIGH);    // turn alram off  
  24. }
複製代碼

評分

1

查看全部評分

 樓主| 發表於 2014-4-19 16:54:49 | 顯示全部樓層
cools0607 發表於 2014-4-19 12:47 AM static/image/common/back.gif
試試看吧~ 我也是最近自己剛學習....
剛編譯是可以過的.  但我沒有實際硬體電路可以測試.

感謝你
硬體測試是OK的

再請問一個問題,如果我要再追加3個功能,火災警報/一氧化碳警報/防盜警報共4個功能,軟體應該如何
寫呢 ? 不好意思好像一次加太多了....

每個功能希望有個別的LED警示燈顯示,防盜警報想控制大門,有人開啟時,嚮笛持續嚮1分鐘後停止LED則不停閃爍,
就算大門關上LED也持續閃爍,直到按壓解除按鈕,一氧化碳就免嚮笛了,改裝繼電器控制風扇馬達,感測器解除後風扇馬達要再持續運轉3分鐘才停止

學程式設計真的很不簡單
發表於 2014-4-19 18:57:55 | 顯示全部樓層
tsao0427 發表於 2014-4-19 04:54 PM static/image/common/back.gif
感謝你
硬體測試是OK的

tsao0427大:
  有人說,先把流程畫出來,接下來就比較順了!!

評分

1

查看全部評分

發表於 2014-4-20 00:38:04 | 顯示全部樓層
 樓主| 發表於 2014-4-20 17:52:09 | 顯示全部樓層
搞了一整個下午,終於將2個功能寫入同一個程式當中,也許寫的不是很漂亮,但動作是正常了,
接下來還想再加入一氧化碳警報與防盜警報,一氧化碳警報也許還可以,防盜警報方面還要加一顆解除按鈕,
就不知要如何寫了 ? 希望知道的大大能幫助在下,感謝各位



int snr1 = 2;           //設定第2腳為snr1火災偵測
  int snr2 = 4;          //設定第4腳為snr2瓦斯偵測
  int led1 = 13;          //設定第13腳為led1
  int led2 = 8;          //設定第8腳為led2
  int buzzer = 12;       //設定第12腳為嚮笛
  int a;                    //60秒旗標設a為嚮笛啟動的基準次數

  void setup()
  {
  Serial.begin(9600);                   //設定Serial傳輸速度
  pinMode(led1, OUTPUT);           //設定led1腳為輸出模式
  pinMode(led2, OUTPUT);           //設定led2腳為輸出模式
  pinMode(snr1, INPUT);            //設定snr1腳為輸入模式
  pinMode(snr2, INPUT);            //設定snr2腳為輸入模式
  pinMode(buzzer, OUTPUT);        //設定buzzer腳為輸出模式
  
  }
  
  void loop()
  {
  int snr1Sate = digitalRead(snr1);               //設snr1Sate為讀取數位輸入PIN腳snr1的值
  int snr2Sate = digitalRead(snr2);               //設snr2Sate為讀取數位輸入PIN腳snr2的值
  if(snr1Sate == 1 && snr2Sate == 1)           
  {
  Serial.println("Safe");                           //序列訊息顯示Safe
  digitalWrite(led1, LOW);                      // led1滅
  digitalWrite(led2, LOW);                      // led2滅
  digitalWrite(buzzer, HIGH);                  //寫入嚮笛腳為高電位不叫
  a=0;                                       
  }

  else                                       
  {  
    if(a==60 && snr1Sate == 0 && snr2Sate == 1)           //當a=60,snr1Sate==1 snr2Sate==0,則執行以下指令
    {
      Serial.println("Get Fired");              //序列訊息顯示 Get Fired
      digitalWrite(buzzer, HIGH);             //因a=60所以嚮笛停止                                    
      digitalWrite(led1, HIGH);                // led1亮
      delay(500);                                   //持續點亮0.5秒
      digitalWrite(led1, LOW);                 //led1滅
      delay(500);                                 //熄滅0.5秒
    }

    if(a==60 && snr1Sate == 1 && snr2Sate == 0)     //當a=60,snr1Sate==0 snr2Sate==1,則執行以下指令
    {
      Serial.println("Gas out of pape");                        //序列訊息顯示 ""Gas out of pape"
      digitalWrite(buzzer, HIGH);                                //因a=60所以嚮笛停止                                    
      digitalWrite(led2, HIGH);                                   //led2亮
      delay(500);                                                      //持續點亮0.5秒
      digitalWrite(led2, LOW);                                   //led1滅
      delay(500);                                                     //熄滅0.5秒
    }

    if(a==60 && snr1Sate == 0 && snr2Sate == 0)        //當a=60,snr1Sate==0 snr2Sate==0,則執行以下指令
    {
      Serial.println("Gas out of pape & Get Fired");          //序列訊息顯示 ""Gas out of pape & Get Fired"
      digitalWrite(buzzer, HIGH);                                   //因a=60所以嚮笛停止                                    
      digitalWrite(led1, HIGH);                                       // led1亮
      digitalWrite(led2, HIGH);                                       //led2亮
      delay(500);                                                           //持續點亮0.5秒
      digitalWrite(led1, LOW);                                       //led1滅
      digitalWrite(led2, LOW);                                      //led2滅
      delay(500);                                                        //熄滅0.5秒
    }
   
    else                                    
    {

    if(a!=60 && snr1Sate == 0 && snr2Sate == 1)     //當a不等60,snr1Sate==0 snr2Sate==1,則執行以下指令
    {  
      Serial.println("Get Fired");                                //序列訊息顯示 Get Fired
      digitalWrite(buzzer, LOW);                               //寫入嚮笛腳為低電位叫
      digitalWrite(led1, HIGH);                                  // led1亮
      delay(500);                                                     //持續點亮0.5秒
      digitalWrite(led1, LOW);                                 //led1滅
      delay(500);                                                   //熄滅0.5秒
      a=a++;                                                        //a每循環過1次就加1,然後程式跳回void loop()再執行
    }

    if(a!=60 && snr1Sate == 1 && snr2Sate == 0)     //當a不等60,snr1Sate==1 snr2Sate==0,則執行以下指令
    {  
      Serial.println("Gas out of pape");                       //序列訊息顯示 "Gas out of pape"(瓦斯漏氣)
      digitalWrite(buzzer, LOW);                               //寫入嚮笛腳為低電位叫
      digitalWrite(led2, HIGH);                                  // led2亮
      delay(500);                                                     //持續點亮0.5秒
      digitalWrite(led2, LOW);                                 //led1滅
      delay(500);                                                   //熄滅0.5秒
      a=a++;                                                       //a每循環過1次就加1,然後程式跳回void loop()再執行
    }

    if(a!=60 && snr1Sate == 0 && snr2Sate == 0)        //當a=60,snr1Sate==0 snr2Sate==0,則執行以下指令
     {
      Serial.println("Gas out of pape & Get Fired");          //序列訊息顯示 ""Gas out of pape & Get Fired"
      digitalWrite(buzzer, LOW);                                     //因a=60所以嚮笛停止                                    
      digitalWrite(led1, HIGH);                                       // led1亮
      digitalWrite(led2, HIGH);                                      //led2亮
      delay(500);                                                          //持續點亮0.5秒
      digitalWrite(led1, LOW);                                       //led1滅
      digitalWrite(led2, LOW);                                      //led2滅
      delay(500);                                                        //熄滅0.5秒
      a=a++;                                                            //a每循環過1次就加1,然後程式跳回void loop()再執行
    }
    }
  }
  }
發表於 2014-4-20 20:20:46 | 顯示全部樓層
本帖最後由 jojoling 於 2014-4-21 02:30 AM 編輯
  1. int sound_alert=0;
  2. int led_alert=0;
  3. void loop()
  4. {
  5.   int snr1Sate = digitalRead(snr1);              
  6.   int snr2Sate = digitalRead(snr2);
  7.   int snr3Sate = digitalRead(snr3);
  8.   int snr4Sate = digitalRead(snr4);


  9. //重置警報
  10. if( ResetAlertCondition()) // 這只是個例子~你可以讀 IO或是其它條件
  11. {
  12.   led_alert = 0;
  13.   sound_alert = 0;
  14.   Serial.println("Reset Alert");
  15. }

  16. if( !snr1Sata && !(led_alert & 0x01) ) // 如果第一個警報成立,且之前這個警報還沒發生過
  17. {
  18.    if(sound_alert <60) sound_alert=60;  // 設定聲音警報 60秒,如果有之前的警報聲音還會執行超過60秒就不設定
  19.    led_alert |= 0x01;  // 這裏是用 bitmap來帶表不同的警報發生~此處為 bit0 = 1 代表 1號警報發生
  20.    Serial.println("Alert 1");
  21. }
  22. if( !snr2Sata  && !(led_alert & 0x02))
  23. {
  24.    if(sound_alert <60) sound_alert=60;
  25.    led_alert |= 0x02;
  26.    Serial.println("Alert 2");
  27. }
  28. if( !snr3Sata  && !(led_alert & 0x04))
  29. {
  30.    if(sound_alert <60) sound_alert=60;
  31.    led_alert |= 0x04;
  32.    Serial.println("Alert 3");
  33. }
  34. if( !snr4Sata  && !(led_alert & 0x08))
  35. {
  36.    if(sound_alert <120) sound_alert=120;  // 可設定聲音警報不同長度,例如 120秒
  37.    led_alert |= 0x08;
  38.    Serial.println("Alert 4");
  39. }

  40. // 處理警報聲音,依據之前所設定的秒數來決定~
  41.   if(sound_alert>0)
  42. {
  43.     digitalWrite(buzzer, LOW);
  44.     sound_alert--;
  45.   }
  46.   else
  47.    digitalWrite(buzzer, HIGH);

  48. // 處理警報燈號~
  49. if( led_alert)
  50. {
  51.       // 可以處理多個  led的亮暗,把 led_alert 每一個 bit表示一種警示行為
  52.       if(led_alert & 0x01) digitalWrite(led1, HIGH);
  53.       if(led_alert & 0x02) digitalWrite(led2, HIGH);
  54.       if(led_alert & 0x04) digitalWrite(led3, HIGH);
  55.       if(led_alert & 0x08) digitalWrite(led4, HIGH);
  56.       delay(500);
  57.       if(led_alert & 0x01) digitalWrite(led1, LOW);
  58.       if(led_alert & 0x02) digitalWrite(led2, LOW);
  59.       if(led_alert & 0x04) digitalWrite(led3, LOW);
  60.       if(led_alert & 0x08) digitalWrite(led4, LOW);
  61.       delay(500);
  62. }

  63. }
複製代碼
發表於 2014-4-20 20:25:18 | 顯示全部樓層
如需要設計重置 or 關掉某一種警報~
直接清除or改寫 sound_alert 與led_alert 及可
發表於 2014-4-20 20:29:54 | 顯示全部樓層
另外,其實在 loop() 裏面花時間在 dealy()在一個不重要的事是一個非常不好的技巧~
最好的方法是透過2次不同的loop()來表示一暗一亮~
 樓主| 發表於 2014-4-20 22:23:12 | 顯示全部樓層
jojoling 發表於 2014-4-20 08:20 PM static/image/common/back.gif
int sound_alert=0;
int led_alert=0;
void loop()

感謝 jojoling 大
雖然還看不太懂,但我會找資料,努力看懂它
發表於 2014-4-20 22:36:43 | 顯示全部樓層
請大家討論"程式碼"時,加上 code 的標籤
這樣會比較好閱讀喔!
  1. int i = 1;
  2. println("Hellow World!");
  3. end if
複製代碼
您需要登錄後才可以回帖 登錄 | 立即註冊

本版積分規則

關閉

站長小叮嚀上一條 /1 下一條

禁閉室|手機版|連繫我們|痞酷網電子技術論壇

GMT+8, 2024-11-23 10:01 AM , Processed in 0.164205 second(s), 17 queries , Gzip On.

Powered by Discuz! X3.4 Licensed

© 2001-2023 Discuz! Team.