基于STM32的温湿度传感器

一、创新实践实习内容

一:指导老师给我们介绍了广州粤嵌通信科技股份有限公司的企业文化与企业环境,简要地介绍了本行业的发展历史及未来发展趋势。讲解了Keil5的功能与应用。指导我们搭建STM32F407驱动环境以及学习相关芯片包的安装使用方法。并且带着我们对C语言的基础知识进行了回顾。通过一些实例操作介绍了STM32F407 常用的编程指令,完成创建工程,学习程序编译与运行。

    二:学习STM32F407相关开关板,Keil5下的代码编辑器的使用方法;学习使用库函数建立相关工程,完成流水灯:亮的个数一次递增,再依次递减完实验。学习外部中断初始化,NVIC初始化,建立工程完成外部中断控制灯的亮灭。

    开始学习对系统定时器system的使用,完成系统精确延时的程序,使用精确延时控制LED灯闪烁。学习串口通信,串口初始化结构体,实现数据收发,实现对STM32F407开发板的控制。

学习了解DHT11温湿度传感器,编辑相关程序完成温湿度的获取并用串口显示在PC上。学习OLED显示屏,了解其通讯方式,以及连接方法。编辑相关程序完成温湿度的获取以及随意一张图片显示在OLED显示屏上。

    学习了解adc模数转换器,将模拟信号转换为数字信号; 按键测温,结果显示在oled,温度过低,蜂鸣器响。测烟雾,测光照,测湿度 显示在oled。都设定一个阈值,低于阈值报警。

项目答辩环节。

二、实习过程

第一阶段主要是学习Keil5的功能与应用,STM32F407 常用的编程指令,完成创建工程。简要简介了公司的企业文化及企业环境,让我们对本行业的未来发展有了一个初步的认识。老师带我们回顾了C语言的基础知识,如基本数据类型、运算符、数组、指针、结构体、typedef取别名、头文件的编写、条件编译、文件操作等内容。为后面编程奠定了基础。懂得库函数常用的命令以及一些快捷键的使用方式。

第二阶段学系STM32F407相关开关板的组成,了解程序烧录接线及步骤,Keil5下的代码编辑器的使用方法;学习使用库函数建立相关工程,学习GPIO口的初始化步骤并完成相关IO初始化,完成流水灯程序编写:亮的个数一次递增,再依次递减完实验。学习外部中断初始化,NVIC初始化相关步骤,建立工程完成外部中断控制灯的亮灭。

第三阶段:开始学习对系统定时器system的使用,了解systic计数方式:向下计数的24为计数器;以及其时钟频率21MHz;完成系统精确延时的程序,使用精确延时控制LED灯闪烁。学习串口通信,串行接口 (Serial Interface)是指数据一位一位地顺序传送。其特点是通信线路简单,只要一对传输线就可以实现双向通信,串口初始化结构体,实现数据收发,实现对STM32F407开发板灯及蜂鸣器的控制。

第四阶段:学习了解DHT11温湿度传感器,DATA 用于微处理器与 DHT11之间的通讯和同步,采用单总线数据格式,一次通讯时间4ms左右,数据分小数部分和整数部分,一次完整的数据传输为40bit,高位先出。 例如:37.2 00100101 00000010;数据格式:8bit湿度整数数据+8bit湿度小数数据+8bi温度整数数据+8bit温度小数数据+8bit校验和,通讯过程如图a所示;编辑相关程序完成温湿度的获取并用串口显示在PC上。学习OLED显示屏,了解其通讯方式,以及连接方法。编辑相关程序完成温湿度的获取以及随意一张图片显示在OLED显示屏上。

图a

第五阶段: 学习了解adc模数转换器,将模拟信号转换为数字信号; 按键测温,结果显示在oled,温度过低,蜂鸣器响。测烟雾,测光照,测湿度 显示在oled。都设定一个阈值,低于阈值报警。是前面所有项目的验收答辩环节,具体在下面部分结果里说明。

三、实践结果

(1)使用库函数建立相关工程,完成流水灯:亮的个数一次递增,再依次递减完实验。建立工程完成外部中断控制灯的亮灭。

          图1  外部中断控制流水灯灯的亮灭。

(2)使用精确延时控制LED灯闪烁

图2  LED灯闪烁

(3)串口通信,实现数据收发,实现对STM32F407开发板的控制

           图3   串口通信

(3)完成温湿度的获取并用串口显示在PC上

        图4 温湿度的获取

(4)完成温湿度的获取以及随意一张图片显示在OLED显示屏上。

              图5  OLED显示屏

(5) 按键测温,结果显示在oled,温度过低,蜂鸣器响。测烟雾,测光照,测湿度 显示在oled。都设定一个阈值,低于阈值报警。

图6  OLED显示屏温度报警

图7  OLED显示屏湿度报警

图7  OLED显示光强度报警

四、实习总结及体会

在本次的创新实践实习中,我对c语言有了更深刻的了解,巩固了C语言基础,提高了C语言编辑能力。加深理解Keil5的功能与应用。还有通过此次实习,加强了动手思考能力开拓了视野,增长了见识。学习对系统定时器system的使用,了解systic计数方式:向下计数的24为计数器;以及其时钟频率21MHz;学习了串口通信,串行接口(Serial Interface)是指数据一位一位地顺序传送。了解DHT11温湿度传感器,DATA 用于微处理器与 DHT11之间的通讯和同步,采用单总线数据格式,一次通讯时间4ms左右,数据分小数部分和整数部分,一次完整的数据传输为40bit,高位先出。 例如:37.2 00100101 00000010;数据格式:8bit湿度整数数据+8bit湿度小数数据+8bi温度整数数据+8bit温度小数数据+8bit校验和。发现了自己对于软硬件操作以及与组员间的交流沟通能力还有待提高,明白团队协作的重要性,学会换位思考。

附录:程序

验收main.c文件

#include <stm32f4xx.h>
#include <led.h>
#include <adc.h>
#include <beep.h>
#include <key.h>
#include <delay.h>
#include <usb.h>
#include <string.h>
#include <DS18B20.h>
#include <stdio.h>
#include "oled.h"
#include "bmp.h"
#include <mq.h>
char date[5]={0};
int ret;
char buf[20];
u16 flag=0;
void EXTI0_IRQHandler(void)
{
  //确保是否产生了EXTI Line中断
if(EXTI_GetITStatus(EXTI_Line0) != RESET) 
{
delay_ms(30);
if(GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_0)==0)
{
OLED_ShowNum(46,2,date[2],2,16);//整数部分
OLED_ShowChar(64,2,'.');
OLED_ShowNum(69,2,date[3],1,16);//小数部分
if(date[2]<=27)
{
// if(date[3]<=1)
// {
GPIO_SetBits(GPIOF,GPIO_Pin_8);
OLED_DrawBMP(93, 2,109, 4, BMP1);
// }

delay_s(2);
GPIO_ResetBits(GPIOF,GPIO_Pin_8);
}
EXTI_ClearITPendingBit(EXTI_Line0);  //清除中断标志位
}  
}

void USART1_IRQHandler(void)
{
//确保是否产生了中断
if(USART_GetITStatus(USART1, USART_IT_RXNE))
{
buf[flag]=USART_ReceiveData(USART1);
USART_SendData(USART1, buf[flag]);
flag++;
if(flag==20)
{
flag=0;
}
if(buf[flag-1]=='#')
{
buf[flag]=0;
flag=0;
}
}
}

int main()
{
u16 adcx,yw;
char temp;
init_mq();
init_adc();
init_led();//led初始化
init_key();//key初始化
init_beep();
init_usart1(9600);//串口初始化
init_DS18B20();
OLED_Init(); //OLED初始化
OLED_Clear(); 
SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK_Div8);
ADC_SoftwareStartConv(ADC3);//ADC3开始转换
ADC_SoftwareStartConv(ADC1);//ADC1开始转换
printf("模块加载完成\r\n");
while(1)
{

LED_RUN();

ret=get_data(date);//读湿度和温度
while(ADC_GetFlagStatus(ADC3, ADC_FLAG_EOC)==RESET);
ADC_ClearFlag(ADC3, ADC_FLAG_EOC);
adcx = ADC_GetConversionValue(ADC3);
adcx=((4095-adcx)*100)/4095;
//printf("%d\r\n",yw);
  while(ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC)==RESET);
ADC_ClearFlag(ADC1, ADC_FLAG_EOC);
yw = ADC_GetConversionValue(ADC1);
yw=(yw*100)/4095;
if(date[0]>=80||adcx<=30||yw>8)
{
GPIO_SetBits(GPIOF,GPIO_Pin_8);

}
//   if()
// {
// GPIO_SetBits(GPIOF,GPIO_Pin_8);
// }
OLED_Clear();
// OLED_DrawBMP(0,0,128,8,BMP2);delay_s(2);
  OLED_ShowCHinese(0,0,3);//湿
OLED_ShowCHinese(18,0,1);//度
OLED_ShowChar(36,0,':');
OLED_ShowNum(46,0,date[0],2,16);
OLED_ShowChar(64,0,'.');
OLED_ShowNum(69,0,date[1],1,16);
OLED_ShowChar(77,0,'%');
// OLED_DrawBMP(90, 0,106, 16, BMP1);
OLED_ShowCHinese(0,2,0);//温
OLED_ShowCHinese(18,2,1);//度
OLED_ShowChar(36,2,':');
OLED_ShowCHinese(77,2,4);
OLED_ShowCHinese(0,4,5);//光
OLED_ShowCHinese(18,4,6);//强
OLED_ShowChar(36,4,':');
OLED_ShowNum(46,4,adcx,2,16);
OLED_ShowChar(64,4,'%');
OLED_ShowCHinese(0,6,7);//烟
OLED_ShowCHinese(18,6,8);//雾
OLED_ShowChar(36,6,':');
// adcx=Get_Adc_Average(ADC_Channel_5,10);
OLED_ShowNum(46,6,yw,2,16);
OLED_ShowChar(64,6,'%');
if(date[0]>=80)  OLED_DrawBMP(93, 0,109, 2, BMP1);
if(adcx<=30)  OLED_DrawBMP(93, 4,109, 6, BMP1);
if(yw>8)  OLED_DrawBMP(93, 6,109, 8, BMP1);
delay_s(1);
GPIO_ResetBits(GPIOF,GPIO_Pin_8);
OLED_DrawBMP(93, 0,109, 2, BMP2);
OLED_DrawBMP(93, 4,109, 6, BMP2);
OLED_DrawBMP(93, 6,109, 8, BMP2);
delay_s(1);
}
}

验收key.c文件

#include "stm32f4xx.h"
static void NVIC_Configuration(void)
{
  NVIC_InitTypeDef NVIC_InitStructure;
  /* 配置NVIC为优先级组1 */
  NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
  
  /* 配置中断源:按键1 */
  NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQn;
  /* 配置抢占优先级 */
  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
  /* 配置子优先级 */
  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
  /* 使能中断通道 */
  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  NVIC_Init(&NVIC_InitStructure);
}
void init_key(void)
{
GPIO_InitTypeDef GPIO_InitStruct;
EXTI_InitTypeDef EXTI_InitStructure;
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOE, ENABLE);
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE);
GPIO_InitStruct.GPIO_Pin  = GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4;
  GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IN;
  GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_InitStruct.GPIO_OType = GPIO_OType_PP;
  GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_UP;

NVIC_Configuration(); /* 配置 NVIC 中断*/
GPIO_Init(GPIOE, &GPIO_InitStruct);
GPIO_InitStruct.GPIO_Pin  = GPIO_Pin_0;
  GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IN;
  GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_InitStruct.GPIO_OType = GPIO_OType_PP;
  GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_UP;
SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOA, EXTI_PinSource0);
GPIO_Init(GPIOA, &GPIO_InitStruct);
  EXTI_InitStructure.EXTI_Line = EXTI_Line0;         //中断线0
  EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt; /* EXTI为中断模式 边沿触发*/
  EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling; /* 下降沿中断 */
  EXTI_InitStructure.EXTI_LineCmd = ENABLE; /* 使能中断 */
  EXTI_Init(&EXTI_InitStructure);
}

验收beep.c文件

#include "stm32f4xx.h"
void init_beep(void)
{
GPIO_InitTypeDef GPIO_InitStruct;
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOF, ENABLE);
GPIO_InitStruct.GPIO_Pin  = GPIO_Pin_8;
  GPIO_InitStruct.GPIO_Mode = GPIO_Mode_OUT;
  GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_InitStruct.GPIO_OType = GPIO_OType_PP;
  GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_NOPULL;
GPIO_Init(GPIOF, &GPIO_InitStruct);
}

验收adc.c文件

#include "stm32f4xx.h"
#include "delay.h"
void init_adc(void)
{
ADC_CommonInitTypeDef ADC_CommonInitStruct;
ADC_InitTypeDef ADC_InitStruct;
GPIO_InitTypeDef GPIO_InitStruct;
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOF, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC3, ENABLE);
//引脚初始化
GPIO_InitStruct.GPIO_Pin  = GPIO_Pin_7;
  GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AN;
  GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_InitStruct.GPIO_OType = GPIO_OType_PP;
  GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_NOPULL;
GPIO_Init(GPIOF, &GPIO_InitStruct);
//adc通用初始化
ADC_CommonInitStruct.ADC_Mode=ADC_Mode_Independent;                                                                
ADC_CommonInitStruct.ADC_Prescaler=ADC_Prescaler_Div2;                
ADC_CommonInitStruct.ADC_DMAAccessMode=ADC_DMAAccessMode_Disabled;            
ADC_CommonInitStruct.ADC_TwoSamplingDelay=ADC_TwoSamplingDelay_5Cycles;         
ADC_CommonInit(&ADC_CommonInitStruct);
//adc1初始化
ADC_InitStruct.ADC_Resolution =ADC_Resolution_12b;
ADC_InitStruct.ADC_DataAlign =ADC_DataAlign_Right;
ADC_InitStruct.ADC_ExternalTrigConv =ADC_ExternalTrigConvEdge_None;
ADC_InitStruct.ADC_ContinuousConvMode =ENABLE;
ADC_InitStruct.ADC_ScanConvMode =DISABLE;
ADC_InitStruct.ADC_NbrOfConversion = 1;
ADC_Init(ADC3, &ADC_InitStruct);

ADC_RegularChannelConfig(ADC3, ADC_Channel_5, 1, ADC_SampleTime_3Cycles);
//使能
ADC_Cmd(ADC3, ENABLE);
}
u16 Get_Adc(u8 ch)   
{
   //设置指定ADC的规则组通道,一个序列,采样时间
ADC_RegularChannelConfig(ADC3, ch, 1, ADC_SampleTime_3Cycles ); //ADC1,ADC通道,采样时间为239.5周期        
  
ADC_SoftwareStartConv(ADC3); //使能指定的ADC1的软件转换启动功能
 
while(!ADC_GetFlagStatus(ADC3, ADC_FLAG_EOC ));//等待转换结束

ADC_ClearFlag(ADC3, ADC_FLAG_EOC);

return ADC_GetConversionValue(ADC1); //返回最近一次ADC1规则组的转换结果
}
u16 Get_Adc_Average(u8 ch,u8 times)
{
u32 temp_val=0;
u8 t;
for(t=0;t<times;t++)
{
temp_val+=Get_Adc(ch);
delay_ms(5);
}
return temp_val/times;
}

验收led.c文件

#include "stm32f4xx.h"
#include<delay.h>
void Delay(u32 nCount)
{
    for(;nCount!=0;nCount--);
}
void init_led(void)
{

GPIO_InitTypeDef GPIO_InitStruct;
GPIO_InitStruct.GPIO_Pin  = GPIO_Pin_9|GPIO_Pin_10;
  GPIO_InitStruct.GPIO_Mode = GPIO_Mode_OUT;
  GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_InitStruct.GPIO_OType = GPIO_OType_PP;
  GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_NOPULL;
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOF, ENABLE);
GPIO_Init(GPIOF, &GPIO_InitStruct);
GPIO_InitStruct.GPIO_Pin  = GPIO_Pin_13|GPIO_Pin_14;
  GPIO_InitStruct.GPIO_Mode = GPIO_Mode_OUT;
  GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_InitStruct.GPIO_OType = GPIO_OType_PP;
  GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_NOPULL;
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOE, ENABLE);
GPIO_Init(GPIOE, &GPIO_InitStruct);
}
void LED_RUN(void)
{
GPIO_ResetBits(GPIOF,GPIO_Pin_9);
delay_ms(50);
GPIO_ResetBits(GPIOF,GPIO_Pin_10);
delay_ms(50);
GPIO_ResetBits(GPIOE,GPIO_Pin_13);
delay_ms(50);
GPIO_ResetBits(GPIOE,GPIO_Pin_14);
delay_ms(50);
GPIO_SetBits(GPIOE,GPIO_Pin_14);
delay_ms(50);
GPIO_SetBits(GPIOE,GPIO_Pin_13);
  delay_ms(50);
GPIO_SetBits(GPIOF,GPIO_Pin_10);
delay_ms(50);
GPIO_SetBits(GPIOF,GPIO_Pin_9);
delay_ms(50);
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/619097.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

力扣热题100

排序 快速排序 #include <iostream> #include <vector> using namespace std;// 快速排序函数&#xff0c;传入引用&#xff0c;以便修改原始数组 void quick_sort(vector<int>& q, int l, int r) {// 边界条件&#xff1a;如果左边界大于等于右边界&am…

基于SpringBoot+Vue实现的二手交易系统

系统介绍 校园二手交易网站是一种专门针对有二手物品交易需求用户的二手交易的网站。它的设计和开发主要是为了满足用户之间的二手物品交易需求&#xff0c;方便大家在线买卖二手物品。近年来&#xff0c;随着互联网技术的发展&#xff0c;人们越来越喜欢在线购物&#xff0c;…

NMEA0183协议相关笔记

协议基本知识 参考以前的文章 <北斗/GPS模块的使用-基于正点原子ATK-1218-BD>&#xff0c;文章链接&#xff0c;或者野火相关资料整理。 1、协议格式 2、地址段指令 1、标识 2、语句类型 二、指令内容 1、 GGA 2、GLL 3、GSA 4、GSV 5、RMC 6、VTG 7、ZDA 8、TXT

码牛课堂首推——鸿蒙南北双向开发学习路线图标准版~

鸿蒙&#xff01;鸿蒙&#xff01;鸿蒙&#xff01; 要说2023-2024年IT圈最火爆的名词&#xff0c;一定是鸿蒙&#xff01; 2023年9月25日&#xff0c;华为发布会正式宣布2024年第一季度将推出HarmonyOS NEXT版本&#xff0c;这意味着鸿蒙原生应用开发将彻底摆脱Android手机系…

Java实现在线编辑预览office文档

文章目录 1 在线编辑1.1 PageOffice简介1.2 前端项目1.2.1 配置1.2.2 页面部分 1.3 后端项目1.3.1 pom.xml1.3.2 添加配置1.3.3 controller 2 在线预览2.1 引言2.2 市面上现有的文件预览服务2.2.1 微软2.2.2 Google Drive查看器2.2.3 阿里云 IMM2.2.4 XDOC 文档预览2.2.5 Offic…

【simple-admin】FMS模块如何快速接入阿里云oss 腾讯云cos 服务 实现快速上传文件功能落地

让我们一起支持群主维护simple-admin 社群吧!!! 不能加入星球的朋友记得来点个Star!! https://github.com/suyuan32/simple-admin-core 一、前提准备 1、goctls版本 goctls官方git:https://github.com/suyuan32/goctls 确保 goctls是最新版本 v1.6.19 goctls -v goct…

【竞技宝】DOTA2:梦幻联赛开战在即 中国区前两名将晋级正赛

北京时间2024年1月12日&#xff0c;近期DOTA2刚刚结束了别墅杯东南亚/中国区的封闭预选赛&#xff0c;而别墅杯的正赛还要等到下个月才会正式开打&#xff0c;而即将在明天开始进行的是梦幻联赛S22的中国区预选赛&#xff0c;除官方直邀的XG战队直接晋级正赛之外&#xff0c;其…

Elasticsearch 7.8.0从入门到精通

安装Elasticsearch 7.8.0 官网&#xff1a;Elasticsearch 7.8.0 | Elastic 大家下载所需要的安装包即可。然后解压缩&#xff1a; Elasticsearch是通过java编写的&#xff0c;所以自带jdk。多好&#xff0c;下载Elasticsearch赠送jdk 0.0&#xff0c;不过一般我们用自己的jdk…

@PreAuthorize注解

前言&#xff1a;RuoYi框架中&#xff0c;菜单管理的权限标识字段通常用于定义用户对特定菜单或操作的访问权限。 这个权限标识字段通常会被用在两个地方&#xff1a; 1. 后端&#xff1a;在Spring Security的PreAuthorize注解中&#xff0c;用于控制对特定方法的访问。例如&am…

二蛋赠书十四期:《微前端实战》

前言 大家好&#xff01;我是二蛋&#xff0c;一个热爱技术、乐于分享的工程师。在过去的几年里&#xff0c;我一直通过各种渠道与大家分享技术知识和经验。我深知&#xff0c;每一位技术人员都对自己的技能提升和职业发展有着热切的期待。因此&#xff0c;我非常感激大家一直…

51单片机点阵开发

一.LED点阵屏 LED点阵屏通过LED(发光二极管)组成&#xff0c;以灯珠亮灭来显示文字、图片、动画、视频等&#xff0c;LED点阵显示屏制作简单&#xff0c;安装方便&#xff0c;被广泛应用于各种公共场合&#xff0c;如汽车报站器、广告屏、银行窗口屏叫号屏以及停车系统等等。 …

Ansible的切片特性与多机器选取

一、【概述】 本文介绍一下Ansible的多机器选取和切片特性&#xff0c;这个还是一个比较有用的技巧&#xff0c;可以快速选取仓库中我们需要的机器清单。 因为该特性可能与其他工具语法稍微有些不一样&#xff0c;时间长了会忘&#xff0c;值得记录一下 二、【具体说明】 1…

力扣(leetcode)第606题根据二叉树创建字符串(Python)

606.根据二叉树创建字符串 题目链接&#xff1a;606.根据二叉树创建字符串 给你二叉树的根节点 root &#xff0c;请你采用前序遍历的方式&#xff0c;将二叉树转化为一个由括号和整数组成的字符串&#xff0c;返回构造出的字符串。 空节点使用一对空括号对 “()” 表示&…

NUS CS1101S:SICP JavaScript 描述:二、使用数据构建抽象

原文&#xff1a;2 Building Abstractions with Data 译者&#xff1a;飞龙 协议&#xff1a;CC BY-NC-SA 4.0 我们现在来到数学抽象的决定性步骤&#xff1a;我们忘记符号代表什么。…[数学家]不需要闲着&#xff1b;他可以用这些符号进行许多操作&#xff0c;而无需看它们所代…

Jenkins实现基础CI操作配合python

条件&#xff1a; gitlab准备好 jenkins准备好 (不会java项目, 故跳过Maven打jar包) jenkins配置 在配置里通过插件Git Parameter配置Git&#xff0c;以便于从gitlab 拉去代码到Jenkins r容器内 /var/jenkins_home/ 刚接触python 项目好像不需要构建&#xff0c;直接推送到远…

测试工程师能否作为一份「终身职业」?30岁+怎么办?

【讨论】测试工程师可否作为一份终生的职业&#xff1f; 这是我在论坛看到的一个讨论&#xff0c;你的答案是什么呢&#xff1f; 我希望大家能认真思考后给出一个属于自己的答案&#xff0c;无论你是新手入门&#xff0c;还是资深专家。回答这个问题请不要凭一腔热血&#xff…

ZooKeeper初探:分布式世界的守护者

欢迎来到我的博客&#xff0c;代码的世界里&#xff0c;每一行都是一个故事 ZooKeeper初探&#xff1a;分布式世界的守护者 前言Zookeeper的概述分布式系统中的角色和作用&#xff1a; Zookeeper的数据模型Znode的概念和层次结构&#xff1a;Znode的类型和应用场景&#xff1a;…

NUS CS1101S:SICP JavaScript 描述:三、模块化、对象和状态

原文&#xff1a;3 Modularity, Objects, and State 译者&#xff1a;飞龙 协议&#xff1a;CC BY-NC-SA 4.0 变化中安宁 &#xff08;即使它在变化&#xff0c;它仍然保持不变。&#xff09; ——赫拉克利特 变化越大&#xff0c;越是相同。 ——阿方斯卡尔 前面的章节介绍了构…

程序员如何弯道超车?周末有奇效

作为一名程序员&#xff0c;不断提升自己的技能和知识是至关重要的。然而&#xff0c;在繁忙的工作日常中&#xff0c;很难有足够的时间和精力来学习新技术或深入研究。因此&#xff0c;周末成为了一个理想的时机&#xff0c;可以专注于个人发展和技能提升。所以程序员如何利用…

Vulnhub靶机:driftingblues 3

一、介绍 运行环境&#xff1a;Virtualbox 攻击机&#xff1a;kali&#xff08;10.0.2.15&#xff09; 靶机&#xff1a;driftingblues3&#xff08;10.0.2.19&#xff09; 目标&#xff1a;获取靶机root权限和flag 靶机下载地址&#xff1a;https://www.vulnhub.com/entr…