news 2026/9/4 8:17:32

基于STM32与NRF24L01的无线温湿度采集系统设计全解析

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
基于STM32与NRF24L01的无线温湿度采集系统设计全解析

简介:本资源是一套完整的基于STM32的温湿度无线采集系统工程资料,面向嵌入式初学者、课程设计学生及单片机开发入门者,解决环境参数远程监测中传感器驱动、SPI通信、NRF24L01无线收发与LCD数据显示等典型实践问题。压缩包共252个文件,含68个编译中间文件(.o/.d)、66个编译依赖记录(.crf)、4个核心源码(main.c/stm32f10x_it.c等)、3个可执行镜像(.hex)、3个原理图与PCB设计文件(.schdoc/.pcbdocpreview)、多份PDF/DOC格式设计说明及JPG/PNG硬件接线图,整体34.19MB,结构完整覆盖原理图、代码、编译输出与硬件调试全流程。已有3286人学习下载,提供可直接Keil MDK编译运行的工程框架,包含DHT11驱动、NRF24L01收发协议栈、Nokia5110显示适配及双机(采集端+接收端)协同逻辑,便于理解无线传感网络的端到端实现机制。

1. 项目缘起与核心价值

最近在整理工作室的旧项目资料,翻出了一个几年前做的温湿度无线采集节点。当时是为了解决一个小型仓库的环境监控问题,客户要求能实时查看几个关键区域的温湿度,但又不能拉线,预算也有限。于是,基于STM32F103C8T6(也就是大家常说的“蓝桥杯”或“最小系统板”核心)搭配DHT11传感器和NRF24L01无线模块的方案就诞生了。这个方案成本极低,一套节点硬件成本可以控制在30元以内,稳定性却出乎意料的好,在非极端环境下连续运行了两年多。

这个项目的核心价值在于,它完整地呈现了一个典型嵌入式物联网数据采集终端从硬件设计到软件实现的闭环。对于初学者而言,它是一个绝佳的练手项目,涵盖了单片机选型、传感器驱动、无线通信、低功耗设计(可选)等多个基础知识点;对于有经验的开发者,其硬件原理图和软件架构也提供了清晰的参考,可以快速移植到自己的产品中,或者作为更复杂系统(比如加入LoRa、NB-IoT等远距离传输)的一个子模块。很多人可能觉得DHT11精度一般,NRF24L01通信距离有限,但正是这种“够用就好”的朴素设计,恰恰体现了嵌入式开发中“在成本、功耗、性能之间寻找平衡”的核心思想。接下来,我将从硬件原理、软件设计、调试心得三个方面,把这个项目的“家底”彻底摊开来讲清楚。

2. 硬件系统架构与核心电路设计

一套完整的无线采集系统,通常包含至少一个发送节点(终端)和一个接收节点(主机)。我们这里主要剖析发送节点,也就是负责采集温湿度并通过无线发送出去的那一端。它的硬件核心可以拆解为三大部分:主控单元、传感器单元、无线射频单元,再加上必不可少的电源管理。

2.1 主控单元:STM32F103C8T6的“性价比之选”

为什么选STM32F103C8T6?这个问题几乎每个项目开始前都要回答一遍。对于这个温湿度采集项目,原因非常直接:

  1. 性能足够:72MHz的Cortex-M3内核,处理DHT11的时序和NRF24L01的SPI通信绰绰有余,还有充足的资源留给未来功能扩展(如加装OLED屏显示本地数据)。
  2. 外设丰富:它自带多个定时器、USART、SPI、I2C,我们只需要用到一路GPIO驱动DHT11,一路SPI驱动NRF24L01,其余都是储备。
  3. 生态与成本:这款芯片是STM32家族中知名度最高、资料最全的型号之一,各种库(标准库、HAL库)和开发工具(Keil、STM32CubeIDE)支持完善。关键是其价格和配套的“最小系统板”在市场上极具竞争力,降低了学习和部署门槛。

在原理图设计中,最小系统部分必须可靠。除了常规的3.3V供电、复位电路、启动模式选择(BOOT0/BOOT1)外,有两点需要特别注意:

  • 晶振电路:虽然STM32内部有HSI RC振荡器,但为了SPI通信等时序的绝对稳定,强烈建议使用外部8MHz晶振。匹配电容(通常为20pF)要尽量靠近晶振引脚,走线要短,下方铺地屏蔽。
  • 去耦电容:在VDD(3.3V)和VDDA(模拟电源)的每个引脚附近,都必须放置一个100nF的陶瓷电容,并且尽可能靠近引脚。这是保证单片机稳定运行、降低电源噪声的基石,原理图上不能省略,PCB布局时更要严格执行。

2.2 传感器接口:DHT11的驱动电路与注意事项

DHT11是一款经典的温湿度复合传感器,采用单总线协议。其电路简单到令人发指,但驱动起来却有不少“坑”。

原理图设计:DHT11只有三个引脚(VCC, GND, DATA)。DATA引脚需要接一个4.7kΩ - 10kΩ的上拉电阻到VCC,这是因为其数据线在空闲时需要保持高电平。很多初学者直接连接GPIO,忽略了上拉电阻,导致无法读取数据。在嘉立创(LCEDA)等工具画图时,这是一个必须添加的细节。

驱动深层解析:DHT11的通信时序是学习的重点。主机(STM32)先拉低DATA线至少18ms(启动信号),然后释放并切换到输入模式,等待DHT11的响应。DHT11会先拉低80us,再拉高80us作为应答,随后开始发送40位数据(16位湿度整数+16位温度整数+8位校验和)。每一位数据都以一个50us的低电平起始位开始,随后26-28us的高电平表示‘0’,70us的高电平表示‘1’。

这里的关键在于定时器的精准使用。不建议用简单的delay_us函数,因为在中断或复杂任务中容易不准。更可靠的做法是使用一个基本定时器(如TIM2)的计数功能,或者利用SysTick定时器来测量高电平的持续时间。例如,在接收到起始低电平后,将计数器清零,然后循环检测引脚电平,一旦变为高电平,就开始计数,直到再次变为低电平,根据计数值判断是‘0’还是‘1’。这个计数值需要根据你的系统时钟频率进行校准。

注意:DHT11每次读数间隔不得低于2秒。在程序里,必须做一个软件延时或标志位,防止频繁读取。此外,其温湿度测量范围和工作电压(3.3V-5.5V)需明确,在3.3V系统下工作完全正常。

2.3 无线通信核心:NRF24L01+模块的电路与配置

NRF24L01+是一款2.4GHz的无线收发芯片,功率低,速率快(最高2Mbps),非常适合短距离点对点或星型网络。

硬件连接:NRF24L01采用SPI接口与STM32通信,此外还有CE(芯片使能)、CSN(片选)、IRQ(中断)三个控制引脚。原理图连接如下:

  • MOSI->PA7(SPI1_MOSI)
  • MISO->PA6(SPI1_MISO)
  • SCK->PA5(SPI1_SCK)
  • CSN-> 任意GPIO,如PA4
  • CE-> 任意GPIO,如PB0
  • IRQ-> 任意GPIO,如PB1(配置为外部中断下降沿触发)

电源滤波是重中之重:NRF24L01对电源噪声非常敏感。必须在模块的VCC引脚就近放置一个10uF的钽电容或电解电容,再并联一个100nF的陶瓷电容。很多现成模块已经集成了这些滤波电路,但自己在设计底板时,如果通过排针连接模块,务必在底板的电源入口处加上这组电容,否则通信距离和稳定性会大打折扣。

天线设计:对于PCB天线版本,需要严格按照数据手册的参考设计进行布局,天线区域下方和周围需要净空(禁止敷铜)。对于外接天线版本,确保天线接口(如IPEX)连接可靠,天线本身性能良好。

2.4 电源管理:稳定可靠的3.3V生成方案

整个系统通常由一节3.7V锂电池或两节干电池(约3V)供电。因此,需要一个LDO(低压差线性稳压器)将电压稳定到3.3V。常用的有AMS1117-3.3、ME6211等。

在原理图设计中,LDO的输入和输出端都需要配置滤波电容。以AMS1117为例,输入端建议10uF,输出端建议22uF+100nF。对于有低功耗要求的应用(比如希望电池续航数月),则需要考虑:

  1. 选用静态电流(Quiescent Current)极低的LDO,如HT7333。
  2. 设计电源开关电路,通过STM32的一个GPIO控制MOS管,在不采样时彻底切断传感器和无线模块的供电。DHT11和NRF24L01在待机模式下仍有可观的耗电,物理断电是最有效的省电方式。

3. 软件程序设计:从驱动到应用逻辑

有了稳定的硬件,软件就是让系统“活”起来的关键。程序框架采用前后台(超级循环)方式,清晰易懂。核心任务包括:初始化、定时采集传感器数据、打包并通过无线发送。

3.1 系统初始化与外设配置

初始化顺序有讲究,应遵循“时钟->GPIO->具体外设”的顺序。

int main(void) { // 1. 系统时钟初始化(使用外部8MHz晶振,倍频到72MHz) SystemInit(); // 2. 延时函数初始化(基于SysTick) delay_init(); // 3. 调试串口初始化(用于打印日志,非必需但强烈推荐) uart_init(115200); printf("System Boot...\r\n"); // 4. DHT11 GPIO初始化(配置为上拉输入模式) DHT11_Init(); // 5. SPI初始化(用于NRF24L01) SPI1_Init(); // 6. NRF24L01初始化(配置通道、地址、速率、发射功率等) while(NRF24L01_Check() == 0) { // 检测模块是否存在 printf("NRF24L01 Check Failed!\r\n"); delay_ms(500); } NRF24L01_TX_Mode(); // 设置为发送模式 printf("NRF24L01 Init OK!\r\n"); // 进入主循环 while(1) { // 主循环任务 } }

3.2 DHT11数据采集的稳健性实现

如前所述,DHT11的驱动关键在于时序。下面提供一个基于SysTick微秒延时函数的读取函数框架,并强调错误处理。

// 读取一次DHT11数据,返回0成功,1失败 u8 DHT11_Read_Data(u8 *temp, u8 *humi) { u8 buf[5] = {0}; u8 i, j; // 主机拉低至少18ms DHT11_IO_OUT(); DHT11_DQ_OUT(0); delay_ms(20); // 主机释放总线,拉高20-40us DHT11_DQ_OUT(1); delay_us(30); // 切换为输入模式,等待DHT11响应 DHT11_IO_IN(); // 等待DHT11拉低 (超时检查) if(DHT11_DQ_IN() != 0) return 1; while(DHT11_DQ_IN() == 0); // 等待低电平结束 while(DHT11_DQ_IN() == 1); // 等待高电平结束 // 至此,应答信号结束,开始接收40位数据 for(i=0; i<5; i++) { for(j=0; j<8; j++) { while(DHT11_DQ_IN() == 0); // 等待每个位开始的低电平过去 delay_us(40); // 延时40us后检测,此时正处于数据位的高电平期间 if(DHT11_DQ_IN() == 1) { buf[i] |= (1 << (7-j)); // 等待高电平结束(如果是‘1’,高电平持续约70us) while(DHT11_DQ_IN() == 1); } else { // ‘0’的高电平只有26-28us,此时已经结束 } } } // 校验 if(buf[4] == (buf[0]+buf[1]+buf[2]+buf[3])) { *humi = buf[0]; *temp = buf[2]; return 0; } return 1; }

实操心得:在实际环境中,电磁干扰可能导致时序错乱。因此,必须加入超时机制。例如,在while(DHT11_DQ_IN() == 0)这类等待循环中,加入一个计数器,超过一定时间(如200us)仍未跳出,则判定为超时,函数返回错误。这能防止程序因传感器故障或接触不良而“卡死”。

3.3 NRF24L01数据发送的配置与流程

NRF24L01的驱动相对复杂,但市面上有成熟的库。核心是配置其工作模式、通道、地址和自动应答等。

void NRF24L01_TX_Mode(void) { CE_LOW(); // 使能引脚拉低 // 写配置寄存器:使能CRC(2字节)、上电、设置为发送模式 NRF24L01_Write_Reg(CONFIG, 0x0E); // 设置接收地址(对于发送端,是设置接收端的地址,用于接收ACK) NRF24L01_Write_Reg(RX_ADDR_P0, TX_ADDRESS, ADDR_WIDTH); // 设置发送地址 NRF24L01_Write_Reg(TX_ADDR, TX_ADDRESS, ADDR_WIDTH); // 设置自动重发延时和次数 NRF24L01_Write_Reg(SETUP_RETR, 0x1A); // 500us + 86us, 重试10次 // 设置射频通道(频率) NRF24L01_Write_Reg(RF_CH, 40); // 2.4GHz + 40 = 2.440GHz // 设置发射速率和功率 NRF24L01_Write_Reg(RF_SETUP, 0x07); // 1Mbps, 0dBm最大功率 CE_HIGH(); // 拉高CE,进入发送模式 delay_us(130); // 等待稳定 }

发送一帧数据的函数:

// 发送一帧数据,返回发送状态 u8 NRF24L01_TxPacket(u8 *txbuf) { u8 status; CE_LOW(); // 拉低CE,准备写入数据 // 写入数据到TX FIFO NRF24L01_Write_Buf(WR_TX_PLOAD, txbuf, TX_PLOAD_WIDTH); CE_HIGH(); // 拉高CE,启动发送 // 等待发送完成(检测TX_DS或MAX_RT中断标志) while(NRF24L01_IRQ_PIN != 0); // 假设IRQ连接了中断引脚,低电平有效 status = NRF24L01_Read_Reg(STATUS); NRF24L01_Write_Reg(STATUS, status); // 清除中断标志 if(status & TX_DS) { printf("Send OK.\r\n"); return 0; // 发送成功 } else if(status & MAX_RT) { printf("Send Failed: Max Retry.\r\n"); NRF24L01_Write_Reg(FLUSH_TX, 0xff); // 清空TX FIFO return 1; // 达到最大重发次数 } return 2; // 其他错误 }

3.4 主循环逻辑与低功耗考量

在主循环中,我们需要定时(例如每5秒)执行一次采集与发送。

while(1) { static u32 last_send_time = 0; u8 temperature, humidity; u8 tx_buffer[32]; // 发送缓冲区 // 每5000ms执行一次 if(HAL_GetTick() - last_send_time >= 5000) { last_send_time = HAL_GetTick(); // 1. 读取传感器 if(DHT11_Read_Data(&temperature, &humidity) == 0) { // 2. 打包数据(可以加入节点ID、电池电压等信息) sprintf((char*)tx_buffer, "ID:01,T:%d,H:%d", temperature, humidity); printf("Read: T=%d, H=%d\r\n", temperature, humidity); // 3. 无线发送 if(NRF24L01_TxPacket(tx_buffer) == 0) { // 发送成功,可以点亮一个LED指示 LED_ON(); delay_ms(50); LED_OFF(); } } else { printf("DHT11 Read Error!\r\n"); } } // 此处可以加入其他任务,或进入低功耗模式 // Enter_LowPower_Mode(); // 例如,调用停机模式 }

低功耗优化:如果对功耗有要求,在两次采集发送的间隔,可以让STM32进入睡眠(Sleep)或停机(Stop)模式。在停机模式下,所有时钟停止,功耗可降至微安级,通过RTC或外部中断唤醒。需要注意的是,进入低功耗前,需要将NRF24L01设置为掉电模式(PWR_DOWN),并将DHT11的供电引脚(如果可控)拉低。唤醒后,再重新初始化外设。这是一个进阶话题,但能极大提升电池寿命。

4. 调试、排坑与性能优化实战

项目做出来和项目能稳定工作是两回事。下面分享几个调试过程中必然会遇到的坑和解决方法。

4.1 硬件层面的常见问题与排查

  1. NRF24L01通信不稳定或距离极短

    • 首要怀疑对象是电源:用示波器测量NRF24L01模块VCC引脚上的电压波形。如果纹波过大(超过100mV),通信必然受影响。解决方法是在模块的电源引脚最近处并联一个10uF钽电容和一个100nF陶瓷电容。
    • 检查天线:如果是PCB天线,确保天线区域下方没有敷铜,且周围没有金属物体遮挡。如果是外接天线,检查天线接口是否虚焊,天线本身是否损坏。
    • 检查SPI时序:用逻辑分析仪抓取STM32与NRF24L01之间的SPI波形,确认CSN、CE的控制时序符合数据手册要求。特别是CE引脚,在写入数据后需要拉高至少10us才能启动发送。
  2. DHT11读取总是失败或数据全为0

    • 检查上拉电阻:DATA线必须接4.7kΩ上拉电阻到3.3V。
    • 检查供电电压:确保DHT11的VCC引脚电压在3.3V左右,电压过低会导致工作异常。
    • 检查时序精度:单总线协议对时序要求严格。如果使用delay_us函数,确保系统时钟配置正确,且没有被中断频繁打断。建议用定时器计数器来测量高电平时间,更为可靠。
    • 物理连接:杜邦线接触不良是新手最常见的问题。尝试按压连接处或直接焊接。

4.2 软件调试技巧与工具使用

  1. 串口打印是生命线:在关键步骤(如初始化完成、数据读取成功/失败、发送成功/失败)添加printf语句输出到串口,通过PC端的串口助手(如XCOM、Putty)查看,能快速定位问题发生在哪个环节。
  2. 逻辑分析仪是神器:对于时序问题(DHT11单总线、SPI通信),一个几十块钱的逻辑分析仪(配合上位机软件如PulseView)可以直观地看到波形,对比数据手册的时序图,一切问题无所遁形。
  3. 分模块测试:不要一次性把所有代码写完。先写一个程序,只测试DHT11读取,在串口上能稳定打印温湿度后再进行下一步。然后单独写一个NRF24L01的收发测试程序,用两个开发板互相收发,确认无线链路通畅。最后再将两个模块整合。

4.3 系统稳定性与抗干扰优化

  1. 数据校验与重传:无线通信难免丢包。除了NRF24L01自带的自动重传,在应用层也可以设计简单的协议。例如,发送端发送一包数据后,等待接收端的ACK(确认)指令。如果在规定时间内没收到ACK,就重发数据。ACK指令本身也可以包含“上一包数据校验和正确”的信息。
  2. 看门狗定时器:为了防止程序跑飞,务必启用STM32的独立看门狗(IWDG)。在while(1)主循环中定期“喂狗”。如果因为未知原因(如强干扰)导致程序死锁,看门狗会在超时后复位系统,让设备自愈。
  3. 软件滤波:DHT11的读数可能会有小跳动。可以在软件中实现一个简单的滑动平均滤波。连续读取5次,去掉最大最小值,再取平均,能有效输出更稳定的数值。
    #define FILTER_NUM 5 u8 temp_buf[FILTER_NUM], humi_buf[FILTER_NUM]; u8 get_filtered_value(u8 *buf) { u8 i, j, temp, sum=0; // 简单冒泡排序 for(i=0; i<FILTER_NUM-1; i++) { for(j=0; j<FILTER_NUM-1-i; j++) { if(buf[j] > buf[j+1]) { temp = buf[j]; buf[j] = buf[j+1]; buf[j+1] = temp; } } } // 去掉头尾,取中间值的平均 for(i=1; i<FILTER_NUM-1; i++) { sum += buf[i]; } return sum / (FILTER_NUM-2); }

5. 项目扩展与进阶思路

这个基础框架搭建好后,可以根据实际需求进行多方面的扩展,提升其应用价值。

5.1 硬件扩展:多传感器与显示接口

  • 增加传感器:STM32的多个GPIO和I2C/SPI接口可以轻松接入更多传感器。例如,通过I2C接入一个精度更高的SHT30温湿度传感器,或者接入一个BH1750光照强度传感器。只需在软件中增加对应传感器的驱动函数即可。
  • 本地显示:添加一个0.96寸的OLED屏幕(SSD1306驱动,I2C接口),可以在节点本地实时显示温湿度数据和无线连接状态,方便现场调试和查看。
  • 电池电量监测:通过STM32的ADC通道,测量经过电阻分压后的电池电压,可以估算剩余电量,并在数据帧中上报,实现低电量预警。

5.2 网络拓扑扩展:从点到点转向星型网络

基础的方案是一个发送端对一个接收端。可以很容易地扩展为一个接收端对多个发送端的星型网络。

  1. 地址管理:为每个发送节点分配一个唯一的短地址(如01, 02, 03)。
  2. 接收端配置:接收端的NRF24L01需要开启多通道接收(例如开启RX_ADDR_P0, P1, P2...),并将每个通道的接收地址设置为对应发送端的地址。或者,所有发送端使用同一个接收地址,但在数据包中加入节点ID字段。
  3. 发送端防冲突:简单的做法是让每个节点在不同的随机延时后发送,降低碰撞概率。更复杂的可以设计简单的时分复用或监听-避让机制。

5.3 软件协议优化:定义轻量级应用层协议

原始的数据包“ID:01,T:%d,H:%d”是字符串格式,虽然可读性好,但效率低。可以设计一个二进制协议,例如:

#pragma pack(1) // 按1字节对齐 typedef struct { u8 head; // 帧头,固定为0xAA u8 node_id; // 节点ID u8 temp; // 温度 u8 humi; // 湿度 u16 voltage; // 电池电压(ADC值) u8 checksum; // 校验和(前面所有字节的累加和) } Sensor_Data_Packet_t; #pragma pack()

这样一帧数据只有7个字节,传输效率高,解析速度快。接收端通过判断帧头0xAA和校验和来确认数据有效性。

5.4 云端连接与数据可视化(进阶)

接收端(主机)通常是一个更强的设备,如STM32F407、ESP32甚至树莓派。它可以负责:

  1. 汇总数据:接收所有节点的数据。
  2. 协议转换:通过串口、Wi-Fi(如ESP32)或以太网将数据上传到云平台(如阿里云IoT、ThingsBoard等私有部署平台)。
  3. 数据可视化:在云平台或自建服务器上,利用Grafana等工具绘制温湿度历史曲线图,设置阈值告警(如温度超过30℃发送邮件或短信)。

例如,使用ESP32作为接收主机,它既可以用SPI连接NRF24L01接收数据,又可以内置Wi-Fi将数据通过MQTT协议发布到云端。这就构成了一个典型的“边缘节点-网关-云端”三层物联网架构的雏形。

这个基于STM32的温湿度无线采集系统,麻雀虽小,五脏俱全。它像一块坚实的积木,通过不同的组合与扩展,能够构建出适应各种场景的监测网络。从原理图上的每一个电阻电容,到代码中的每一行时序控制,都体现着嵌入式开发中对细节的掌控和对稳定性的追求。希望这份详细的拆解,能帮助你不仅做出这个系统,更能理解其背后的每一个设计抉择,从而具备独立设计和优化类似项目的能力。

本文还有配套的精品资源,点击获取

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/4 8:16:47

光流补帧技术:让FNF游戏视频从60帧到120帧的丝滑升级指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/4 8:15:44

IVD循环与自治度:构建可工程化多智能体系统的核心范式

最近在技术社区里&#xff0c;一个名为“范式&#xff1a;起源”的项目引起了不小的讨论。它的副标题“sense of wonder [IVD 13] AD(-10)”看起来像某种神秘的版本号或内部代号&#xff0c;让很多开发者第一眼感到困惑&#xff1a;这到底是一个新的编程框架、一个AI模型&#…

作者头像 李华
网站建设 2026/9/4 8:15:43

[论文分析]面向AI赋能SOAR系统鲁棒性评估的红队框架

A Red Teaming Framework for Evaluating Robustness of AI-enabled Security Orchestration, Automation, and Response Systems论文重点 本文提出了一种将大语言模型&#xff08;LLM&#xff09;与强化学习&#xff08;RL&#xff09;相结合的分层红队框架&#xff0c;用于评…

作者头像 李华
网站建设 2026/9/4 8:15:31

【2014-08-11】C++ Primer Plus 6th重读笔记:Array

[历史归档] 本文原发布于 cstriker1407.info 个人博客&#xff0c;内容为历史存档&#xff0c;仅供参考。 发布时间&#xff1a; 2014-08-11 &#xff5c; 标题&#xff1a;C Primer Plus 6th重读笔记&#xff1a;Array &#xff5c; 分类&#xff1a; 编程 / C &&…

作者头像 李华
网站建设 2026/9/4 8:15:01

i茅台自动预约系统:Docker化协议层模拟实践

简介&#xff1a;本资源是一款面向茅台爱好者与自动化技术实践者的i茅台App预约辅助工具&#xff0c;解决用户每日手动抢约耗时费力、易错过时段的痛点&#xff0c;适用于具备基础Docker和前端/后端开发能力的技术人员。压缩包共542个文件&#xff0c;涵盖209个Java后端逻辑文件…

作者头像 李华
网站建设 2026/9/4 8:14:46

从零搭建74LS74 D触发器电路:深入时序逻辑与硬件实践

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华