上一篇博文CLion+openocd+stm32cubemx基于HAL库搭建开发环境我们搭建好了开发环境,现在我准备利用DS18b20和ESP-01S实现一个简单的温度检测上报功能,实时检测当前的温度然后通过wifi上报到我们后台服务器上。
DS18B20接线
DS18B20是一个温度传感器,单总线协议,所以只需要接3根线:VCC、GND、DQ,因为单总线协议在stm32上并没有直接支持的外设,可能是因为用这个协议的器件太少了吧,所以这里直接把DQ数据引脚接到某个通用GPIO口上就行了,我这里选择的是PA1引脚,注意要配置为初始高电平,开漏输出(Open-Drain),输出速度低速即可:

至于驱动代码当然是软件模拟,但是我懒得研究单总线协议的时序了,有兴趣的你可以找其他资料研究下,我直接找ChatGPT写,告诉他我的接线方式就行了,啪啪几秒钟就给我整出来了,AI还是太好用了。
不过这里有个坑得注意:
因为温度是有小数的,所以读取温度转换计算后返回给我浮点型数据确实没毛病,但是我后续需要通过串口把数据发送出去,所以我使用了sprintf(buf, "temp|%.2f", temp);这个函数格式化浮点数为字符串,结果死活无法格式化成功。
查了一些信息发现是需要在CMakeLists.txt文件中加入浮点输出的支持:
target_link_options(${CMAKE_PROJECT_NAME} PRIVATE
-u _printf_float
)
但是我很奇怪为什么cubemx给我生成代码的时候没有给我自动加上,后来发现加上这个配置后编译,FLASH占用直接暴涨40%,这还得了,所以尽量还是不要加了,在获取温度时直接获取整型数据,比如25.23摄氏度按照乘以100的2523来处理,发到服务器上后再想怎么存都行。
ESP-01S接线
ESP-01S是一个串口WIFI模块,stm32有串口外设,所以这里就简单了,我直接使用USART1外设,至于引脚定义接线方式我在另一篇博文描述过,直接参考这个就行:ESP-01S模块介绍
这里又有个坑得注意:
这个模块我买了好多年了,之前的店也找不到了,所以配置时我默认它的串口波特率是115200,调试半天发现不对,换成9600果然就行了,现在买的模块大概率是115200了,包括我手上有块开发板里面集成了ESP8266,波特率就是115200,唯一要注意的就是这个参数其他保持默认就好。
没想到还有坑,这个模块应该是指支持2.4Gwifi的,一开始随便连了个一直连不上。
Python搭建简单的TCP服务
既然是检测温度上传到服务端,当然需要一个服务端程序开启端口接收数据了,本来想用Java基于Netty写一个服务端的,但是我这里懒得写代码了,直接让AI帮我一段Python脚本就好了,直接打印温度:
import socket
import threading
def start_string_tcp_server(host='0.0.0.0', port=37775):
"""
简洁的TCP服务器,专门用于接收和打印字符串
"""
server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
server.bind((host, port))
server.listen(5)
print(f"✅ TCP服务器已启动")
print(f"📡 监听地址: {host}:{port}")
print("等待连接... (按 Ctrl+C 停止)")
print("-" * 40)
def handle_client(client_socket, addr):
"""处理客户端连接"""
print(f"📱 新连接: {addr[0]}:{addr[1]}")
try:
while True:
# 接收数据
data = client_socket.recv(1024)
if not data:
print(f"🔌 连接关闭: {addr[0]}:{addr[1]}")
break
# 直接解码为字符串并打印
text = data.decode('utf-8').strip()
if text: # 只打印非空内容
print(f"[{addr[0]}:{addr[1]}] >>> {text}")
except ConnectionResetError:
print(f"⚠️ 连接异常断开: {addr[0]}:{addr[1]}")
finally:
client_socket.close()
try:
while True:
client_sock, addr = server.accept()
# 为新连接创建线程
thread = threading.Thread(target=handle_client, args=(client_sock, addr))
thread.daemon = True
thread.start()
except KeyboardInterrupt:
print("\n🛑 服务器停止")
finally:
server.close()
if __name__ == "__main__":
# 最简单用法
start_string_tcp_server(port=37775)
AI还是太好用了
程序代码及实现效果
程序代码我直接传到Github上了:
https://github.com/chengpei/TempMonitor
实现效果如下:

上电连接wifi连接tcp服务,几乎1秒上报一次温度数据
评论区