我们将使用Arduino开发板制作一个温度数据记录仪,该设备从温度传感器LM35获取温度值,并从DS3231实时时钟模块获取时间。 b}Gm{;s!
cQ- #]
在本项目中,我们将使用Arduino开发板制作一个温度数据记录仪,该设备从温度传感器LM35获取温度值,并从DS3231实时时钟模块获取时间。然后我们将使用mini SD卡模块将这些值存储在SD卡文件中。之后,我们从PC访问该文件,并在Microsoft Excel中创建这些数值的图表。 uo]\L^j
u->[y1JY
所需组件 yOlVS@7
qbq2Bi'a
该项目所需的组件如下 L@[}sMdq(
N7"cMAs\G
● Arduino Uno开发板 5,MM`:{{
!O!:=wq
● DS3231实时时钟模块 K\Q4u4DjbJ
>Vq07R
● mini SD卡模块 -
i2^ eZl
:*
|WE29U
● LM35温度传感器 ?SYmsaSr5
U~yPQ8jD
● 连接导线 igTs[q=Ak
}o!b3*#
● 面包板 vqT)=ZC1
电路原理图 Y54yojvV
+pq=i
Arduino开发板与DS3231时钟模块的连接方式如下所示 \\R<HuTY
/PaS<"<P@
● DS3231的GND连接到Arduino的GND X{cB%to
#B?lU"f8q^
● DS3231的VCC连接到Arduino的5V引脚 /V+7:WDj
[g"nu0sOK
● DS3231的SDA连接到Arduino上的A4 Dj=$Q44
r\fkx>
● DS3231的SCL连接到Arduino的A5 `dX0F=Ag?
Arduino开发板与SD卡模块的连接方式如下所示 zp9l u B
5#f_1
V
● mini SD卡模块的CS连接到Arduino的数字引脚10 Ew.6y=Ba
cCiDe`T\F
● mini SD卡模块的SCK连接到Arduino的数字插针13 = =pQ
V[
.u&X:jOE
● mini SD卡模块的MOSI连接到Arduino的数字引脚11 VgbT/v
wGs'qL"z
● mini SD卡模块的MISO连接到Arduino的数字引脚12 PyI"B96gz
5.\|*+E~
● Mini SD卡模块的VCC连接到Arduino的数字5V )xU+M{p-os
B)DuikV.D
● Mini SD卡模块的GND连接到Arduino的数字GND vAG|Y'aO@%
Arduino开发板与LM35温度传感器的连接方式如下所示 0[YksNNl1
,\+N}F^
● LM35的VCC引脚连接到Arduino的5V引脚
N6BOUU]
yZ=O+H
● LM35的OUT引脚连接到Arduino的A0 {l/`m.Z
D5Rp<PBq,
● LM35的GND引脚连接到Arduino的GND 4yTgH0(T
014ednc20180411 *@@dO_%6
.P5'\
工作原理 WyB^b-QmDh
6,1oLvU
LM35温度传感器以模拟方式输出信号。我们需要使用ADC转换此输出,以便能够测量温度。 Arduino开发板内置了一个ADC,通过它可以将LM35的输出转换成温度值。 }3WP:Et
/ioBc}]
DS3231时钟模块通过I2C通信连接到Arduino。因此,我们只需要将DS3213上的SCL和SDA引脚与Arduino连接,模块就会开始通信。该模块有一个独立的电池,使得其在即使它没有Arduino供电时也能正常运行。 dqBN_P%
ntPX?/
然后使用SD卡模块将温度和时间存储在SD卡中。 SD卡模块将打开SD卡并在里面存储数据。之后,我们在PC上打开该文件,并且在Microsoft Excel中使用这些值生成一个图表。 k`' *niz
VL"Cxs
注意:如果您是第一次使用DS3231模块,则必须先设置时间和数据。要实现这一点,请根据您的时间更改代码中的时间和日期,并上传以下代码: <7Yh<(R e^
XLYGhM
时间设定代码 /Trbr]lWy
@!ja/Y^
#include <DS3231.h> G[`2Nd<
x<w-j[{k_K
DS3231 rtc(SDA, SCL); }=|{"C
8ZjRMr}
void setup() ($UUgjv F
%<O~eXY
{ ^HuB40
e^;:iJS
rtc.begin(); g%ys|
2*gB ~Jn4
rtc.setDOW(WEDNESDAY); H<nA*Zf2@R
rkdA4'66w
rtc.setTime(12, 0, 0); g&.OJ
noB8*n0
rtc.setDate(1, 1, 2014); F_/ra?WVH
o1{3[=G
} y^Q);siSy
Ne3YhCC>
void loop() k7sD"xR3
.>}Z3jUrf
{ at\u7>;.^k
hc9ON&L\>
} 9`^(M^|c
nLANWQk9
代码 f4f)9n
NP4u/C<
#include <SD.h> c|k(_#\B
2o1WXE %$
#include <SPI.h> x wwL
PAC=LQn&
#include <DS3231.h> SY@;u<Pd
HvZSkq^
File data_file; *c$UIg
zR/mz) 6_
DS3231 rtc(SDA, SCL); *p\fb7Pu_3
B:cQsaty
const int lm35_pin = A0; n`jG[{3t&
NweGK
int temperature; LZ&I<ID`-
MpJ\4D5G
int chip_select_pin = 10; //pin 53 for arduino mega 2560 <7L-25 =
)1GJ^h$l
void setup() { z/p^C~|}
MJH>rsTQ
Serial.begin(9600); O@dK^o
iO18FfM_
rtc.begin(); &5B/>ag1!
(wxi!
pinMode(lm35_pin, INPUT); q @wX=
mjk<FXW
pinMode(chip_select_pin, OUTPUT); ;WrG\R/|
;'[?H0Jw'
if (SD.begin()) C58B(Ndo
uGYH4
{ nhZ/^`Y<
#i.BOQxS
Serial.println("Initialization Successful. Ready to use"); *o(bB!q"c
} else WZTv
,u-9e4
{ NH=@[t)P,
MFWkJbZV
Serial.println("Initialization failed. Check your pin connections or change your SD card"); n 1^h;2gz
i!(5y>I_
return; E2`9H-6e
} +<B"g{dLuX
R4DfqX
} A\E ))b9+
;Cty"H,
void loop() { Z\n^m^Z
=
l!\~T"-7;:
temperature = analogRead(lm35_pin); q,;wD1_wG
8R(l~
temperature = (temperature*500)/1023; @ @(O##(7
EyBTja(4
data_file = SD.open("test.txt", FILE_WRITE); |X6R2I
,WW=,P
if (data_file) { K,*z8@
e9QjRx
Serial.print(rtc.getTimeStr()); ]Qp-$)N
data_file.print(rtc.getTimeStr()); \E05qk_;K
yi(IIW
Serial.print(","); N6%L4v8-}X
(_gt!i{h
data_file.print(","); $ma@z0%8}
P1$D[aF9$
Serial.println(temperature); G}}Lp~
uy<b5.!-
data_file.println(temperature); WU,b<PU &
yDRi
data_file.close(); ;U y}(
} w:=:D=xH2
zzd PR}VG
else { GR 1%(,
(eHTXk*V`
Serial.println("error opening your SD card file. Try again"); 'UuHyC2Ha3
} i]qxF&1
J*Cf1 D5!
delay(3000); -"#jRP]#
1/?K/gL
} BV}sN{
kcMg`pJ4<
代码说明 ^D ;EbR
.CW,Td3f!
首先,我们包含了mini SD卡模块和DS3231时钟模块所需的库文件。 SD卡模块通过SPI通信连接到Arduino,因此我们包含了SPI库。 之后,我们初始化两个变量以便使用库函数。 ]bstkf}~u
]U}B~Y
#include <SD.h> Jq8v69fyQ
)FfS7 C\.
#include <SPI.h> ,TYFPulYcp
6k{gI.SG
#include <DS3231.h> pP#|: %
}I18|=TB
File data_file; \#F>R,
E, oR.B
DS3231 rtc(SDA, SCL); ^_W] @m2
,F "P/`i'
在设置函数中,我们开始与SD卡模块进行通信。 如果一切正常,Arduino将在串行监视器上打印输出“Initialization Successful. Ready to use“,否则将打印输出”Initialization failed. Check your pin connections or change your SD card“。 ##Qy6Dc
:H:+XIgoR
if (SD.begin()) >q ,Z*s>?
&(|Ot`el]v
{ h&~9?B
~b4kV)[ q
Serial.println("Initialization Successful. Ready to use"); ^a1k"|E?f
} else OgHqF,0MN
joNV4v"=`
{ -av=5hm
*V[I&dKq
Serial.println("Initialization failed. Check your pin connections or change your SD card"); *R7bI?ow
lc]cs D
return; Deq@T {
} wT-Kg=-q
P5GV9SA
LM35温度传感器以模拟形式输出信号,因此首先需要将该模拟输出转换为温度。 然后我们打开SD卡文件“test.txt”。 如果没有该名称的文件,那么Arduino将会创建它。 打开文件后,Arduino将打印输出时间和温度。 Zt9ld=T
T#vY(d
temperature = analogRead(lm35_pin); TpdYU*z_Br
u EERNo&
temperature = (temperature*500)/1023; NH*"AE;
Mf7
[@#$
data_file = SD.open("test.txt", FILE_WRITE); *uKYrs [
'+c@U~d*7
if (data_file) { +G,_|C2J
"_=t1UE
Serial.print(rtc.getTimeStr()); ~&"'>C#
I$XwM
data_file.print(rtc.getTimeStr()); aN!,\D
t[AA=
Serial.print(","); 0WyOORuK
=-qYp0sVP
data_file.print(","); *r7%'K{C
w$""])o,
Serial.println(temperature); %_~1(Glz
1Ve~P"w
data_file.println(temperature); Os!x<r|r
S>Gb
Jt(]
data_file.close(); z(#dL>d$'
注意:您要选择的文件名必须为8.3格式。 8.3格式的文件名可以类似“data345.txt”,其中“data345”是8个字符串,“.txt”是3个字符的扩展名。 您不能使用比此格式更长的文件名。 如果您是第一次使用该SD卡,建议在使用SD卡之前进行格式化。
@l&{ j
&'?Hh(
如何在Excel中制作图表 E?VOst&
9! yDZ<s
要在excel中制作一个图表,打开Microsoft excel并转到数据菜单,点击'从文本'按钮并选择SD卡文件。 然后选择分隔符,然后单击下一步,之后选择逗号并完成向导。 =c%gV]>G
Zv9%}%7p
现在,选择所有的数据,然后转到插入菜单,点击'折线图'。 这将会为我们创建出一个图表。 iRM ?_|