基于Arduino的开源自行车行车电脑Word文件下载.docx
- 文档编号:22658892
- 上传时间:2023-02-05
- 格式:DOCX
- 页数:29
- 大小:1.31MB
基于Arduino的开源自行车行车电脑Word文件下载.docx
《基于Arduino的开源自行车行车电脑Word文件下载.docx》由会员分享,可在线阅读,更多相关《基于Arduino的开源自行车行车电脑Word文件下载.docx(29页珍藏版)》请在冰豆网上搜索。
PIN0(RX)GPS模块TX
PIN1(TX)GPS模块RX
PIN2
PIN3Nokia5110LCD模块SCK
PIN4Nokia5110LCD模块MOSI
PIN5Nokia5110LCD模块A0
PIN6Nokia5110LCD模块Reset
PIN7
PIN8
PIN9
PIN10TF卡模块片选SS
PIN11TF卡模块MOSI
PIN12TF卡模块MISO
PIN13TF卡模块SCK
在这里,使用硬件Serial来作为GPSNMEA信号输入而不使用SoftSerial的好处是:
1.避免SoftSerial的兼容问题;
2.节省Flash的空间,减少SRAM使用。
而需要注意的是,Nokia5110LCD模块使用的是非标准的SPI通信协议,因此不能使用硬件SPI,而需要使用SoftSPI来驱动。
连接完成后就开始代码的编写工作了。
在这个项目中,GPS模块的驱动使用了TinyGPS库,LCD显示则使用了u8glib,TF卡模块驱动使用了SD库。
当然,为了节省SRAM,对库也进行了修改。
例如对TinyGPS的cardinal函数进行了修改,将数组使用PROGMEM进行存储,节省SRAM的空间。
整个系统的代码逻辑其实很简单。
初始化完成后,每秒检查一次GPS信号,如果信号正常则更新信息并在LCD屏幕更新显示的实时数据。
由于事后用于分析的数据不需要精确到每秒这样的级别,因此设定每5秒判断一次,如果当前位置和5秒前相比发生了一定的位移量则将数据记录到TF卡,以供分析。
为了简化数据存储的方式,数据以类似CSV的格式存储在TF卡上,文件名则为开始记录的日期,每一段数据以数据格式的版本号开始,每一行都是一笔数据。
格式如下:
日期,时间,连接的卫星个数,纬度,经度,海拔高度,时速,行驶方向,
流程图
下面是目前处于beta测试阶段的主程序的源代码,以供参考。
C代码:
1.#include"
U8glib.h"
2.#include<
SD.h>
3.#include<
TinyGPS.h>
4.#include<
avr/pgmspace.h>
5.
6.//使用PROGMEM存放GPS方向数组,节省SRAM
7.
prog_chard_0[]
PROGMEM=
"
N"
;
8.
prog_chard_1[]
NNE"
9.
prog_chard_2[]
NE"
10.
prog_chard_3[]
ENE"
11.
prog_chard_4[]
E"
12.
prog_chard_5[]
ESE"
13.
prog_chard_6[]
SE"
14.
prog_chard_7[]
SSE"
15.
prog_chard_8[]
S"
16.
prog_chard_9[]
SSW"
17.
prog_chard_10[]
SW"
18.
prog_chard_11[]
WSW"
19.
prog_chard_12[]
W"
20.
prog_chard_13[]
WNW"
21.
prog_chard_14[]
NW"
22.
prog_chard_15[]
NNW"
23.
24.
PROGMEM
const
char
*dir_table[]
=
25.
{
26.
d_0,
27.
d_1,
28.
d_2,
29.
d_3,
30.
d_4,
31.
d_5,
32.
d_6,
33.
d_7,
34.
d_8,
35.
d_9,
36.
d_10,
37.
d_11,
38.
d_12,
39.
d_13,
40.
d_14,
41.
d_15
42.
};
43.
44.
45.TinyGPSgps;
46.U8GLIB_PCD8544u8g(3,
4,
99,
5,
6);
//SPICom:
SCK=3,MOSI=4,CS=永远接地,A0=5,Reset=6
47.FilemyFile;
48.
49.booleansderror=
false;
//TF卡状态
50.char
logname[13];
//记录文件名
51.booleanwritelog=
true;
//是否要记录当前数据到TF卡标志
52.booleanrefresh=
//是否要更新液晶显示标志
53.booleanfinish_init=
//初始化完成标志
54.
55.bytesatnum=0;
//连接上的卫星个数
56.float
flat,flon,spd,alt,oflat,oflon;
//GPS信息,经纬度、速度、高度、上一次的经纬度
57.unsigned
long
age;
//GPS信息fixage
58.int
year;
//GPS信息年
59.bytemonth,day,hour,minute,second,hundredths;
//GPS信息时间信息
60.char
crs[4];
//GPS信息行驶方向
61.char
sz[10];
//文本信息
62.bytecnt=0;
//循环计数器
63.
64.
65.static
void
gpsdump(TinyGPS&
gps);
66.static
boolfeedgps();
67.static
print_date(TinyGPS&
68.static
print_satnum(TinyGPS&
69.static
print_pos(TinyGPS&
70.static
print_alt(TinyGPS&
71.static
print_speed(TinyGPS&
72.static
print_course(TinyGPS&
73.static
String
float2str(float
val,bytelen);
74.
75.
76.//AVR定时器,每秒触发
77.ISR(TIMER1_OVF_vect)
{
78.
TCNT1=0x0BDC;
//setinitialvaluetoremovetimeerror(16bitcounterregister)
79.
if
(finish_init)
refresh=
//在完成初始化后,将刷新显示标志设为true
80.}
81.
82.
83.void
setup()
84.{
85.
86.
finish_init=
87.
88.
//设置并激活AVR计时器
89.
TIMSK1=0x01;
//启用全局计时器中断
90.
TCCR1A=0x00;
//normaloperationpage148(mode0);
91.
//setinitialvaluetoremovetimeerror(16bitcounterregister)
92.
TCCR1B=0x04;
//启动计时器
93.
94.
pinMode(10,OUTPUT);
95.
96.
oflat=
0;
97.
oflon=
98.
logname[0]='
'
99.
100.
Serial.begin(9600);
//GPS模块默认输出9600bps的NMEA信号
101.
102.
u8g.setColorIndex
(1);
//设置LCD显示模式,黑白
103.
u8g.setFont(u8g_font_04b_03br);
//字体
104.
105.
//TF卡的片选端口是10
106.
(!
SD.begin(10))
107.
sderror=
108.
}
109.
110.
//初始化完成
111.
112.}
113.
114.void
loop()
115.{
116.
//读取并分析GPS数据
117.
feedgps();
118.
//刷新显示
119.
(refresh)
120.
121.
cnt%=10;
122.
writelog=
123.
124.
u8g.firstPage();
125.
do{
126.
gpsdump(gps);
127.
u8g.setPrintPos(70,48);
128.
u8g.print(
cnt);
129.
}
while
(
u8g.nextPage()
);
130.
131.
//每5秒且GPS信号正常时将数据记录到TF卡
132.
(cnt%
5
==
0
&
writelog)
133.
134.
logEvent();
135.
136.
137.
//刷新完毕,更新秒计数器
138.
refresh=
139.
cnt++;
140.
141.}
142.
143.static
gps)
144.{
145.
print_satnum(gps);
146.
print_date(gps);
147.
print_pos(gps);
148.
print_speed(gps);
149.
print_alt(gps);
150.
print_course(gps);
151.}
152.
153.//更新并显示卫星个数
154.static
155.{
156.
satnum=gps.satellites();
157.
satnum!
=TinyGPS:
:
GPS_INVALID_SATELLITES){
158.
u8g.setPrintPos(
46,
159.
u8g.print(satnum);
160.
writelog&
=
161.
162.
else
163.
u8g.drawStr(
10,
15,F("
gTrackingSystem"
));
164.
22,
23,F("
build2506"
165.
0,
34,
2)
?
F("
Searching..."
)
"
166.
//u8g.drawStr(7,48,F("
167.
168.
169.
feedgps();
170.}
171.
172.//更新并显示GPS经纬度信息
173.static
174.{
175.
gps.f_get_position(&
flat,&
flon,&
age);
176.
177.
(flat!
GPS_INVALID_F_ANGLE
flon!
TinyGPS:
GPS_INVALID_F_ANGLE)
178.
u8g.setPrintPos(0,40);
179.
u8g.print(float2str(flon,8));
180.
u8g.print(F("
:
181.
u8g.print(float2str(flat,8));
182.
183.
184.
else
185.
186.
187.
188.}
189.
190.//更新并显示GPS高度信息
191.static
192.{
193.
alt=gps.f_altitude();
194.
195.
(alt!
GPS_INVALID_F_ALTITUDE){
196.
u8g.setPrintPos(0,48);
197.
Alt:
198.
u8g.print(float2str(alt,5));
199.
200.
201.
202.
203.
204.
205.
206.}
207.
208.//更新并显示行驶方向
209.static
210.{
211.
(gps.f_course()
==TinyGPS:
GPS_INVALID_F_ANGLE)
212.
213.
214.
215.
//从PROGMEM中读取数组中的字符串
216.
strcpy_P(crs,
(char*)pgm_read_word(&
(dir_table[gps.cardinal(gps.f_course())])));
217.
u8g.setPrintPos(60,6);
218.
u8g.print(crs);
219.
220.
221.}
222.
223.//更新并显示GPS时间
224.static
225.{
226.
gps.crack_datetime(&
year,&
month,&
day,&
hour,&
minute,&
second,&
hundredths,&
227.
(age!
GPS_INVALID_AGE
month>
day>
0)
228.
229.
230.
sprintf(sz,
%02d"
((hour+8)
%
24));
//显示北京时间GMT+8
231.
u8g.print(sz);
232.
11,
233.
u8g.print(second%
2
234.
u8g.setPrintPos(15,6);
235.
minute);
236.
237.
238.
239.
240.
241.
242.}
243.
2
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 基于 Arduino 源自 行车 电脑