陈拓 2021/05/05-2021/05/05
1. 概述
在本文中我们使用ESP8266_RTOS_SDK 3.x读取DS18B20的数据。
开发环境:
- Win10 Linux子系统Ubuntu
《用乐鑫国内镜像构建ESP8266_RTOS_SDK开发环境》
https://zhuanlan.zhihu.com/p/347711847
https://blog.csdn.net/chentuo2000/article/details/113349010
- 阿里云
《阿里云ECS搭建ESP8266_RTOS_SDK开发环境》
https://zhuanlan.zhihu.com/p/346975777
https://blog.csdn.net/chentuo2000/article/details/113173934
用阿里云的好处是编译速度快,但需要下载编译好的文件。
2. 硬件连接
- 开发板
我用的是网上买的下面这种开发板,加上ESP8366-12F模块。
- 接线
为了和ESP8266-01/01S兼容,DS18B20的数据总线DQ连接ESP8266的GPIO13。下面的表是ESP8266引脚定义的一部分,其中可以看到GPIO13对应引脚12。
有关DS18B20的使用可以参考《树莓派+温度传感器DS18B20》
https://blog.csdn.net/chentuo2000/article/details/81051701
3. 项目下载
- 下载ds18b20_test.tar.gz
网址:
https://download.csdn.net/download/chentuo2000/18626858
压缩文件中包含头文件ds18b20.h、静态库文件libds18b20.a(不提供源代码)和整个项目。你可以直接编译项目,也可以按照下面的说明从头做起。
注意:编译之前要根据你的环境重新用make menuconfig进行配置。
- Windows10目录和Linux子系统Ubuntu目录的对应关系
Ubuntu的家目录:
在Win10中ubuntu home文件夹路径:
C:\Users\admin\AppData\Local\Packages\CanonicalGroupLimited.Ubuntu20.04onWindows_79rhkp1fndgsc\LocalState\rootfs\home
可以直接在ubuntu的mnt目录操作win10硬盘,在/mnt路径就可以看到Windows的盘符:
详细说明见《Win10启用Linux子系统安装Ubuntu》。
https://zhuanlan.zhihu.com/p/341394468
https://blog.csdn.net/chentuo2000/article/details/112131624
- 解压
按照《用乐鑫国内镜像构建ESP8266_RTOS_SDK开发环境》一文的方法安装开发环境。将ds18b20_test.tar.gz复制到/home/ccdc/esp目录下:
修改权限:chmod 644 ds18b20_test.tar.gz
解压:tar -zxvf ds18b20_test.tar.gz
4. 创建项目
快速编译测试可以跳过这一部分。
4.1 项目构建
项目构建有两种方法。
- 构建系统传统 GNU Make
https://docs.espressif.com/projects/esp-idf/zh_CN/latest/esp32/api-guides/build-system-legacy.html
- 构建系统(CMake版)
https://docs.espressif.com/projects/esp-idf/zh_CN/latest/esp32/api-guides/build-system.html?highlight=cmakelist%20txt
下面我们采用传统 GNU Make。
4.2 我的项目目录结构
按照下面的目录结构创建目录和文件。
cd ~
cd ~/esp/ds18b20_test/
4.3 主程序
/* user_main.c */
#include <stdio.h>
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "esp_spi_flash.h"
#include "driver/gpio.h"
#include "esp_system.h"
#include "ds18b20.h"
#define DQ GPIO_NUM_13 // GPIO13
/* 温度检测任务函数 */
uint8_t temp_s[8] = {' ','9','9','9','9','9','9','\0'};
void temp_task(void *arg)
{
uint8_t msb, lsb;
uint8_t temp0,temp1; // temp0温度的小数位,temp1温度的整数位
uint8_t sign; // sign判断温度符号
int temp, temp_d;
while (1) {
temp = ds18b20_read_temp(DQ);
printf("ds18b20 temp_raw: %d \n", temp);
lsb = (uint8_t)temp;
msb = (uint8_t)(temp >> 8);
// 转换18B20格式到十进制数
temp0 = lsb & 0x0f; // 取4位小数部分存放到temp0
temp1 = ((msb & 0x07)<<4)|((lsb>>4) & 0x0f); // 取7位整数部分存放到存放temp1
sign=(msb>>4==0X0F);
if(sign) { // MS Byte 的前面5位是符号位,同时为 0 或 1,这里只看高4位。如果值为负
temp0 = 16 - temp0; // 求补码(4位 1111=15)
temp1 = 128 - temp1; // 求补码(7位 1111111=127)
}
temp_d = temp1 * 16 + temp0; // 十六进制转换为10进制
temp_d = temp_d * 100 / 16; //12位精度,最小分辨率为0.0625=1/16,乘100保留2位小数
// 转换温度的每个位到ASCII
temp_s[1] = temp_d/10000+'0'; // 百位
temp_s[2] = (temp_d%10000)/1000+'0'; // 十位
temp_s[3] = (temp_d%1000)/100+'0'; // 个位
temp_s[4] = 0x2e; // 小数点
temp_s[5] = (temp_d%100)/10+'0'; // 小数点后第一位
temp_s[6] = temp_d%10+'0'; // 小数点后第二位
// 删除前导0
uint8_t i = 0, j = 0;
for (i=0; i<2 ;i++ ) {
if (temp_s[1] == '0') {
for (j = 0; j < 6; j++) {temp_s[j+1] = temp_s[j+2];}
}
}
// 添加符号
if(sign) {
temp_s[0] = '-';
} else {
temp_s[0] = '+';
}
printf("ds18b20 temp value -> %s\r\n", temp_s);
vTaskDelay(5000 / portTICK_PERIOD_MS); // 调用任务睡眠函数,延时5s
}
}
void app_main()
{
/* 定义gpio配置结构体 */
gpio_config_t io_conf;
/* 初始化gpio配置结构体 */
io_conf.pin_bit_mask = (1ULL << DQ); // 选择gpio
io_conf.intr_type = GPIO_INTR_DISABLE; // 禁用中断
io_conf.mode = GPIO_MODE_OUTPUT; // 设置为输出模式
io_conf.pull_down_en = 0; // 不用下拉模式
io_conf.pull_up_en = 0; // 不用上拉模式
/* 用给定的设置配置GPIO */
gpio_config(&io_conf);
// 启动读温度任务
xTaskCreate(temp_task, "temp task", 2048, NULL, 10, NULL);
}
说明:在这里GPIO引脚并没有设置启用内部上拉电阻器,因为ESP8266的内部上拉电阻较大(约为47k),不符合ds18x20数据表中的上拉要求,我们使用4.7k外部上拉电阻。
4.4 DS18B20操作程序
- 头文件
- 库文件
libds18b20.a
说明:不提供源代码。
4.5 CMakeList.txt、Makefile、component.mk、sdkconfig和Kconfig文件
4.5.1 顶层
- 项目顶层CMakeList.txt
- 项目顶层Makefile
其中PROJECT_NAME: 项目名称,最终输出的二进制文件也使用该名称。
- 项目配置文件 sdkconfig
执行 make menuconfig 后会创建或更新此文件
4.5.2 main目录
- main 目录
main 目录是一个特殊的伪组件,它包含项目本身的源代码。main 是默认名称,Makefile 变量 COMPONENT_DIRS 默认会导入此组件,但您也可以修改此变量(或者设置 EXTRA_COMPONENT_DIRS )以查找其他位置的组件。
- main目录下component.mk(组件Makefile文件)
此Makefile文件可以保留为空。默认情况下,它将从src/目录获取源,编译它们并将它们链接到build目录的lib(subdirectory_name).a中。这种行为是完全可配置的,如果需要,请阅读ESP-IDF文档。
如果文件为空,则组件的默认构建行为会被设置为:
(1) makefile 所在目录中的所有源文件(*.c,*.cpp,*.cc,*.S)将会被编译进组件库中。
(2) 子目录 include 将被添加到其他组件的全局头文件搜索路径中。
(3) 组件库将会被链接到项目的应用程序中。
空的 component.mk 文件同没有 component.mk 文件之间存在本质差异,前者会调用默认的组件构建行为,后者不会发生默认的组件构建行为。
4.5.3 components目录下的组件目录ds18b20
- components/ds18b20目录下component.mk(组件Makefile文件)
- components/ds18b20目录下Kconfig
每个组件都可以包含一个 Kconfig 文件,和 component.mk 放在同一个目录下。Kconfig 中包含此组件在 make menuconfig 时要展示的配置规则的设置。
运行 menuconfig 时,可以在 Component Settings 菜单栏下找到这些设置。
创建一个组件的 Kconfig 文件,最简单的方法就是使用 ESP-IDF 中现有的 Kconfig 文件作为模板,在这基础上进行修改。
4.6 build 目录
build 目录在项目构建的时候创建或者更新,里面包含有构建生成的临时目标文件和库以及最终输出的二进制文件。
5. 配置
- 查看USB-串口
Windows中的串口COM3对应Linux中的设备/dev/ttyS3。
- 项目配置
make menuconfig
(1) 设置串口和Flash存储器
(1) 查看前面在Kconfig里定义的组件DS18B20
保存Save,退出Exit。
6. 编译烧写
- 编译
make
第一次编译需要较长的时间。
- 烧写
make flash
7. 运行测试
串口使用的详细说明见:
《Win10使用CH340 USB-SERIAL串口》
https://zhuanlan.zhihu.com/p/342339132
https://blog.csdn.net/chentuo2000/article/details/112323488
《Win10的Linux子系统Ubuntu使用串口》
https://zhuanlan.zhihu.com/p/343013801