590|5

198

帖子

3

TA的资源

一粒金砂(中级)

楼主
 

【2024 DigiKey创意大赛】基于ESP32 S3的智能骑行头盔 [复制链接]

 

基于ESP32 S3的智能骑行头盔

作者:reayfei

 

一、项目概述

       本项目旨在设计一款集成了多种功能的智能头盔,以满足骑行者在导航、安全提示等方面的需求。智能头盔以ESP32为主控芯片,搭载OLED显示屏、MPU6050传感器、RGB灯条等模块,实现了手机导航信息实时显示、转向及刹车提示等功能。

 
 

二、主要组件及功能

  1. ESP32主控芯片
    • 负责处理所有传感器数据、控制显示屏及RGB灯条。
    • 支持蓝牙和Wi-Fi通信,可连接手机实现数据传输。
  2. OLED显示屏
    • 显示手机导航信息,包括路线、方向、距离等。
    • 分辨率高,显示清晰,便于骑行者查看。

 

 

  1. MPU6050传感器
    • 整合了3轴陀螺仪和3轴加速度传感器,用于测量头盔的姿态和运动状态。
    • 可通过数据处理,实现姿态感知,为导航和刹车提醒提供辅助信息。
  2. RGB灯条
    • 显示左转向、右转向、双闪指示、刹车提醒等安全提示。
    • 颜色鲜艳,易于被其他道路使用者识别。

三、硬件连接及配置

  1. ESP32与OLED显示屏连接
    • 使用I2C接口连接ESP32和OLED显示屏,节省引脚资源。
    • 初始化OLED显示屏,设置显示区域和字体大小。
  2. ESP32与MPU6050连接
    • 使用I2C接口连接ESP32和MPU6050,配置MPU6050的加速度计和陀螺仪量程。
    • 初始化MPU6050,设置采样率和数字低通滤波器。
  3. ESP32与RGB灯条连接
    • 使用GPIO引脚控制RGB灯条的亮度和颜色。
    • 编写控制函数,根据骑行者的操作或MPU6050的数据,改变RGB灯条的状态。

四、软件设计及功能实现

  1. 导航信息显示
    • 通过蓝牙或Wi-Fi将手机与ESP32连接,接收导航信息。
    • 在OLED显示屏上实时显示导航信息,包括路线、方向、距离等。
  2. 姿态感知及刹车提醒
    • 利用MPU6050的数据,判断头盔的姿态和运动状态。
    • 当检测到急刹车时,通过RGB灯条发出刹车提醒。
  3. 转向提示
    • 通过获取导航信息,实现左转向、右转向指示。
    • 利用瞬时加速度变化,实现双闪指示。
    • 控制RGB灯条显示相应的转向提示。
  4. 夜晚行车灯
    • 通过发出高亮度的RGB灯光,智能头盔能够显著提高骑行者在夜晚或低光照条件下的可见性,降低交通事故的风险。
    • 多种灯光模式和智能控制功能使得骑行者能够根据不同的环境和需求调整灯光效果,从而更好地保护自己和他人的安全。
    • RGB夜晚行车灯不仅具有实用功能,还能够为骑行者带来更加炫酷的视觉效果和个性化的骑行体验。
  5. 系统初始化及配置
    • 在ESP32的代码中,完成所有硬件模块的初始化及配置。
    • 设置中断和定时器,用于实时检测和处理传感器数据。

五、调试与优化

  1. 硬件调试
    • 检查所有硬件连接是否正确,确保传感器和显示屏正常工作。
    • 使用示波器或逻辑分析仪检测I2C通信信号。
  2. 软件调试
    • 编写测试代码,验证各个模块的功能是否实现。
    • 使用串口调试助手,实时查看传感器数据和系统状态。
  3. 性能优化
    • 优化代码,提高系统的实时性和稳定性。
    • 调整RGB灯条的亮度和闪烁频率,使其更加醒目且节能。

六、视频演示

 

WeChat_20241105215557

 

七、结论

       本设计实现了一款功能丰富的智能头盔,通过ESP32、OLED显示屏、MPU6050传感器和RGB灯条的集成,实现了手机导航信息显示、姿态感知及刹车提醒、转向提示等功能。该智能头盔不仅提高了骑行者的安全性和便利性,还展示了物联网技术在智能穿戴设备中的应用潜力。

 

八、源码

#define BLYNK_PRINT Serial
#define BLYNK_USE_DIRECT_CONNECT
#include <U8g2lib.h>
#include <Wire.h>
#include <Adafruit_NeoPixel.h>
#include <MPU6050_tockn.h>
#include <BlynkSimpleEsp32_BLE.h>
#include <BLEDevice.h>
#include <BLEServer.h>

volatile int page;
volatile int item;
volatile byte flag;
volatile byte value;
volatile unsigned int alive_counter;
U8G2_SSD1306_128X64_NONAME_F_SW_I2C u8g2(U8G2_R0,  14, 13, U8X8_PIN_NONE);
Adafruit_NeoPixel rgb_display_47 = Adafruit_NeoPixel(12,47,NEO_GRB + NEO_KHZ800);
MPU6050 mpu6050(Wire);
char auth[] = "840807db99794545b20a76528f273c91";
int vpin_value;
int v5pin_value;
int v6pin_value;
int v7pin_value;
BlynkTimer timer;

void task_1( void * pvParameters ){
for(;;){
  if (page == 1) {
    u8g2.firstPage();
    do
    {
      u8g2.setFontPosBottom();
      u8g2.setFont(u8g2_font_open_iconic_all_4x_t);
      u8g2.drawGlyph(16,15+4*8,76);
      u8g2.setFont(u8g2_font_timR14_tf);
      u8g2.setFontPosTop();
      u8g2.setCursor(70,24);
      u8g2.print(v5pin_value);
      u8g2.setCursor(110,24);
      u8g2.print("m");
    }while(u8g2.nextPage());

  }
  if (page == 2) {
    u8g2.firstPage();
    do
    {
      u8g2.setFontPosBottom();
      u8g2.setFont(u8g2_font_open_iconic_all_4x_t);
      u8g2.drawGlyph(16,15+4*8,73);
      u8g2.setFont(u8g2_font_timR14_tf);
      u8g2.setFontPosTop();
      u8g2.setCursor(70,24);
      u8g2.print(v5pin_value);
      u8g2.setCursor(110,24);
      u8g2.print("m");
    }while(u8g2.nextPage());

  }
  if (page == 3) {
    u8g2.firstPage();
    do
    {
      u8g2.setFontPosBottom();
      u8g2.setFont(u8g2_font_open_iconic_all_4x_t);
      u8g2.drawGlyph(16,15+4*8,74);
      u8g2.setFont(u8g2_font_timR14_tf);
      u8g2.setFontPosTop();
      u8g2.setCursor(70,24);
      u8g2.print(v6pin_value);
      u8g2.setCursor(110,24);
      u8g2.print("m");
    }while(u8g2.nextPage());

  }
  if (page == 4) {
    u8g2.firstPage();
    do
    {
      u8g2.setFontPosBottom();
      u8g2.setFont(u8g2_font_open_iconic_all_4x_t);
      u8g2.drawGlyph(16,15+4*8,75);
      u8g2.setFont(u8g2_font_timR14_tf);
      u8g2.setFontPosTop();
      u8g2.setCursor(70,24);
      u8g2.print(v6pin_value);
      u8g2.setCursor(110,24);
      u8g2.print("m");
    }while(u8g2.nextPage());

  }
  vTaskDelay(1);
}
}

void task_3( void * pvParameters ){
for(;;){
  delay(1000);
  vTaskDelay(1);
}
}

void task_4( void * pvParameters ){
for(;;){
  if (item == 1 && v6pin_value <= 30) {
    for (int i = 1; i <= 12; i = i + (1)) {
      rgb_display_47.setPixelColor((i)-1, (((255 & 0xffffff) << 16) | ((255 & 0xffffff) << 8) | 0));
      rgb_display_47.show();
      delay(30);
    }
    for (int i = 1; i <= 12; i = i + (1)) {
      rgb_display_47.setPixelColor((i)-1, (((0 & 0xffffff) << 16) | ((0 & 0xffffff) << 8) | 0));
      rgb_display_47.show();
    }
    delay(300);

  }
  if (item == 2 && v6pin_value <= 30) {
    for (int i = 12; i >= 1; i = i + (-1)) {
      rgb_display_47.setPixelColor((i)-1, (((255 & 0xffffff) << 16) | ((255 & 0xffffff) << 8) | 0));
      rgb_display_47.show();
      delay(30);
    }
    for (int i = 1; i <= 12; i = i + (1)) {
      rgb_display_47.setPixelColor((i)-1, (((0 & 0xffffff) << 16) | ((0 & 0xffffff) << 8) | 0));
      rgb_display_47.show();
    }
    delay(300);

  }
  if (item == 3) {
    for (int i = 1; i <= 12; i = i + (1)) {
      rgb_display_47.setPixelColor((i)-1, (((255 & 0xffffff) << 16) | ((0 & 0xffffff) << 8) | 0));
      rgb_display_47.show();
    }
    delay(100);
    for (int i = 1; i <= 12; i = i + (1)) {
      rgb_display_47.setPixelColor((i)-1, (((0 & 0xffffff) << 16) | ((0 & 0xffffff) << 8) | 0));
      rgb_display_47.show();
    }
    delay(100);

  }
  if (v7pin_value == 0) {
    for (int i = 1; i <= 12; i = i + (1)) {
      rgb_display_47.setPixelColor((i)-1, (((0 & 0xffffff) << 16) | ((0 & 0xffffff) << 8) | 0));
      rgb_display_47.show();
    }
    delay(500);

  }
  if (v7pin_value == 55) {
    if (flag == 0) {
      value++;
      if (value >= 255) {
        flag = 1;

      }

    } else if (flag == 1) {
      value--;
      if (value <= 0) {
        flag = 0;

      }
    }
    for (int i = 1; i <= 12; i = i + (1)) {
      rgb_display_47.setPixelColor((i)-1, (((0 & 0xffffff) << 16) | ((0 & 0xffffff) << 8) | value));
      rgb_display_47.show();
    }
    delayMicroseconds(200);

  }
  vTaskDelay(1);
}
}

void task_2( void * pvParameters ){
for(;;){
  mpu6050.update();
  if (mpu6050.getAccY() > 0.8) {
    item = 3;

  }
  delay(500);
  vTaskDelay(1);
}
}

BLYNK_WRITE(V1) {
  vpin_value = param.asInt();
  item = 0;
  page = 1;
}

BLYNK_WRITE(V2) {
  vpin_value = param.asInt();
  item = 0;
  page = 2;
}

BLYNK_WRITE(V3) {
  vpin_value = param.asInt();
  item = 1;
  page = 3;
}

BLYNK_WRITE(V4) {
  vpin_value = param.asInt();
  item = 2;
  page = 4;
}

BLYNK_WRITE(V5) {
  v5pin_value = param.asInt();
  Serial.println(v5pin_value);
}

BLYNK_WRITE(V6) {
  v6pin_value = param.asInt();
  Serial.println(v6pin_value);
}

BLYNK_WRITE(V7) {
  v7pin_value = param.asInt();
  Serial.println(v7pin_value);
}

void myTimerEvent1() {
  alive_counter++;
  Blynk.virtualWrite(V8, alive_counter);
}

void setup(){
  page = 0;
  item = 0;
  flag = 0;
  value = 0;
  alive_counter = 0;
  u8g2.setI2CAddress(0x3C*2);
  u8g2.begin();
  u8g2.enableUTF8Print();


  xTaskCreatePinnedToCore(task_1, "task_1", 4096, NULL, 2, NULL, 0);


  xTaskCreatePinnedToCore(task_3, "task_3", 4096, NULL, 2, NULL, 0);

  rgb_display_47.begin();

  xTaskCreatePinnedToCore(task_4, "task_4", 4096, NULL, 2, NULL, 0);

  Wire.begin();
  mpu6050.begin();
  mpu6050.calcGyroOffsets(true);

  xTaskCreatePinnedToCore(task_2, "task_2", 4096, NULL, 2, NULL, 0);

  Serial.begin(9600);
  Serial.println("Waiting for connections...");
  Blynk.setDeviceName("Blynk");
  Blynk.begin(auth);

  timer.setInterval(1000L, myTimerEvent1);

}

void loop(){
  vTaskDelay(1);

  vTaskDelay(1);

  vTaskDelay(1);

  vTaskDelay(1);

  Blynk.run();

  timer.run();

}

 

 

最新回复

有意思,期待成品   详情 回复 发表于 2024-11-1 19:31
点赞 关注
 
 

回复
举报

7244

帖子

2

TA的资源

版主

沙发
 
这个想法可以的~我记得有那种好像有那种安全智能头盔

点评

现在有类似的产品。不过,仍然有很多探索的功能,能让骑行更便捷、更有保障。  详情 回复 发表于 2024-11-1 13:52
 
 
 

回复

198

帖子

3

TA的资源

一粒金砂(中级)

板凳
 
wangerxian 发表于 2024-10-31 23:09 这个想法可以的~我记得有那种好像有那种安全智能头盔

现在有类似的产品。不过,仍然有很多探索的功能,能让骑行更便捷、更有保障。

点评

是的,智能头盔,未来也是一个方向。  详情 回复 发表于 2024-11-1 16:14
 
 
 

回复

7244

帖子

2

TA的资源

版主

4
 
reayfei 发表于 2024-11-1 13:52 现在有类似的产品。不过,仍然有很多探索的功能,能让骑行更便捷、更有保障。

是的,智能头盔,未来也是一个方向。

 
 
 

回复

76

帖子

2

TA的资源

一粒金砂(中级)

5
 

有意思,期待成品

点评

感谢支持  详情 回复 发表于 2024-11-4 21:45
 
 
 

回复

198

帖子

3

TA的资源

一粒金砂(中级)

6
 
CoderX9527 发表于 2024-11-1 19:31 有意思,期待成品

感谢支持

 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/6 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表