心跳跟随的心形灯(STM32(HAL)+WS2812+MAX30102)

这篇具有很好参考价值的文章主要介绍了心跳跟随的心形灯(STM32(HAL)+WS2812+MAX30102)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。


前言

在好几年前,我好像就看到了焊武帝 jiripraus在纪念结婚五周年时,制作的一个心跳跟随心形灯,感觉太浪漫了,于是在假期的时候,我也仿照做了一个,虽然还有很多需要完善的地方,但是大致功能已经实现了,下面开源讲讲开源的项目。
心跳跟随的心形灯(STM32(HAL)+WS2812+MAX30102),stm32,嵌入式硬件,单片机,FreeRTOS,HAL
心跳跟随的心形灯(STM32(HAL)+WS2812+MAX30102),stm32,嵌入式硬件,单片机,FreeRTOS,HAL
心跳跟随的心形灯(STM32(HAL)+WS2812+MAX30102),stm32,嵌入式硬件,单片机,FreeRTOS,HAL
心跳跟随的心形灯(STM32(HAL)+WS2812+MAX30102),stm32,嵌入式硬件,单片机,FreeRTOS,HAL


介绍

系统框架

心脏的外壳采用紫铜丝或黄铜丝焊接,1mm的铜丝较硬,适合完成外部框架的搭建,0.7mm的铜丝可塑性较好,适合焊接内部的WS2812,整个过程中吗,焊接难度较大,电子器件的固定难度也很大,我内部借助了一些热熔胶固定,有些丑,可以参考 jiripraus的固定方法。

原作者采用的Arduino主控,且没有借助PCB,纯飞铜线完成内部电子器件的连接。

因为我想利用FreeRTOS学习一下实际项目编写,所以将主控更换成了STM32F103C8T6,当然编写了两套代码,先编写了一套裸机开发,测试能够完成所有功能、之后移植了一套FreeRTOS的,都可以运行。

原项目地址

jiripraus项目地址(Arduino):https://www.instructables.com/Beating-LED-Heart/

本项目开发开源地址

裸机开发软件下载(STM32版本):https://download.csdn.net/download/zerokingwang/88173336

FreeRTOS开发软件下载(STM32版本):https://download.csdn.net/download/zerokingwang/88173410

硬件PCB(立创开源)下载链接:https://oshwhub.com/zeroking/my_heart_

所有文件上传到github了,也可以到github下载:https://github.com/VioletJA/MY_HEART

硬件PCB

绘制了包括STM32F103C8T6的最小系统、蜂鸣器、TP4059锂电池充电电路、OLED接口、MAX30102接口等。
心跳跟随的心形灯(STM32(HAL)+WS2812+MAX30102),stm32,嵌入式硬件,单片机,FreeRTOS,HAL
心跳跟随的心形灯(STM32(HAL)+WS2812+MAX30102),stm32,嵌入式硬件,单片机,FreeRTOS,HAL

软件功能

在没有手指触碰到MAX30102模块时,WS2812进行彩虹灯变换,当手指触碰到时,跟随检测到的心跳进行红色闪烁及蜂鸣器模拟心跳。

详细内容

硬件外壳制作

在3D打印的器件上进行焊接,我先用胶带固定好铜丝,然后再各个连接点进行焊接。
心形3D打印件:https://www.cgtrader.com/items/865899/download-page
心跳跟随的心形灯(STM32(HAL)+WS2812+MAX30102),stm32,嵌入式硬件,单片机,FreeRTOS,HAL
WS2812焊接:最好黏在胶带上,固定好大致位置后再进行焊接,我没有找到其他好方法,焊接极其耗时。
心跳跟随的心形灯(STM32(HAL)+WS2812+MAX30102),stm32,嵌入式硬件,单片机,FreeRTOS,HAL

WS2812级联及控制

心跳跟随的心形灯(STM32(HAL)+WS2812+MAX30102),stm32,嵌入式硬件,单片机,FreeRTOS,HAL

心跳跟随的心形灯(STM32(HAL)+WS2812+MAX30102),stm32,嵌入式硬件,单片机,FreeRTOS,HAL
当发送一串数据时,第一个24bits的数据给D1,第n个24bits的数据给第n。(24bit对应三原色,每一色八位)

输出码型通过下图判断,因此每一位的高低都需要进行严格控制
心跳跟随的心形灯(STM32(HAL)+WS2812+MAX30102),stm32,嵌入式硬件,单片机,FreeRTOS,HAL

心跳跟随的心形灯(STM32(HAL)+WS2812+MAX30102),stm32,嵌入式硬件,单片机,FreeRTOS,HAL
大多数采用的是PWM+DMA的模式,通过传输一串数据,控制不同占空比的PWM完成数据传输

HAL_TIM_PWM_Start_DMA(&ws2812_TIM, ws2812_CHANNEL, (uint32_t *)Pixel_Buf,(Pixel_NUM+1)*24);

参考:STM32系列(HAL库)——F103C8T6驱动WS2812全彩RGB模块(PWM+DMA方式)

但有一点需要注意,必须在PWM的完成回调函数中进行手动关闭DMA传输,否则WS2812颜色不对(应该就是DMA传输出错了)

void HAL_TIM_PWM_PulseFinishedCallback(TIM_HandleTypeDef *htim)
{
	if(htim->Instance==ws2812_TIM.Instance)
	HAL_TIM_PWM_Stop_DMA(&ws2812_TIM, ws2812_CHANNEL);
}

其他详细的代码控制都在开源代码中了

MAX30102血氧传感器

参考:【stm32】手把手用cubemx配置血氧传感器(MAX30102)

采用的是中断处理,每次模块发送一个下降沿中断,STM32接收到后进行数据处理。

模块采用IIC进行控制与数据读取,普通采用HAL配置硬件IIC就能够实现,但是在我用STM32F103C6T6进行测试的时候,HAl生成的代码中,IIC引脚不会自动设置为高速,导致运行会出现HAL_ERROR的问题,然而在STM32F103C8T6就已经纠正了这个错误。

void HAL_I2C_MspInit(I2C_HandleTypeDef* i2cHandle)
{

  GPIO_InitTypeDef GPIO_InitStruct = {0};
  if(i2cHandle->Instance==I2C1)
  {
    __HAL_RCC_GPIOB_CLK_ENABLE();
    GPIO_InitStruct.Pin = GPIO_PIN_6|GPIO_PIN_7;
    GPIO_InitStruct.Mode = GPIO_MODE_AF_OD;
    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
    HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
    __HAL_RCC_I2C1_CLK_ENABLE();
  else if(i2cHandle->Instance==I2C2)
  {
    __HAL_RCC_GPIOB_CLK_ENABLE();
    GPIO_InitStruct.Pin = GPIO_PIN_10|GPIO_PIN_11;
    GPIO_InitStruct.Mode = GPIO_MODE_AF_OD;
    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
    HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
    __HAL_RCC_I2C2_CLK_ENABLE();
  }
}

心跳跟随的心形灯(STM32(HAL)+WS2812+MAX30102),stm32,嵌入式硬件,单片机,FreeRTOS,HAL

0.96OLED

在屏幕调试中,由于1616的字看上去太小了,于是我调整为2424的大小,这个时候,网上的一些库就不够用了,需要看懂是如何完成一个汉字的显示。

利用PCtoLCD2002完成取字模,一般设置如下
心跳跟随的心形灯(STM32(HAL)+WS2812+MAX30102),stm32,嵌入式硬件,单片机,FreeRTOS,HAL
心跳跟随的心形灯(STM32(HAL)+WS2812+MAX30102),stm32,嵌入式硬件,单片机,FreeRTOS,HAL
数据如下:

{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x80,0x08,0x10,0x70,0xE0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},
{0x00,0x00,0x80,0xC0,0xF8,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0xC0,0x04,0x18,0xF0,0xE0,0x00,0x00},
{0x00,0x00,0x01,0x01,0x00,0x00,0x00,0x00,0x1F,0x18,0x10,0x10,0x10,0x10,0x10,0x10,0x18,0x1F,0x08,0x00,0x00,0x00,0x00,0x00},/*"心",0*/

网上一般说取数据是按照一行一行来的,一个数据代表的是8位,不足8位的按照8位算。

但是我实际测试,是按列算的,例如第一个数据0x00,表示第一列中的前八个点全没有点亮,第二个0x00代表的是第二列数据的前8个也全部没有点亮,当前8行的所有列都完成后,计算中间8行,一列一列,之后计算下面8行(24*24的数据)
例如下图:
心跳跟随的心形灯(STM32(HAL)+WS2812+MAX30102),stm32,嵌入式硬件,单片机,FreeRTOS,HAL

而我们采用的低位在前时:
心跳跟随的心形灯(STM32(HAL)+WS2812+MAX30102),stm32,嵌入式硬件,单片机,FreeRTOS,HAL
当第一个格子点亮时,对应的就是0x01

在OLED汉字显示的函数中,需要将汉字分为三上中下,完成三次打印,组成一个完整的汉字

//显示24*24汉字
void OLED_ShowCHinese24(uint8_t x,uint8_t y,uint8_t no)
{      			    
	uint8_t t;
	OLED_Set_Pos(x,y);	
    for(t=0;t<24;t++)
	{
		OLED_WR_Byte(CHI_24_24[3*no][t],OLED_DATA);
     }	
	OLED_Set_Pos(x,y+1);	
    for(t=0;t<24;t++)
	{	
		OLED_WR_Byte(CHI_24_24[3*no+1][t],OLED_DATA);
     }
	OLED_Set_Pos(x,y+2);	
    for(t=0;t<24;t++)
	{	
		OLED_WR_Byte(CHI_24_24[3*no+2][t],OLED_DATA);
     }	
}

FreeRTOS

在移植操作系统的时候,创建了两个任务,一个完成WS2812和蜂鸣器的控制,一个完成MAX30102和OLED的控制。

其中出现了一些跨任务的信号量,尝试利用任务通知方式进行数据保护,但是效果不佳,最后还是利用了临界区保护,在信号改写的地方进行了保护(临界区时间太长,系统会崩溃)
心跳跟随的心形灯(STM32(HAL)+WS2812+MAX30102),stm32,嵌入式硬件,单片机,FreeRTOS,HAL

效果视频

心跳跟随心形灯

总结

通过制作这个小项目,还是学习了HAL的IIC配置,PWM的DMA模式,WS2812的控制,OLED屏幕控制,FreeRTOS也理解更多了一点,当然还只是刚开始入门,要学的东西还是有很多,在这个小项目中,还有很多bug和不完善的地方,比如说MAX30102测量的心率不准等等,但是目前打算就先这样结束,先继续学习吧。文章来源地址https://www.toymoban.com/news/detail-630411.html

到了这里,关于心跳跟随的心形灯(STM32(HAL)+WS2812+MAX30102)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • STM32系列(HAL库)——F103C8T6驱动WS2812全彩RGB模块(PWM+DMA方式)

    (1)编程平台:Keil5 (2)CubeMX (1)某宝买的RGB模块(4个灯珠级联) (2)F1的板子,本例使用经典F103C8T6 (3)ST-link 下载器 (4)杜邦线若干 (1)模块简介: 没什么比手册讲得更加清楚了,模块中文数据手册:ws2812b中文资料_数据手册_参数 (2)驱动原理:          以上这是数据手册中提到

    2023年04月11日
    浏览(42)
  • stm32+MAX30102+OLED

    stm32 + 1个心率血氧模块(MAX30102)+ 1个WiFi模块(ESP8266-01S) + 蜂鸣器 + OLED显示+ 本地数据保存(内置Flash ROM或附加SD卡) 背景:对医院住院危重患者的心率和血氧进行实时监测并报警。 主要功能与要求: 1)了解外置心率血氧模块(MAX30102)检测心率和血氧浓度的原理;模块的接

    2024年01月21日
    浏览(43)
  • (STM32笔记5)ws2812驱动开发

    ws2812 需要开发的外设:ws2812 开发环境:MDK 开发板:stm32最小系统板 杜邦线无数 一、原理阐述 (一) 这个ws2812有很多种,一个小灯、灯带,矩形像素屏等等。 这些都是DIN连接输入,DOUT连接输出,另外两个引脚是GNE和VCC   (二) 数据传输原理: 第1个WS2812B灯珠接收到了第1个

    2024年01月19日
    浏览(40)
  • STM32--基于STM32F103的MAX30102心率血氧测量

    本文介绍基于STM32F103ZET6+MAX30102心率血氧测量+0.96寸OLED(7针)显示(完整程序代码见文末链接) 一、简介 MAX30102是一个集成的脉搏血氧仪和心率监测仪生物传感器的模块。它集成了一个红光LED和一个红外光LED、光电检测器、光器件,以及带环境光抑制的低噪声电子电路。 MA

    2024年01月16日
    浏览(47)
  • STM32传感器外设集--心率模块(MAX30102)

    目录 ​​​​​​​ 一、模块介绍 二、资料获取连接  欢迎关注微信公众号--星之援工作室 发送(MAX30102) 三、接线方式 四、代码编写 main.c max30102.c max30102.h myiic.c myiic.h algorithm.c algorithm.h 五 、参考 MAX30102模块是一种集成了光学传感器和信号处理器的模块,广泛应用

    2024年01月22日
    浏览(48)
  • STM32驱动全彩LED灯模块WS2812

    WS2812全彩LED灯模块系列,可以进行级联实现灯带的效果,MCU端通过一个管脚可以控制所有级联的LED灯的不同发光颜色显示。 WS2811(未集成LED)的级联电路如下所示: WS2812(集成LED)的级联电路如下所示: STM32是3.3V供电芯片,输出Push-Pull模式只有3.3V,WS2812采用5V供电,输入Vi

    2024年01月17日
    浏览(38)
  • STM32+ MAX30102通过指尖测量心率+血氧饱和度

            重要的事情放在最前面:max30102只适用于指尖手指测量,不适用与手腕手指测量,如需做成可穿戴样式选择传感器的小伙伴请pass掉他,因为他只有红光和红外2种光,不够充足的数据源去运算。         由于一些原因,本篇文章所有下载资源不收取任何积分,让你不

    2024年02月03日
    浏览(47)
  • STM32C0开发(1)----SPI 驱动WS2812灯珠

    本文介绍了如何使用STM32微控制器,结合STM32CubeMX配置工具和SPI通讯接口,来驱动和控制WS2812 LED灯带。这是一个集硬件连接、软件配置和编程开发于一体的综合性项目,目标是实现对LED灯带颜色和亮度的精确控制。 最近在弄ST的课程,需要样片的可以加群申请:615061293 。 ht

    2024年02月04日
    浏览(43)
  • STM32+PWM+DMA驱动WS2812彩灯模块(附源码)

    WS2812是一颗数字LED灯珠,采用单总线通讯,每颗灯珠支持24bit的颜色控制,也即RGB888,信号线通过DIN输入,经过一颗灯珠之后,信号线上前24bit数据会被该灯珠锁存,之后将剩下的数据信号整形之后通过DOUT输出 C1为VDD的滤波电容,一般大小为100NF。 WS2812.c pwm.c DMA.c main.c 需要源

    2024年02月15日
    浏览(43)
  • 关于STM32利用TIM+PWM+DMA控制WS2812

    MCU:STM32F103c8t6 开发工具:STM32CubeMX  使用板子参考原理图:STM32F103C8T6最小系统板开源链接 脉宽调制(PWM)基本原理:控制方式就是对逆变电路开关器件的通断进行控制,使输出端得到一系列幅值相等但宽度不一致的脉冲,用这些脉冲来代替正弦波或所需要的波形。也就是在输

    2024年02月01日
    浏览(48)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包