SMT32 智能环境监测系统 嵌入式初学者课堂小组作业
一、应用知识
1,开发语言:C语言
2,开发工具:Keil uVision5、Setup_JLinkARM_V415e
3,开发平台:XCOM V2.0
4,开发知识:温湿度传感DHT11、STM32F4xx中文参考手册
5,文件操作:GEC-M4原理图2016-07-29、程序烧录硬件连接、中断控制线
6,任务管理:stm32f4xx_dsp_stdperiph_lib_um
二、软件设计
1、使用的工具软件是:ubuntu,gcc,secureCRT
三、智能环境监测系统实现功能描述:
(1)登录系统:通过串口助手,输入密码登录,正确则蜂鸣器滴一下示意,错误则长鸣一会儿(定义一个数组存放初始密码);
(2)入系统后,通过串口助手输入"temp humi#"就可以定期监测当下环境的温湿度(每隔2秒);(要求温湿度数据能够在串口助手显示),若温湿度超过设定的值范围,蜂鸣器嘀急促报警;
(3)要求按键能够改变温湿度设定的阈值,按下按键1,温度阈值就+1;按下按键2,比如温度阈值就-1:按下按键湿度阈值就+1;按下按键4,湿度阈值就-1,(设定阈值也能实时在串口助手显示)按键控制是由外部中断去控制。
(4)要求开发板的4个led,每隔1s依次闪烁,呈见流水灯效果表示系统稳定运行。
附加实验图片(效果图)
图示1输入错误密码无法进入温湿度检测系统
图2 输入正确密码进入温湿度检测系统并正确读取
图3 密码正确进入正常状态led显示
图4 按键1和按键3分别控制温度和湿度阈值增值
图5 按键2和按键4分别控制温度和湿度减值
温度阈值的标识符:temp_cmp,湿度阈值的标识符:temp_shidu,
四、实训总结
本实验设计温湿度检测系统,根据实验的要求正确实现本次系统功能。更加深入的理解SMT32的应用,也有更加深刻的嵌入式应用开发经历。
实验过程中,遇到过四个方面问题。首先,在每隔两秒显示温湿度的状态值,最开始使用的是定时器中断控制时间的状态,但是在写时定时器与系统的时钟始终无法匹配。之后改用延时函数的方式设置时间显示状态。其次,在当前温度状态值与阈值的比较时,最开始是粗暴的使用result的值进行比较,随后发现效果十分不理想,因为读取温湿度值使用的是数组获取的,因此要提前改数组值进行比较才最为合理,经实验证明效果也十分的理想。
再其次,使用外部中断时,实时的显示了状态的数值以及阈值的数值,但是出现了按键抖动的问题,为了解决这一问题,我们定义了另一种延时函数,在外部中断函数中使用,显示的状态则不会发生一次按下出现多种数值的状态。最后,在阈值警报中,实现了中断的效果,但是改变的阈值数无法与当前变化的温湿度状态进行比较,检查发现,temp_cmp和temp_shidu的值应放入到进入第二个while循环中,也就是进入系统后就进行实时更新。
本次实验解决问题的过程中,感谢我的老师、队友和其他同学们的帮助解惑,没有他们我无法那么顺利的完成,这也让我深刻的理解了团队合作的重要性,更好的指引我未来的工作状态和工作方向。
程序附录:
main
#include "usart.h"
#include <stdio.h>
#include <string.h>
#include "dht11.h"
#include "sys.h"
#include "delay.h"
#include "led.h"
#include "key.h"
#include "exti.h"
EXTI_InitTypeDef EXTI_InitStructure;
int32_t temp_cmp = 25;
int32_t temp_shidu = 50;
void delay()
{int i =0x1000000;while(i--);
}
int main(void)
{ char password_buf[20] = "654321#\r\n"; //输入密码值char buf[5]; //存放温湿度数据的数组 int32_t result = 0; usart1_config(115200); //串口1的初始化 dht11_config(); //dht11的初始化 led_config(); //led配置key_config(); //key配置 exti0_config(); //外部中断0配置 exti2_config(); //外部中断2配置 exti3_config(); //外部中断3配置 exti4_config(); //外部中断4配置 while (1) { if (usart1_event == 1) //断数据是否接收完毕的标志改变 { usart1_event = 0; printf("[%s]\r\n", usart1_recvbuf); if (strcmp((char *)usart1_recvbuf, password_buf) == 0) { printf("密码正确:\r\n"); PFout(8) = 1; delay_ms(1000); PFout(8) = 0; memset((char *)usart1_recvbuf, 0, usart1_cnt); //清空接收数据的数组 usart1_cnt = 0; //清空数据接收记录的个数while (1) { if (strcmp((char *)usart1_recvbuf, "temp_humi?#\r\n") == 0) { result = dht11_read(buf); //读取温湿度 if (result == 0) { float A = (float)buf[2] + (float)buf[3] / 100.0; // buf[3]是小数部分,表示百分之一 printf("读取温湿度成功!\r\n"); printf("temp: %d.%d humi: %d.%d temp_cmp:%d temp_shidu:%d\r\n",buf[2], buf[3], buf[0], buf[1],temp_cmp,temp_shidu); led_ctrl(1,0,0,0); //三盏灯熄灭delay_ms(1000);led_ctrl(0,1,0,0); //三盏灯熄灭delay_ms(1000);led_ctrl(0,0,1,0); //三盏灯熄灭delay_ms(1000);led_ctrl(0,0,0,1);; //三盏灯熄灭delay_ms(1000);if (A > temp_cmp) //比较温度值{ PFout(8) = 1; delay_ms(200); PFout(8) = 0; delay_ms(200); PFout(8) = 1; delay_ms(200); PFout(8) = 0; }if (B> temp_shidu) //比较湿度值{ PFout(8) = 1; delay_ms(200); PFout(8) = 0; delay_ms(200); PFout(8) = 1; delay_ms(200); PFout(8) = 0; } } }}} else { printf("密码错误,请重新输入:\r\n"); PFout(8) = 1; delay_ms(2000); PFout(8) = 0; led_ctrl(1,1,1,1); //四盏灯熄灭} memset((char *)usart1_recvbuf, 0, usart1_cnt); //清空接收数据的数组 usart1_cnt = 0; //清空数据接收记录的个数 } }
}
void EXTI0_IRQHandler(void)
{if(EXTI_GetITStatus(EXTI_Line0) != RESET ){temp_cmp++; delay();EXTI_ClearITPendingBit(EXTI_Line0);}
}
void EXTI2_IRQHandler(void)
{if (EXTI_GetITStatus(EXTI_Line2) != RESET){temp_cmp--;delay();EXTI_ClearITPendingBit(EXTI_Line2);}
}
void EXTI3_IRQHandler(void)
{if (EXTI_GetITStatus(EXTI_Line3) != RESET){temp_shidu++;delay();EXTI_ClearITPendingBit(EXTI_Line3);}
}
void EXTI4_IRQHandler(void)
{if (EXTI_GetITStatus(EXTI_Line4) != RESET){temp_shidu--;delay();EXTI_ClearITPendingBit(EXTI_Line4);}
}
"exti.h"
#ifndef _EXTI_H_
#define _EXTI_H_#include "stm32f4xx.h"
#include "sys.h"extern void exti0_config(void);extern void exti2_config(void);extern void exti3_config(void);extern void exti4_config(void);#endif
"exti.c"
#include "exti.h"
#include <stdio.h>
#include "stm32f4xx.h"
#include "sys.h"//中断0
void exti0_config(void)
{EXTI_InitTypeDef EXTI_InitStructure;GPIO_InitTypeDef GPIO_InitStructure;NVIC_InitTypeDef NVIC_InitStructure;/* Enable GPIOA clock A端口时钟使能*/RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);/* Enable SYSCFG clock SYSCFG系统配置时钟使能*/RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE);/* Configure PA0 pin as input floating 配置PA0引脚为浮空输入模式*/GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;GPIO_Init(GPIOA, &GPIO_InitStructure);/* Connect EXTI Line0 to PA0 pin 将PA0引脚连接到外部中断线0*/SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOA, EXTI_PinSource0);/* Configure EXTI Line0 配置外部中断线0*/EXTI_InitStructure.EXTI_Line = EXTI_Line0; //选择外部中断线0EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt; //设置中断模式EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling; //上升沿触发,按键1松开EXTI_InitStructure.EXTI_LineCmd = ENABLE; //使能EXTI_Init(&EXTI_InitStructure); //应用该配置参数/* Enable and set EXTI Line0 Interrupt to the lowest priority 使能外部中断线0并且设置为最低优先级*/NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQn; //选择中断通道0NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2; //抢占优先级NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2; //响应优先级NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //使能中断NVIC_Init(&NVIC_InitStructure); //应用该配置参数}//中断2
void exti2_config(void)
{EXTI_InitTypeDef EXTI_InitStructure;GPIO_InitTypeDef GPIO_InitStructure;NVIC_InitTypeDef NVIC_InitStructure;/* Enable GPIOA clock E端口时钟使能*/RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOE, ENABLE);/* Enable SYSCFG clock SYSCFG系统配置时钟使能*/RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE);/* Configure PA0 pin as input floating 配置PE2引脚为浮空输入模式*/GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;GPIO_Init(GPIOE, &GPIO_InitStructure);/* Connect EXTI Line0 to PE2 pin 将PE2引脚连接到外部中断线2*/SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOE, EXTI_PinSource2);/* Configure EXTI Line2 配置外部中断线2*/EXTI_InitStructure.EXTI_Line = EXTI_Line2; //选择外部中断线2EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt; //设置中断模式EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling; //上升沿触发,按键1松开EXTI_InitStructure.EXTI_LineCmd = ENABLE; //使能EXTI_Init(&EXTI_InitStructure); //应用该配置参数/* Enable and set EXTI Line2 Interrupt to the lowest priority 使能外部中断线2并且设置为最低优先级*/NVIC_InitStructure.NVIC_IRQChannel = EXTI2_IRQn; //选择中断通道2NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2; //抢占优先级NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3; //响应优先级NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //使能中断NVIC_Init(&NVIC_InitStructure); //应用该配置参数}//中断3
void exti3_config(void)
{EXTI_InitTypeDef EXTI_InitStructure;GPIO_InitTypeDef GPIO_InitStructure;NVIC_InitTypeDef NVIC_InitStructure;/* Enable GPIOA clock E端口时钟使能*/RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOE, ENABLE);/* Enable SYSCFG clock SYSCFG系统配置时钟使能*/RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE);/* Configure PE3 pin as input floating 配置PE3引脚为浮空输入模式*/GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;GPIO_Init(GPIOE, &GPIO_InitStructure);/* Connect EXTI Line3 to PE3 pin 将PE3引脚连接到外部中断线3*/SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOE, EXTI_PinSource3);/* Configure EXTI Line3 配置外部中断线3*/EXTI_InitStructure.EXTI_Line = EXTI_Line3; //选择外部中断线3EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt; //设置中断模式EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling; //上升沿触发,按键1松开EXTI_InitStructure.EXTI_LineCmd = ENABLE; //使能EXTI_Init(&EXTI_InitStructure); //应用该配置参数/* Enable and set EXTI Line3 Interrupt to the lowest priority 使能外部中断线3并且设置为最低优先级*/NVIC_InitStructure.NVIC_IRQChannel = EXTI3_IRQn; //选择中断通道3NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2; //抢占优先级NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3; //响应优先级NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //使能中断NVIC_Init(&NVIC_InitStructure); //应用该配置参数}//中断4
void exti4_config(void)
{EXTI_InitTypeDef EXTI_InitStructure;GPIO_InitTypeDef GPIO_InitStructure;NVIC_InitTypeDef NVIC_InitStructure;/* Enable GPIOE clock E端口时钟使能*/RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOE, ENABLE);/* Enable SYSCFG clock SYSCFG系统配置时钟使能*/RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE);/* Configure PE4 pin as input floating 配置PE4引脚为浮空输入模式*/GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4;GPIO_Init(GPIOE, &GPIO_InitStructure);/* Connect EXTI Line4 to PE4 pin 将P4引脚连接到外部中断线4*/SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOE, EXTI_PinSource4);/* Configure EXTI Line4 配置外部中断线4*/EXTI_InitStructure.EXTI_Line = EXTI_Line4; //选择外部中断线4EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt; //设置中断模式EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling; //上升沿触发,按键1松开EXTI_InitStructure.EXTI_LineCmd = ENABLE; //使能EXTI_Init(&EXTI_InitStructure); //应用该配置参数/* Enable and set EXTI Line4 Interrupt to the lowest priority 使能外部中断线4并且设置为最低优先级*/NVIC_InitStructure.NVIC_IRQChannel = EXTI4_IRQn; //选择中断通道4NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2; //抢占优先级NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3; //响应优先级NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //使能中断NVIC_Init(&NVIC_InitStructure); //应用该配置参数}
"key.h"
#include "key.h"void key_config(void)
{GPIO_InitTypeDef GPIO_InitStructure;/* GPIOA Peripheral clock enable 给A端口外设时钟使能*/RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0; //设置0号引脚GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN; //设置输入模式GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz; //设置引脚速度为高速GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; //设置无上下拉电阻GPIO_Init(GPIOA, &GPIO_InitStructure); //应用到配置/* GPIOE Peripheral clock enable 给E端口外设时钟使能*/RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOE, ENABLE);GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2; //设置2号引脚GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3; //设置3号引脚GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4; //设置4号引脚GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN; //设置输入模式GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz; //设置引脚速度为高速GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; //设置无上下拉电阻GPIO_Init(GPIOE, &GPIO_InitStructure); //应用到配置
}
"key.c"
#ifndef _KEY_H_
#define _KEY_H_#include "stm32f4xx.h"
#include "sys.h"extern void key_config(void);#endif
"dht11.c"
#include "dht11.h"static GPIO_InitTypeDef GPIO_InitStructure; //static修饰的全局变量仅在本文件有效#define DHT11_PIN_OUT PGout(9)
#define DHT11_PIN_IN PGin(9)void dht11_config(void)
{RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOG, ENABLE);GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; //设置9号引脚GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT; //设置输出模式GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; //设置推挽模式,说白了就是增强他的驱动电流GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz; //设置引脚速度为高速GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; //设置无上下拉电阻GPIO_Init(GPIOG, &GPIO_InitStructure); //应用到配置//dht11初始化,主机发送高电平信号DHT11_PIN_OUT = 1;
}//模式切换
void dht11_mode(GPIOMode_TypeDef mode)
{GPIO_InitStructure.GPIO_Mode = mode; //GPIO_Mode_OUT GPIO_Mode_INGPIO_InitStructure.GPIO_OType = GPIO_OType_PP; //设置推挽模式,说白了就是增强他的驱动电流GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz; //设置引脚速度为高速GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; //设置无上下拉电阻GPIO_Init(GPIOG, &GPIO_InitStructure); //应用到配置
}//通信的开始
int32_t dht11_start(void)
{int32_t t = 0;//主机发送低电平信号持续18msDHT11_PIN_OUT = 0;delay_ms(20);//主机发送高电平信号持续30usDHT11_PIN_OUT = 1;delay_us(30);//模式切换dht11_mode(GPIO_Mode_IN);//等待dht11响应低电平信号的到来while(DHT11_PIN_IN == 1){delay_us(1);t++;if(t > 4000) //等待响应信号超时return -1;}t = 0;//低电平到来,持续80uswhile(DHT11_PIN_IN == 0){delay_us(1);t++;if(t > 100) //等待低电平信号持续时间超时return -2;}t = 0;//高电平到来,持续80uswhile(DHT11_PIN_IN == 1){delay_us(1);t++;if(t > 100) //等待高电平信号持续时间超时return -3;}t = 0;return 0; //通信开始成功
}//接收1个字节的数据
int32_t dht11_read_byte(void)
{int8_t data = 0; // 0000 0000int32_t i = 0;int32_t t = 0;for(i=7; i>=0; i--) //高位先出{//等待dht11响应低电平信号的到来while(DHT11_PIN_IN == 1){delay_us(1);t++;if(t > 4000) //等待响应信号超时return -4;}t = 0;//低电平到来,持续50uswhile(DHT11_PIN_IN == 0){delay_us(1);t++;if(t > 100) //等待低电平信号持续时间超时return -5;}t = 0;//判断接收到的数据是0还是1 取决于高电平持续的时间 delay_us(40);if(DHT11_PIN_IN == 1) //接收到的数据为1{data |= 1 << i; }}return data;
}//通信结束
int32_t dht11_stop(void)
{int32_t t = 0;//等待dht11响应低电平信号的到来while(DHT11_PIN_IN == 1){delay_us(1);t++;if(t > 4000) //等待响应信号超时return -6;}t = 0;//低电平到来,持续50uswhile(DHT11_PIN_IN == 0){delay_us(1);t++;if(t > 100) //等待低电平信号持续时间超时return -7;}t = 0;//模式转换dht11_mode(GPIO_Mode_OUT);DHT11_PIN_OUT == 1;return 0; //通信结束成功
}//读取温湿度
int32_t dht11_read(char *buf)
{int32_t sum = 0;int32_t i = 0;if(dht11_start() != 0) //通信开始失败{return -8;}for(i=0; i<5; i++){buf[i] = dht11_read_byte();}if(dht11_stop() != 0) //通信结束失败{return -9;}sum = buf[0]+buf[1]+buf[2]+buf[3];sum &= 0xff; //1111 1111if(sum != buf[4]) //校验和错误{return -10;}return 0; //读取温湿度成功
}
"led.c"
#include "led.h"void led_config(void)
{GPIO_InitTypeDef GPIO_InitStructure;/* GPIOF Peripheral clock enable 给F端口外设时钟使能*/RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOF, ENABLE);/* GPIOE Peripheral clock enable 给E端口外设时钟使能*/RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOE, ENABLE);/* Configure PF9 in output pushpull mode */GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9 | GPIO_Pin_10 | GPIO_Pin_8; //设置9号,10号引脚GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT; //设置输出模式GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; //设置推挽模式,说白了就是增强他的驱动电流GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz; //设置引脚速度为高速GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; //设置无上下拉电阻GPIO_Init(GPIOF, &GPIO_InitStructure); //应用到配置GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13 | GPIO_Pin_14; //设置9号,10号引脚GPIO_Init(GPIOE, &GPIO_InitStructure);PFout(8) = 0;PFout(9) = 1;PFout(10) = 1;PEout(13) = 1;PEout(14) = 1;
}void led_ctrl(int sw1,int sw2,int sw3,int sw4)
{if(sw1){PFout(9) = 0; //led1亮}else{PFout(9) = 1; //led1灭}if(sw2){PFout(10) = 0; //led1亮}else{PFout(10) = 1; //led1灭}if(sw3){PEout(13) = 0; //led1亮}else{PEout(13) = 1; //led1灭}if(sw4){PEout(14) = 0; //led1亮}else{PEout(14) = 1; //led1灭}
}
这个基础的功能,最开始的设计是有蓝牙功能,以及led的延时是定时器中断的方式,但是由于课时被放假冲了,作者也不想努力了就没学,还有写的定时器中断函数不知道哪里由问题,死活就是不行,就算了。主程序还可用其他方式写,我看了一下其他的小组有的是用类似于FPGA的状态机的思路写的,还有其他乱七八糟的写法,本人太菜了,更多功能等大家写吧。
相关文章:

SMT32 智能环境监测系统 嵌入式初学者课堂小组作业
一、应用知识 1,开发语言:C语言 2,开发工具:Keil uVision5、Setup_JLinkARM_V415e 3,开发平台:XCOM V2.0 4,开发知识:温湿度传感DHT11、STM32F4xx中文参考手册 5,文…...

20241114给荣品PRO-RK3566开发板刷Rockchip原厂的Android13下适配RJ45以太网卡
20241114给荣品PRO-RK3566开发板刷Rockchip原厂的Android13下适配RJ45以太网卡 2024/11/14 15:44 缘起:使用EVB2的方案,RJ45加进去怎么也不通。 实在没有办法,只能将荣品的SDK:rk-android13-20240713.tgz 解压缩,编译之…...
JVM这个工具的使用方法
JVM(Java虚拟机)是Java程序运行的基础环境,它提供了内存管理、线程管理和性能监控等功能。吃透JVM诊断方法,可以帮助开发者更有效地解决Java应用在运行时遇到的问题。以下是一些常见的JVM诊断方法: 使用JConsole: JCon…...
创建型设计模式与面向接口编程
创建型设计模式(Creational Patterns)的主要目的之一就是帮助实现面向接口编程,避免直接创建实现类的实例。通过这些模式,可以将对象的创建过程封装起来,使得客户端代码不需要知道具体的实现类,从而提高代码…...

算法每日双题精讲——滑动窗口(长度最小的子数组,无重复字符的最长子串)
🌟快来参与讨论💬,点赞👍、收藏⭐、分享📤,共创活力社区。 🌟 别再犹豫了!快来订阅我们的算法每日双题精讲专栏,一起踏上算法学习的精彩之旅吧!💪…...

1.7 JS性能优化
从输入url到页面加载完成都做了些什么 输入 URL - 资源定位符 http://www.zhaowa.com - http 协议 域名解析 https://www.zhaowa.com > ip 1. 切HOST? > 浏览器缓存映射、系统、路由、运营商、根服务器 2. 实际的静态文件存放? 大流量 > 多个…...

STL - vector的使用和模拟实现
目录 一:vector的构造函数 二:vector的迭代器 三vector的空间增长问题 四:vector 增删查改接口 五:vector的模拟实现 (一)一些简单接口的实现: (二)一些复杂接口的…...

《鸿蒙生态:开发者的机遇与挑战》
一、引言 在当今科技飞速发展的时代,操作系统作为连接硬件与软件的核心枢纽,其重要性不言而喻。鸿蒙系统的出现,为开发者带来了新的机遇与挑战。本文将从开发者的角度出发,阐述对鸿蒙生态的认知和了解,分析鸿蒙生态的…...

【C++融会贯通】二叉树进阶
目录 一、内容说明 二、二叉搜索树 2.1 二叉搜索树概念 2.2 二叉搜索树操作 2.2.1 二叉搜索树的查找 2.2.2 二叉搜索树的插入 2.2.3 二叉搜索树的删除 2.3 二叉搜索树的实现 2.3.1 二叉搜索树的节点设置 2.3.2 二叉搜索树的查找函数 2.3.2.1 非递归实现 2.3.2.2 递…...
使用python-Spark使用的场景案例具体代码分析
使用场景 1. 数据批处理 • 日志分析:互联网公司每天会产生海量的服务器日志,如访问日志、应用程序日志等。Spark可以高效地读取这些日志文件,对数据进行清洗(例如去除无效记录、解析日志格式)、转换(例如…...
如何查看本地的个人SSH密钥
1.确保你的电脑上安装了 Git。 你可以通过终端或命令提示符输入以下命令来检查: git --version 如果没有安装,请前往 Git 官网 下载并安装适合你操作系统的版本。 2.查找SSH密钥 默认情况下,SSH密钥存储在你的用户目录下的.ssh文件夹中。…...
本人认为 写程序的三大基本原则
1. 合法性 定义:合法性指的是程序必须遵守法律法规和道德规范,不得用于非法活动。 建议: 了解法律法规:在编写程序之前,了解并遵守所在国家或地区的法律法规,特别是与数据隐私、版权、网络安…...

A030-基于Spring boot的公司资产网站设计与实现
🙊作者简介:在校研究生,拥有计算机专业的研究生开发团队,分享技术代码帮助学生学习,独立完成自己的网站项目。 代码可以查看文章末尾⬇️联系方式获取,记得注明来意哦~🌹 赠送计算机毕业设计600…...
React Hooks 深度解析与实战
💓 博客主页:瑕疵的CSDN主页 📝 Gitee主页:瑕疵的gitee主页 ⏩ 文章专栏:《热点资讯》 React Hooks 深度解析与实战 React Hooks 深度解析与实战 React Hooks 深度解析与实战 引言 什么是 Hooks? 定义 为什么需要 Ho…...

#渗透测试#SRC漏洞挖掘#蓝队基础之网络七层杀伤链04 终章
网络杀伤链模型(Kill Chain Model)是一种用于描述和分析网络攻击各个阶段的框架。这个模型最初由洛克希德马丁公司提出,用于帮助企业和组织识别和防御网络攻击。网络杀伤链模型将网络攻击过程分解为多个阶段,每个阶段都有特定的活…...

计算机毕业设计Python+大模型农产品推荐系统 农产品爬虫 农产品商城 农产品大数据 农产品数据分析可视化 PySpark Hadoop
温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 作者简介:Java领…...

爬虫补环境案例---问财网(rpc,jsdom,代理,selenium)
目录 一.环境检测 1. 什么是环境检测 2.案例讲解 二 .吐环境脚本 1. 简介 2. 基础使用方法 3.数据返回 4. 完整代理使用 5. 代理封装 6. 封装所有使用方法 jsdom补环境 1. 环境安装 2. 基本使用 3. 添加参数形式 Selenium补环境 1. 简介 2.实战案例 1. 逆向目…...
SpringBoot有几种获取Request对象的方法
HttpServletRequest 简称 Request,它是一个 Servlet API 提供的对象,用于获取客户端发起的 HTTP 请求信息。例如:获取请求参数、获取请求头、获取 Session 会话信息、获取请求的 IP 地址等信息。 那么问题来了,在 Spring Boot 中…...
在 Windows 11 中使用 MuMu 模拟器 12 国际版配置代理
**以下是优化后的教学内容,使用 Markdown 格式,便于粘贴到 CSDN 或其他支持 Markdown 格式的编辑器中: 在 Windows 11 中使用 MuMu 模拟器 12 国际版配置代理 MuMu 模拟器内有网络设置功能,可以直接在模拟器中配置代理。但如果你不确定如何操作,可以通过在 Windows 端设…...

ASP.NET Core Webapi 返回数据的三种方式
ASP.NET Core为Web API控制器方法返回类型提供了如下几个选择: Specific type IActionResult ActionResult<T> 1. 返回指定类型(Specific type) 最简单的API会返回原生的或者复杂的数据类型(比如,string 或者…...

手游刚开服就被攻击怎么办?如何防御DDoS?
开服初期是手游最脆弱的阶段,极易成为DDoS攻击的目标。一旦遭遇攻击,可能导致服务器瘫痪、玩家流失,甚至造成巨大经济损失。本文为开发者提供一套简洁有效的应急与防御方案,帮助快速应对并构建长期防护体系。 一、遭遇攻击的紧急应…...

地震勘探——干扰波识别、井中地震时距曲线特点
目录 干扰波识别反射波地震勘探的干扰波 井中地震时距曲线特点 干扰波识别 有效波:可以用来解决所提出的地质任务的波;干扰波:所有妨碍辨认、追踪有效波的其他波。 地震勘探中,有效波和干扰波是相对的。例如,在反射波…...

Qt/C++开发监控GB28181系统/取流协议/同时支持udp/tcp被动/tcp主动
一、前言说明 在2011版本的gb28181协议中,拉取视频流只要求udp方式,从2016开始要求新增支持tcp被动和tcp主动两种方式,udp理论上会丢包的,所以实际使用过程可能会出现画面花屏的情况,而tcp肯定不丢包,起码…...

视频字幕质量评估的大规模细粒度基准
大家读完觉得有帮助记得关注和点赞!!! 摘要 视频字幕在文本到视频生成任务中起着至关重要的作用,因为它们的质量直接影响所生成视频的语义连贯性和视觉保真度。尽管大型视觉-语言模型(VLMs)在字幕生成方面…...

用docker来安装部署freeswitch记录
今天刚才测试一个callcenter的项目,所以尝试安装freeswitch 1、使用轩辕镜像 - 中国开发者首选的专业 Docker 镜像加速服务平台 编辑下面/etc/docker/daemon.json文件为 {"registry-mirrors": ["https://docker.xuanyuan.me"] }同时可以进入轩…...
css3笔记 (1) 自用
outline: none 用于移除元素获得焦点时默认的轮廓线 broder:0 用于移除边框 font-size:0 用于设置字体不显示 list-style: none 消除<li> 标签默认样式 margin: xx auto 版心居中 width:100% 通栏 vertical-align 作用于行内元素 / 表格单元格ÿ…...

如何在最短时间内提升打ctf(web)的水平?
刚刚刷完2遍 bugku 的 web 题,前来答题。 每个人对刷题理解是不同,有的人是看了writeup就等于刷了,有的人是收藏了writeup就等于刷了,有的人是跟着writeup做了一遍就等于刷了,还有的人是独立思考做了一遍就等于刷了。…...
站群服务器的应用场景都有哪些?
站群服务器主要是为了多个网站的托管和管理所设计的,可以通过集中管理和高效资源的分配,来支持多个独立的网站同时运行,让每一个网站都可以分配到独立的IP地址,避免出现IP关联的风险,用户还可以通过控制面板进行管理功…...

毫米波雷达基础理论(3D+4D)
3D、4D毫米波雷达基础知识及厂商选型 PreView : https://mp.weixin.qq.com/s/bQkju4r6med7I3TBGJI_bQ 1. FMCW毫米波雷达基础知识 主要参考博文: 一文入门汽车毫米波雷达基本原理 :https://mp.weixin.qq.com/s/_EN7A5lKcz2Eh8dLnjE19w 毫米波雷达基础…...

elementUI点击浏览table所选行数据查看文档
项目场景: table按照要求特定的数据变成按钮可以点击 解决方案: <el-table-columnprop"mlname"label"名称"align"center"width"180"><template slot-scope"scope"><el-buttonv-if&qu…...