標題: 基于STM32的智能小車無線環(huán)境監(jiān)測系統(tǒng)(完整版資料) [打印本頁]

作者: SWJ_51    時間: 2018-6-3 23:08
標題: 基于STM32的智能小車無線環(huán)境監(jiān)測系統(tǒng)(完整版資料)
本文介紹了一款使用由意法半導體公司生產的STM32為核心控制器,在MDK4.70軟件開發(fā)平臺下設計開發(fā)的智能小車。文中介紹了整個設計的需求分析、方案選擇、硬件部分、軟件部分、傳感器的選擇與布局、電路板的安裝、以及整車的測試與評估。

本次設計最終采用STM32為主控制器,此款芯片功能強大,足以滿足整個設計的需求,選用最常用高靈敏度的紅外光電傳感器完成循跡功能,采用MG995舵機和HC-SR04超聲波模塊配合完成避障功能,采用MQ-2煙霧氣敏傳感器完成煙霧濃度探測功能,采用DHT11溫濕度傳感器模塊完成溫濕度探測功能,采用NRF24L01無線發(fā)射接收模塊完成與上位機之間的無線通信功能,采用SIM800C模塊完成與管理者手機通訊功能。程序經過多次測試和改進,能夠較健壯的運行。最終能夠很好地實現上述功能。

演示視頻:

智能小車無線環(huán)境監(jiān)測系統(tǒng)
SmartCar_NF2401
是遙控板程序
SmartCar_Update
是小車程序

小車實現了 循跡、蔽障、檢測濕度、溫度、煙霧、并通過NF2401傳給遙控板,遙控板顯示出溫度濕度煙霧狀態(tài)等。遙控板可以可控制小車任意行走或者執(zhí)行任意模式。小車還實現SIM800發(fā)短信和打電話功能,當溫度、濕度、煙霧狀態(tài)超標時,給指定手機發(fā)短信,打電話!

單片機源程序如下:
  1. #include "led.h"
  2. #include "delay.h"
  3. #include "key.h"
  4. #include "sys.h"
  5. #include "lcd.h"
  6. #include "usart.h"         
  7. #include "24l01.h"          
  8. #include "stm32f10x_tim.h"
  9. #include "stm32f10x_rcc.h"


  10. u16 Change_mode_cnt=0;//變換模式計數
  11. u8 Change_mode=1; //改變發(fā)送接收模式
  12. u8 NRF2401_Rxbuf[10];
  13. u8 NRF2401_Txbuf[10];


  14. void TIM1_INIT()
  15. {
  16.         TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
  17.           NVIC_InitTypeDef NVIC_InitStructure;
  18. //??TIM2
  19. RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1, ENABLE); //????
  20.    /* TIM2 configuration */
  21.    TIM_TimeBaseStructure.TIM_Period=10-1;//??,??????ARR??
  22.    TIM_TimeBaseStructure.TIM_Prescaler=899;//???????1Mhz
  23.    TIM_TimeBaseStructure.TIM_ClockDivision=0x00;
  24.    TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up;//????
  25.    TIM_TimeBaseInit(TIM1,&TIM_TimeBaseStructure);//???
  26.    
  27.   
  28.    
  29.    /* Clear TIM2 update pending flag */
  30.    TIM_ClearFlag(TIM1,TIM_FLAG_Update);//??????
  31.    
  32.    /* Enable TIM2 Update interrupt */
  33.    TIM_ITConfig(TIM1,TIM_IT_Update,ENABLE);//????
  34.          
  35.          
  36.           
  37.      //??TIM3????
  38.      NVIC_InitStructure.NVIC_IRQChannel=TIM1_UP_IRQn;
  39.      NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=1;//??????1
  40.      NVIC_InitStructure.NVIC_IRQChannelSubPriority=0;//?????0
  41.      NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;
  42.      NVIC_Init(&NVIC_InitStructure);
  43.                  
  44.                   /* TIM2 enable counter */
  45.    TIM_Cmd(TIM1,ENABLE);//?????


  46. }

  47. int main(void)
  48. {         
  49.        
  50.        
  51.         u8 key;                     
  52.         delay_init();                     //延時函數初始化          
  53.         NVIC_Configuration();          //設置NVIC中斷分組2:2位搶占優(yōu)先級,2位響應優(yōu)先級
  54.         uart_init(9600);                 //串口初始化為9600
  55.         LED_Init();                             //LED端口初始化
  56.         LCD_Init();        //初始化LCD
  57.         KEY_Init();         //按鍵初始化       

  58.         NRF24L01_Init();            //初始化NRF24L01
  59.           TIM1_INIT();
  60.         POINT_COLOR=RED;//設置字體為紅色
  61.         LCD_ShowString(60,50,200,16,16,"WarShip STM32");       
  62.         LCD_ShowString(60,70,200,16,16,"NRF24L01 TEST");                  
  63.         while(NRF24L01_Check())        //檢查NRF24L01是否在位.       
  64.         {
  65.                 LCD_ShowString(60,90,200,16,16,"NRF24L01 Error");
  66.                 delay_ms(200);
  67.                 LCD_Fill(60,130,239,130+16,WHITE);
  68.                 delay_ms(200);
  69.         }
  70.         LCD_ShowString(60,90,200,16,16,"NRF24L01 OK");
  71.         NRF24L01_TX_Mode();
  72.                                                                           
  73.         //LCD_ShowString(60,130,200,16,16,"NRF24L01 OK");
  74.         //LCD_ShowNum(60,130,200,6,16);
  75.         POINT_COLOR=BLUE;//設置字體為藍色
  76.         while(1)
  77.         {
  78.          key=KEY_Scan(0);
  79.                 NRF2401_Txbuf[0]=1;
  80.     if(key==KEY_UP)
  81.                 NRF2401_Txbuf[1]=1;
  82.         else if(key==KEY_LEFT)
  83.                 NRF2401_Txbuf[1]=2;
  84.         else if(key==KEY_DOWN)
  85.                 NRF2401_Txbuf[1]=3;
  86.         else if(key==KEY_RIGHT)
  87.                 NRF2401_Txbuf[1]=4;
  88.         else;
  89.                
  90.                
  91.          if(Change_mode==0)//RX模式
  92.          {
  93.                 LCD_ShowString(60,110,200,16,16,"NRF24L01 RX_Mode");       
  94.                 LCD_ShowString(60,130,200,16,16,"Received DATA:");       
  95.                 NRF24L01_RX_Mode();       
  96.            while(1)                 
  97.                 {                                                                                   
  98.                         if(NRF24L01_RxPacket(NRF2401_Rxbuf)==0)//一旦接收到信息,則顯示出來.
  99.                         {
  100.                                 LCD_ShowString(60,150,200,16,16,"Temperature:");
  101.                                 LCD_ShowNum(160,150,NRF2401_Rxbuf[1],2,16);

  102.                                 LCD_ShowString(60,170,200,16,16,"Humidity:");
  103.                                 LCD_ShowNum(160,170,NRF2401_Rxbuf[2],2,16);

  104.                                 LCD_ShowString(60,190,200,16,16,"Smokestate:");
  105.                                 LCD_ShowNum(160,190,NRF2401_Rxbuf[3],1,16);
  106.                                 Change_mode=1;
  107.                        
  108.                         }
  109.               if(Change_mode)
  110.               break;                               
  111.                                     
  112.                 }
  113.         }
  114.         else//TX模式
  115.         {                                                            
  116.                 LCD_ShowString(60,110,200,16,16,"NRF24L01 TX_Mode");       
  117.                 NRF24L01_TX_Mode();
  118.                 while(1)
  119.                 {                                                              
  120.                         if(NRF24L01_TxPacket(NRF2401_Txbuf)==TX_OK)
  121.                         {       
  122.                                  LCD_ShowString(60,210,200,16,16,"Car_State:");
  123.                                   LCD_ShowNum(160,210,NRF2401_Txbuf[1],1,16);
  124.                                   Change_mode=0;                               
  125.                         }
  126.                         else;
  127.                
  128.                         if(!Change_mode)
  129.       break;                               
  130.                 }
  131.        
  132.           
  133.         }   
  134.        
  135. }
  136. }

  137. void TIM1_UP_IRQHandler(void)
  138. {
  139. TIM_ClearITPendingBit(TIM1, TIM_IT_Update);
  140.         Change_mode_cnt++;
  141.         if(Change_mode_cnt>50)
  142.         {
  143.                 Change_mode_cnt=0;
  144.                 //Change_mode=~Change_mode;
  145.         }
  146. }
  147.        

復制代碼




所有資料51hei提供下載:
基于STM32的智能小車無線環(huán)境監(jiān)測系統(tǒng)(完整版).zip (18.53 MB, 下載次數: 259)



作者: qzcx    時間: 2019-1-16 22:43
很好啊很需求這個東西
作者: flyMQL    時間: 2019-12-8 19:38
拿走了,謝謝。




歡迎光臨 (http://www.torrancerestoration.com/bbs/) Powered by Discuz! X3.1