这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界» 论坛首页» DIY与开源设计» 电子DIY» 【STM32Nucleo-C031C6样片开发】---自动门锁

共26条 1/3 1 2 3 跳转至

【STM32Nucleo-C031C6样片开发】---自动门锁

菜鸟
2023-03-11 17:41:02 打赏

自动门锁

因为最近一直在忙毕设,所以STM32 Nucleo-C031C6的小项目开发有所耽搁,本次自动门锁的小项目设计,采用STM32 Nucleo-C031C6、HC-SR505、0.96寸OLED、SG90舵机共同完成。

利用HC-SR505进行AD信息采集,当人体靠近时,HC-SR505采集到数据信息并反馈给单片机,单片机通过分析数据,进行0.96寸OLED数据显示,SG90舵机旋转等操作,并实时将数据在串口助手上进行打印。

串口打印信息:

~QB%]J46{1P0{MRZ`7XHNN6.png

整体连线:

IMG_20230311_124401.jpg

整体操作流程:

单片机上电后,通过判断按键是否按下,选择是否开始工作。按键1按下,led常亮,进入功能1。

功能1:人体经过红外传感器,进行数据采集,上传给单片机后,单片机控制舵机旋转(舵机模拟门锁),并在OLED屏上进行开门提示。当红外传感器没有采集到人体信息,关闭舵机,并在OLED屏上进行关门提醒。

再次按下按键1,led熄灭,进入功能2。

功能2:关闭所有功能,进入待机状态,并在OLED屏上进行关机提示,2秒过后,OLED屏关闭显示。


芯片引脚使用情况:

[ZPJ]OD_[B`CT`4C(%_ZQKC.png




主函数代码:

int main(void) { /* USER CODE BEGIN 1 */ /* USER CODE END 1 */ /* MCU Configuration------------------------------------------------------*/ /* Reset of all peripherals, Initializes the Flash interface and the Systick. */ HAL_Init(); /* USER CODE BEGIN Init */ /* USER CODE END Init */ /* Configure the system clock */ SystemClock_Config(); /* USER CODE BEGIN SysInit */ /* USER CODE END SysInit */ /* Initialize all configured peripherals */ MX_GPIO_Init(); MX_TIM3_Init(); HAL_TIM_PWM_Start(&htim3,TIM_CHANNEL_4); OLED_Init(); MX_ADC1_Init(); MX_USART2_UART_Init(); /* USER CODE BEGIN 2 */ OLED_ShowString(1, 1, "hello world!"); OLED_ShowString(2, 1, "Program loading."); OLED_ShowString(3, 1, " --1-- "); __HAL_TIM_SET_COMPARE(&htim3,TIM_CHANNEL_4,500); printf("功能选择中...\r\n"); /* USER CODE END 2 */ /* Infinite loop */ /* USER CODE BEGIN WHILE */ while (1) { if(k==1) { HAL_ADC_Start_IT(&hadc1); i=ADC_Value/4000; n++; sum=sum+i; if(n>500)//采集500个数进行判断消抖 { if(sum>333)//采集到数据信息 { if(t==0) { t=1; OLED_Clear(); OLED_ShowString(1, 1, "identified!"); OLED_ShowString(2, 1, "open"); OLED_ShowString(3, 1, " --1-- "); __HAL_TIM_SET_COMPARE(&htim3,TIM_CHANNEL_4,1500); printf("门已开启,通行中...\r\n"); } i=0; n=0; sum=0; } else { if(t==1) { t=0; OLED_Clear(); OLED_ShowString(1, 1, "nothing!"); OLED_ShowString(2, 1, "close"); OLED_ShowString(3, 1, " --1-- "); __HAL_TIM_SET_COMPARE(&htim3,TIM_CHANNEL_4,500); printf("门已关闭,请耐心等待...\r\n"); } i=0; n=0; sum=0; } n=0; sum=0; } } else if(k==2) { if(k==2) { OLED_Clear(); OLED_ShowString(1, 1, "shutting down"); OLED_ShowString(3, 1, " --2-- "); __HAL_TIM_SET_COMPARE(&htim3,TIM_CHANNEL_4,500); HAL_Delay(2000); printf("正在关机...\r\n"); HAL_Delay(2000); OLED_Clear(); k=3; printf("已关机...\r\n"); } } /* USER CODE END WHILE */ /* USER CODE BEGIN 3 */ } /* USER CODE END 3 */ }

中断代码:

void HAL_GPIO_EXTI_Rising_Callback(uint16_t GPIO_Pin) { if(GPIO_Pin == GPIO_PIN_13) { LED_TOGGLE(); if(k==0) k=1; else if(k==1) k=2; else { k=1; printf("系统数据正在加载中,请耐心等待...\r"); OLED_ShowString(1, 1, "loading..."); } printf("系统功能转换中,转换至[功能%d]...\r\n",k); } }//中断配置按键 void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef *hadc)//中断回调函数--ad采集 { if(hadc->Instance == ADC1) { ADC_Value = HAL_ADC_GetValue(&hadc1); ADC_Volt = ADC_Value * 3300 / 4096; //UR1_Send_Info(); } }


本次基于STM32 Nucleo-C031C6设计的小项目均由手边现有的模块构成,hal库的学习也均采用STM32 Nucleo-C031C6当作学习板,所以本项目若存在什么缺陷,欢迎大家在评论区指出,本人会根据大家的意见继续改进项目,优化代码。


增加:因原代码中采用硬件i2c与pwm起冲突,所以将硬件i2c更改成了软件i2c,代码有些许不同,但源代码逻辑正常无需更改,只需更改部分oled代码。






关键词: STM32 Nucleo-C031C6 样片 开发

助工
2023-03-11 18:10:21 打赏
2楼

感谢楼主的分享,很实用了。


高工
2023-03-11 21:05:08 打赏
3楼

感谢分享


院士
2023-03-11 23:02:03 打赏
4楼

学习


院士
2023-03-11 23:08:20 打赏
5楼

学习并收藏了,谢谢分享。


专家
2023-03-12 00:14:37 打赏
6楼

感谢楼主分享



专家
2023-03-12 00:15:00 打赏
7楼

感谢分享


专家
2023-03-12 01:31:56 打赏
8楼

感谢楼主的分享,很实用了。


专家
2023-03-12 01:34:32 打赏
9楼

感谢楼主的分享,很实用了。


高工
2023-03-12 04:16:01 打赏
10楼

感谢楼主的分享,很实用了。


共26条 1/3 1 2 3 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册]