- 2024-11-05
-
加入了学习《智能骑行头盔》,观看 基于ESP32 S3的智能骑行头盔
- 2024-11-04
-
回复了主题帖:
【2024 DigiKey创意大赛】基于ESP32 S3的智能骑行头盔
CoderX9527 发表于 2024-11-1 19:31
有意思,期待成品
感谢支持
- 2024-11-01
-
回复了主题帖:
【2024 DigiKey创意大赛】基于ESP32 S3的智能骑行头盔
wangerxian 发表于 2024-10-31 23:09
这个想法可以的~我记得有那种好像有那种安全智能头盔
现在有类似的产品。不过,仍然有很多探索的功能,能让骑行更便捷、更有保障。
- 2024-10-31
-
发表了主题帖:
【2024 DigiKey创意大赛】基于ESP32 S3的智能骑行头盔
本帖最后由 reayfei 于 2024-11-6 20:13 编辑
一、项目概述
本项目旨在设计一款集成了多种功能的智能头盔,以满足骑行者在导航、安全提示等方面的需求。智能头盔以ESP32为主控芯片,搭载OLED显示屏、MPU6050传感器、RGB灯条等模块,实现了手机导航信息实时显示、转向及刹车提示等功能。
二、主要组件及功能
ESP32主控芯片
负责处理所有传感器数据、控制显示屏及RGB灯条。
支持蓝牙和Wi-Fi通信,可连接手机实现数据传输。
OLED显示屏
显示手机导航信息,包括路线、方向、距离等。
分辨率高,显示清晰,便于骑行者查看。
MPU6050传感器
整合了3轴陀螺仪和3轴加速度传感器,用于测量头盔的姿态和运动状态。
可通过数据处理,实现姿态感知,为导航和刹车提醒提供辅助信息。
RGB灯条
显示左转向、右转向、双闪指示、刹车提醒等安全提示。
颜色鲜艳,易于被其他道路使用者识别。
三、硬件连接及配置
ESP32与OLED显示屏连接
使用I2C接口连接ESP32和OLED显示屏,节省引脚资源。
初始化OLED显示屏,设置显示区域和字体大小。
ESP32与MPU6050连接
使用I2C接口连接ESP32和MPU6050,配置MPU6050的加速度计和陀螺仪量程。
初始化MPU6050,设置采样率和数字低通滤波器。
ESP32与RGB灯条连接
使用GPIO引脚控制RGB灯条的亮度和颜色。
编写控制函数,根据骑行者的操作或MPU6050的数据,改变RGB灯条的状态。
四、软件设计及功能实现
导航信息显示
通过蓝牙或Wi-Fi将手机与ESP32连接,接收导航信息。
在OLED显示屏上实时显示导航信息,包括路线、方向、距离等。
姿态感知及刹车提醒
利用MPU6050的数据,判断头盔的姿态和运动状态。
当检测到急刹车时,通过RGB灯条发出刹车提醒。
转向提示
通过获取导航信息,实现左转向、右转向指示。
利用瞬时加速度变化,实现双闪指示。
控制RGB灯条显示相应的转向提示。
夜晚行车灯
通过发出高亮度的RGB灯光,智能头盔能够显著提高骑行者在夜晚或低光照条件下的可见性,降低交通事故的风险。
多种灯光模式和智能控制功能使得骑行者能够根据不同的环境和需求调整灯光效果,从而更好地保护自己和他人的安全。
RGB夜晚行车灯不仅具有实用功能,还能够为骑行者带来更加炫酷的视觉效果和个性化的骑行体验。
系统初始化及配置
在ESP32的代码中,完成所有硬件模块的初始化及配置。
设置中断和定时器,用于实时检测和处理传感器数据。
五、调试与优化
硬件调试
检查所有硬件连接是否正确,确保传感器和显示屏正常工作。
使用示波器或逻辑分析仪检测I2C通信信号。
软件调试
编写测试代码,验证各个模块的功能是否实现。
使用串口调试助手,实时查看传感器数据和系统状态。
性能优化
优化代码,提高系统的实时性和稳定性。
调整RGB灯条的亮度和闪烁频率,使其更加醒目且节能。
六、视频演示
[localvideo]b0c8f1f1a848b9825d7431191578f220[/localvideo]
七、结论
本设计实现了一款功能丰富的智能头盔,通过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-10-16
-
回复了主题帖:
【2024 DigiKey 创意大赛】物料开箱
wangerxian 发表于 2024-9-30 11:30 Cardputer怎么支持那么多个按键的?是有按键电路吗?
有按键电路的,后面研究明白,继续分享
- 2024-09-30
-
发表了主题帖:
【2024 DigiKey 创意大赛】物料开箱
前言
非常感谢eeworld和得捷电子提供宝贵的参赛资格。
借助这次活动,可以基于python实现一下快速构建的小作品。
开箱
1、Cardputer
外观:其小巧如信用卡,但功能强大。
硬件配置:内含ESP32芯片、Wi-Fi、蓝牙、TF卡槽等。
并通过演示使用UIFlow进行编程,展示了创建温度监测应用的过程。
2、ESP32
ESP32-C6-WROOM-1 和 ESP32-C6-WROOM-1U 是通用型模组,支持 2.4 GHz Wi-Fi 6、蓝牙 5 及 IEEE 802.15.4(Zigbee 3.0 和 Thread 1.3)。模组内置 ESP32-C6 芯片,配置 8 MB SPI flash。ESP32-C6-WROOM-1 采用板载 PCB 天线,ESP32-C6-WROOM-1U 采用外部天线连接器。
3、RFID和LED模块
作用:RFID读卡器是一种能阅读电子标签数据的自动识别设备。