TMP117温度传感器在ESP32上的Micropython驱动实战从接线到数据上传1. 项目概述与硬件准备在物联网和智能硬件快速发展的今天温度监测已成为众多应用场景的基础需求。TMP117作为一款高精度数字温度传感器以其±0.1°C的测量精度和低功耗特性成为环境监测项目的理想选择。结合ESP32的Wi-Fi能力和Micropython的易用性我们可以快速构建一个无线温度监测系统。所需硬件清单ESP32开发板推荐使用ESP32-WROOM-32TMP117温度传感器模块4.7kΩ电阻×2用于I2C上拉面包板和杜邦线若干TMP117采用I2C接口通信默认地址为0x48可通过ADDR引脚配置为其他地址。其关键特性包括测量范围-55°C至150°C分辨率0.0078°C工作电流3.5μA单次测量模式2. 硬件连接与I2C配置正确的硬件连接是项目成功的第一步。ESP32与TMP117的接线方式如下ESP32引脚TMP117引脚备注3.3VVCC电源正极GNDGND电源地GPIO22SCLI2C时钟线需上拉GPIO21SDAI2C数据线需上拉-ALERT可悬空或连接中断提示I2C总线必须连接上拉电阻4.7kΩ否则通信可能失败。部分开发板已内置上拉电阻建议仍外接以确保稳定性。连接完成后可通过以下Micropython代码验证I2C设备是否被正确识别from machine import I2C, Pin i2c I2C(sclPin(22), sdaPin(21), freq100000) devices i2c.scan() print(发现的I2C设备地址, [hex(addr) for addr in devices])正常情况应输出[0x48]TMP117的默认地址。若未发现设备请检查电源连接是否正确I2C线序是否接反上拉电阻是否正常工作3. TMP117驱动开发3.1 寄存器配置TMP117通过寄存器进行配置和读数主要寄存器包括寄存器地址名称功能描述0x00TEMP_RESULT温度结果只读0x01CONFIGURATION传感器配置0x02THIGH_LIMIT温度高阈值0x03TLOW_LIMIT温度低阈值我们需要重点关注CONFIGURATION寄存器地址0x01其各位定义如下15: MODE[1:0] - 工作模式00连续01单次10关闭 13-12: CONV[1:0] - 转换周期0015.5ms01125ms10250ms11500ms 11-9: AVG[1:0] - 平均采样次数00无018次1032次1164次 8: T/nA - 报警极性0低电平1高电平 7: POL - 报警模式0窗口比较1超限比较 6: DR/ALERT - 数据就绪/报警选择 5: SOFT_RESET - 软件复位写1触发 4-0: 保留3.2 Micropython驱动实现创建一个tmp117.py文件实现完整的驱动功能from machine import I2C import time class TMP117: def __init__(self, i2c, address0x48): self.i2c i2c self.address address self._config_reg 0x0220 # 默认配置连续模式15.5ms转换周期 def write_register(self, reg, data): 写入16位寄存器 self.i2c.writeto_mem(self.address, reg, bytes([(data 8) 0xFF, data 0xFF])) def read_register(self, reg): 读取16位寄存器 data self.i2c.readfrom_mem(self.address, reg, 2) return (data[0] 8) | data[1] def reset(self): 软件复位传感器 self.write_register(0x01, 0x8000) time.sleep_ms(20) def configure(self, mode0, conv0, avg0): 配置传感器工作模式 :param mode: 0连续模式1单次模式2关闭 :param conv: 转换周期 015.5ms, 1125ms, 2250ms, 3500ms :param avg: 平均次数 0无, 18次, 232次, 364次 config (mode 0x03) 13 | (conv 0x03) 10 | (avg 0x03) 5 self.write_register(0x01, config) self._config_reg config def read_temp(self): 读取温度值摄氏度 raw_temp self.read_register(0x00) return raw_temp * 0.0078125 # 转换为摄氏度 def set_limits(self, high30.0, low10.0): 设置温度报警阈值 high_raw int(high / 0.0078125) low_raw int(low / 0.0078125) self.write_register(0x02, high_raw) self.write_register(0x03, low_raw)4. 数据采集与网络传输4.1 基础数据采集示例使用驱动类进行温度采集的简单示例from machine import I2C, Pin from tmp117 import TMP117 import time i2c I2C(sclPin(22), sdaPin(21), freq100000) sensor TMP117(i2c) # 配置为单次模式250ms转换周期8次平均 sensor.configure(mode1, conv2, avg1) while True: sensor.write_register(0x01, sensor._config_reg | 0x8000) # 触发单次测量 while not (sensor.read_register(0x01) 0x0080): # 等待数据就绪 time.sleep_ms(10) temp sensor.read_temp() print(当前温度: %.2f°C % temp) time.sleep(5) # 每5秒测量一次4.2 通过MQTT上传数据将温度数据发布到MQTT服务器以Adafruit IO为例import network from umqtt.simple import MQTTClient import ubinascii # Wi-Fi配置 WIFI_SSID your_wifi WIFI_PASS your_password # MQTT配置 MQTT_SERVER io.adafruit.com MQTT_PORT 1883 MQTT_USER your_username MQTT_KEY your_aio_key MQTT_TOPIC byour_username/feeds/temperature def connect_wifi(): sta_if network.WLAN(network.STA_IF) if not sta_if.isconnected(): print(正在连接Wi-Fi...) sta_if.active(True) sta_if.connect(WIFI_SSID, WIFI_PASS) while not sta_if.isconnected(): time.sleep(0.5) print(网络配置:, sta_if.ifconfig()) def publish_temp(temp): client MQTTClient(ubinascii.hexlify(machine.unique_id()), MQTT_SERVER, portMQTT_PORT, userMQTT_USER, passwordMQTT_KEY) client.connect() client.publish(MQTT_TOPIC, str(temp).encode()) client.disconnect() # 主循环 connect_wifi() while True: temp sensor.read_temp() print(发布温度:, temp) publish_temp(temp) time.sleep(60) # 每分钟发布一次4.3 Web服务器实时显示创建一个简单的Web服务器显示当前温度import socket import network def start_web_server(): sta_if network.WLAN(network.STA_IF) addr socket.getaddrinfo(0.0.0.0, 80)[0][-1] s socket.socket() s.bind(addr) s.listen(1) print(监听地址:, sta_if.ifconfig()[0]) while True: conn, addr s.accept() print(客户端连接:, addr) temp sensor.read_temp() html htmlheadmeta http-equivrefresh content5/head bodyh1当前温度: %.2f°C/h1/body/html % temp conn.send(HTTP/1.0 200 OK\r\nContent-type: text/html\r\n\r\n) conn.send(html) conn.close() start_web_server()5. 进阶应用与优化5.1 低功耗设计对于电池供电的应用优化功耗至关重要使用单次测量模式配置mode1仅在需要时触发测量调整转换周期根据应用需求选择最长的合适周期如500msESP32深度睡眠在两次测量间使ESP32进入深度睡眠import machine # 配置传感器为单次模式 sensor.configure(mode1, conv3) # 单次模式500ms转换 while True: sensor.write_register(0x01, 0x8000) # 触发测量 time.sleep_ms(600) # 等待测量完成 temp sensor.read_temp() print(温度:, temp) # 保存数据到文件或发送到服务器... # 进入深度睡眠10分钟 print(进入深度睡眠...) machine.deepsleep(10*60*1000) # 毫秒5.2 数据校准与滤波虽然TMP117本身精度很高但在特殊环境下可能需要校准# 简单的两点校准 def calibrate(temp1_actual, temp1_measured, temp2_actual, temp2_measured): 计算校准系数 gain (temp2_actual - temp1_actual) / (temp2_measured - temp1_measured) offset temp1_actual - gain * temp1_measured return gain, offset # 应用校准 gain, offset 1.02, -0.5 # 示例值需实际校准 calibrated_temp raw_temp * gain offset对于波动较大的环境可添加软件滤波class MovingAverage: def __init__(self, size5): self.size size self.buffer [] def add(self, value): self.buffer.append(value) if len(self.buffer) self.size: self.buffer.pop(0) return sum(self.buffer) / len(self.buffer) filter MovingAverage(5) while True: raw_temp sensor.read_temp() smooth_temp filter.add(raw_temp) print(原始: %.2f, 平滑: %.2f % (raw_temp, smooth_temp)) time.sleep(1)5.3 多传感器组网通过I2C地址配置可以连接多个TMP117传感器将不同传感器的ADDR引脚连接到不同电平GND/VCC/SCL/SDA对应的地址变化如下ADDR连接I2C地址GND0x48VCC0x49SDA0x4ASCL0x4B读取多个传感器的示例sensors { 室内: TMP117(i2c, 0x48), 室外: TMP117(i2c, 0x49) } while True: for location, sensor in sensors.items(): temp sensor.read_temp() print(%s温度: %.2f°C % (location, temp)) time.sleep(10)
TMP117温度传感器在ESP32上的Micropython驱动实战(从接线到数据上传)
发布时间:2026/6/11 21:56:15
TMP117温度传感器在ESP32上的Micropython驱动实战从接线到数据上传1. 项目概述与硬件准备在物联网和智能硬件快速发展的今天温度监测已成为众多应用场景的基础需求。TMP117作为一款高精度数字温度传感器以其±0.1°C的测量精度和低功耗特性成为环境监测项目的理想选择。结合ESP32的Wi-Fi能力和Micropython的易用性我们可以快速构建一个无线温度监测系统。所需硬件清单ESP32开发板推荐使用ESP32-WROOM-32TMP117温度传感器模块4.7kΩ电阻×2用于I2C上拉面包板和杜邦线若干TMP117采用I2C接口通信默认地址为0x48可通过ADDR引脚配置为其他地址。其关键特性包括测量范围-55°C至150°C分辨率0.0078°C工作电流3.5μA单次测量模式2. 硬件连接与I2C配置正确的硬件连接是项目成功的第一步。ESP32与TMP117的接线方式如下ESP32引脚TMP117引脚备注3.3VVCC电源正极GNDGND电源地GPIO22SCLI2C时钟线需上拉GPIO21SDAI2C数据线需上拉-ALERT可悬空或连接中断提示I2C总线必须连接上拉电阻4.7kΩ否则通信可能失败。部分开发板已内置上拉电阻建议仍外接以确保稳定性。连接完成后可通过以下Micropython代码验证I2C设备是否被正确识别from machine import I2C, Pin i2c I2C(sclPin(22), sdaPin(21), freq100000) devices i2c.scan() print(发现的I2C设备地址, [hex(addr) for addr in devices])正常情况应输出[0x48]TMP117的默认地址。若未发现设备请检查电源连接是否正确I2C线序是否接反上拉电阻是否正常工作3. TMP117驱动开发3.1 寄存器配置TMP117通过寄存器进行配置和读数主要寄存器包括寄存器地址名称功能描述0x00TEMP_RESULT温度结果只读0x01CONFIGURATION传感器配置0x02THIGH_LIMIT温度高阈值0x03TLOW_LIMIT温度低阈值我们需要重点关注CONFIGURATION寄存器地址0x01其各位定义如下15: MODE[1:0] - 工作模式00连续01单次10关闭 13-12: CONV[1:0] - 转换周期0015.5ms01125ms10250ms11500ms 11-9: AVG[1:0] - 平均采样次数00无018次1032次1164次 8: T/nA - 报警极性0低电平1高电平 7: POL - 报警模式0窗口比较1超限比较 6: DR/ALERT - 数据就绪/报警选择 5: SOFT_RESET - 软件复位写1触发 4-0: 保留3.2 Micropython驱动实现创建一个tmp117.py文件实现完整的驱动功能from machine import I2C import time class TMP117: def __init__(self, i2c, address0x48): self.i2c i2c self.address address self._config_reg 0x0220 # 默认配置连续模式15.5ms转换周期 def write_register(self, reg, data): 写入16位寄存器 self.i2c.writeto_mem(self.address, reg, bytes([(data 8) 0xFF, data 0xFF])) def read_register(self, reg): 读取16位寄存器 data self.i2c.readfrom_mem(self.address, reg, 2) return (data[0] 8) | data[1] def reset(self): 软件复位传感器 self.write_register(0x01, 0x8000) time.sleep_ms(20) def configure(self, mode0, conv0, avg0): 配置传感器工作模式 :param mode: 0连续模式1单次模式2关闭 :param conv: 转换周期 015.5ms, 1125ms, 2250ms, 3500ms :param avg: 平均次数 0无, 18次, 232次, 364次 config (mode 0x03) 13 | (conv 0x03) 10 | (avg 0x03) 5 self.write_register(0x01, config) self._config_reg config def read_temp(self): 读取温度值摄氏度 raw_temp self.read_register(0x00) return raw_temp * 0.0078125 # 转换为摄氏度 def set_limits(self, high30.0, low10.0): 设置温度报警阈值 high_raw int(high / 0.0078125) low_raw int(low / 0.0078125) self.write_register(0x02, high_raw) self.write_register(0x03, low_raw)4. 数据采集与网络传输4.1 基础数据采集示例使用驱动类进行温度采集的简单示例from machine import I2C, Pin from tmp117 import TMP117 import time i2c I2C(sclPin(22), sdaPin(21), freq100000) sensor TMP117(i2c) # 配置为单次模式250ms转换周期8次平均 sensor.configure(mode1, conv2, avg1) while True: sensor.write_register(0x01, sensor._config_reg | 0x8000) # 触发单次测量 while not (sensor.read_register(0x01) 0x0080): # 等待数据就绪 time.sleep_ms(10) temp sensor.read_temp() print(当前温度: %.2f°C % temp) time.sleep(5) # 每5秒测量一次4.2 通过MQTT上传数据将温度数据发布到MQTT服务器以Adafruit IO为例import network from umqtt.simple import MQTTClient import ubinascii # Wi-Fi配置 WIFI_SSID your_wifi WIFI_PASS your_password # MQTT配置 MQTT_SERVER io.adafruit.com MQTT_PORT 1883 MQTT_USER your_username MQTT_KEY your_aio_key MQTT_TOPIC byour_username/feeds/temperature def connect_wifi(): sta_if network.WLAN(network.STA_IF) if not sta_if.isconnected(): print(正在连接Wi-Fi...) sta_if.active(True) sta_if.connect(WIFI_SSID, WIFI_PASS) while not sta_if.isconnected(): time.sleep(0.5) print(网络配置:, sta_if.ifconfig()) def publish_temp(temp): client MQTTClient(ubinascii.hexlify(machine.unique_id()), MQTT_SERVER, portMQTT_PORT, userMQTT_USER, passwordMQTT_KEY) client.connect() client.publish(MQTT_TOPIC, str(temp).encode()) client.disconnect() # 主循环 connect_wifi() while True: temp sensor.read_temp() print(发布温度:, temp) publish_temp(temp) time.sleep(60) # 每分钟发布一次4.3 Web服务器实时显示创建一个简单的Web服务器显示当前温度import socket import network def start_web_server(): sta_if network.WLAN(network.STA_IF) addr socket.getaddrinfo(0.0.0.0, 80)[0][-1] s socket.socket() s.bind(addr) s.listen(1) print(监听地址:, sta_if.ifconfig()[0]) while True: conn, addr s.accept() print(客户端连接:, addr) temp sensor.read_temp() html htmlheadmeta http-equivrefresh content5/head bodyh1当前温度: %.2f°C/h1/body/html % temp conn.send(HTTP/1.0 200 OK\r\nContent-type: text/html\r\n\r\n) conn.send(html) conn.close() start_web_server()5. 进阶应用与优化5.1 低功耗设计对于电池供电的应用优化功耗至关重要使用单次测量模式配置mode1仅在需要时触发测量调整转换周期根据应用需求选择最长的合适周期如500msESP32深度睡眠在两次测量间使ESP32进入深度睡眠import machine # 配置传感器为单次模式 sensor.configure(mode1, conv3) # 单次模式500ms转换 while True: sensor.write_register(0x01, 0x8000) # 触发测量 time.sleep_ms(600) # 等待测量完成 temp sensor.read_temp() print(温度:, temp) # 保存数据到文件或发送到服务器... # 进入深度睡眠10分钟 print(进入深度睡眠...) machine.deepsleep(10*60*1000) # 毫秒5.2 数据校准与滤波虽然TMP117本身精度很高但在特殊环境下可能需要校准# 简单的两点校准 def calibrate(temp1_actual, temp1_measured, temp2_actual, temp2_measured): 计算校准系数 gain (temp2_actual - temp1_actual) / (temp2_measured - temp1_measured) offset temp1_actual - gain * temp1_measured return gain, offset # 应用校准 gain, offset 1.02, -0.5 # 示例值需实际校准 calibrated_temp raw_temp * gain offset对于波动较大的环境可添加软件滤波class MovingAverage: def __init__(self, size5): self.size size self.buffer [] def add(self, value): self.buffer.append(value) if len(self.buffer) self.size: self.buffer.pop(0) return sum(self.buffer) / len(self.buffer) filter MovingAverage(5) while True: raw_temp sensor.read_temp() smooth_temp filter.add(raw_temp) print(原始: %.2f, 平滑: %.2f % (raw_temp, smooth_temp)) time.sleep(1)5.3 多传感器组网通过I2C地址配置可以连接多个TMP117传感器将不同传感器的ADDR引脚连接到不同电平GND/VCC/SCL/SDA对应的地址变化如下ADDR连接I2C地址GND0x48VCC0x49SDA0x4ASCL0x4B读取多个传感器的示例sensors { 室内: TMP117(i2c, 0x48), 室外: TMP117(i2c, 0x49) } while True: for location, sensor in sensors.items(): temp sensor.read_temp() print(%s温度: %.2f°C % (location, temp)) time.sleep(10)