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

IDEA运行Tomcat出现乱码问题解决汇总
最近正值期末周,有很多同学在写期末Java web作业时,运行tomcat出现乱码问题,经过多次解决与研究,我做了如下整理: 原因: IDEA本身编码与tomcat的编码与Windows编码不同导致,Windows 系统控制台…...
OpenLayers 可视化之热力图
注:当前使用的是 ol 5.3.0 版本,天地图使用的key请到天地图官网申请,并替换为自己的key 热力图(Heatmap)又叫热点图,是一种通过特殊高亮显示事物密度分布、变化趋势的数据可视化技术。采用颜色的深浅来显示…...
DockerHub与私有镜像仓库在容器化中的应用与管理
哈喽,大家好,我是左手python! Docker Hub的应用与管理 Docker Hub的基本概念与使用方法 Docker Hub是Docker官方提供的一个公共镜像仓库,用户可以在其中找到各种操作系统、软件和应用的镜像。开发者可以通过Docker Hub轻松获取所…...

《用户共鸣指数(E)驱动品牌大模型种草:如何抢占大模型搜索结果情感高地》
在注意力分散、内容高度同质化的时代,情感连接已成为品牌破圈的关键通道。我们在服务大量品牌客户的过程中发现,消费者对内容的“有感”程度,正日益成为影响品牌传播效率与转化率的核心变量。在生成式AI驱动的内容生成与推荐环境中࿰…...

BCS 2025|百度副总裁陈洋:智能体在安全领域的应用实践
6月5日,2025全球数字经济大会数字安全主论坛暨北京网络安全大会在国家会议中心隆重开幕。百度副总裁陈洋受邀出席,并作《智能体在安全领域的应用实践》主题演讲,分享了在智能体在安全领域的突破性实践。他指出,百度通过将安全能力…...
爬虫基础学习day2
# 爬虫设计领域 工商:企查查、天眼查短视频:抖音、快手、西瓜 ---> 飞瓜电商:京东、淘宝、聚美优品、亚马逊 ---> 分析店铺经营决策标题、排名航空:抓取所有航空公司价格 ---> 去哪儿自媒体:采集自媒体数据进…...
Swagger和OpenApi的前世今生
Swagger与OpenAPI的关系演进是API标准化进程中的重要篇章,二者共同塑造了现代RESTful API的开发范式。 本期就扒一扒其技术演进的关键节点与核心逻辑: 🔄 一、起源与初创期:Swagger的诞生(2010-2014) 核心…...

回溯算法学习
一、电话号码的字母组合 import java.util.ArrayList; import java.util.List;import javax.management.loading.PrivateClassLoader;public class letterCombinations {private static final String[] KEYPAD {"", //0"", //1"abc", //2"…...
PAN/FPN
import torch import torch.nn as nn import torch.nn.functional as F import mathclass LowResQueryHighResKVAttention(nn.Module):"""方案 1: 低分辨率特征 (Query) 查询高分辨率特征 (Key, Value).输出分辨率与低分辨率输入相同。"""def __…...

推荐 github 项目:GeminiImageApp(图片生成方向,可以做一定的素材)
推荐 github 项目:GeminiImageApp(图片生成方向,可以做一定的素材) 这个项目能干嘛? 使用 gemini 2.0 的 api 和 google 其他的 api 来做衍生处理 简化和优化了文生图和图生图的行为(我的最主要) 并且有一些目标检测和切割(我用不到) 视频和 imagefx 因为没 a…...