距离传感器
//发送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++;
}
}
显示屏 曲线 只能显示0到255的数据
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日
STM32F103 常用代码
于 2024-10-16 10:18:08 首次发布