当前位置:   article > 正文

【嵌入式项目】基于ARM+Linux的车载系统(完整工程资料源码)

【嵌入式项目】基于ARM+Linux的车载系统(完整工程资料源码)

        基于ARM+Linux的车载系统演示效果

基于ARM+Linux的车载系统

前言:

        本项目计划主要应用于家用,办公等领域轿车中实施的基于物联网云平台的车载系统项目,既能够为车主在行驶过程中提供舒适的体验,又能提供一定的安全保障。   

目录:

        基于ARM+Linux的车载系统演示效果

前言:

目录:

一、系统方案

1.1 项目背景

1.2 项目特性

1.2.1 安全性

1.2.2 实用性

1.2.3 美观性

1.2.1 实用性

1.3 落地应用范例

二、功能与特色

2.1 项目功能

2.1.1 基本功能

2.1.2创新功能

2.2 项目特色

三、实现原理

3.1 核心框架

3.2 模块原理

3.2.1 陀螺仪模块

3.2.2 温度传感器模块

3.3 功能开发

3.3.1 UI界面开发

3.3.2 上位机APP开发

3.3.3 定位功能实现

3.3.4 底层驱动实现

3.4 QT部分源码

3.5 电路原理图: 

3.5.1 短信模块

3.5.2 红外传感器

3.6 APP页面 

四、项目框图

4.1 具体框图

4.1.1 硬件框图

4.1.2 软件流程图

4.2 开发目标

3.2.1 APP开发目标

3.2.2 UI界面开发目标

3.2.3 安全保障实现

五、系统测试方案及结果

5.1 系统测试方案

5.2 测试结果

5.2.1 主界面测试

5.2.2 汽车倾倒测试

5.2.3 温度过高测试

5.2.4 APP测试

5.2.5 音乐播放器测试

 六、实物演示

6.1 图片展示

6.2 实物展示 

 资源链接:毕设&竞赛&项目&实训-基于ARM+Linux的车载系统(完整工程代码用户开发手册)资源-CSDN文库

资料详情:

资源总文件夹:

电路图: 

数据:

应用程序: 

源程序 

用户手册:


 

一、系统方案

1.1 项目背景

        本项目在实现了基本的功能包括实时时钟,天气预报,车内温湿度获取,照片显示,音乐播放器等功能还增加了汽车倾倒短信报警,APP数据互传,温度过高报警等功能,其中控制方面通过APP,触摸屏两种方式对车载系统的控制与数据显示,且能够将当前车内的环境与信息显示在触摸屏与APP上,并搭配温度传感器,陀螺仪等模块实现基本的智能化数据收集,搭配上GPS模块与短信模块,实现汽车倾倒时将准确经纬度信息发送至指定的用户手机上。部署在华为云服务器上实现远程数据通信与控制,使人们能够无距离限制地查看当前汽车所处的准确经纬度信息与当前车内的环境,通过网络模块,获取当前的网络时间与未来五天的天气情况,能够方便车主更好地预防位置的天气变化,提高了生活和事业上的效率,并且在车载系统中提供了音乐播放器功能,不仅实现了市面上存在的音乐播放器的所有功能,还提高了UI界面的美观性。通过上述功能的全方位服务,不仅实现了汽车在行驶过程中舒适的体验,更提高了车主的安全保障,真正让车主放心,家人安心的智能车载系统。

1.2 项目特性

1.2.1 安全性

        该系统不仅能保证车主在形式过程中安全地驾驶,并且因为加上了短信模块与GPS模块,通过姿态传感器检测当前汽车行驶的状态,当检测到汽车倾倒时,就可以立即通过短信模块,将当前的GPS信息,即经纬度信息发送给指定的用户,能够让对方立即接收到车祸的信息,并且能够及时地进行报警与打电话急救,这极大地保证了用户的安全性,并且加上网络模块,在车载系统中添加APP互传功能,当用户登录APP时,就可以随时查看当前汽车所处的位置与车内信息,如果用户发现异常时,就可以即使做出处理

1.2.2 实用性

        通过网络模块的帮助,用户能够实时查看车内信息以及汽车的形式状态,无论是汽车在行驶过程中还是停下,或是进入隧道,用户都可以通过手机APP,实时地查看汽车。

1.2.3 美观性

        通过QT实现的UI界面,在完成基本的汽车车载系统的功能下还尽可能的美化界面,QT作为嵌入式上位机设计软件,是市面上最常见的UI界面设计软件,能够满足大部分的界面的设计,并且,也能够保证所有的功能正常运行。

1.2.1 实用性

        该车载系统不仅能够完成危险报警与APP数据互传控制,在极尽美观的基础上,还完成了车载系统该有的功能,包括音乐播放器,图片显示,天气预报获取,车内温湿度查看等多种功能。

1.3 落地应用范例

        在如今许多家庭都已经买车的基础上,车载系统作为汽车必备的功能,无论是上百万元的高档车还是几万的家用型轿车,都存在着车载系统,因此该项目是被市场普遍认可的,市场接受能力极高。

        在台湾车载资通讯产业2012年的产值约为4,026亿新台币。透过经济部之推动协助,台湾产业于2015年时达成突破6,000亿元年产值的目标。进而整合ITS/Telematics创新技术应用,提供全面“智慧化交通运输服务”,进行整体交通网络与跨运具之计划,建立智慧车载系统,达成流畅交通路网服务与无缝隙智慧旅运生活 [1]  。此外,台湾产业界近年来亦积极投入车联网智慧车载产品之研发,如科技大厂华硕(ASUS)、宏碁(ACER)与新创公司谛诺科技(ADENOVO)...等均争相投入这块新蓝海。

        在国际中由全球移动通信系统协会(GSMA)近期发布的报告指出,从2012年原先的130亿欧元(5千亿台币),预估到2018年全球车载资通讯系统的市场规模将达到约390亿欧元(新台币1.5兆元),显示智慧联网结合车载资通讯系统之商机正逐年翻倍成长。

二、功能与特色

2.1 项目功能

2.1.1 基本功能

(1)音乐播放器:车载系统中的音乐播放器是最常见的功能,因此该项目中,音乐播放器也作为主要的项目开发进行,不仅摆脱了传统音乐播放器中丑陋的UI界面与操作难,更提升了音质与蓝牙音乐播放

(2)实时时钟:车载系统中,通过网络模块,获取当前的北京时间,方便车主实时查看时间,安排生活或办公的计划,并且,可以设置提醒功能,当某个时间需要做某事时,可以设定提醒功能,方便日常生活和工作的安排

(3)照片显示:在车载系统中,可以存放车主的照片,并且选择自己喜欢的照片作为车载系统的主页

2.1.2创新功能

(1)汽车倾倒短信报警:通过姿态检测模块,实时检测汽车的姿态,当检测到汽车发生倾倒时,及时地通过短信模块,将当前的GPS信息通过短信方式发送至指定的用户手机,使得车主能第一时间得到治疗,极大地保证了车主的安全。

(2)车内温湿度:车内温湿度信息的显示,不仅方便车主查看,及时地调整,还方便用户通过手机APP查看该信息,并且当检测到车内有人而温度又过高的情况下会触发短信报警以及蜂鸣器报警向路人请求援助,避免当有人在车内时,车门紧锁而导致温度过高发生的惨状

(3)上位机APP开发:手机APP的实现,使得车主的家人能够足不出户就可以观察到车主当前所处汽车的状态,并且当车主发生危险时,及时地进行报警,并且当用户在汽车内时,也可以通过APP实现切歌,更换相册等功能。

(4)天气预报显示:在车载系统中,提供了未来五天的天气情况显示,并且支持三个城市间的切换,当方便车主及时地根据未来几天的天气情况安排出行。

 

2.2 项目特色

        在完成市面上的车载系统基本的音乐播放器,实时时钟,天气预报等功能的实现的基础上,额外增加了温度过高报警,手机APP上位机实现,汽车倾倒报警,车载系统主界面DIY设计等功能,保护了车主的人身安全,并且增加了车载系统的美观度

三、实现原理

3.1 核心框架

        该项目硬件方面是选择了I.MX6ULL,操作系统使用Linux,并且在此基础上,增加了QT作为UI界面开发工具,I.MX6ULL作为ARM公司生产的A7系列芯片,能够满足该项目的开发需求,并且Linux作为项目的车载系统,因为其稳定,开源,兼容各种硬件的优点,是主流的嵌入式操作系统,而QT作为嵌入式开发上位机的应用程序,有大量的插件与开源库提供,为项目成功开发提供了稳定的报账

3.2 模块原理

3.2.1 陀螺仪模块

        陀螺仪模块所选择的是MPU6050,因为其便宜,功能稳定,使用I2C通信的特性,所以方便在项目开发中使用

3.2.2 温度传感器模块

        温湿度检测通过DHT11实现,该模块使用单总线通信,能够同时识别温湿度,并且占用IO资源少,精度高

3.3 功能开发

3.3.1 UI界面开发

        通过QT实现的车载系统界面的设计,该软件不仅在市面上得到了广泛的应用,还支持各平台的兼容性,因此可靠性得到了极大的保证,并且QT中还提供了多种UI界面的选择,也为车载系统UI界面美化设计提供了便利。

3.3.2 上位机APP开发

        手机上位机APP也是通过QT进行开发,因此能够完美地实现与车载系统的通信,无论是基本的数据传输还是车载系统控制,该APP都能过完美地实现。

3.3.3 定位功能实现

        通过GPS模块实现,该模块连接北斗系统,能够实时地获取当前模块所处的经纬度信息,并且通过串口,将数据传给车载系统与上位机中。

3.3.4 底层驱动实现

        该项目需要实现陀螺仪(MPU6050),蜂鸣器,DHT11,串口等底层驱动的实现,因为不同的模块所需要的底层驱动代码不同,而公用一个设备树,因此就需要将所有的驱动和设备树进行匹配,并且完成设备的初始化与注册。

3.4 QT部分源码

  1. #include "main_window.h"
  2. #include "ui_main_window.h"
  3. #include <QDebug>
  4. #include <QRect>
  5. #include <QToolButton>
  6. #include <QColor>
  7. #include <QMovie>
  8. #include <QTimer>
  9. #include <QtNetwork/QNetworkAccessManager>
  10. #include <QtNetwork/QNetworkRequest>
  11. #include <QtNetwork/QNetworkReply>
  12. #include <QtWidgets/QWidget>
  13. #include <QTextCodec>
  14. #include <QString>
  15. #include <QUrl>
  16. #include <QThread>
  17. #include <QMediaPlayer>
  18. #include <sys/types.h>
  19. #include <sys/stat.h>
  20. #include <fcntl.h>
  21. #include <unistd.h>
  22. #include <QString>
  23. #include "mpu6050.h"
  24. Main_Window::Main_Window(QWidget *parent) :
  25. QWidget(parent),
  26. ui(new Ui::Main_Window)
  27. {
  28. ui->setupUi(this);
  29. this->Beep_page = new Beep_window;//实例化led窗口
  30. this->Music_page = new Music_window;
  31. this->Pichoose_page = new Pichoose_window;
  32. this->Map_page = new Map_window;
  33. this->dht11_obj = new dht11;
  34. this->mpu6050_obj = new Mpu6050;
  35. /*dht11与mpu6050的初始化*/
  36. ui->dht11temp->setText("x");
  37. ui->dht11hum->setText("x");
  38. mpu6050_dht11_init();
  39. ui->change->installEventFilter(this);
  40. time_weather_data my_data(this);
  41. weather_init(city_id);
  42. my_data.get_time(&(this->year),&(this->month),&(this->day),&(this->hour),&(this->minute),&(this->second),&(this->time_flag));
  43. timer_obj = new QTimer(this);
  44. connect(this->timer_obj,&QTimer::timeout,[=](){
  45. this->second++;
  46. /*更新dht11和mpu6050的值*/
  47. if(this->second%2==0){
  48. show_mpu6050_dht11();
  49. }
  50. if(old_picture_flag != picture_flag){
  51. QPixmap pbuty;
  52. //QString str = QString::number();
  53. picture_name.append(Pichoose_page->PicturePath);
  54. picture_name.append(Pichoose_page->fileList.at(picture_flag));
  55. pbuty.load(picture_name);
  56. ui->gif_label->setPixmap(pbuty);
  57. ui->gif_label->setScaledContents(true);
  58. picture_name = "\0";
  59. old_picture_flag = picture_flag;
  60. }
  61. if(this->second >= 60){
  62. this->second = 0;
  63. this->minute++;
  64. // weather_init();
  65. if(this->minute >=60){
  66. this->minute = 0;
  67. this->hour++;
  68. if(this->hour>=24){
  69. this->hour = 0;
  70. this->day++;
  71. weather_init(city_id);
  72. //接下来做月份,闰年判断,不想写了
  73. }
  74. }
  75. update();
  76. }
  77. });
  78. this->show_mainwindow();
  79. timer_obj->start(1000);
  80. }
  81. void Main_Window::show_mpu6050_dht11(){
  82. int ret = dht11_obj->read_dht11_data(dht11_obj->dht11_temp,dht11_obj->dht11_hum);
  83. if(ret == 0){
  84. QString str1(dht11_obj->dht11_temp);
  85. ui->dht11temp->setText(str1);
  86. QString str2(dht11_obj->dht11_hum);
  87. ui->dht11hum->setText(str2);
  88. }
  89. // qDebug()<<"read mpu6050\r\n";
  90. mpu6050_obj->read_mpu6050_data(mpu6050_obj->acce_x,mpu6050_obj->acce_y,mpu6050_obj->acce_z,mpu6050_obj->gyro_x,mpu6050_obj->gyro_y,mpu6050_obj->gyro_z);
  91. QString str1(mpu6050_obj->acce_x);
  92. ui->accex->setText(str1);
  93. QString str2(mpu6050_obj->acce_y);
  94. ui->accey->setText(str2);
  95. QString str3(mpu6050_obj->acce_z);
  96. ui->accez->setText(str3);
  97. QString str4(mpu6050_obj->gyro_x);
  98. ui->gyrox->setText(str4);
  99. QString str5(mpu6050_obj->gyro_y);
  100. ui->gyroy->setText(str5);
  101. QString str6(mpu6050_obj->gyro_z);
  102. ui->gyroz->setText(str6);
  103. // qDebug()<<mpu6050_data<<"\r\n ok \r\n";
  104. }
  105. void Main_Window::mpu6050_dht11_init(){
  106. QPalette dht11_pe;
  107. dht11_pe.setColor(QPalette::WindowText,Qt::white);
  108. ui->dht11temp->setPalette(dht11_pe);
  109. ui->dht11hum->setPalette(dht11_pe);
  110. ui->accex->setPalette(dht11_pe);
  111. ui->accey->setPalette(dht11_pe);
  112. ui->accez->setPalette(dht11_pe);
  113. ui->gyrox->setPalette(dht11_pe);
  114. ui->gyroy->setPalette(dht11_pe);
  115. ui->gyroz->setPalette(dht11_pe);
  116. }
  117. void Main_Window::show_mainwindow(){
  118. QPalette pe;
  119. pe.setColor(QPalette::WindowText,Qt::white);
  120. QPixmap pic(":/picture/weather_window/切换.png");
  121. ui->change->setPixmap(pic);
  122. ui->change->setScaledContents(true);
  123. /*主菜单栏的右侧*/
  124. QPalette pex;
  125. pex.setColor(QPalette::ButtonText,Qt::white); //文字颜色
  126. pex.setColor(QPalette::Button ,QColor(0,64,128)); //背景色
  127. ui->Beep_but->setStyleSheet("QToolButton{background-color: rgb(0,64,128);border:2px groove gray;border-radius:10px;padding:2px 4px;border-style: outset;}"
  128. "QToolButton:hover{background-color:rgb(0,64,128); color: white;}"
  129. "QToolButton:pressed{background-color:rgb(0,54,108);border-style: inset;}");
  130. ui->Crema_but->setStyleSheet("QToolButton{background-color: rgb(0,64,128);border:2px groove gray;border-radius:10px;padding:2px 4px;border-style: outset;}"
  131. "QToolButton:hover{background-color:rgb(0,64,128); color: white;}"
  132. "QToolButton:pressed{background-color:rgb(0,54,108);border-style: inset;}");
  133. ui->Picture_but->setStyleSheet("QToolButton{background-color: rgb(0,64,128);border:2px groove gray;border-radius:10px;padding:2px 4px;border-style: outset;}"
  134. "QToolButton:hover{background-color:rgb(0,64,128); color: white;}"
  135. "QToolButton:pressed{background-color:rgb(0,54,108);border-style: inset;}");
  136. ui->Music_but->setStyleSheet("QToolButton{background-color: rgb(0,64,128);border:2px groove gray;border-radius:10px;padding:2px 4px;border-style: outset;}"
  137. "QToolButton:hover{background-color:rgb(0,64,128); color: white;}"
  138. "QToolButton:pressed{background-color:rgb(0,54,108);border-style: inset;}");
  139. ui->Beep_but->setPalette(pex);
  140. ui->Crema_but->setPalette(pex);
  141. ui->Picture_but->setPalette(pex);
  142. ui->Music_but->setPalette(pex);
  143. ui->Beep_but->setIcon(QIcon(":/picture/main_window/喇叭.png"));
  144. ui->Beep_but->setIconSize(QSize(201,105));
  145. ui->Beep_but->setText(QString::fromLocal8Bit("喇叭"));
  146. ui->Beep_but->setToolButtonStyle(Qt::ToolButtonTextUnderIcon);
  147. ui->Crema_but->setIcon(QIcon(":/picture/main_window/天气.png"));
  148. ui->Crema_but->setIconSize(QSize(201,105));
  149. ui->Crema_but->setText(QString::fromLocal8Bit("天气"));
  150. ui->Crema_but->setToolButtonStyle(Qt::ToolButtonTextUnderIcon);
  151. ui->Picture_but->setIcon(QIcon(":/picture/main_window/picture.png"));
  152. ui->Picture_but->setIconSize(QSize(201,105));
  153. ui->Picture_but->setText(QString::fromLocal8Bit("照片"));
  154. ui->Picture_but->setToolButtonStyle(Qt::ToolButtonTextUnderIcon);
  155. ui->Music_but->setIcon(QIcon(":/picture/main_window/music.png"));
  156. ui->Music_but->setIconSize(QSize(201,105));
  157. ui->Music_but->setText(QString::fromLocal8Bit("音乐"));
  158. ui->Music_but->setToolButtonStyle(Qt::ToolButtonTextUnderIcon);
  159. /*桌面照片*/
  160. QPixmap pbuty;
  161. QString str = QString::number(picture_flag);
  162. picture_name.append(Pichoose_page->PicturePath);
  163. picture_name.append(str);
  164. picture_name.append(".jpg");
  165. pbuty.load(picture_name);
  166. ui->gif_label->setPixmap(pbuty);
  167. ui->gif_label->setScaledContents(true);
  168. picture_name = "\0";
  169. }
  170. Main_Window::~Main_Window()
  171. {
  172. delete ui;
  173. }
  174. void Main_Window::paintEvent(QPaintEvent *event){
  175. QPainter my_painter(this);
  176. QPen pen(QColor(255,255,255));
  177. QFont font;
  178. font.setFamily("Microsoft YaHei");
  179. my_painter.setPen(pen);
  180. /*背景颜色*/
  181. my_painter.setBrush(QBrush(QColor(234,254,254)));
  182. my_painter.drawRect(this->rect());
  183. /*第一个框*/
  184. my_painter.setBrush(QBrush(QColor(0,64,128)));
  185. QRectF first_rect(9,9,330,151);
  186. my_painter.drawRoundedRect(first_rect, 10, 10);
  187. //时分妙
  188. font.setPointSize(60);
  189. my_painter.setFont(font);
  190. char strNum[5];
  191. sprintf(strNum,"%02d",this->hour);//整形到字符串的转换,并且自动补0
  192. my_painter.drawText(QRect(14,5,150,100),strNum);
  193. my_painter.drawText(QRect(105,0,20,100),":");
  194. sprintf(strNum,"%02d",this->minute);
  195. my_painter.drawText(QRect(130,5,150,100),strNum);
  196. font.setPointSize(30);
  197. my_painter.setFont(font);
  198. if(this->time_flag == 0) my_painter.drawText(QRect(235,50,100,100),"AM");
  199. else if(this->time_flag == 1) my_painter.drawText(QRect(235,50,100,100),"PM");
  200. //分界线
  201. my_painter.drawLine(QPoint(9,120),QPoint(338,120));
  202. //年月日
  203. font.setPointSize(16);
  204. my_painter.setFont(font);
  205. sprintf(strNum,"%04d",this->year);
  206. my_painter.drawText(QRect(16,125,100,100),strNum);
  207. my_painter.drawText(QRect(70,125,100,100),"年");
  208. sprintf(strNum,"%02d",this->month);
  209. my_painter.drawText(QRect(100,125,100,100),strNum);
  210. my_painter.drawText(QRect(130,125,100,100),"月");
  211. sprintf(strNum,"%02d",this->day);
  212. for(int i=1;i<=31;i++){
  213. if(i==this->day) my_painter.drawText(QRect(160,125,100,100),strNum);
  214. }
  215. my_painter.drawText(QRect(190,125,100,100),"日");
  216. /*第二个框*/
  217. QRectF second_rect(9,166,330,151);
  218. my_painter.drawRoundedRect(second_rect, 10, 10);
  219. //天气
  220. font.setPointSize(13);
  221. my_painter.setFont(font);
  222. // qputenv("QT_IM_MODULE", QByteArray("xyinput"));
  223. switch (this->weather) {
  224. case 0:{my_painter.drawPixmap(200,180,100,100,QPixmap(":/picture/main_window/weather/晴天.png"));
  225. my_painter.drawText(QRect(230,285,150,50),"晴天");
  226. }break;
  227. case 1:{my_painter.drawPixmap(200,180,100,100,QPixmap(":/picture/main_window/weather/雨天.png"));
  228. my_painter.drawText(QRect(230,285,150,50),"雨天");
  229. }break;
  230. case 2:{my_painter.drawPixmap(200,180,100,100,QPixmap(":/picture/main_window/weather/多云.png"));
  231. my_painter.drawText(QRect(230,285,150,50),"多云");
  232. }break;
  233. case 3:{my_painter.drawPixmap(200,180,100,100,QPixmap(":/picture/main_window/weather/阵雪.png"));
  234. my_painter.drawText(QRect(230,285,150,50),"雪天");
  235. }break;
  236. case 4:{my_painter.drawPixmap(200,180,100,100,QPixmap(":/picture/main_window/weather/阴天.png"));
  237. my_painter.drawText(QRect(230,285,150,50),"阴天");
  238. }break;
  239. }
  240. //地点
  241. font.setPointSize(25);
  242. my_painter.setFont(font);
  243. my_painter.drawText(QRect(14,166,150,50),Map_page->city_name);
  244. //温度
  245. font.setPointSize(45);
  246. my_painter.setFont(font);
  247. sprintf(strNum,"%02d",this->tempature);
  248. my_painter.drawText(QRect(14,210,150,80),strNum);
  249. my_painter.drawText(QRect(90,210,150,80),"°C");
  250. //第三个框
  251. QRectF third_rect(9,323,330,151);
  252. my_painter.drawRoundedRect(third_rect, 10, 10);
  253. font.setPointSize(13);
  254. my_painter.setFont(font);
  255. /* if(this->wifi_state == 1){
  256. my_painter.drawPixmap(50,340,100,100,QPixmap(":/picture/main_window/wifi.png"));
  257. my_painter.drawText(QRect(70,440,150,80),"已连接");
  258. }
  259. else{
  260. my_painter.drawPixmap(50,340,100,100,QPixmap(":/picture/main_window/没wifi.png"));
  261. my_painter.drawText(QRect(70,440,150,80),"未连接");
  262. }*/
  263. /* if(this->lanya_state == 0){
  264. my_painter.drawPixmap(200,340,100,100,QPixmap(":/picture/main_window/蓝牙-关.png"));
  265. my_painter.drawText(QRect(220,440,150,80),"未连接");
  266. }
  267. else{
  268. my_painter.drawPixmap(200,340,100,100,QPixmap(":/picture/main_window/蓝牙.png"));
  269. my_painter.drawText(QRect(220,440,150,80),"已连接");
  270. }*/
  271. }
  272. void Main_Window::on_Beep_but_clicked()
  273. {
  274. this->hide();
  275. this->Beep_page->show();
  276. this->GPIO_File->open(QIODevice::WriteOnly);
  277. this->GPIO_File->write("19",2);
  278. this->GPIO_File->close();
  279. }
  280. void Main_Window::on_Crema_but_clicked()
  281. {
  282. this->hide();
  283. this->Map_page->show();
  284. }
  285. void Main_Window::on_Music_but_clicked()
  286. {
  287. this->hide();
  288. this->Music_page->show();
  289. }
  290. void Main_Window::weather_init(QString id){
  291. QString webaddr="http://wthrcdn.etouch.cn/weather_mini?citykey=";
  292. webaddr.append(id);
  293. QNetworkRequest network_request;
  294. network_request.setUrl(QUrl(webaddr));
  295. connect(manage,SIGNAL(finished(QNetworkReply *)),this,SLOT(replyfinished(QNetworkReply*)));
  296. manage->get(network_request);
  297. }
  298. void Main_Window::replyfinished(QNetworkReply *reply)
  299. {
  300. QVariant status_code = reply->attribute(QNetworkRequest::HttpStatusCodeAttribute);
  301. if(reply->error() == QNetworkReply::NoError)
  302. {
  303. QString all = reply->readAll();
  304. // qDebug()<<all;
  305. weather_dispose(all);
  306. }
  307. reply->deleteLater();
  308. }
  309. void Main_Window::weather_dispose(QString str){
  310. QByteArray byte_array;
  311. QJsonParseError json_error;
  312. QJsonDocument document = QJsonDocument::fromJson(byte_array.append(str),&json_error);
  313. if(json_error.error == QJsonParseError::NoError)
  314. {
  315. QJsonObject obj = document.object();
  316. QJsonValue value = obj.take("desc");//qjsonvalue生成json文档中对象的值的对象
  317. if(value.toString() != "OK")
  318. {
  319. QMessageBox::warning(this,QString::fromLocal8Bit("抱歉"),QString::fromLocal8Bit("暂无此城市信息"),QMessageBox::Ok,QMessageBox::Ok);
  320. QMessageBox::warning(this,"抱歉","暂无此城市的天气情况",QMessageBox::Ok,QMessageBox::Ok);
  321. return;
  322. }
  323. QJsonValue da = obj.take("data");//获取data数据对象里面的值
  324. QString wendu = da.toObject().take("low").toString();
  325. this->tempature = wendu.toInt();
  326. QJsonValue da1 = da.toObject().take("forecast");
  327. QJsonArray array = da1.toArray();
  328. qDebug()<<array;
  329. QJsonValue value1 = array.at(0);
  330. QJsonObject obj1 = value1.toObject();
  331. QString type1 = obj1.take("type").toString();
  332. QString low1 = obj1.take("low").toString();
  333. QString high1 = obj1.take("high").toString();
  334. QString date1 = obj1.take("date").toString();
  335. this->Map_page->day1_l = low1.mid(3);
  336. this->Map_page->temp_now = low1.mid(3);
  337. QStringList list = low1.mid(3).split("℃");
  338. this->tempature = list.at(0).toInt();
  339. qDebug()<<list.at(0);
  340. this->Map_page->day1_h = high1.mid(3);
  341. this->Map_page->day1_time = date1;
  342. // qDebug()<<low1<< this->Map_page->day1_l<<high1<<high1.toInt();
  343. if(type1 == "晴"){
  344. this->Map_page->day1_tq = 0;
  345. this->Map_page->tq_flag = 0;
  346. }
  347. else if(type1 == "大雨" || type1 == "小雨"){
  348. this->Map_page->day1_tq = 1;
  349. this->Map_page->tq_flag = 1;
  350. }
  351. else if(type1 == "多云"){
  352. this->Map_page->day1_tq = 2;
  353. this->Map_page->tq_flag = 2;
  354. }
  355. else if(type1 == "小雪" ||type1 == "大雪"){
  356. this->Map_page->day1_tq = 3;
  357. this->Map_page->tq_flag = 3;
  358. }
  359. else if(type1 == "阴"){
  360. this->Map_page->day1_tq = 4;
  361. this->Map_page->tq_flag = 4;
  362. }
  363. QJsonValue value2 = array.at(1);
  364. QJsonObject obj2 = value2.toObject();
  365. QString type2 = obj2.take("type").toString();
  366. QString low2 = obj2.take("low").toString();
  367. QString high2 = obj2.take("high").toString();
  368. QString date2 = obj2.take("date").toString();
  369. this->Map_page->day2_l = low2.mid(3);
  370. // this->tempature = this->Map_page->temp_now;
  371. this->Map_page->day2_h = high2.mid(3);
  372. this->Map_page->day2_time = date2;
  373. if(type2 == "晴"){
  374. this->Map_page->day2_tq = 0;
  375. }
  376. else if(type2 == "小雨"||type2 == "大雨"){
  377. this->Map_page->day2_tq = 1;
  378. }
  379. else if(type2 == "多云"){
  380. this->Map_page->day2_tq = 2;
  381. }
  382. else if(type2 == "小雪"||type2 == "大雪"){
  383. this->Map_page->day2_tq = 3;
  384. }
  385. else if(type2 == "阴"){
  386. this->Map_page->day2_tq =4;
  387. }
  388. QJsonValue value3 = array.at(2);
  389. QJsonObject obj3 = value3.toObject();
  390. QString type3 = obj3.take("type").toString();
  391. QString low3 = obj3.take("low").toString();
  392. QString high3 = obj3.take("high").toString();
  393. QString date3 = obj3.take("date").toString();
  394. this->Map_page->day3_l = low3.mid(3);
  395. // this->tempature = this->Map_page->temp_now;
  396. this->Map_page->day3_h = high3.mid(3);
  397. this->Map_page->day3_time = date3;
  398. if(type3 == "晴"){
  399. this->Map_page->day3_tq = 0;
  400. }
  401. else if(type3 == "小雨"||type3 == "大雨"){
  402. this->Map_page->day3_tq = 1;
  403. }
  404. else if(type3 == "多云"){
  405. this->Map_page->day3_tq = 2;
  406. }
  407. else if(type3 == "小雪"||type3=="大雪"){
  408. this->Map_page->day3_tq = 3;
  409. }
  410. else if(type3 == "阴"){
  411. this->Map_page->day3_tq =4;
  412. }
  413. QJsonValue value4 = array.at(3);
  414. QJsonObject obj4 = value4.toObject();
  415. QString type4 = obj4.take("type").toString();
  416. QString low4 = obj4.take("low").toString();
  417. QString high4 = obj4.take("high").toString();
  418. QString date4 = obj4.take("date").toString();
  419. this->Map_page->day4_l = low4.mid(3);
  420. // this->tempature = this->Map_page->temp_now;
  421. this->Map_page->day4_h = high4.mid(3);
  422. this->Map_page->day4_time = date4;
  423. if(type4 == "晴"){
  424. this->Map_page->day4_tq = 0;
  425. }
  426. else if(type4 == "小雨"||type4 =="大雨"){
  427. this->Map_page->day4_tq = 1;
  428. }
  429. else if(type4 == "多云"){
  430. this->Map_page->day4_tq = 2;
  431. }
  432. else if(type4 == "小雪"||type4 =="大雪"){
  433. this->Map_page->day4_tq = 3;
  434. }
  435. else if(type4 == "阴"){
  436. this->Map_page->day4_tq =4;
  437. }
  438. QJsonValue value5 = array.at(4);
  439. QJsonObject obj5 = value5.toObject();
  440. QString type5 = obj5.take("type").toString();
  441. QString low5 = obj5.take("low").toString();
  442. QString high5 = obj5.take("high").toString();
  443. QString date5 = obj5.take("date").toString();
  444. this->Map_page->day5_l = low5.mid(3);
  445. // this->tempature = this->Map_page->temp_now;
  446. this->Map_page->day5_h = high5.mid(3);
  447. this->Map_page->day5_time = date5;
  448. if(type5 == "晴"){
  449. this->Map_page->day5_tq = 0;
  450. }
  451. else if(type5 == "小雨"||type5 == "大雨"){
  452. this->Map_page->day5_tq = 1;
  453. }
  454. else if(type5 == "多云"){
  455. this->Map_page->day5_tq = 2;
  456. }
  457. else if(type5 == "小雪"||type5 == "大雪"){
  458. this->Map_page->day5_tq = 3;
  459. }
  460. else if(type5 == "阴"){
  461. this->Map_page->day5_tq =4;
  462. }
  463. if(type1 == "晴"){
  464. this->weather = 0;
  465. }
  466. else if(type1 == "小雨"|| type1 =="大雨"){
  467. this->weather = 1;
  468. }
  469. else if(type1 == "多云"){
  470. this->weather = 2;
  471. }
  472. else if(type1 == "小雪"||type1 == "大雪"){
  473. this->weather = 3;
  474. }
  475. else if(type1 =="阴"){
  476. this->weather = 4;
  477. }
  478. }
  479. update();
  480. }
  481. bool Main_Window::eventFilter(QObject *obj, QEvent *event)
  482. {
  483. QPixmap pic;
  484. if (obj == ui->change)//指定某个QLabel
  485. {
  486. if (event->type() == QEvent::MouseButtonPress) //鼠标点击
  487. {
  488. QMouseEvent *mouseEvent = static_cast<QMouseEvent*>(event); // 事件转换
  489. if(mouseEvent->button() == Qt::LeftButton)
  490. {
  491. if(this->Map_page->city_flag == 0){
  492. this->Map_page->city_name = "厦门";
  493. city_id = "101230201";
  494. this->Map_page->city_flag=1;
  495. }
  496. else if(this->Map_page->city_flag == 1){
  497. this->Map_page->city_name = "泉州";
  498. this->Map_page->city_flag=2;
  499. city_id = "101230501";
  500. }
  501. else if(this->Map_page->city_flag == 2){
  502. this->Map_page->city_name = "兰州";
  503. this->Map_page->city_flag=0;
  504. city_id = "101160101";
  505. }
  506. weather_init(city_id);
  507. return true;
  508. }
  509. else
  510. {
  511. return false;
  512. }
  513. }
  514. else
  515. {
  516. return false;
  517. }
  518. }
  519. }
  520. void Main_Window::on_Picture_but_clicked()
  521. {
  522. this->hide();
  523. Pichoose_page->show();
  524. }

3.5 电路原理图: 

3.5.1 短信模块

87825463ae3d4b678cf26ea0890b1ea5.jpeg

3.5.2 红外传感器

dda633a6942d44e5aec4cbdfe482dd01.jpeg

3.6 APP页面 

339e9401ae8a461cbeb0f27bd44a606d.jpeg

 

四、项目框图

4.1 具体框图

4.1.1 硬件框图

c37678d13c274c7d8caffc11b18eb07a.png

4.1.2 软件流程图

c98ef68068b8405e93d5f7121008a0ce.png

4.2 开发目标

3.2.1 APP开发目标

        能够实现与车载系统的通信与控制功能,并保证不会发生误触断连,无效控制或数据出错的情况,并且尽量保证APP界面的美观

3.2.2 UI界面开发目标

        作为车载系统的UI界面,要在实现市面上车载系统所拥有的功能的基础上,增加界面的美观性,并且提供安全保障的额外功能

3.2.3 安全保障实现

        作为该项目的特色,需要在实现倾倒报警与温度过高报警功能的基础上,保证不会因为汽车上坡或者传感器检测错误而导致的误报警

五、系统测试方案及结果

5.1 系统测试方案

        1,通过对主界面图片的更改测试图片切换功能

        2,倾倒车载系统,测试能否获得到GPS信息,并把GPS信息发送到指定的手机上

        3,通过APP调节最高温度,测试当温度过高并且红外传感器检测到有人时能否触发蜂鸣器报警

        4,APP连接车载系统后,通过对音乐播放器的选择,测试能否和车载系统进行通信

        5,在车载系统中,在音乐播放器界面,测试音乐播放功能

5.2 测试结果

5.2.1 主界面测试

        在本项目中,车载系统的UI界面基本设计完成,并且在此基础上进行了一定的美化,并且增加了主界面自主选择功能,满足了车载系统自主DIY喜欢的界面

5.2.2 汽车倾倒测试

        在本项目中,能够时刻检测汽车的状态,并且当汽车发生倾倒时,立刻将当前的经纬度信息发送到用户手机,并且,能够避免清位晃动而导致的误报警

5.2.3 温度过高测试

        在本项目中,通过DHT11模块,能够获取温度信息,当温度高于最大温度车内又同时检测到有人时,就会触发蜂鸣器警报,其中最大温度可以通过手机APP进行设置,能够满足不同环境的要求

5.2.4 APP测试

        在本项目中,通过QT实现了手机APP的设计,能够满足与车载系统的基本通信与控制,控制与显示效果能够满足与其,不会发生中途断连的现象。

5.2.5 音乐播放器测试

        在本项目中,音乐播放器与市面上的音乐播放器相同,并且支持三种模式的切换,音量控制,列表播放等基础功能

 六、实物演示

6.1 图片展示

37b4efec7dc84bfab08f6cb8f32fb506.png

6.2 实物展示 

3174272f74484c6d8f65b9dc9d1edef8.png

 资源链接:毕设&竞赛&项目&实训-基于ARM+Linux的车载系统(完整工程代码用户开发手册)资源-CSDN文库

资料详情:

资源总文件夹:

c020dc3d00924cd1a20cef3ca794e09a.png

电路图: 

38dc404daa764918a51c333e46826f8d.png

数据:

6ce337cf0c9e4e59a47edd2c93e94c5b.png

 

应用程序: 

93240a06fde246c6b71c3129312fb548.png

源程序 

c7108b438f1f4a43a24e6f11a5676785.png 用户手册:

2affcaf4bed64b8dae682c21699776f2.png

 

声明:本文内容由网友自发贡献,转载请注明出处:【wpsshop】
推荐阅读
相关标签
  

闽ICP备14008679号