因為ArduinUno支持很多開源庫以及傳感器,所以編寫程序起來也是十分簡單,易于操作,相比較其他單片機需要了解各種復雜的寄存器起來,ArduinoUno只需要簡單的語句即可實現很多功能。單片機性能方面,ArduinoUno所搭載的Atmega328單片機的資源也足夠使用,并且有RISC精簡指令集的加持,ArduinoUno足夠勝任本項目。
選擇好單片機之后,其他元件的選擇就簡單了許多,溫度測量方面使用了DHT11溫濕度傳感器,它可以測量環境的溫濕度,單總線傳輸數據的方式更加節省端口資源,得益于Arduino的開源環境,使用它也是十分容易,只需要一個函數即可獲取溫濕度信息,是制作溫度計的不二之選。
步進電機的驅動模塊使用ULN2003大功率達林頓晶體管陣列模塊,此模塊很易于找到并且價格低廉,搭配我選擇的步進電機是不二之選。板載4路led指示燈可以清楚的觀察到各相的工作狀態。
圖9.jpg (495.14 KB, 下載次數: 120)
下載附件
2018-9-12 13:27 上傳
這里再次感謝Arduino的開源環境,各路大神早已為我們寫好了此驅動模塊的函數庫,我們只需要調用即可。這里是設計好的電路圖:
圖10.jpg (571.43 KB, 下載次數: 100)
下載附件
2018-9-12 13:27 上傳
完成的結構設計以及元件之后,接下來就是設計木板的圖紙了,經過一小會忙活,設計好圖紙,發送給廠家切割,幾天后,收到了切好的木板:
圖11.jpg (808.07 KB, 下載次數: 93)
下載附件
2018-9-12 13:29 上傳
接下來就是安裝了,將各個元件悉數安裝到對應位置,并將線路接好:
圖12.jpg (800.56 KB, 下載次數: 93)
下載附件
2018-9-12 13:29 上傳
圖13.jpg (936.17 KB, 下載次數: 106)
下載附件
2018-9-12 13:30 上傳
圖14.jpg (897.96 KB, 下載次數: 120)
下載附件
2018-9-12 13:30 上傳
圖15.jpg (867.64 KB, 下載次數: 112)
下載附件
2018-9-12 13:30 上傳
圖16.jpg (837.21 KB, 下載次數: 128)
下載附件
2018-9-12 13:30 上傳
因為溫度傳感器以及步進電機驅動都是使用的數字信號,所以我只使用了ArduinoUno的數字端口。線路與元件都安裝好之后,接下倆就是對ArduinoUno編程了。
程序:
- //首先我們需要引入頭文件,沒有這些頭文件,在編程中一些函數就無法調用。
- #include <dht11.h> //引用dht11溫濕度傳感器庫文件,使得下面可以調用相關參數
- #include <Stepper.h> ///引用步進電機驅動庫文件,使得下面可以調用相關參數
- //接著依據電路圖,我們來定義元件的接口。
- #define DHT11PIN 6 //dht11溫濕度傳感器的數據輸出接在ArduinoUno的6號數字引腳
- Stepper myStepper(stepsPerRevolution,2,3,4,5); //步進電機驅動的輸入信號接在ArduinoUno的2,3,4,5號數字引腳
- dht11 DHT11; //實例化DHT11對象,便于后面讀取溫度使用
- //接下來定義一些變量,來存儲溫度數據或者步進電機的位置信息
- int stepsPerRevolution = 128; //步進電機每次轉動步數
- int temlast=0; //temlast代表上一次讀取到的溫度數據
- int chk,tem; //chk代表讀取到的溫濕度數據,tem代表讀取到的溫度數據
- //接下來就是初始化程序,里面包含了初始化溫度傳感器以及各個變量的代碼。
- void setup() {
- Serial.begin(9600); //設置串口波特率
- pinMode(DHT11PIN,OUTPUT); //定義溫濕度傳感器的端口為輸出
- myStepper.setSpeed(50); //設置步進電機速度為50r/min
- delay(1000);
- chk = DHT11.read(DHT11PIN); //讀取溫濕度的值賦給chk
- tem=DHT11.temperature; //從DHT11對象中將溫度數據分離出來
- temlast=tem; //將溫度值賦給存儲上一次測量溫度值的變量,以便接下來的比較
- }
- //接下來就是主要循環程序,對于控制步進電機轉動的方法,我使用了比較的方法,將上一次測量的溫度存儲起來,與當前測量的溫度值比較,根據比較大小來控制步進電機轉動方向,具體實現代碼如下。
- void loop() {
- chk = DHT11.read(DHT11PIN); //讀取溫濕度的值賦chk
- tem=DHT11.temperature; //從DHT11對象中將溫度數據分離出來
- delay(100);
- Serial.print("Tempeature:"); //串口打印出Tempeature:
- Serial.println(tem); //打印溫度結果
- if(tem-temlast>=1) //如果當前測量溫度的結果大于等于上一次測量的溫度值1度
- {
- myStepper.step(stepsPerRevolution); //步進電機正向轉動
- Serial.println("add"); //串口打印增加
- temlast=tem; //更新上一次測量的溫度值
- }
- else if(tem-temlast<=-1) //如果當前測量溫度的結果小于等于上一次測量的溫度值1度
- {
- myStepper.step(-stepsPerRevolution); //步進電機反向轉動
- Serial.println("less"); //串口打印減小
- temlast = tem; //更新上一次測量的溫度值
- }
- delay(500); //延時500ms
- }
復制代碼 連接電腦,燒寫代碼到ArduinoUno中,打開串口監視器,根據屏幕上顯示的溫度數值。
圖17.jpg (25.8 KB, 下載次數: 101)
下載附件
2018-9-12 13:31 上傳
來調整回形針指針的位置以及張緊彈簧的位置。調整好之后,一件富有科技與藝術的溫度計就做成了,有問題的朋友請在下面留言,這款溫度計我已經做成了套材,想了解的請訪問鏈接
圖18.jpg (937.67 KB, 下載次數: 108)
下載附件
2018-9-12 13:31 上傳
務必記住,如果有需要的朋友請發送我們的暗號“51黑電子”給我,我會給你們優惠!