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