基于STM32的智能行车辅助系统源码,文档,视频(自动大灯,倒车报警,自动雨刷,温湿度传感器,TFT 1.3寸LCD屏幕显示,ESP8266WIFI)

基于STM32+ESP8266的智能行车辅助系统

基于STM32的智能行车辅助系统(自动大灯,倒车报警,自动雨刷,温湿度传感器,TFT 1.3寸LCD屏幕显示,ESP8266WIFI),这是一个课程设计。这个题目没有成品。但是我还是完成了。

DHT11模块:
DHT11

是一款有已校准数字信号输出的温湿度传感器。 其精度湿度±5%RH, 温度±2℃,量程湿度5~95%RH, 温度-20~+60℃。

SR04超声波模块:

1.采用IO口触发测距,给至少10us高电平脉冲;
2.模块自动发送八个40khz方波,并自主检测是否有电波返回;
3.当有信号返回时,通过IO口输出一个高电平,高电平的持续时间就是超声波从发送到返回的时间;
4.测距公式:距离=(高电平时间*声速)/2;

光敏传感器:

光敏传感器是利用光敏元件将光信号转换为电信号的传感器,它的敏感波长在可见光波长附近,包括红外线波长和紫外线波长。光传感器不只局限于对光的探测,它还可以作为探测元件组成其他传感器,对许多非电量进行检测,只要将这些非电量转换为光信号的变化即可。

TFT屏幕:

TFT式显示屏是各类笔记本电脑和台式机上的主流显示设备,该类显示屏上的每个液晶像素点都是由集成在像素点后面的薄膜晶体管来驱动,因此TFT式显示屏也是一类有源矩阵液晶显示设备。这里采用1.3SPI协议的IPS屏幕

雨滴传感器:

雨滴传感器是一种传感装置,主要用于检测是否下雨及雨量的大小,并广泛应用于汽车自动刮水系统、智能灯光系统和智能天窗系统等。

ESP8266:

ESP8266是一款物联网WiFi芯片,基于ESP8266可以开发物联网串口WiFi模块,通过AT指令初始化等。全双工模块。可以用来物联网交互
架构图
过程:

自动大灯

根据光敏传感器的DO模式,在判断光敏阈值来发送不同电平,这里采用LED灯,判断亮度来是否点亮LED。
步骤:采用串口输出打印亮度,用手遮挡测试黑暗和白天的光敏亮度值,记录。通过记录的亮度值来逻辑判断。

倒车辅助

使用HC-SR04超声波模块,根据来回的时间和声速计算距离,通过串口打印观察,通过距离判断来点亮LED+蜂鸣器报警。
步骤:逻辑判断距离,可根据不同距离设定不同的报警方式,如LED闪烁速度和蜂鸣器节奏

温度监测

使用DHT11模块检测温湿度。串口打印观察。

自动雨刷

通过DO模式直接判断电平输出高低来报警有雨。如果用AO模式可以输出雨滴数量等更多细节。

WIFI

ESP8266全双工
方式1:使用发射模式,安卓APP连接模块发射的WIFI并和安卓APP交互发送请求。
方式2:使用接受模式,保存HTML文件到模块并创建IP,作为服务器连接手机wifi,手机访问IP即可看到HTML页面直接读取温湿度等

基本功能完成
做一个制糊的外壳
弄个剩下的小车固定上去

最后加了一个舵机。让雨滴检测到后左右摆动模拟雨刮器。

核心代码:

资源:https://download.csdn.net/download/m0_47987937/87865646

void microDelay (uint16_t delay)
{
    
    
  __HAL_TIM_SET_COUNTER(&htim1, 0);
  while (__HAL_TIM_GET_COUNTER(&htim1) < delay);
}

uint8_t DHT11_Start (void)
{
    
    
  uint8_t Response = 0;
  GPIO_InitTypeDef GPIO_InitStructPrivate = {
    
    0};
  GPIO_InitStructPrivate.Pin = DHT11_PIN;
  GPIO_InitStructPrivate.Mode = GPIO_MODE_OUTPUT_PP;
  GPIO_InitStructPrivate.Speed = GPIO_SPEED_FREQ_LOW;
  GPIO_InitStructPrivate.Pull = GPIO_NOPULL;
  HAL_GPIO_Init(DHT11_PORT, &GPIO_InitStructPrivate); // set the pin as output
  HAL_GPIO_WritePin (DHT11_PORT, DHT11_PIN, 0);   // pull the pin low
  HAL_Delay(20);   // wait for 20ms
  HAL_GPIO_WritePin (DHT11_PORT, DHT11_PIN, 1);   // pull the pin high
  microDelay (30);   // wait for 30us
  GPIO_InitStructPrivate.Mode = GPIO_MODE_INPUT;
  GPIO_InitStructPrivate.Pull = GPIO_PULLUP;
  HAL_GPIO_Init(DHT11_PORT, &GPIO_InitStructPrivate); // set the pin as input
  microDelay (40);
  if (!(HAL_GPIO_ReadPin (DHT11_PORT, DHT11_PIN)))
  {
    
    
    microDelay (80);
    if ((HAL_GPIO_ReadPin (DHT11_PORT, DHT11_PIN))) Response = 1;
  }
  pMillis = HAL_GetTick();
  cMillis = HAL_GetTick();
  while ((HAL_GPIO_ReadPin (DHT11_PORT, DHT11_PIN)) && pMillis + 2 > cMillis)
  {
    
    
    cMillis = HAL_GetTick();
  }
  return Response;
}

uint8_t DHT11_Read (void)
{
    
    
  uint8_t a,b;
  for (a=0;a<8;a++)
  {
    
    
    pMillis = HAL_GetTick();
    cMillis = HAL_GetTick();
    while (!(HAL_GPIO_ReadPin (DHT11_PORT, DHT11_PIN)) && pMillis + 2 > cMillis)
    {
    
      // wait for the pin to go high
      cMillis = HAL_GetTick();
    }
    microDelay (40);   // wait for 40 us
    if (!(HAL_GPIO_ReadPin (DHT11_PORT, DHT11_PIN)))   // if the pin is low
      b&= ~(1<<(7-a));
    else
      b|= (1<<(7-a));
    pMillis = HAL_GetTick();
    cMillis = HAL_GetTick();
    while ((HAL_GPIO_ReadPin (DHT11_PORT, DHT11_PIN)) && pMillis + 2 > cMillis)
    {
    
      // wait for the pin to go low
      cMillis = HAL_GetTick();
    }
  }
  return b;
}
/* USER CODE END 0 */

/**
  * @brief  The application entry point.
  * @retval int
  */
int main(void)
{
    
    
  /* USER CODE BEGIN 1 */

	//float t=0;
	uint8_t temp=0;
	uint8_t humidity =0;
	uint8_t t=0;			    

  /* 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_ADC1_Init();
  MX_USART1_UART_Init();
  MX_TIM1_Init();
  MX_TIM2_Init();
	
  /* USER CODE BEGIN 2 */
	LCD_Init();//LCD初始化
		HAL_TIM_PWM_Start(&htim2,TIM_CHANNEL_1);//***定时器初始化
	LCD_Fill(0,0,LCD_W,LCD_H,WHITE);
	for(int i=0;i<3;i++)
	{
    
    
		LED();
	HAL_Delay(100);
	}
	 HAL_TIM_Base_Start(&htim1);
  HAL_GPIO_WritePin(TRIG_PORT, TRIG_PIN, GPIO_PIN_RESET);  // pull the TRIG pin low
	
	

  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
    
    
		
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
		 HAL_GPIO_WritePin(TRIG_PORT, TRIG_PIN, GPIO_PIN_SET);  // pull the TRIG pin HIGH
    __HAL_TIM_SET_COUNTER(&htim1, 0);
    while (__HAL_TIM_GET_COUNTER (&htim1) < 10);  // wait for 10 us
    HAL_GPIO_WritePin(TRIG_PORT, TRIG_PIN, GPIO_PIN_RESET);  // pull the TRIG pin low

    pMillis = HAL_GetTick(); // used this to avoid infinite while loop  (for timeout)
    // wait for the echo pin to go high
    while (!(HAL_GPIO_ReadPin (ECHO_PORT, ECHO_PIN)) && pMillis + 10 >  HAL_GetTick());
    Value1 = __HAL_TIM_GET_COUNTER (&htim1);

    pMillis = HAL_GetTick(); // used this to avoid infinite while loop (for timeout)
    // wait for the echo pin to go low
    while ((HAL_GPIO_ReadPin (ECHO_PORT, ECHO_PIN)) && pMillis + 50 > HAL_GetTick());
    Value2 = __HAL_TIM_GET_COUNTER (&htim1);
		
    Distance = (Value2-Value1)* 0.034/2;
		if(Distance < 15 && Distance >10){
    
    
			LCD_ShowChinese(20,100,"碰撞警告!",RED,WHITE,16,0);
			LCD_ShowIntNum(100,100,Distance,2,RED,WHITE,16);
			LCD_ShowChinese(120,100,"厘米:",RED,WHITE,16,0);
			
	
			HAL_GPIO_WritePin(LED_SR04_GPIO_Port, LED_SR04_Pin, GPIO_PIN_SET);
			HAL_GPIO_WritePin(BI_GPIO_Port, BI_Pin, GPIO_PIN_RESET);
			HAL_Delay(400);
			HAL_GPIO_WritePin(LED_SR04_GPIO_Port, LED_SR04_Pin, GPIO_PIN_RESET);
			HAL_GPIO_WritePin(BI_GPIO_Port, BI_Pin, GPIO_PIN_SET);
			HAL_Delay(400);
			
		}else if(Distance <=10 && Distance >5){
    
    

			HAL_GPIO_WritePin(LED_SR04_GPIO_Port, LED_SR04_Pin, GPIO_PIN_SET);
			HAL_GPIO_WritePin(BI_GPIO_Port, BI_Pin, GPIO_PIN_RESET);
			HAL_Delay(100);
			HAL_GPIO_WritePin(LED_SR04_GPIO_Port, LED_SR04_Pin, GPIO_PIN_RESET);
			HAL_GPIO_WritePin(BI_GPIO_Port, BI_Pin, GPIO_PIN_SET);
			
			
			LCD_ShowChinese(20,100,"碰撞警告!",RED,WHITE,16,0);
			LCD_ShowIntNum(100,100,Distance,2,RED,WHITE,16);
			LCD_ShowChinese(120,100,"厘米:",RED,WHITE,16,0);
			
			HAL_Delay(100);
		}else if(Distance <=5 && Distance >1 ){
    
    
			HAL_GPIO_WritePin(LED_SR04_GPIO_Port, LED_SR04_Pin, GPIO_PIN_SET);
			HAL_GPIO_WritePin(BI_GPIO_Port, BI_Pin, GPIO_PIN_RESET);
			HAL_Delay(20);
			HAL_GPIO_WritePin(LED_SR04_GPIO_Port, LED_SR04_Pin, GPIO_PIN_RESET);
			HAL_GPIO_WritePin(BI_GPIO_Port, BI_Pin, GPIO_PIN_SET);
			
			LCD_ShowChinese(20,100,"碰撞警告!",RED,WHITE,16,0);
			LCD_ShowIntNum(100,100,Distance,1,RED,WHITE,16);
			LCD_ShowChinese(120,100,"厘米:",RED,WHITE,16,0);
			HAL_Delay(20);
			
		}else if(Distance <2 ){
    
    
			HAL_GPIO_WritePin(LED_SR04_GPIO_Port, LED_SR04_Pin, GPIO_PIN_SET);
			HAL_GPIO_WritePin(BI_GPIO_Port, BI_Pin, GPIO_PIN_RESET);
		}else{
    
    
			HAL_GPIO_WritePin(LED_SR04_GPIO_Port, LED_SR04_Pin, GPIO_PIN_RESET);
			HAL_GPIO_WritePin(BI_GPIO_Port, BI_Pin, GPIO_PIN_SET);
			__HAL_TIM_SET_COMPARE(&htim2,TIM_CHANNEL_1,0);
		}
		if(GPIOB->IDR& GPIO_IDR_IDR1){
    
    
			LCD_ShowChinese(130,100,"",RED,WHITE,16,0);
			HAL_GPIO_WritePin(LED_GPIO_Port, LED_Pin, GPIO_PIN_RESET);
			HAL_GPIO_WritePin(BI_GPIO_Port, BI_Pin, GPIO_PIN_SET);
		}else if((~GPIOB->IDR)& GPIO_IDR_IDR1){
    
    
			LCD_ShowChinese(130,100,"有雨!",RED,WHITE,16,0);
			__HAL_TIM_SET_COMPARE(&htim2,TIM_CHANNEL_1,100); //相当于一个周期内(20ms)有0.5ms高脉冲
			HAL_GPIO_WritePin(LED_GPIO_Port, LED_Pin, GPIO_PIN_SET);
			HAL_GPIO_WritePin(BI_GPIO_Port, BI_Pin, GPIO_PIN_RESET);
			HAL_Delay(1000);
			HAL_GPIO_WritePin(LED_GPIO_Port, LED_Pin, GPIO_PIN_RESET);
			HAL_GPIO_WritePin(BI_GPIO_Port, BI_Pin, GPIO_PIN_SET);
      __HAL_TIM_SET_COMPARE(&htim2,TIM_CHANNEL_1,200); //相当于一个周期内(20ms)有2.5ms高脉冲
			HAL_Delay(1000);
		}
		if(read_adc()>2000){
    
    
			HAL_GPIO_WritePin(LED_GPIO_Port, LED_Pin, GPIO_PIN_SET);
			LCD_ShowPicture(210,170,30,30,gImage_light);
		}else{
    
    
			HAL_GPIO_WritePin(LED_GPIO_Port, LED_Pin, GPIO_PIN_RESET);
			LCD_ShowPicture(210,170,30,30,gImage_white);
		}

  /* USER CODE BEGIN 3 */

		LCD_ShowPicture(10,10,40,40,gImage_logo);
		LCD_ShowChinese(60,10,"行车辅助",BLACK,WHITE,32,0);
		
		LCD_ShowChinese(50,50,"温度:",BLACK,WHITE,16,0);
		LCD_ShowIntNum(90,50,temp,2,GREEN,WHITE,16);
		LCD_ShowChinese(108,50,"度",BLACK,WHITE,16,0);

		
		LCD_ShowChinese(130,50,"湿度:",BLACK,WHITE,16,0);
		LCD_ShowIntNum(170,50,humidity,2,GREEN,WHITE,16);
		LCD_ShowChinese(188,50,"度",BLACK,WHITE,16,0);
		
		LCD_ShowPicture(0,100,240,16,whitE);
		

		LCD_ShowPicture(0,120,210,90,gImage_car);
		
		if(DHT11_Start())
    {
    
    
      RHI = DHT11_Read(); // Relative humidity integral
      RHD = DHT11_Read(); // Relative humidity decimal
      TCI = DHT11_Read(); // Celsius integral
      TCD = DHT11_Read(); // Celsius decimal
      SUM = DHT11_Read(); // Check sum
      if (RHI + RHD + TCI + TCD == SUM)
      {
    
    
        // Can use RHI and TCI for any purposes if whole number only needed
        tCelsius = (float)TCI + (float)(TCD/10.0);
        tFahrenheit = tCelsius * 9/5 + 32;
        RH = (float)RHI + (float)(RHD/10.0);
        // Can use tCelsius, tFahrenheit and RH for any purposes
      }
			temp = TCI;
			humidity = RHI;
    }
		
  }
  /* USER CODE END 3 */
}

之前有全部提取到各个.c和.h中,main方法只调用非常简洁, 但是弄好后灯闪烁然后整理完的弄丢了。这个加了舵机的就没有再整理。有兴趣的可以继续加。代码我上传了。应该不要积分。如果要就某宝一毛钱下一下。觉得麻烦也可以私信。如果没回复耐心等等哦~
WIFI端用的是ESP8266的AP模式,让它创建一个服务器得到IP地址。通过给里边放一个HTML的字符串在进入服务器的时候浏览器会自动渲染。我们通过a标签不同的src判断发送一些GPIO的基本操作或者读值。但是有点小BUG。是在油管学的。然后这个wifi端只有不带屏幕的。我试了一下全部放进去STM32会报错显示过大了,如果改内存是可以烧进去但是运行不起来。看来是确实太大了。建议还是把上位机单独做一个安卓APP什么的交互。

猜你喜欢

转载自blog.csdn.net/m0_47987937/article/details/128270871