這是第一個比較像完整作品的 Arduino 作業:一個簡易的溫溼度計,功能是顯示溫度與濕度,有一個按鈕可以切換顯示哪一項,顯示的地方是在一個 1602 的LCD顯示幕上面。

所需要的零件有:

  1. 1. Arduino *1
  2. 2. 按鈕 *1
  3. 3. 電阻10k *2
  4. 4. 1602 LCD 顯示幕 (I2C界面) *1
  5. 5. DHT 11 溫濕度感應器 *1 (或是其他替代方案也可以)
  6. 6. 單心線若干

 

10k的電阻是做為按鈕的上拉(或下拉,看你想要怎麼接)電阻、以及 DHT11 的上拉電阻。

DHT 11 的函式庫可以在網路上找到,我是順便練習看 spec 然後自己寫一個。

1602 LCD 的函式庫要用這個:https://github.com/fdebrabander/Arduino-LiquidCrystal-I2C-library

一開始的時候是用這個: http://hmario.home.xs4all.nl/arduino/LiquidCrystal_I2C/

雖然他說已經針對 Arduino 1.0 做了修正,可是我還是試不出來,甚至以為是 LCD 壞了,後來才發現是函式庫問題,卡了好久。他的舊版是可以在 Arduino 0.22 版運作無誤,可是新版在 Arduino 1.0, 1.0.1, 1.0.2 我都試不出來。好險有找到可以用的函式庫,不然我應該暫時改不出來,囧rz

因為做作業的時候,手上沒有按鈕,就只好拿舊電腦拆下的按鈕先將就著用 XDD

以下是完成圖:

按鈕尚未按下時,顯示濕度

IMG_20121216_230209

按鈕按下之後顯示溫度

IMG_20121216_230220  

有幾個小技巧:

濕度的最大值99、溫度的最大值40、溫度的度C字元,還有下面的長條圖是我自己加上去的,這些圖案必須自己手繪,LCD 函式庫中的範例有。這項作業剛好將8個可自訂字元用完:99、40、度C、左邊線、右邊線、方塊、左邊線+方塊、右邊線+方塊。

把溫濕度的數值轉換成長條圖可以自己算,或是採用內建的函式 map() 可以將某一段數值對應到另一段數值,這邊的例子就是濕度的 0~99 對應到 0~16 (因為每行可以顯示16個字元)。

大家一起來玩 Arduino 吧!!

, ,
創作者介紹

koukai的Blog

koukaipan 發表在 痞客邦 PIXNET 留言(6) 人氣()


留言列表 (6)

發表留言
  • man38384
  • 請問大哥
    1602 LCD 顯示幕 的部分
    可不可以直接讓他顯示在電腦上?
    電腦有沒有這個程式?

    懇請賜教
  • Hi,你好。如果你想要讓溫度顯示在電腦上的話,你可以直接透過 Arduino 的序列埠 (serial port) 傳輸功能,在電腦端讀取來自序列埠的資料(數據),你可以參考這篇:http://coopermaa2nd.blogspot.tw/2011/01/arduino-1.html 他是直接利用 Arduino 開發工具的序列埠監控程式看。如果你想要進行更進階的用法,像是全天候記錄、繪圖等功能,你可能必須學習如何撰寫序列埠通訊的程式,並且配合其他程式語言來開發自己的程式。大致上是這樣,有問題歡迎再發問,祝你好運 :D

    koukaipan 於 2013/05/14 09:47 回覆

  • xiaoching
  • 可不可以給接線圖+程式(完整)?
    (我沒有DHT15的...)
    (若可以的話,可不可以說直接寄到信箱)
    xiaoxiaochingching@yahoo.com.tw
  • xp134679
  • #include<Servo.h>
    #include <LiquidCrystal.h>
    #include <NewSoftSerial.h>
    #include <serLCD.h>

    LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
    int backLight = 13;
    int val = 0;
    int photocellPin = 0;
    Servo myservo;


    void setup() {

    lcd.begin(16,2);
    lcd.print("Val. : ");

    myservo.attach(9);
    myservo.write(0);
    pinMode(photocellPin, INPUT);


    }

    void loop() {
    val = analogRead(photocellPin);

    if( val<=4.6)
    {
    myservo.write(180); }
    else if(val>5.3) {

    myservo.write(0); }

    lcd.setCursor(0, 1);
    lcd.print(val,1); // 顯示到小數點後一位

    delay;
    }

    不好意思,想請問,這是我綜合一些程式所寫出來的,我是利用電壓大小來控制我的馬達,以及利用LCD來顯示我當時的電壓值,但不知未何顯示出的數字都不是我要的(程式碼錯誤嗎?),理論上認為接線無誤。 謝謝幫忙~
  • Hello, 你有沒有先試著在 LCD 上面印出簡單的數字,一個個元件先確定可以動會比較好除錯。如果 LCD 沒問題的話,電壓值也可以透過 serial port 先輸出看看,先完成較單純的工作會比較好確認問題所在。

    koukaipan 於 2014/04/19 00:18 回覆

  • xp134679
  • 哈囉! 你說的方法我都嘗試過了 單純一點的動作都很正常 想問會有其他可能造成顯示錯誤的原因嗎?? 謝謝你喔!!
  • 訪客
  • 你好~ 最近要學習做此溫濕度數字顯示於lcd上 請問1602LCD我是要買3.3V還是5V的?
  • 新手
  • 先進可否教導一下度c符號的顯示方式,感謝
  • Hi,LCD他有提供幾個自創字元的空間,度C是我自己畫出來的。

    koukaipan 於 2015/01/25 23:11 回覆