esp32 micropython添加C模块(esp32 s2 c3 s3 内置温度传感器读取)

micropython 不支持 esp32 s2 c3 s3 的内置温度传感器读取。我这里尝试添加一个模块,可以用py读取。

arduino 先测试一下

因为有人说 esp32的后面的芯片内置的温度传感器不能用,所以先试试

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
#include "driver/temp_sensor.h"
void setup() 
{
  Serial.begin(115200);
  temp_sensor_config_t temp_sensor = {
    .dac_offset = TSENS_DAC_L2,
    .clk_div = 6,
  };
  temp_sensor_set_config(temp_sensor);
  temp_sensor_start();
}
void loop() 
{
  float tsens_out;
  temp_sensor_read_celsius(&tsens_out);
  Serial.printf("%f\r\n", tsens_out);
  delay(500);
}

测试良好,精度 ±1℃ 凑合,比环境温度略微高一点。做好主要温度范围的多点校准后,可以凑合使用。

添加到mpy固件

tempSensor.c

创建文件 /mpy-bin/micropython/ports/esp32/tempSensor.c

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
// import time
// import tempSensor
// tempSensor.init()
// for _ in range(10):
//     print(tempSensor.getT())
//     time.sleep(1)
// tempSensor.stop()
#include "py/obj.h"
#include "py/runtime.h" // Include MicroPython API.

#if CONFIG_IDF_TARGET_ESP32S2 || CONFIG_IDF_TARGET_ESP32C3 || CONFIG_IDF_TARGET_ESP32S3
#include "driver/temp_sensor.h"
#endif

// 函数 初始化 并启动
STATIC mp_obj_t tempSensor_init(void) {
     #if CONFIG_IDF_TARGET_ESP32S2 || CONFIG_IDF_TARGET_ESP32C3 || CONFIG_IDF_TARGET_ESP32S3
	    temp_sensor_config_t temp_sensor = TSENS_CONFIG_DEFAULT();
	    temp_sensor.dac_offset = TSENS_DAC_DEFAULT; // DEFAULT: range:-10 ~  80, error < 1.
	    temp_sensor_set_config(temp_sensor);
	    temp_sensor_start();
     #endif
   return mp_const_none;
}
// 定义参数
STATIC MP_DEFINE_CONST_FUN_OBJ_0(tempSensor_init_obj, tempSensor_init);

// 函数 获取
STATIC mp_obj_t tempSensor_getT(void) {
     #if CONFIG_IDF_TARGET_ESP32S2 || CONFIG_IDF_TARGET_ESP32C3 || CONFIG_IDF_TARGET_ESP32S3
	float tsens_out;
  	temp_sensor_read_celsius(&tsens_out);
	//temp_sensor_stop();
	return mp_obj_new_float(tsens_out);
     #endif
   return mp_const_none;
}
// 定义参数
STATIC MP_DEFINE_CONST_FUN_OBJ_0(tempSensor_getT_obj, tempSensor_getT);

// 函数 停止
STATIC mp_obj_t tempSensor_stop(void) {
     #if CONFIG_IDF_TARGET_ESP32S2 || CONFIG_IDF_TARGET_ESP32C3 || CONFIG_IDF_TARGET_ESP32S3
	   temp_sensor_stop();
     #endif
   return mp_const_none;
}
// 定义参数
STATIC MP_DEFINE_CONST_FUN_OBJ_0(tempSensor_stop_obj, tempSensor_stop);


// 定义模块的所有属性。
// 表条目是属性名称(字符串)的键/值对
//  MicroPython 对象引用。
// 所有的标识符和字符串都写成 MP_QSTR_xxx 并且会被
// 由构建系统优化为字大小的整数(驻留字符串).
STATIC const mp_rom_map_elem_t tempSensor_module_globals_table[] = {
    { MP_ROM_QSTR(MP_QSTR___name__), MP_ROM_QSTR(MP_QSTR_tempSensor) },
    { MP_ROM_QSTR(MP_QSTR_getT), MP_ROM_PTR(&tempSensor_getT_obj) },
    { MP_ROM_QSTR(MP_QSTR_init), MP_ROM_PTR(&tempSensor_init_obj) },
    { MP_ROM_QSTR(MP_QSTR_stop), MP_ROM_PTR(&tempSensor_stop_obj) },
};
STATIC MP_DEFINE_CONST_DICT(tempSensor_module_globals, tempSensor_module_globals_table);

// 定义模块对象
const mp_obj_module_t tempSensor_user_cmodule = {
    .base = { &mp_type_module },
    .globals = (mp_obj_dict_t *)&tempSensor_module_globals,
};

// 注册模块以使其在 Python 中可用  这行 最好条件编译
MP_REGISTER_MODULE(MP_QSTR_tempSensor, tempSensor_user_cmodule);

添加到模块

ports/esp32/main/CMakeLists.txt 搜索 machine_sdcard.c 比这添加一行tempSensor.c

编译,更多编译教程 查看本站其他文章

py测试

1
2
3
4
5
6
7
import time
import tempSensor
tempSensor.init()
for _ in range(10):
    print(tempSensor.getT())
    time.sleep(1)
tempSensor.stop()
Licensed under CC BY-NC-SA 4.0
comments powered by Disqus
使用 Hugo 构建
主题 StackJimmy 设计