STM32项目_无垃圾桶的智能垃圾桶

智能垃圾桶分为两个外设分别为超声波模块HC-04,SG90、0.96OLED
单片机内部资源使用情况:TIM1、TIM2、TIM3、GPIO口(软件模拟)

OLED配置

cubemx配置

软件模拟I2C_SCL

在这里插入图片描述

软件模拟I2C_SDA

在这里插入图片描述

代码部分移植江科大自动协

将端口改掉,修改后如下

#include "stm32f1xx_hal.h"
#define OLED_W_SCL(x) HAL_GPIO_WritePin(OLED_SCL_GPIO_Port,OLED_SCL_Pin,(GPIO_PinState)(x))
#define OLED_W_SDA(x) HAL_GPIO_WritePin(OLED_SDA_GPIO_Port,OLED_SDA_Pin,(GPIO_PinState)(x))

超声波测距模块编写

cubemx配置(us)

us级延时

在这里插入图片描述

Delay.h

#ifndef __DELAY_H
#define __DELAY_H

#include "stm32f1xx_hal.h"
#include "tim.h"
void Delay_us(uint16_t us);

#endif

Delay.c

#include "delay.h"


void Delay_us(uint16_t us)
{
	uint16_t differ = 0xffff - us - 5;
	__HAL_TIM_SET_COUNTER(&htim1,differ);
	HAL_TIM_Base_Start(&htim1);
	
	while(differ < 0xffff - 5)
	{
		differ = __HAL_TIM_GET_COUNTER(&htim1);
	}
	HAL_TIM_Base_Stop(&htim1);
}

cubemx配置(HC04)

Trig引脚

在这里插入图片描述

Echo引脚

在这里插入图片描述

开启中断

在这里插入图片描述

HC04代码编写

Devrier_sr04.h

#ifndef __DRIVER_SR04_H
#define __DRIVER_SR04_H

#include "stm32f1xx_hal.h"
#include "main.h"
#include "delay.h"
#include "oled.h"

#define Trig_ON    HAL_GPIO_WritePin(Trig_GPIO_Port,Trig_Pin,GPIO_PIN_SET);
#define Trig_OFF   HAL_GPIO_WritePin(Trig_GPIO_Port,Trig_Pin,GPIO_PIN_RESET);

void SR04_Trig(void);
void SR04_Test(void);

#endif

Devrier_sr04.c

#include "driver_sr04.h"

uint32_t distance_cm = 0;
void SR04_Trig(void)
{
	Trig_ON;
	Delay_us(10);
	Trig_OFF;
//	HAL_GPIO_WritePin();
}

void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
	static int count = 0;
	if(GPIO_Pin == Echo_Pin)
	{
		if(HAL_GPIO_ReadPin(Echo_GPIO_Port,Echo_Pin) == GPIO_PIN_SET)
		{
			HAL_TIM_Base_Start(&htim2);
			__HAL_TIM_SetCounter(&htim2,0);
		}
		else if(HAL_GPIO_ReadPin(Echo_GPIO_Port,Echo_Pin) == GPIO_PIN_RESET)
		{
			HAL_TIM_Base_Stop(&htim2);
			count = __HAL_TIM_GetCounter(&htim2);
			distance_cm = count * 340 / 2 * 0.000001 * 100;
			OLED_ShowString(1,1,"Distance:");
			OLED_ShowNum(1,11,distance_cm,3);
			count = 0;
		}
	}
}
void SR04_Test(void)
{
	int SR04_Tick = 0;
	if(HAL_GetTick() - SR04_Tick > 50)
	{
	 SR04_Tick = HAL_GetTick();
	 SR04_Trig();
	}
}

cubemx配置(SG90)

定时器3通道1,舵机配置50HZ~~(72M / 720 /arr)
在这里插入图片描述

代码编写

SG90.h

#ifndef __SG90_H
#define __SG90_H

#include "stm32f1xx_hal.h"

void SG90_Init(void);
uint16_t SG90_Set(uint8_t Angle);
void SG90_Show(uint16_t val);

void SG90_Control(void);

#endif

SG90.c

#include "sg90.h"
#include "tim.h"
extern uint32_t distance_cm;
void SG90_Init(void)
{
	HAL_TIM_PWM_Start(&htim3,TIM_CHANNEL_1);
	__HAL_TIM_SET_COMPARE(&htim3,TIM_CHANNEL_1,50);
}

uint16_t SG90_Set(uint8_t Angle)
{
//	float Ret = (Angle / 180) * 2000 + 500;
	float Ret = (Angle / 9) * 10 + 50;
	return Ret;
}
void SG90_Show(uint16_t val)
{
	__HAL_TIM_SET_COMPARE(&htim3,TIM_CHANNEL_1,val);
}
void SG90_Control(void)
{
	if(distance_cm < 50)
	{
		SG90_Show(SG90_Set(0));
	}
	else if(distance_cm > 50)
	{
		SG90_Show(SG90_Set(90));
	}
}

main函数编写

/*头文件以及初始化写上~~~*/
while (1)
  {
	  SR04_Test();
	  SG90_Control();
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
  }
  • 5
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值