Robofun 機器人論壇

 找回密碼
 申請會員
搜索
熱搜: 活動 交友 discuz
查看: 9072|回復: 8
打印 上一主題 下一主題

想要做一個溫控箱,請前輩們指點一下。

[複製鏈接]
跳轉到指定樓層
1#
發表於 2014-4-14 02:04:48 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
本帖最後由 ccu516 於 2014-4-14 02:11 編輯

各位前輩好。
小弟最近剛開始玩Arduino,剛好有朋友想要做小鳥的保溫箱,因此就以此為題目來學習。
以下是我的構想與目前遇到的問題,還請前輩們不吝指教。

目的:
     首先我想做的東西是一個<<可調式的恆溫箱>>,
     也就是預設(可調的)一個 溫度 T0  使箱內溫度維持在 T0±5。
     利用ARDUINO控制 保溫燈/風扇 升降溫來達到恆溫效果。

保溫燈/風扇 開關的決定,是由溫度感測器(DHT11)量測目前溫度來進行回授。

材料:
     Arduino UNO *1
     40W保溫燈組*1
     9V風扇*1
     雙位數七段顯示器(用來顯示預設溫度T0) *1
     DHT11 溫濕度感測器 *1
     按鈕開關(作為調控預設溫度T0的按鈕,增減各一) *2
     繼電器 (以arduino輸出5V小電壓來控制  1. 110V的保溫燈組  2.  9V風扇 ) *2


作法:
    一、七段顯示器
         首先是關於雙位數七段顯示器與程式的撰寫方式。
         要使僅有7隻腳(排除掉小數點與COM點)的雙位數七段顯示器程式產生
         25、26...等"十位數"與"個位數"不相等的數字,
         以顯示25這個雙位數為例,一般的方法是在極短的時間內
         切換顯示"十位數"的2與"個位數的5",由於人類的視覺暫留
         會使得左右閃爍的2、5產生25這個雙位數字。

         為了達到顯示預設溫度T0=25這個數字,必須以do...while迴圈,或是以loop去使2、5的閃爍持續,
         如此一來程式就卡在迴圈內無法跳出。
         
         除非是增加讀取外部訊號的指令
         do{"七段顯示器顯示25";  
               if(up、down按鈕被按下){
               T0+1或T0-1
               break;
               }
         }while(溫度T0=25)


        問題1:                  
            可是如此一來Arduino程式似乎就卡死在這邊(顯示溫度T0的部分),
            而無法進行到下面的部分(讀取實際溫度T1與下指令開關風扇/保溫箱)  




    二、溫度感測器
         透過arduino讀取溫度感測器DHT11的讀值T1(讀取的程式是從網路上現成的改的),
         若是 T1>T0 代表目前溫度大於預設溫度--->箱內溫度太高 開啟風扇
         若是 T1<T0 代表目前溫度小於預設溫度--->箱內溫度太低 開啟保溫燈

        (其實真實情況是T1介在 T0-5與 T0+5 間不作動,超過T0+5--->風扇   低於T0-5--->保溫燈)


    三、繼電器
         根據上述的方式決定 風扇/保溫燈的開關後,透過arduino輸出信號,
         以「繼電器」控制 9V風扇 與110V保溫燈的開關。
        
         我的製作方法是:

                   1.買有針腳的端子台
                      http://ppt.cc/NNN7 (可將110V栓在螺絲上)


                   2.針腳悍在洞洞板上

                     http://img.store.pchome.com.tw/~prod/M02996388_big.JPG


                   3.將端子台的針腳連接到我買的繼電器上

                      http://www.100y.com.tw/product/23096.htm




                  (由於使用到110V的電,因此格外小心,我想問清楚以免發生災害 )

        問題2:      
            端子台針腳與繼電器之間所連接的電線可以用一般插在麵包板上的單芯線來做連接嘛?

            或是要使用一般110V的電線。(40W保溫燈約0.36A)



        問題3:

              我用的繼電器真的可以乘載110V的電嘛  針腳那麼細不會燒掉嘛..?


             繼電器有好多種,我買的20~30元,也有200~400元的,可是工作電壓都差不多,


              我實在很不放心..
      (不想把朋友家燒了阿~)




小弟目前大抵上是做到這邊,如果前輩們發現裡面有甚麼問題希望可以指點一下,感謝....



2#
發表於 2014-4-14 12:39:52 | 只看該作者
本帖最後由 pizg 於 2014-4-14 14:22 編輯

回復 1# ccu516


   我最近也想做一個溫濕度控制的發酵箱, 遇到的問題跟你差不多,這兒有不少高手, 所以我只能簡單回答你幾個問題:
1.
不需要使用DO...WHILE迴圈, 讓它隨著loop掃瞄。7 Seg. 需負責顯示2種溫度,1.目前溫度 2.設定的溫度,
所以須設定mode變數來辨別哪一種模式的溫度。
  1. void loop() {
  2.   .....
  3.   //設定溫度
  4.   if (digitalRead(D1) == HIGH) t0++; //button up
  5.   if (digitalRead(D2) == HIGH) t0--; //button down
  6.   
  7.   //讀取溫度
  8.   t1= analogRead(A0); //DHT11  

  9.   //掃瞄(逐一點亮)7 Seg.,顯示溫度

  10.   //溫控
  11.   if(t1<t0-5) {
  12.     digitalWrite(D3, HIGH); //保溫燈    digitalWrite(D4, LOW);  //風扇  } else if(t1> t0+5) then {    digitalWrite(D3, LOW);
  13.     digitalWrite(D4, HIGH);
  14.   }   delay(10);
  15. }
複製代碼

程式大概是這樣,你仍需稍加修改。

2.
這得看你使用的加熱裝置電流而定,0.36A的保溫燈算是電流不大的設備。
繼電器也有分種類用途,有些是用來切換信號的,這種的就不適合用在AC設備上。
繼電器接AC那邊最好要用接線端子,然後AC電線用1A以上即可。

3.只要繼電器上面標示的電壓和電流大於設備,都沒問題的。

如果怕發生意外,最好加裝保險絲。

有一些問題順便提醒你一下:
1. 如果目前溫度剛好在你設定的溫度上下限之間跳動,加熱燈或風扇將會持續地開開關關,如此將會導致不良後果。
所以在撰寫程式時必須要解決這問題。

2. 如果停電,那些溫度設定將會跑掉。所以設定值最好要存入EEPROM裡面。


哈~~我也是初學,以上如有錯誤請多多指教。






3#
 樓主| 發表於 2014-4-14 20:16:37 | 只看該作者
回復 2# pizg

經前輩指點後恍然大悟  感謝
原來七段顯示器可以不用另外寫LOOP來顯示阿,這我原本都沒想到~
   又學習到新東西了 真愉快  
4#
發表於 2014-4-15 09:32:08 | 只看該作者
回復  pizg

經前輩指點後恍然大悟  感謝
原來七段顯示器可以不用另外寫LOOP來顯示阿,這我原本都沒想到 ...
ccu516 發表於 2014-4-14 20:16


實際做專案是最快能夠學到東西的。

我在學習的過程當中,發現美國、印度、日本和大陸在這方面學習的人數眾多,資源也很豐富,反觀台灣卻是有點令人失望。
不知是不是在這個島內待久了眼光也變淺了,大家都忙著爭取眼前的利益,不肯相互幫助扶持,深怕幫助了別人,自己的經驗也被別人學走了。


我個人在學習的過程中,受到Cooper Maa、Vegewell...等前輩幫助甚多,秉持這個信念,只要我知道的都會知無不言。
5#
 樓主| 發表於 2014-6-23 19:20:48 | 只看該作者
本帖最後由 ccu516 於 2014-6-23 19:32 編輯

各位前輩好
經過一段時間 小弟終於把理想中的保溫箱做出來了
不過就有一點點小瑕疵無法解決,希望前輩們能給予一點意見
首先是我的程式碼




/* 可調溫式保溫箱   */
/*程式描述:
本程式用途為保溫箱溫度之控制。
經由一旋鈕改變保溫箱內之設定溫度 TempSet,
(其中TempSet會透過七段顯示器來顯示。)
並與溫度感測器DHT11所量測保溫箱內之實際溫度值TempNow進行比較,
當 TempNow>TempSet+2 -->溫度過高,開起風扇 。風扇持續運轉到TempNow=TempSet停止。
當 TempNow<TempSet-2 -->溫度過低,開起保溫燈。保溫燈持續運轉到TempNow=TempSet停止。
當 TempSet-2 < TempNow < TempSet+2 -->保溫箱達到恆溫。*/
/* 版本:v1.2 */
/*完成日期:2014.6.8*/




//------------------------------  「1」  ------------------------------//

/*載入dht11 Library;定義DHT11之格式*/
#include <dht11.h>
dht11 DHT11;

//宣告pin編號
    /*類比*/
#define Knob 0        //旋鈕
    /*數位*/      
#define ASeg 4
#define BSeg 5
#define CSeg 11
#define DSeg 9
#define ESeg 10
#define FSeg 3
#define GSeg 2
#define digiten 6     // 十位數 on/off
#define digione 8     // 個位數 on/off
#define Fan 12        // 風扇 on/off
#define Lamp 13       // 保溫燈 on/off
#define DHT11PIN 7    // dht11之溫度讀取(串列)
//------------------------------  「1」  ------------------------------//




//------------------------------  「2」  ------------------------------//
/*宣告pin 1~13->output*/

void setup() {
  for(int i=0;i<14;i++){   //pin1~13為output
    pinMode(i,OUTPUT);
  }   
}
//------------------------------  「2」  ------------------------------//



//------------------------------  「3」  ------------------------------//
/*主程式迴圈 */  

void loop() {

//讀取旋鈕數值存到TempSet,轉化為25~40oC
  int TempSet = map(analogRead(Knob),0,1020,25,35);   
//0~1020 是為了避免1024可變電阻轉到底(5Vor1024)時不穩,數字會跳。

//七段顯示器顯示TempSet
    tempshow(TempSet);
//讀取DHT11溫度計溫度 TempNow
    int chk = DHT11.read(DHT11PIN);
    int TempNow = DHT11.temperature;
//---------「穩定」-----------//   

    digitalWrite(Fan,LOW);
    digitalWrite(Lamp,LOW);  
//---------「穩定」-----------//   
   
    //---------「過熱」-----------//
    if(TempNow>TempSet+1){
        while(TempNow>TempSet){
          //讀取TempSet
          TempSet = map(analogRead(Knob),0,1020,25,35);
          //讀取TempNow
          chk = DHT11.read(DHT11PIN);
          TempNow = DHT11.temperature;
          //開啟風扇
          digitalWrite(Fan,HIGH);
          digitalWrite(Lamp,LOW);
          //七段顯示器顯示TempSet
          tempshow(TempSet);
        }
    }
    //---------「過熱」-----------//
   
    //---------「過冷」-----------//
    if(TempNow<TempSet-1){
        while(TempNow<TempSet){
          //讀取TempSet
          TempSet = map(analogRead(Knob),0,1020,25,35);
          //讀取TempNow
          chk = DHT11.read(DHT11PIN);
          TempNow = DHT11.temperature;
          //開啟保溫燈
          digitalWrite(Fan,LOW);
          digitalWrite(Lamp,HIGH);
          //七段顯示器顯示TempSet
          tempshow(TempSet);
        }
    }
    //---------「過冷」-----------//
}
//------------------------------  「3」  ------------------------------//



//------------------------------  「4」  ------------------------------//
/*副程式(七段顯示器)*/
byte segs[7] = { ASeg, BSeg, CSeg, DSeg, ESeg, FSeg, GSeg };
byte seven_seg_digits[10][7] = { { 1,1,1,1,1,1,0 },  // = 0
                                 { 0,1,1,0,0,0,0 },  // = 1
                                 { 1,1,0,1,1,0,1 },  // = 2
                                 { 1,1,1,1,0,0,1 },  // = 3
                                 { 0,1,1,0,0,1,1 },  // = 4
                                 { 1,0,1,1,0,1,1 },  // = 5
                                 { 1,0,1,1,1,1,1 },  // = 6
                                 { 1,1,1,0,0,0,0 },  // = 7
                                 { 1,1,1,1,1,1,1 },  // = 8
                                 { 1,1,1,0,0,1,1 }   // = 9
                             };


void tempshow(byte number){
  lightdigione(number%10);
  delay(5);
  lightdigiten(number/10%10);
  delay(5);
}

void lightdigione(byte number){
  digitalWrite(digione,LOW);
  digitalWrite(digiten,HIGH);  
  singlenumber(number);
}

void lightdigiten(byte number){
  digitalWrite(digione,HIGH);
  digitalWrite(digiten,LOW);  
  singlenumber(number);
}

void singlenumber(byte number) {
  for (int i=0;i<7;i++){
    digitalWrite(segs, seven_seg_digits[number]);
  }
}

//------------------------------  「4」  ------------------------------//




我的程式運行後確實可以成功的進行溫度調控,
不過問題就在顯示TempSet的七段顯示器,由於刷的速度太慢了
導致一定有一個位數會一閃一閃的(速度不夠無法形成視覺暫留)
就算調整tempshow()中的delay值或是把tempshow()中十位數與個位數平均拆散在程式中還是一樣
每行程式運算的太慢導致迴圈刷得不夠快
請問有辦法解決嗎??

卡關卡好久....
6#
發表於 2014-6-23 20:04:11 | 只看該作者
本帖最後由 pizg 於 2014-6-23 20:15 編輯
各位前輩好
經過一段時間 小弟終於把理想中的保溫箱做出來了
不過就有一點點小瑕疵無法解決,希望前輩們能 ...
ccu516 發表於 2014-6-23 19:20



1.讀取 TempSet 應該保留最前面那一行程式碼即可, 其餘可刪除。另外還有一些問題, 請你自行發掘。
2.慎用 while, 你可能還不明瞭 void loop() {} 的真正含意。
3.你有空的話可以加寫定時功能, 這個定時功能可以有多個時間的設定, 到時候你應該就能懂 loop() 和瞭解怎麼做"多工"。
7#
 樓主| 發表於 2014-6-24 15:57:30 | 只看該作者
回復 6# pizg

先謝謝前輩的指教


我使用while迴圈的目的是想用來解決風扇和保溫燈在臨界值時會開關開關的問題
例如說
if(溫度超過設定值2度)
  while(溫度大於設定值){
  開啟風扇
  }

因此T+2為風扇開啟條件 一直持續到降為T               (T為設定溫度)
我也知道這個寫法好像不是很好
不過這是我目前能解決臨界值問題的辦法了


想請教一下有更適當的方式來寫嗎?
8#
發表於 2014-6-24 18:22:35 | 只看該作者
如果七段顯示器閃得很嚴重,看你要不要用2顆74573去鎖住顯示?
9#
發表於 2014-11-26 12:16:17 | 只看該作者
你好 我是Arduino初學者 我想做一個老鼠溫控箱

可以跟你要接線圖 自己試試看嗎?
您需要登錄後才可以回帖 登錄 | 申請會員

本版積分規則

小黑屋|手機版|Archiver|機器人論壇 from 2005.07

GMT+8, 2024-6-1 15:02 , Processed in 0.167147 second(s), 9 queries , Apc On.

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回復 返回頂部 返回列表