0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

基于瑞萨MCU的智能环境检测小车设计

瑞萨MCU小百科 来源:瑞萨MCU小百科 2023-11-13 14:40 次阅读

1.项目设计简介

本项目用瑞萨mcu作为主控,两个编码电机作为动力装置,一个万向轮提高车子的机动性、搭载蓝牙模块、DHT11模块、火焰传感器模块、WiFi模块,实现的功能如下:

①在手机上APP界面按下相应的指令能够控制小车的运动和获取当前环境的温湿度

②火焰靠近火焰传感器模块,蜂鸣器会报警

③是否有火源的信息,可根据火焰传感器的检测,在0.96寸OLED屏幕上实时显示上传的信息

视频演示

小车整体实物图

44c074fc-81ef-11ee-939d-92fbcf53809c.png

2.所用到的模块

2.1火焰传感器模块

44f17048-81ef-11ee-939d-92fbcf53809c.png

1、可以检测火焰或者波长在760纳米~1100纳米范围内的光源,打火机测试火焰距离为80cm,对火焰越大,测试距离越远
2、探测角度60度左右,对火焰光谱特别灵敏
3、灵敏度可调(图中蓝色数字电位器调节)
4、比较器输出,信号干净,波形好,驱动能力强,超过15mA
5、配可调精密电位器调节灵敏度
6、工作电压3.3V-5V
DO引脚输出数字信号

2.20.96寸oled屏幕

451e138c-81ef-11ee-939d-92fbcf53809c.png  

0.96 寸oled屏幕,利用iic通信总线,可以很好的传输和显示数据

2.3DHT11模块

45517998-81ef-11ee-939d-92fbcf53809c.png

该模块使用奥松DHT11数字温湿度传感器,DHT11是一款含有已校准数字信号输出的温湿度复合传感器。它应用专用的数字模块采集技术和温湿度传感技术,确保产品具有可靠的稳定性,响应快,抗干扰能力强。传感器包括一个高分子电阻式感湿元件和一个NTC测温元件,并与一个高性能8位单片机相连接,通过单总线与微处理器通讯,只需要一根线。

2.4蓝牙模块

利用串口就能发送想要的数据。

4574b55c-81ef-11ee-939d-92fbcf53809c.png

2.5手机端控制界面

按下相应的指令能够控制小车的运动和获取当前环境的温湿度

45af99c4-81ef-11ee-939d-92fbcf53809c.png

2.6 电机驱动模块

采用的整体化设计,便于接线。 45d0baaa-81ef-11ee-939d-92fbcf53809c.png

3.程序设计

3.1 oled屏幕采用硬件iic 45f1f454-81ef-11ee-939d-92fbcf53809c.png460854a6-81ef-11ee-939d-92fbcf53809c.png

左右滑动查看更多

//==================================================================================================
//  实现功能: 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设置

461a147a-81ef-11ee-939d-92fbcf53809c.png

小车上电初始化时,开发板上的蜂鸣器会响一秒,随后等待指令的发出,并不断的采集周围环境的信息,例如温度、湿度、是否有火。

左右滑动查看更多

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;
}
}

审核编辑:汤梓红
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 传感器
    +关注

    关注

    2526

    文章

    48110

    浏览量

    740110
  • mcu
    mcu
    +关注

    关注

    146

    文章

    16019

    浏览量

    343649
  • OLED
    +关注

    关注

    118

    文章

    5986

    浏览量

    221465
  • 瑞萨
    +关注

    关注

    32

    文章

    22214

    浏览量

    84915
  • 蓝牙模块
    +关注

    关注

    30

    文章

    454

    浏览量

    55116

原文标题:【瑞萨RA MCU创意氛围赛作品赏析】项目13——基于瑞萨启明6M5智能环境检测小车

文章出处:【微信号:瑞萨MCU小百科,微信公众号:瑞萨MCU小百科】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    MCU产品技术解析

    “世界份额NO.1的MCU”为核心的业务强化政策。通过与各类事业伙伴共同合作,以提供功能强大的CPU核心和丰富的周边IP为基础开发ASSP,并且努力为用户提供最完善的应用技术服务和软件开发环境,使得
    发表于 08-08 19:59

    智能车竞赛

    智能车竞赛https://bbs.elecfans.com/jishu_260888_1_1.html
    发表于 08-18 09:08

    智能车技术报告

    智能车技术报告
    发表于 08-18 13:16

    元器件清单上有MCU是不是意味着必须用的单片...

    元器件清单上有MCU是不是意味着必须用的单片机???还是用的话有加分??
    发表于 08-30 10:55

    MCU型号速查手册

    `MCU型号速查手册`
    发表于 10-27 11:11

    【视频】如何搭建MCU开发环境CubeSuit+

    本帖最后由 于圭 于 2015-1-8 16:54 编辑 本视频介绍了如何搭建MCU开发环境CubeSuite、如何使用CubeSuite对
    发表于 01-08 16:09

    解决方案汇总帖

    解决方案之LCD直接驱动车载导航系统解决方案解决方案之洗衣机方案
    发表于 01-30 18:27

    有破解MCU的吗

    有一MCU需要解密,高手请联系我,谢谢。
    发表于 02-03 10:18

    开发环境CS+堆栈怎么设置啊

    这次电赛要用的芯片第一次用的开发环境 请问CS+怎么进行堆栈设置
    发表于 08-10 15:33

    MCU经典应用】资料&例程

    MCU经典应用】经典资料&例程
    发表于 07-28 08:50

    MCU指纹识别解决方案!

    `随着智能社会加速实现,智能生物识别及进入系统也在日常工作、生活场景中得到快速普及。虽然指纹识别已经开始普及,指纹芯片市场的竞争也已进入白热化阶段,认为“指纹识别”这一市场仍然有其
    发表于 09-02 13:57

    单片机开发环境

    单片机开发环境,根据自己的芯片家族选择不同的代码编辑工具及仿真工具      对应78K0系列单片机,推荐的是cubeSuite+集成开发环境,具体使用可以看帮助手册。    有接
    发表于 07-14 07:40

    MCU的相关资料分享

    电子推出了适用于空间受限、能源敏感的物联网 (IoT) 端点应用的新型微控制器 (MCU),包括可穿戴设备、医疗设备、电器和工业自动化。新的 RA2E2 MCU 组基于最新的 Ar
    发表于 11-11 08:18

    RISC 32MCU Flash SuperH的相关资料推荐

    推出SH7216系列32-位片上Flash存储器MCU作者:时间:2009-04-21来源:电子产品世界字号: 小 中 大关键词:
    发表于 01-26 06:01

    怎么读取mcu的checksum?

    怎么读取mcu的checksum?
    发表于 02-10 07:03