STM32F103 常用代码

距离传感器
//发送0x55,等待数据返回,然后解析。第一个字节为高,第二个字节为低。

			uint8_t juli[1]={0x55};
			HAL_UART_Transmit(&huart1, (uint8_t*)juli, 1, HAL_MAX_DELAY);
			HAL_Delay(500);
			if(g_usart_rx_sta==0x0001){
//				printf("收到数据了 %c%c \r\n",g_usart_rx_buf[0],g_usart_rx_buf[1]);
				ju_li = g_usart_rx_buf[0]*256+g_usart_rx_buf[1];
				g_usart_rx_sta=0x0000;
				g_jishu_huancun=0;
			}


	//串1角度传感器 55 55 01 06 1B DB E1 F8 0B 43 CE 
	 if(huart->Instance == USART1)  
	{
//		printf("收到数据了1 %c\r\n",g_rx_buffer[0]);		
		if (g_usart_rx_sta == 0x0000)                /* 0收数据,*/	
			{        
				
				g_usart_rx_buf[g_jishu_huancun]=g_rx_buffer[0];
				g_jishu_huancun++;
				if(g_jishu_huancun==2){
					g_usart_rx_sta = 0x0001;
				}
			}
	}

显示屏
			sprintf(result3, "无烟雾无火焰,关水泵");  // 使用 sprintf 合并字符串,并使用占位符插入变量值  
			HAL_UART_Transmit(&huart2, (uint8_t*)Data_t3, (8), HAL_MAX_DELAY);
			HAL_UART_Transmit(&huart2, (uint8_t*)result3, 100, HAL_MAX_DELAY);
			HAL_UART_Transmit(&huart2, (uint8_t*)Data_tail, (4), HAL_MAX_DELAY);
控制IO
	HAL_GPIO_WritePin(GPIOC, GPIO_PIN_13, GPIO_PIN_RESET);
读取IO
	HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_3) == GPIO_PIN_SET

	HAL_GPIO_TogglePin(GPIOA, GPIO_PIN_0);  
    	HAL_Delay(500); // 延迟500毫秒  


PWM
	__HAL_TIM_SET_COMPARE(&htim3,TIM_CHANNEL_4,15000);


PWM调节占空比
void PWM_Config(uint32_t Freq, uint8_t Duty)
{
    uint32_t arr = 1000000 / Freq - 1;
    uint32_t ccr = (uint32_t)Duty * arr / 100;
    __HAL_TIM_SetAutoreload(&htim3, arr);
    __HAL_TIM_SetCompare(&htim3, TIM_CHANNEL_4, ccr);    
}


//————————————————

//                            版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
//  
https://blog.youkuaiyun.com/qq_33288274/article/details/125029664?spm=1001.2014.3001.5506                      
//原文链接:https://blog.youkuaiyun.com/wanglong3713/article/details/134938244
https://blog.youkuaiyun.com/weixin_49337111/article/details/135671353?spm=1001.2014.3001.5506



//接收DHT11的温度和湿度的值
	DHT11_Read_Data(&temperature , &humidity); 


		pinglu++;
		if(pinglu>65535){
				pinglu=0;
		}
		
		if(pinglu % 100 == 0){
			
				printf("温度%.2f阀值%.2f\r\n",wendu,wenduzhi);
				printf("湿度%.2f阀值%.2f\r\n",shidu,shiduzhi);
				printf("甲醛%.2f阀值%.2f\r\n",jiaquan,jiaqianzhi);
				printf("PM2.5%.2f阀值%.2f\r\n",pm,pmzhi);
		   
		}


你先自己先看下,有问题用文档写出来,我有时间逐条回复哦,有点忙,看信息可能不及时

// https://cloud.alientek.com/manage 18371501992 yz123612  WiFi名 rxdqwlw WiFi密码 wlw65675333 待客户注册

第一步:用华为手机开热点 WiFi名 rxdqwlw WiFi密码 wlw65675333    (2.4G)
第二步:登录https://cloud.alientek.com/manage 用户名18371501992 密码yz123612
第三步:用手机充电器给实物供电


https://cloud.alientek.com/manage
注册一个账号密码,发群里面,后面写程序网页控制会用到

拳头哥2020 qt123612 https://iot.console.aliyun.com/lk/summary/new

注册账号密码,实名认证以后,账号密码发我

WiFi
if(huart->Instance == USART3)  
	{
		//串口3 WiFi 65 00 05 01 FF FF FF  65 00 06 01 FF FF FF  加05 减06
		if (g3_usart_rx_sta == 0x0000)                
			{        
				g3_usart_rx_buf[g3_jishu_huancun]=g3_rx_buffer[0];
				if(g3_usart_rx_buf[g3_jishu_huancun]==0xFF&&g3_usart_rx_buf[g3_jishu_huancun-1]==0xFF&&g3_usart_rx_buf[g3_jishu_huancun-2]==0xFF){
						 g3_usart_rx_sta = 0x0002; 	
				}
				g3_jishu_huancun++;
				if(g3_jishu_huancun>1000){
					g3_jishu_huancun=0;
				}
			}
	}



65000401FFFFFF
65000501FFFFFF
65000601FFFFFF
到
65000C01FFFFFF

原子云不能有空格

语音播放
				uint8_t play[5]={0x7E,0x03,0x01,0x02,0xEF};
				uint8_t pause[5]={0x7E,0x03,0x02,0x01,0xEF};

				HAL_UART_Transmit(&huart3, (uint8_t*)play, 5, HAL_MAX_DELAY);
				HAL_Delay(10000);
				HAL_UART_Transmit(&huart3, (uint8_t*)pause, 5, HAL_MAX_DELAY);
ADC
				//获取亮度
		for(int i=0;i<4;i++){
		  HAL_ADC_Start(&hadc1);     //启动ADC转换
			HAL_ADC_PollForConversion(&hadc1, 50);   //等待转换完成,50为最大等待时间,单位为ms
			ADC_Value = HAL_ADC_GetValue(&hadc1);   //获取AD值	 
			ADC_Value_zu[i]=ADC_Value;
//			printf("%d: %d \r\n",i,ADC_Value);
		}
		HAL_Delay(100);
		HAL_ADC_Stop(&hadc1);
		

		liangdu = 1-(ADC_Value_zu[0]*1.0f/4096);


y = -0.0325x + 95.441
	wendu = (ADC_Value_zu[0]*(-0.0325f))+ 95.441f;
wend
参考文献:
https://blog.youkuaiyun.com/qq153471503/article/details/108123019?spm=1001.2014.3001.5506




CO2  
	 if(huart->Instance == USART1)  
	{
		
		if (g_usart_rx_sta == 0x0000)                /* 0收数据,*/	
			{        
				
				if(g_rx_buffer[0]==0x2C){
					g_jishu_huancun=0;
				}
				g_usart_rx_buf[g_jishu_huancun]=g_rx_buffer[0];
				g_jishu_huancun++;
				if( g_jishu_huancun>8){
					 g_usart_rx_sta = 0x0002;
				}
			}
	}

		if(g_usart_rx_sta == 0x0002){
		

			co2 = g_usart_rx_buf[6]*256+g_usart_rx_buf[7];
			
			g_usart_rx_sta=0x0000;
			g_jishu_huancun=0;
		
		}	





uint8_t *wendu_fasong_bytes = (uint8_t *)&wendu_fasong; // 将uint16_t指针转换为uint8_t指针  
  
printf("%02X%02X", wendu_fasong_bytes[0], wendu_fasong_bytes[1]); // 打印两个字节的十六进制值

//串1 粉尘
	 if(huart->Instance == USART1)  
	{
		
		if (g_usart_rx_sta == 0x0000)                /* 0收数据,*/	
			{        
				
				if(g_rx_buffer[0]==0xFF){
					g_jishu_huancun=0;
				}
				g_usart_rx_buf[g_jishu_huancun]=g_rx_buffer[0];
				g_jishu_huancun++;
				if( g_jishu_huancun>7){
					 g_usart_rx_sta = 0x0002;
				}
			}
	}

if(g_usart_rx_sta == 0x0002){
			
			fencheng=g_usart_rx_buf[3]+(g_usart_rx_buf[4])*0.1;
			
			g_usart_rx_sta=0x0000;
			g_jishu_huancun=0;
			
		}	

模式要接地。


蓝牙模块
	
	if(g_usart_rx_sta == 0x0002){
			if(g_usart_rx_buf[2]==0x04){
				dengkai=1;
			}else if(g_usart_rx_buf[2]==0x05){
			  dengkai=0;
			}else if(g_usart_rx_buf[2]==0x06){
			  chuangkai=1;
			}else if(g_usart_rx_buf[2]==0x07){
			  chuangkai=0;
			}
			
			g_usart_rx_sta=0x0000;
			g_jishu_huancun=0;
			
		}	
	//串1 蓝牙
	 if(huart->Instance == USART1)  
	{
		//串口2屏幕,65 00 05 01 FF FF FF  65 00 06 01 FF FF FF  加05 减06
		if (g_usart_rx_sta == 0x0000)                /* 0收数据,*/	
			{        
				g_usart_rx_buf[g_jishu_huancun]=g_rx_buffer[0];
				if(g_usart_rx_buf[g_jishu_huancun]==0xFF&&g_usart_rx_buf[g_jishu_huancun-1]==0xFF&&g_usart_rx_buf[g_jishu_huancun-2]==0xFF){
						 g_usart_rx_sta = 0x0002; 	
				}
				g_jishu_huancun++;
			}
	}

显示屏 曲线 只能显示0255的数据 

		printf("add s0.id,0,%d\xff\xff\xff",(int)pingjunsudu);
		
		sprintf(result1, "add s0.id,0,%d\xff\xff\xff",(int)sudu);  // 使用 sprintf 合并字符串,并使用占位符插入变量值  
		HAL_UART_Transmit(&huart1, (uint8_t*)result1, 100, HAL_MAX_DELAY);

//发送短信
void gsm_duanxing(void){

		HAL_Delay(2000);

		printf("AT+CSCS=\"GSM\"\r\n");
		HAL_Delay(1000);
		printf("AT+CMGF=1\r\n");
		HAL_Delay(1000);
		printf("AT+CMGS=\"18539791687\"\r\n");
		HAL_Delay(1000);
		printf("Warning: Vehicle suffocation may occur\r\n");
		HAL_Delay(1000);
		printf("%c\r\n",0x1A);
		HAL_Delay(1000);			
}

教程:https://blog.youkuaiyun.com/as480133937/article/details/105741893?spm=1001.2014.3001.5506
教程2:https://www.bilibili.com/video/BV1pm421g77H/?spm_id_from=333.999.0.0&vd_source=90b8b87847ead722213300a37952fa1a
RTC功能
.h

/* USER CODE BEGIN Prototypes */
extern uint16_t MyRTC_Time[];

void MyRTC_Init(void);
void MyRTC_SetTime(void);
void MyRTC_ReadTime(void);

/* USER CODE END Prototypes */


.c
/* USER CODE BEGIN 0 */

#include <time.h>


uint16_t MyRTC_Time[] = {2024, 10, 15, 23, 59, 50};	//定义全局的时间数组,数组内容分别为年、月、日、时、分、秒

void MyRTC_SetTime(void);				//函数声明


/**
  * 函    数:RTC设置时间
  * 参    数:无
  * 返 回 值:无
  * 说    明:调用此函数后,全局数组里时间值将刷新到RTC硬件电路
  */
void MyRTC_SetTime(void)
{
	time_t time_cnt;		//定义秒计数器数据类型
	struct tm time_date;	//定义日期时间数据类型
	
	time_date.tm_year = MyRTC_Time[0] - 1900;		//将数组的时间赋值给日期时间结构体
	time_date.tm_mon = MyRTC_Time[1] - 1;
	time_date.tm_mday = MyRTC_Time[2];
	time_date.tm_hour = MyRTC_Time[3];
	time_date.tm_min = MyRTC_Time[4];
	time_date.tm_sec = MyRTC_Time[5];
	
	time_cnt = mktime(&time_date) - 8 * 60 * 60;	//调用mktime函数,将日期时间转换为秒计数器格式
													//- 8 * 60 * 60为东八区的时区调整
	
//	RTC_SetCounter(time_cnt);						//将秒计数器写入到RTC的CNT中
//	RTC_WaitForLastTask();							//等待上一次操作完成
	
	uint32_t TimeCounter=time_cnt;
	RTC_WriteTimeCounter(&hrtc,TimeCounter);
	
}
/**
  * 函    数:RTC读取时间
  * 参    数:无
  * 返 回 值:无
  * 说    明:调用此函数后,RTC硬件电路里时间值将刷新到全局数组
  */
void MyRTC_ReadTime(void)
{
	time_t time_cnt;		//定义秒计数器数据类型
	struct tm time_date;	//定义日期时间数据类型
	
//	time_cnt = RTC_GetCounter() + 8 * 60 * 60;		//读取RTC的CNT,获取当前的秒计数器
//													//+ 8 * 60 * 60为东八区的时区调整
	
	time_cnt = RTC_ReadTimeCounter(&hrtc) + 8 * 60 * 60;		//读取RTC的CNT,获取当前的秒计数器
													//+ 8 * 60 * 60为东八区的时区调整
	
	
	time_date = *localtime(&time_cnt);				//使用localtime函数,将秒计数器转换为日期时间格式
	
	MyRTC_Time[0] = time_date.tm_year + 1900;		//将日期时间结构体赋值给数组的时间
	MyRTC_Time[1] = time_date.tm_mon + 1;
	MyRTC_Time[2] = time_date.tm_mday;
	MyRTC_Time[3] = time_date.tm_hour;
	MyRTC_Time[4] = time_date.tm_min;
	MyRTC_Time[5] = time_date.tm_sec;
}


/* USER CODE END 0 */

/* RTC init function */
void MX_RTC_Init(void)
{

  /* USER CODE BEGIN RTC_Init 0 */

  /* USER CODE END RTC_Init 0 */

  RTC_TimeTypeDef sTime = {0};
  RTC_DateTypeDef DateToUpdate = {0};

  /* USER CODE BEGIN RTC_Init 1 */

  /* USER CODE END RTC_Init 1 */
  /** Initialize RTC Only
  */
  hrtc.Instance = RTC;
  hrtc.Init.AsynchPrediv = RTC_AUTO_1_SECOND;
  hrtc.Init.OutPut = RTC_OUTPUTSOURCE_NONE;
  if (HAL_RTC_Init(&hrtc) != HAL_OK)
  {
    Error_Handler();
  }

  /* USER CODE BEGIN Check_RTC_BKUP */
	
	if(HAL_RTCEx_BKUPRead(&hrtc,RTC_BKP_DR1)!= 0x5051)
	{
		
		if(0)
	{
	

  /* USER CODE END Check_RTC_BKUP */

  /** Initialize RTC and set the Time and Date
  */
  sTime.Hours = 0x11;
  sTime.Minutes = 0x50;
  sTime.Seconds = 0x0;

  if (HAL_RTC_SetTime(&hrtc, &sTime, RTC_FORMAT_BCD) != HAL_OK)
  {
    Error_Handler();
  }
  DateToUpdate.WeekDay = RTC_WEEKDAY_THURSDAY;
  DateToUpdate.Month = RTC_MONTH_FEBRUARY;
  DateToUpdate.Date = 0x22;
  DateToUpdate.Year = 0x24;

  if (HAL_RTC_SetDate(&hrtc, &DateToUpdate, RTC_FORMAT_BCD) != HAL_OK)
  {
    Error_Handler();
  }
  /* USER CODE BEGIN RTC_Init 2 */
	}
	MyRTC_SetTime();
	HAL_RTCEx_BKUPWrite(&hrtc,RTC_BKP_DR1,0x5051);
	}

  /* USER CODE END RTC_Init 2 */

}

主函数
		MyRTC_ReadTime();							//RTC读取时间,最新的时间存储到MyRTC_Time数组中
		
		printf("%d:%d:%d:%d:%d:%d\r\n", MyRTC_Time[0],MyRTC_Time[1],MyRTC_Time[2],MyRTC_Time[3],MyRTC_Time[4],MyRTC_Time[5]);	
		
		HAL_Delay(1000);

更新日期:20241016
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值