步驟1:
要構建傳感器,我創(chuàng)建了一個小的PCB。為此,我使用了墨粉轉移方法。如何做到這一點是許多指導對象的目標。我焊接了芯片,電容和引腳頭。在傳感器的第五個針腳上,我放了一根從電纜絕緣層中取出的小塑料管。它的目的是將傳感器引導到正確的位置并阻止其插入錯誤的母頭孔中。在圖片上可以看到它必須放置的正確方式。傳感器按照使用以下Arduino引腳的方式投影:“5V”,“GNG”,“GND”,_,_,“A0”。這意味著-模擬輸出電壓值由ADC0采樣。
步驟2:硬件
對于基于DIY溫度傳感器的簡單溫度計項目,我使用了Arduino MEGA板(也是我的DYI項目)。還需要LCD防護罩。就我而言,盾牌也是自制的。使用的LCD是帶有ST9720芯片的圖形128x64顯示器。我在ebay上買了它。 LCD屏蔽板的PCB也來自ebay。我已經在LCD上焊接了母排針,并在原型屏蔽板上焊接了排針-現(xiàn)在,我可以簡單地將LCD模塊插入到原型板上,并且可以正常工作,并且不使用任何電纜。如果您沒有任何LCD防護罩,那么當然可以使用面包屑的標準方法。對于該項目,也可以使用任何字符LCD(例如16x2),但我沒有LCD,但我經歷了更復雜的方式:-)。
步驟3:代碼
現(xiàn)在是時候編寫代碼了。我試圖使它盡可能簡短。因為我使用GLCD,所以我決定將實現(xiàn)基于u8glib庫。如果要使用字符LCD,則應使用標準的LCD Arduino庫,并且必須根據(jù)它們來調整代碼。
這是代碼:
/*
溫度計基于Maxims DS600u +芯片
*/
#include“U8glib.h”
#include
U8GLIB_ST7920_128X64_4X u8g(8,9,10,11) ,4,5,6,7,18,17,16);//8Bit Com:D0..D7:8,9,10,11,4,5,6,7 en = 18,di = 17,rw = 16
void u8g_prepare(void){
u8g。 setFont(u8g_font_6x10);
u8g.setFontRefHeightExtendedText();
u8g.setDefaultForegroundColor();
u8g.setFontPosTop();
}
void setup(void){
//翻轉屏幕,如果需要的話
//u8g.setRot180();
//指定默認顏色值
if(u8g.getMode()== U8G_MODE_R3G3B2)
u8g.setColorIndex(255);//white
else if(u8g.getMode()== U8G_MODE_GRAY2BIT)
u8g.setColorIndex(3);//最大強度
否則if(u8g.getMode()== U8G_MODE_BW)
u8g.setColorIndex(1);//像素在
//u8g.setContrast(0x30);
pinMode(13,OUTPUT);
digitalWrite(13,HIGH);
u8g_prepare();
}
void draw(void){
浮動供應= 4.91 ;//必須在此處輸入arduino板的測量電源電壓
//讀取傳感器輸出電壓
float v_out =(讀取*電源)/ 1.024 ;
//在液晶顯示屏上顯示溫度
float temperature =(v_out-509)/6.45;
char temp [5];
dtostrf(temperature,5,1 ,溫度);結果,u8g.drawStr(4,24, “溫度:”);結果,u8g.drawStr(76,24,溫度);結果,u8g.drawStr(108,24,“的 260 C“);
}
void loop(void){
//圖片循環(huán)
u8g.firstPage();
do {
draw();
} while(u8g.nextPage());
//延遲一段時間后重建圖片
延遲(1000);
有一些棘手的問題代碼中的點。
我把它們放在粗體中。
1)因為內部Atmega ADC使用電源電壓作為參考來測量模擬電壓電位,這不是比率指標電源電壓,但由傳感器芯片固定,如果電源電壓變化,可能會發(fā)生錯誤。粗略的計算表明,50mV的電源變化會引起1度的溫度誤差。提高精度的解決方案是按應使用的方式測量Arduino板上的確切電源電壓-如果您打算使用USB提供的Arduino溫度計,則必須測量這種情況下的板子電源電壓。如果您打算將溫度計用作AC/DC適配器提供的獨立設備 - 那么,在這種情況下應測量電路板+屏蔽的電源電壓。在我的情況下,設備由USB供電,我在“5V”Arduino引腳上測得4.91V。所以我把這個值放在草圖中。
2)很高興在LCD上你可以看到度數(shù)“°”符號。這里的問題是不同的顯示器具有不同的ASCII表,并且難以說出對應于該符號的八進制數(shù)究竟是什么。有兩種可能的解決方案:
A )如果有任何ASCII表,則讀取LCD模塊/驅動程序的數(shù)據(jù)表
B )編寫草圖以顯示寫在LCD ROM中的整個ASCII表,查看符號出現(xiàn)的位置并計算/查看與之對應的十進制數(shù)。進一步將此值轉換為八進制數(shù)并放入草圖。
我使用了第二種方法。..。..并且以最簡單的方式:-) - 庫中有“示例”u8glib。程序“ GraphicsTest”將打印存儲在驅動器芯片ROM中的兩個ASCII表。在那里,我發(fā)現(xiàn)所需的符號具有260個八進制等效數(shù)字。
想要在Arduino Due上實現(xiàn)此項目的家伙,我建議在代碼中也插入以下行:
analogReadResolution(12);
在設置過程中,然后在1.024上除以4.096除。
步驟4:
整個設備組裝,編程并運行:
PS該項目繼續(xù)。..
步驟5:其他工作
在幾周前,我決定在此防護罩中實現(xiàn)其他功能。這些功能必須是:LCD上顯示的當前時間和日期。為此,我從ebay購買了RTC模塊。 (如圖所示)。該模塊不是很精確,必須不時調整。另一個解決方案是嘗試用更好的石英晶體進行更換。
步驟6:進行屏蔽修改
能夠插入RTC我已通過以下方式修改了屏蔽:我焊接了4針母接頭,并將其連接到正確的信號。
SCL RTC引腳與屏蔽/引腳21相連。 arduino
分別將SDA與#20引腳相連
別忘了連接GND和Vcc引腳。
步驟7:代碼。..
以前的代碼已修改為:
/*
基于Maxims DS600u +芯片+ RTC的溫度計
*/
#include“ U8glib.h”
#include
#include
# include
int rtc [7];
float supply = 4.91;//這里必須輸入arduino板的測量電源電壓
//讀取傳感器輸出電壓
char hours [2];
char minutes [2];
char seconds [2] ;
char天[2];
char months [2];
char years [4];
U8GLIB_ST7920_128X64_4X u8g(8,9,10,11,4,5,6,7, 18、17、16);//8Bit Com:D0..D7:8,9,10,11,4,5,6,7 en = 18,di = 17,rw = 16
void u8g_prepare(void){
u8g。 setFont(u8g_font_6x10);
u8g.setFontRefHeightExtendedText();
u8g.setDefaultForegroundColor();
u8g.setFontPosTop();
}
void setup(void){
序列號。 begin(9600);
//翻轉屏幕,如果需要的話
//u8g.setRot180();
//指定默認顏色值
if(u8g.getMode()== U8G_MODE_R3G3B2)
u8g.setColorIndex(255);//white
else if(u8g.getMode()== U8G_MODE_GRAY2BIT)
u8g.setColorIndex(3);//最大強度
否則if(u8g.getMode()== U8G_MODE_BW)
u8g.setColorIndex(1);//像素在
//u8g.setContrast(0x30);
pinMode(13,OUTPUT);
digitalWrite(13,HIGH);
u8g_prepare();
}
void draw(void){ u8g.drawFrame(0,0,127,63);
u8g.drawFrame(13,7,103,21);
u8g.drawBox(15,9,99,17);
RTC.get(rtc,true); u8g.setColorIndex(0);
dtostrf(rtc [2],2,0,hours);
if(rtc [2] 《10 )結果{結果u8g.drawStr(26,14, “0”);結果,},點擊u8g.drawStr(26,14,小時);結果,dtostrf(RTC [1],2 ,0,minutes);
u8g.drawStr(45,14,“:”);
if(rtc [1] 《10)
{
u8g.drawStr(58,14,“ 0“ );結果,},點擊u8g.drawStr(58,14,分鐘);結果,dtostrf(RTC [0],2,0,秒);結果,u8g.drawStr(78,14, “:”);
if(rtc [0] 《10)
{
u8g.drawStr(91,14,“ 0”);
}
u8g.drawStr(91, 14秒);
u8g.setColorIndex(1);
switch(rtc [3])
{
情況1:u8g.drawStr(4,33,“ Sunday”);休息;
案例2:u8g.drawStr(4,33,“星期一”);休息;
案例3:u8g.drawStr(4,33,“星期二”);休息;
案例4:u8g.drawStr(4,33,“星期三”);休息;
案例5:u8g.drawStr(4,33,“星期四”);休息;
案例6:u8g.drawStr(4,33,“星期五”);休息;
案例7:u8g.drawStr(4,33,“星期六”); break;
}
dtostrf(rtc [4],2,0,days);
if(rtc [4] 《10)
{ u8g.drawStr(64,33, “0”);結果,},點擊u8g.drawStr(64,33,天);結果,u8g.drawStr(75,33, “”);結果,dtostrf(RTC [5],2 ,0,months);
if(rtc [5] 《10)
{
u8g.drawStr(80,33,“ 0”);
}
u8g.drawStr(80 ,33,月);結果,u8g.drawStr(90,33, “”);結果,dtostrf(RTC [6],4,0,歲);結果,u8g.drawStr(96,33,年);
int讀數(shù)= AnalogRead(0);
浮點v_out =(讀數(shù)*供給)/1.024;
//在LCD上顯示溫度
浮點溫度=(v_out-509)/6.45;
char temp [5]; dtostrf(temperature,5,1,temp);
u8g.drawStr(4,48,“ Temperature:”);
u8g.drawStr( 76,48,temp);
u8g.drawStr(108,48,“ 260C”);
void loop(void){
//圖片循環(huán)
u8g.firstPage();
做{
draw();
} while(u8g.nextPage());
//延遲一段時間后重建圖片
delay( 1000);
}
如您所見,此代碼需要庫DS1307。我已附上該庫,以幫助您解決由于可用的DS1307庫不同而引起的混亂。
責任編輯:wv
-
溫度傳感器
+關注
關注
48文章
2894瀏覽量
155808 -
Arduino
+關注
關注
187文章
6461瀏覽量
186520
發(fā)布評論請先 登錄
相關推薦
評論