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 或者…...

SQL面试题——蚂蚁SQL面试题 连续3天减少碳排放量不低于100的用户
连续3天减少碳排放量不低于100的用户 这是一道来自蚂蚁的面试题目,要求我们找出连续3天减少碳排放量低于100的用户,之前我们分析过两道关于连续的问题了 SQL面试题——最大连续登陆问题 SQL面试题——球员连续四次得分 这两个问题都是跟连续有关的,但是球员连续得分的难…...

Python酷库之旅-第三方库Pandas(216)
目录 一、用法精讲 1011、pandas.DatetimeIndex.tz属性 1011-1、语法 1011-2、参数 1011-3、功能 1011-4、返回值 1011-5、说明 1011-6、用法 1011-6-1、数据准备 1011-6-2、代码示例 1011-6-3、结果输出 1012、pandas.DatetimeIndex.freq属性 1012-1、语法 1012…...

论文解析:计算能力资源的可信共享:利益驱动的异构网络服务提供机制
目录 论文解析:计算能力资源的可信共享:利益驱动的异构网络服务提供机制 KM-SMA算法 KM-SMA算法通过不断更新节点的可行顶点标记值(也称为顶标),利用匈牙利方法(Hungarian method)来获取匹配结果。在获取匹配结果后,该算法还会判断该结果是否满足Pareto最优性,即在没…...

Spring AOP技术
1.AOP基本介绍 AOP 的全称 (aspect oriented programming) ,面向切面编程。 1.和传统的面向对象不同。 面向切面编程是根据自我的需求,将切面类的方法切入到其他的类的方法中。(这么说抽象吧!来张图来解释。) 如图 传…...

数字IC实践项目(10)—基于System Verilog的DDR4 Model/Tb 及基础Verification IP的设计与验证(付费项目)
数字IC实践项目(10)—基于System Verilog的DDR4 Model/Tb 及基础Verification IP的设计与验证(付费项目) 前言项目框图1)DDR4 Verification IP2)DDR4 JEDEC Model & Tb 项目文件1)DDR4 Veri…...

MATLAB保存多帧图形为视频格式
基本思路 在Matlab中,要将drawnow绘制的多帧数据保存为视频格式,首先需要创建一个视频写入对象。这个对象用于将每一帧图像数据按照视频格式的要求进行组合和编码。然后,在每次drawnow更新绘图后,将当前的图形窗口内容捕获为一帧图…...

redis7.x源码分析:(3) dict字典
dict字典采用经典hash表数据结构实现,由键值对组成,类似于C中的unordered_map。两者在代码实现层面存在一些差异,比如gnustl的unordered_map分配的桶数组个数是(质数n),而dict分配的桶数组个数是࿰…...

连续九届EI稳定|江苏科技大学主办
【九届EI检索稳定|江苏科技大学主办 | IEEE出版 】 🎈【截稿倒计时】!!! ✨徐秘书:gsra_huang ✨往届均已检索,已上线IEEE官网 🎊第九届清洁能源与发电技术国际学术会议(CEPGT 2…...

HarmonyOS NEXT应用开发实战 ( 应用的签名、打包上架,各种证书详解)
前言 没经历过的童鞋,首次对HarmonyOS的应用签名打包上架可能感觉繁琐。需要各种秘钥证书生成和申请,混在一起也分不清。其实搞清楚后也就那会事,各个文件都有它存在的作用。 HarmonyOS通过数字证书与Profile文件等签名信息来保证鸿蒙应用/…...

【CICD】CICD 持续集成与持续交付在测试中的应用
一、什么是CICD? CI/CD 是指持续集成(Continuous Integration)和持续部署(Continuous Deployment)或持续交付(Continuous Delivery) 1.1 持续集成(Continuous Integration…...