很久之前做了一个简易的气象站,室外arduino pro mini 通过dht11读取温湿度,用nrf24l01传输到室内的arduino pro mini上,再经过一些简单的处理,将结果再oled模块上显示出来。
写这篇博客是为了能及时的复习学过的东西,ug8lib的使用,nrf传输的数据处理方式……
这是使用的nrf24l01:
引脚接法:
nRF24L01 Arduino UNO
VCC <—> 3.3V
GND <—> GND
CE <—> D9
CSN <—> D10
MOSI <—> D11
MISO <—> D12
SCK <—> D13
IRQ <—> 不接
在这个项目中,我将使用mirf库驱动nrf模块,你可以在Github上找到它,下面给出它的初始化方法:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
#include <SPI.h>
#include <Mirf.h>
#include <nRF24L01.h>
#include <MirfHardwareSpiDriver.h>
void
setup
(
)
{
dht
.
begin
(
)
;
//DHT开始工作
Mirf
.
cePin
=
9
;
//设置CE引脚为D9
Mirf
.
csnPin
=
10
;
//设置CE引脚为D10
Mirf
.
spi
=
&
MirfHardwareSpi
;
Mirf
.
init
(
)
;
//初始化nRF24L01
Mirf
.
setRADDR
(
(
byte
*
)
"Sen01"
)
;
//设置接收标识符"Sen01"
Mirf
.
channel
=
1
;
//发送通道,可以填0~128,收发必须一致。
Mirf
.
config
(
)
;
}
|
oled12864的驱动是用U8glib库的,同样可以在Github找到它,这里我使用了简单的输出方案,完整的常用函数在这里,我用静态数组来储存中文字符:
1
2
3
4
5
6
7
8
|
static
unsigned
char
bitmap6
[
]
U8G_PROGMEM
=
{
/*-- 文字: 内 --*/
/*-- 宋体9; 此字体下对应的点阵为:宽x高=12x12 --*/
/*-- 宽度不是8的倍数,现调整为:宽度x高度=16x12 --*/
0x20
,
0x00
,
0x20
,
0x00
,
0xFE
,
0x03
,
0x22
,
0x02
,
0x22
,
0x02
,
0x52
,
0x02
,
0x92
,
0x02
,
0x8A
,
0x02
,
0x02
,
0x02
,
0x02
,
0x02
,
0x02
,
0x02
,
0x82
,
0x03
,
}
;
|
整个装置分为sender部分和receiver部分:
这是用Fritzing画的Receiver部分的电路图,并没有想把它做的很完美,所以实物我是用洞洞板焊接的。
Sender部分的电路图大同小异,我是用dht11温湿度传感器代替了lm35温度传感器,并且用了一个加强版的nrf24l01,电源部分我使用了两节18650锂电池加一个降压电路。
下面来说说我的控制思路:
首先是发送模块检测dht11的读取数据,将温湿度坐标发送至接收端:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
#include "DHT.h"
//定义针脚
#define DHTPIN 2
//定义类型,DHT11或者其它
#define DHTTYPE DHT11
//进行初始设置
DHT
dht
(
DHTPIN
,
DHTTYPE
)
;
void
setup
(
)
{
dht
.
begin
(
)
;
//DHT开始工作
}
void
loop
(
)
{
int
Humidity
=
dht
.
readHumidity
(
)
;
//读湿度
int
Temperature
=
dht
.
readTemperature
(
)
;
//读温度,默认为摄氏度
}
|
由于nRF24L01只能以byte单字节数组(8-bit)形式发送数据,arduino中的int数据是占两个字节数的,所以我将温湿度数据分成4个byte字节存入数组中,再一次性发送出去:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
byte
data
[
4
]
;
int
Humidity
=
dht
.
readHumidity
(
)
;
/
/读湿度
int
Temperature
=
dht
.
readTemperature
(
)
;
/
/读温度,默认为摄氏度
data
[
0
]
=
Humidity
&
0xFF
;
/
/低八位给
data
[
0
],
data
[
1
]
=
Humidity
>>
8
;
data
[
2
]
=
Temperature
&
0xFF
;
/
/低八位给
data
[
0
],
data
[
3
]
=
Temperature
>>
8
;
/
/高八位给
data
[
1
]。
/
/发送数据之前设定发送的对象
Mirf
.
setTADDR
(
(
byte
*
)
"Rec01"
)
;
Mirf
.
send
(
data
)
;
/
/
while死循环等待发送完毕,才能进行下一步操作。
while
(
Mirf
.
isSending
(
)
)
{
}
|
在接收端,要把原来的数据重组为温湿度数据:
1
2
3
4
5
6
7
8
9
|
byte
data
[
4
]
;
if
(
Mirf
.
dataReady
(
)
)
//等待接收数据准备好
{
Mirf
.
getData
(
data
)
;
//接收数据到data数组
//data[1]<左移8位与data[0]并,重组数据。
Humidity
=
(
int
)
(
(
data
[
1
]
<<
8
)
|
data
[
0
]
)
;
Temperature
=
(
int
)
(
(
data
[
3
]
<<
8
)
|
data
[
2
]
)
;
}
|
在接收到数据之后,就可以将数据在oled12864上显示出来了,对于位图,u8glib有u8g.drawXBMP(x,y,width,height,bmp_name)
函数可以使用:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
|
u8g
.
firstPage
(
)
;
do
{
u8g
.
drawXBMP
(
0
,
0
,
12
,
12
,
bitmap1
)
;
u8g
.
drawXBMP
(
12
,
0
,
12
,
12
,
bitmap2
)
;
u8g
.
drawXBMP
(
24
,
0
,
12
,
12
,
bitmap3
)
;
u8g
.
drawXBMP
(
36
,
0
,
12
,
12
,
bitmap5
)
;
u8g
.
drawXBMP
(
0
,
12
,
12
,
12
,
bitmap1
)
;
u8g
.
drawXBMP
(
12
,
12
,
12
,
12
,
bitmap2
)
;
u8g
.
drawXBMP
(
24
,
12
,
12
,
12
,
bitmap4
)
;
u8g
.
drawXBMP
(
36
,
12
,
12
,
12
,
bitmap5
)
;
u8g
.
drawXBMP
(
0
,
24
,
12
,
12
,
bitmap1
)
;
u8g
.
drawXBMP
(
12
,
24
,
12
,
12
,
bitmap6
)
;
u8g
.
drawXBMP
(
24
,
24
,
12
,
12
,
bitmap3
)
;
u8g
.
drawXBMP
(
36
,
24
,
12
,
12
,
bitmap5
)
;
u8g
.
drawXBMP
(
18
,
52
,
12
,
12
,
bitmap7
)
;
u8g
.
drawXBMP
(
34
,
52
,
12
,
12
,
bitmap8
)
;
u8g
.
drawXBMP
(
50
,
52
,
12
,
12
,
bitmap9
)
;
u8g
.
drawXBMP
(
66
,
52
,
12
,
12
,
bitmap10
)
;
u8g
.
drawXBMP
(
82
,
52
,
12
,
12
,
bitmap11
)
;
u8g
.
setFont
(
u8g_font_9x15B
)
;
//设置字体
u8g
.
setPrintPos
(
50
,
24
)
;
//设置光标位置
u8g
.
print
(
Humidity
)
;
u8g
.
drawStr
(
70
,
24
,
"%"
)
;
u8g
.
setPrintPos
(
50
,
12
)
;
u8g
.
print
(
Temperature
)
;
u8g
.
setPrintPos
(
50
,
36
)
;
u8g
.
print
(
temp
)
;
u8g
.
drawStr
(
70
,
12
,
"C"
)
;
u8g
.
drawStr
(
70
,
36
,
"C"
)
;
u8g
.
drawStr
(
98
,
64
,
"!"
)
;
}
while
(
u8g
.
nextPage
(
)
)
;
|
这样,整个项目的框架算完成了,当然,后续还需要更多的改进,比如说数据的传输部分的稳定性,还有长串数据的收发问题……
可以移步至我的个人博客这里浏览更多内容