智能垃圾桶分为两个外设分别为超声波模块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 */
}