1.項目設計簡介
本項目用瑞薩的mcu作為主控,兩個編碼電機作為動力裝置,一個萬向輪提高車子的機動性、搭載藍牙模塊、DHT11模塊、火焰傳感器模塊、WiFi模塊,實現的功能如下:
①在手機上APP界面按下相應的指令能夠控制小車的運動和獲取當前環境的溫濕度
②火焰靠近火焰傳感器模塊,蜂鳴器會報警
③是否有火源的信息,可根據火焰傳感器的檢測,在0.96寸OLED屏幕上實時顯示上傳的信息
視頻演示
小車整體實物圖
2.所用到的模塊
2.1火焰傳感器模塊
1、可以檢測火焰或者波長在760納米~1100納米范圍內的光源,打火機測試火焰距離為80cm,對火焰越大,測試距離越遠
2、探測角度60度左右,對火焰光譜特別靈敏
3、靈敏度可調(圖中藍色數字電位器調節)
4、比較器輸出,信號干凈,波形好,驅動能力強,超過15mA
5、配可調精密電位器調節靈敏度
6、工作電壓3.3V-5V
DO引腳輸出數字信號
2.20.96寸oled屏幕
?
0.96 寸oled屏幕,利用iic通信總線,可以很好的傳輸和顯示數據
2.3DHT11模塊
該模塊使用奧松DHT11數字溫濕度傳感器,DHT11是一款含有已校準數字信號輸出的溫濕度復合傳感器。它應用專用的數字模塊采集技術和溫濕度傳感技術,確保產品具有可靠的穩定性,響應快,抗干擾能力強。傳感器包括一個高分子電阻式感濕元件和一個NTC測溫元件,并與一個高性能8位單片機相連接,通過單總線與微處理器通訊,只需要一根線。
2.4藍牙模塊
利用串口就能發送想要的數據。
2.5手機端控制界面
按下相應的指令能夠控制小車的運動和獲取當前環境的溫濕度
2.6 電機驅動模塊
采用的整體化設計,便于接線。
3.程序設計
3.1 oled屏幕采用硬件iic
左右滑動查看更多
//================================================================================================== // 實現功能: 0.96寸OLED 接口演示例程 // 說明: // GND 電源地 // VCC 接5V或3.3v電源 // SCL 接P505(SCL6) // SDA 接P506(SDA6) //==================================================================================================------------------------------------------------------------------------ // | - | - | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 //================================================================================================== //================================================================================================== #include "oled.h" #include "stdlib.h" #include "oledfont.h" #include "math.h" #include "hal_data.h" extern fsp_err_t err; extern int timeout_ms; extern i2c_master_event_t i2c_event ; //OLED的顯存 //存放格式如下. //[0]0 1 2 3 ... 127 //[1]0 1 2 3 ... 127 //[2]0 1 2 3 ... 127 //[3]0 1 2 3 ... 127 //[4]0 1 2 3 ... 127 //[5]0 1 2 3 ... 127 //[6]0 1 2 3 ... 127 //[7]0 1 2 3 ... 127 //================================================================================================== // 函數功能: IIC外設驅動函數部分 // 函數標記: Write_IIC_Command // 函數說明: 無 //------------------------------------------------------------------------------------------------- // | - | - | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 //================================================================================================== void Write_IIC_Command(unsigned char IIC_Command) { uint8_t ii[2]={0x00,0x00}; ii[1] = IIC_Command; err = R_SCI_I2C_Write(&g_sci6_i2c_ctrl, ii, 0x02, true); assert(FSP_SUCCESS == err); /* Since there is nothing else to do, block until Callback triggers*/ //while ((I2C_MASTER_EVENT_TX_COMPLETE != i2c_event) && timeout_ms) while ((I2C_MASTER_EVENT_TX_COMPLETE != i2c_event) && timeout_ms>0) { R_BSP_SoftwareDelay(100U, BSP_DELAY_UNITS_MICROSECONDS); timeout_ms--; } if (I2C_MASTER_EVENT_ABORTED == i2c_event) { __BKPT(0); } /* Read data back from the I2C slave */ i2c_event = I2C_MASTER_EVENT_ABORTED; timeout_ms = 100000; } //================================================================================================== // 函數功能: IIC外設驅動函數部分 // 函數標記: Write_IIC_Data // 函數說明: 無 //------------------------------------------------------------------------------------------------- // | - | - | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 //================================================================================================== void Write_IIC_Data(unsigned char IIC_Data) { uint8_t ii[2]={0x40,0x00}; ii[0] = 0x40; ii[1] = IIC_Data; err = R_SCI_I2C_Write(&g_sci6_i2c_ctrl, ii, 0x02, true); assert(FSP_SUCCESS == err); /* Since there is nothing else to do, block until Callback triggers*/ //while ((I2C_MASTER_EVENT_TX_COMPLETE != i2c_event) && timeout_ms) while ((I2C_MASTER_EVENT_TX_COMPLETE != i2c_event) && timeout_ms>0) { R_BSP_SoftwareDelay(100U, BSP_DELAY_UNITS_MICROSECONDS); timeout_ms--; } if (I2C_MASTER_EVENT_ABORTED == i2c_event) { __BKPT(0); } /* Read data back from the I2C slave */ i2c_event = I2C_MASTER_EVENT_ABORTED; timeout_ms = 100000; } //================================================================================================== // 函數功能: IIC外設驅動函數部分 // 函數標記: Write_IIC_Data // 函數說明: 無 //------------------------------------------------------------------------------------------------- // | - | - | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 //================================================================================================== void OLED_WR_Byte(unsigned dat,unsigned cmd) { if(cmd) { Write_IIC_Data(dat); } else { Write_IIC_Command(dat); } } /******************************************** // fill_Picture ********************************************/ void fill_picture(unsigned char fill_Data) { unsigned char m,n; for(m=0;m<8;m++) { OLED_WR_Byte(0xb0+m,0); //page0-page1 OLED_WR_Byte(0x00,0); //low column start address OLED_WR_Byte(0x10,0); //high column start address for(n=0;n<128;n++) { OLED_WR_Byte(fill_Data,1); } } } /***********************Delay****************************************/ void Delay_50ms(unsigned int Del_50ms) { unsigned int m; for(;Del_50ms>0;Del_50ms--) for(m=6245;m>0;m--); } void Delay_1ms(unsigned int Del_1ms) { unsigned char j; while(Del_1ms--) { for(j=0;j<123;j++); } } //坐標設置 void OLED_Set_Pos(unsigned char x, unsigned char y) { OLED_WR_Byte(0xb0+y,OLED_CMD); OLED_WR_Byte(((x&0xf0)>>4)|0x10,OLED_CMD); OLED_WR_Byte((x&0x0f),OLED_CMD); } //開啟OLED顯示 void OLED_Display_On(void) { OLED_WR_Byte(0X8D,OLED_CMD); //SET DCDC命令 OLED_WR_Byte(0X14,OLED_CMD); //DCDC ON OLED_WR_Byte(0XAF,OLED_CMD); //DISPLAY ON } //關閉OLED顯示 void OLED_Display_Off(void) { OLED_WR_Byte(0X8D,OLED_CMD); //SET DCDC命令 OLED_WR_Byte(0X10,OLED_CMD); //DCDC OFF OLED_WR_Byte(0XAE,OLED_CMD); //DISPLAY OFF } //清屏函數,清完屏,整個屏幕是黑色的!和沒點亮一樣!!! void OLED_Clear(void) { u8 i,n; for(i=0;i<8;i++) { OLED_WR_Byte(0xb0+i,OLED_CMD); //設置頁地址(0~7) OLED_WR_Byte(0x00,OLED_CMD); //設置顯示位置—列低地址 OLED_WR_Byte(0x10,OLED_CMD); //設置顯示位置—列高地址 for(n=0;n<128;n++)OLED_WR_Byte(0,OLED_DATA); } //更新顯示 } void OLED_On(void) { u8 i,n; for(i=0;i<8;i++) { OLED_WR_Byte (0xb0+i,OLED_CMD); //設置頁地址(0~7) OLED_WR_Byte (0x00,OLED_CMD); //設置顯示位置—列低地址 OLED_WR_Byte (0x10,OLED_CMD); //設置顯示位置—列高地址 for(n=0;n<128;n++)OLED_WR_Byte(1,OLED_DATA); } //更新顯示 } //在指定位置顯示一個字符,包括部分字符 //x:0~127 //y:0~63 //mode:0,反白顯示;1,正常顯示 //size:選擇字體 16/12 void OLED_ShowChar(u8 x,u8 y,u8 chr,u8 Char_Size) { unsigned char c=0,i=0; c=chr-' ';//得到偏移后的值 if(x>Max_Column-1){x=0;y=y+2;} if(Char_Size ==16) { OLED_Set_Pos(x,y); for(i=0;i<8;i++) OLED_WR_Byte(F8X16[c*16+i],OLED_DATA); OLED_Set_Pos(x,y+1); for(i=0;i<8;i++) OLED_WR_Byte(F8X16[c*16+i+8],OLED_DATA); } else { OLED_Set_Pos(x,y); for(i=0;i<6;i++) OLED_WR_Byte(F6x8[c],OLED_DATA); } } //m^n函數 u32 oled_pow(u8 m,u8 n) { u32 result=1; while(n--)result*=m; return result; } //顯示2個數字 //x,y :起點坐標 //len :數字的位數 //size:字體大小 //mode:模式 0,填充模式;1,疊加模式 //num:數值(0~4294967295); void OLED_ShowNum(u8 x,u8 y,u32 num,u8 len,u8 size2) { u8 t,temp; u8 enshow=0; for(t=0;t{ temp=(num/oled_pow(10,len-t-1))%10; if(enshow==0&&t<(len-1)) { if(temp==0) { OLED_ShowChar(x+(size2/2)*t,y,' ',size2); continue; }else enshow=1; } OLED_ShowChar(x+(size2/2)*t,y,temp+'0',size2); } } //顯示一個字符號串 void OLED_ShowString(u8 x,u8 y,u8 *chr,u8 Char_Size) { unsigned char j=0; while (chr[j]!='?') { OLED_ShowChar(x,y,chr[j],Char_Size); x+=8; if(x>120){x=0;y+=2;} j++; } } //顯示漢字 void OLED_ShowCHinese(u8 x,u8 y,u8 no) { u8 t,adder=0; OLED_Set_Pos(x,y); for(t=0;t<16;t++) { OLED_WR_Byte(Hzk[2*no][t],OLED_DATA); adder+=1; } OLED_Set_Pos(x,y+1); for(t=0;t<16;t++) { OLED_WR_Byte(Hzk[2*no+1][t],OLED_DATA); adder+=1; } } /***********功能描述:顯示顯示BMP圖片128×64起始點坐標(x,y),x的范圍0~127,y為頁的范圍0~7*****************/ void OLED_DrawBMP(unsigned char x0, unsigned char y0,unsigned char x1, unsigned char y1,unsigned char BMP[]) { unsigned int j=0; unsigned char x,y; if(y1%8==0) y=y1/8; else y=y1/8+1; for(y=y0;y { OLED_Set_Pos(x0,y); for(x=x0;x { OLED_WR_Byte(BMP[j++],OLED_DATA); } } } //初始化SSD1306 void OLED_Init(void) { /* Wait for minimum time required between transfers. */ R_BSP_SoftwareDelay(800, BSP_DELAY_UNITS_MICROSECONDS); OLED_WR_Byte(0xAE,OLED_CMD);//--display off OLED_WR_Byte(0x00,OLED_CMD);//---set low column address OLED_WR_Byte(0x10,OLED_CMD);//---set high column address OLED_WR_Byte(0x40,OLED_CMD);//--set start line address OLED_WR_Byte(0xB0,OLED_CMD);//--set page address OLED_WR_Byte(0x81,OLED_CMD); // contract control OLED_WR_Byte(0xFF,OLED_CMD);//--128 OLED_WR_Byte(0xA1,OLED_CMD);//set segment remap OLED_WR_Byte(0xA6,OLED_CMD);//--normal / reverse OLED_WR_Byte(0xA8,OLED_CMD);//--set multiplex ratio(1 to 64) OLED_WR_Byte(0x3F,OLED_CMD);//--1/32 duty OLED_WR_Byte(0xC8,OLED_CMD);//Com scan direction OLED_WR_Byte(0xD3,OLED_CMD);//-set display offset OLED_WR_Byte(0x00,OLED_CMD);// OLED_WR_Byte(0xD5,OLED_CMD);//set osc division OLED_WR_Byte(0x80,OLED_CMD);// OLED_WR_Byte(0xD8,OLED_CMD);//set area color mode off OLED_WR_Byte(0x05,OLED_CMD);// OLED_WR_Byte(0xD9,OLED_CMD);//Set Pre-Charge Period OLED_WR_Byte(0xF1,OLED_CMD);// OLED_WR_Byte(0xDA,OLED_CMD);//set com pin configuartion OLED_WR_Byte(0x12,OLED_CMD);// OLED_WR_Byte(0xDB,OLED_CMD);//set Vcomh OLED_WR_Byte(0x30,OLED_CMD);// OLED_WR_Byte(0x8D,OLED_CMD);//set charge pump enable OLED_WR_Byte(0x14,OLED_CMD);// OLED_WR_Byte(0xAF,OLED_CMD);//--turn on oled panel }
3.2 電機pwm設置
小車上電初始化時,開發板上的蜂鳴器會響一秒,隨后等待指令的發出,并不斷的采集周圍環境的信息,例如溫度、濕度、是否有火。
左右滑動查看更多
void hal_entry(void) { /*TODO:addyourowncodehere*/ bsp_io_level_t state; int dht11_time=0,fire; err = R_SCI_I2C_Open(&g_sci6_i2c_ctrl, &g_sci6_i2c_cfg); /* Handle any errors. This function should be defined by the user. */ assert(FSP_SUCCESS == err); //err = FSP_SUCCESS; //打開串口 err = R_SCI_UART_Open(&g_uart4_ctrl, &g_uart4_cfg); assert(FSP_SUCCESS == err); //打開藍牙的串口3 err = R_SCI_UART_Open(&g_uart3_ctrl, &g_uart3_cfg); assert(FSP_SUCCESS == err); pwm_init(); OLED_Init(); //oled初始化 OLED_Clear(); R_IOPORT_PinWrite(&g_ioport_ctrl, BSP_IO_PORT_06_PIN_05, BSP_IO_LEVEL_HIGH); R_BSP_SoftwareDelay(1, BSP_DELAY_UNITS_SECONDS); //延時 1 秒 u2_printf("ra6m5_ok"); while(1) { R_IOPORT_PinWrite(&g_ioport_ctrl, BSP_IO_PORT_06_PIN_05, BSP_IO_LEVEL_LOW); R_IOPORT_PinRead(&g_ioport_ctrl,BSP_IO_PORT_03_PIN_02, &state); OLED_ShowCHinese(0,4,12); //是否有火 OLED_ShowCHinese(16,4,13); OLED_ShowCHinese(32,4,14); OLED_ShowCHinese(48,4,15); OLED_ShowCHinese(64,4,13); if(state == BSP_IO_LEVEL_LOW) { OLED_ShowCHinese(64,4,12); R_BSP_SoftwareDelay(20,BSP_DELAY_UNITS_MILLISECONDS);//延時20 } if(dht11_flag == 1){ u2_printf("t,h:"); u2_printf(str_dht11); dht11_flag=0; } if(dht11_time%5 == 0) { DHT11_Read(); sprintf(str_dht11,"%d,%d",temp_integer,humdity_integer); OLED_ShowNum(48,2,temp_integer,3,16); //OLED_ShowNum(0,4,dht11_time,3,16); } if(dht11_time >500) { dht11_time=0; } }
-
傳感器
+關注
關注
2550文章
51035瀏覽量
753084 -
mcu
+關注
關注
146文章
17123瀏覽量
350995 -
OLED
+關注
關注
119文章
6198瀏覽量
224107 -
瑞薩
+關注
關注
35文章
22308瀏覽量
86241 -
藍牙模塊
+關注
關注
30文章
573瀏覽量
55725
原文標題:【瑞薩RA MCU創意氛圍賽作品賞析】項目13——基于瑞薩啟明6M5智能環境檢測小車
文章出處:【微信號:瑞薩MCU小百科,微信公眾號:瑞薩MCU小百科】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論