本网页已闲置超过3分钟,按键盘任意键或点击空白处,即可回到网页

DIY距离传感报警器
发布时间:2021-05-01
分享到:
DIY距离传感报警器
发布时间:2021-05-01
分享到:

该项目主旨是通过警报器,来提示驾驶员他的车与身后汽车之间的距离。

该警报器由H07R3模块(音频扬声器)、H08R6模块(红外传感器)构成,H08R6模块(红外传感器)将读取他与汽车之间的距离,然后发送消息到H07R3模块(音频扬声器)播放歌曲,音量水平将随着两辆车之间距离的减小而增加。

设计步骤:

一、将IR传感器模块(H08R6)与音频扬声器模块(H07R3)连接在一起。

二、编写代码:

1、在两个模块(H08R6,H07R3)中都定义了固定拓扑,描述了它们之间模块的连接。(注:P08R6模块与H08R6模块相同,但形式不同)

2、为每个模块定义了特定的ID。此ID的功能是为另一个模块定义模块。如:

有三个模块(module1,module2,module3),模块1将向模块2发送一条消息,则module2将通过ID知道该消息的来源,该ID随该消息发送给module1。

ID模块1(H08R6)为1

ID模块2(H07R3)为2

在此部分中,module2(H07R3)将在端口3上收到一条消息,因此将其反转。

3、在main.c文件中:

将传感器单位设置为厘米单位,然后启用DMA,以便将数据从传感器传输到内存

内部for循环:

  • 该函数的调用函数AbsDistanceToColor(sensor)函数返回一个取决于传感器值的值,并将赋值返回值赋给state_sensor变量
  • 添加延迟时间,这是一条消息与另一条消息之间的时间
  • 在switch()内部,我们将检查state_sensor的值
  • 补充说明:

         messageParams[0 -> 3] = frequency;//频率

         messageParams[4] = number of samples for sine wave;//正弦波的采样数

         messageParams[5] = play sine wave for specified time;//播放指定时间的正弦波

         SendMessageToModule (2, CODE_H07R3_PLAY_SINE, 6);

2是ID模块2(H07R3)

CODE_H07R3_PLAY_SINE是代码消息(通过它,module2(H07R3)将知道执行什么),这里对module2(H07R3)说正弦波

6个messageparams

注:它们不是(音频扬声器模块H07R3)的代码,因为外部代码通过红外传感器模块(H08R6)来执行。

附:(红外传感器H08R6代码)

/ **
  ****************************************************** ****************************
  *文件名:main.c
  *说明:主程序主体
  ****************************************************** ****************************
  *
  *版权(c)2015 STMicroelectronics
  *
  *以源代码和二进制形式重新分发和使用,无论是否进行了修改,
  *满足以下条件是允许的:
  * 1.重新分发源代码必须保留上述版权声明,
  *此条件列表和以下免责声明。
  * 2.以二进制形式重新分发必须复制上述版权声明,
  *此条件列表和文档中的以下免责声明
  *和/或发行版随附的其他材料。
  * 3. STMicroelectronics的名称或其贡献者的名称
  *可用于认可或促销从该软件派生的产品
  *未经事先特别书面许可。
  *
  *此软件由版权所有者和贡献者“按原样”提供
  *以及任何明示或暗示的保证,包括但不限于
  *针对特定目的的适销性和适用性的默示保证
  *免责声明。版权持有人或贡献者在任何情况下均不承担责任
  *对于任何直接,间接,偶发,特殊,示范或后果性的结果
  *损害赔偿(包括但不限于购买替代商品或
  * 服务; 使用,数据或利润的损失;或业务中断)
  *不论是基于合同责任,严格责任,还是基于任何责任理论,
  *或侵权(包括过失或其他原因)以任何方式终止使用
  *即使已告知可能发生此类损坏,也可以使用本软件的*。
  *
  ****************************************************** ****************************
  * /
    
/ *Hexabitz修改为BitzOS(BOS)V0.2.4-版权所有(C)2017-2021 Hexabitz
    版权所有* /

/ *包括----------------------------------------------- ------------------- * /
#include  “ BOS.h”

/ *私有变量---------------------------------------------- ----------- * /

float sensor = 0.0f;
uint8_t state_sensor;
uint8_t old_state_sensor;
uint8_t mode=1;
uint8_t sample = 200;
/* 私有函数原型 -----------------------------------------------*/
uint8_t AbsDistanceToColor(float distance);

uint8_t counter=0;

/* 主要功能 ------------------------------------------------------------*/

int main(void)
{
  /* MCU 配置----------------------------------------------------------*/

  /* 重置所有外围设备,初始化Flash接口和Systick. */
  HAL_Init();

  /* 配置系统时钟 */
  SystemClock_Config();

  /*初始化所有用户外围设备 */

  /*初始化BitzOS */
  BOS_Init();

  /* 为freertos对象调用init函数(在freertos.c中) */
  MX_FREERTOS_Init();

  /* 启动调度程序*/
  osKernelStart();

  /* 无限循环 */
  while (1)
  {

  }

}

/*-----------------------------------------------------------*/

/* 用户任务 */
void UserTask(void * argument)
{

//     将单位设置为 mm
    SetRangeUnit(UNIT_MEASUREMENT_CM);
//    流到内存
    Stream_ToF_Memory(50, portMAX_DELAY, &sensor);

  for(;;)
  {

      state_sensor = AbsDistanceToColor(sensor);

      Delay_ms(250);
      switch(state_sensor)
      {

          case 1:
                    //频率
                        messageParams[0] = (uint8_t)(150>>24);
                         messageParams[1] = (uint8_t)(150>>16);
                         messageParams[2] = (uint8_t)(150>>8);
                         messageParams[3] = (uint8_t)(150);
                         // 音乐注释样本数
                         messageParams[4] = sample;
                         // 持续时间秒2秒
                         //注意:时分16秒
                         //时间=持续时间/ 16秒
                         messageParams[5] = 2;
                         SendMessageToModule (2,CODE_H07R3_PLAY_SINE, 6);
                         break;
          case 2:

                        //频率
                        messageParams[0] = (uint8_t)(300>>24);
                        messageParams[1] = (uint8_t)(300>>16);
                        messageParams[2] = (uint8_t)(300>>8);
                        messageParams[3] = (uint8_t)(300);
                       // 音乐注释样本数
                        messageParams[4] = sample;
                        // 持续时间秒2秒
                         //注意:时分16秒
                         //时间=持续时间/ 16秒
                        messageParams[5] = 2;
                        SendMessageToModule (2,CODE_H07R3_PLAY_SINE, 6);
                        break;
          case 3:
                  //频率
                messageParams[0] = (uint8_t)(500>>24);
                  messageParams[1] = (uint8_t)(500>>16);
                  messageParams[2] = (uint8_t)(500>>8);
                  messageParams[3] = (uint8_t)(500);
                   // 音乐注释样本数
                  messageParams[4] = sample;
                  // 持续时间秒2秒
                  messageParams[5] = 2;
                  SendMessageToModule (2,CODE_H07R3_PLAY_SINE, 6);      
                        break;
          case 4:
                  //频率
                        messageParams[0] = (uint8_t)(700>>24);
                        messageParams[1] = (uint8_t)(700>>16);
                        messageParams[2] = (uint8_t)(700>>8);
                        messageParams[3] = (uint8_t)(700);
                        // 音乐注释样本
                        messageParams[4] = sample;
                       // 持续时间秒2秒
                        messageParams[5] = 2;
                        SendMessageToModule (2,CODE_H07R3_PLAY_SINE, 6);
                        break;
          case 5:
              //频率
                        messageParams[0] = (uint8_t)(1000>>24);
                      messageParams[1] = (uint8_t)(1000>>16);
                      messageParams[2] = (uint8_t)(1000>>8);
                      messageParams[3] = (uint8_t)(1000);
                      // 音乐注释样本
                      messageParams[4] = sample;
                       // 持续时间秒2秒
                      messageParams[5] = 2;
                      SendMessageToModule (2,CODE_H07R3_PLAY_SINE, 6);
                      break;
          case 6:
              //freq
                        messageParams[0] = (uint8_t)(1500>>24);
                        messageParams[1] = (uint8_t)(1500>>16);
                        messageParams[2] = (uint8_t)(1500>>8);
                    messageParams[3] = (uint8_t)(1500);
                        // 音乐注释样本
                        messageParams[4] = sample;
                        // 持续时间秒2秒
                        messageParams[5] = 2;
                      SendMessageToModule (2,CODE_H07R3_PLAY_SINE, 6);
                        break;          
          case 7:
              //频率
                        messageParams[0] = (uint8_t)(3000>>24);
                        messageParams[1] = (uint8_t)(3000>>16);
                        messageParams[2] = (uint8_t)(3000>>8);
                    messageParams[3] = (uint8_t)(3000);
                        // 音乐注释样本
                        messageParams[4] = sample;
                        // 持续时间秒2秒
                        messageParams[5] = 2;
                        SendMessageToModule (2,CODE_H07R3_PLAY_SINE, 6);
                        break;

          defult :
                      break;
      }
  }
}

uint8_t AbsDistanceToColor(float distance)
{


    if (distance < 15.0f)
        return 1;
    else if (distance < 20.0f)
        return 2;
    else if (distance < 25.0f)
        return 3;
    else if (distance < 30.0f)
          return 4;
    else if (distance < 35.0f)
          return 5;
    else if (distance < 40.0f)
          return 6;
    else if (distance < 45.0f)
        return 7;
    else
        return 8;
}

加入微信技术交流群

技术交流,职业进阶

关注与非网服务号

获取电子工程师福利

加入电路城 QQ 交流群

与技术大牛交朋友

讨论