树莓派DS18B20温度传感器获取温度
时间:2022-08-29 16:00:00
目录
树莓派使能DS18B20-toc" style="margin-left:0px;">树莓派使能DS18B20
C程序获取DS18B20温度
树莓派使能DS18B20
sudo raspi-config 配置树莓派,启动1-Wire完成使能
sudo reboot 重启树莓派,完成配置
lsmod | grep w1可以查看当前系统支持的单总线协议模块
(lsmod(list modules)该命令用于显示已载入系统的模块)
cd /sys/bus/w1/devices/28-xxxxxxxxx(这是设备的特定序列号)
cat w1_slave 即可查看DS18B20测量的温度值
C程序获取DS18B20温度
#include #include #include #include #include #include #include #include #include int get_temperature(float *temp); int main(int argc, char **argv) { float temp; int rv; rv = get_temperature(&temp); if(rv < 0) { printf("get temperature failure, return value: %d", rv); return -1; } printf("temperature: %f\n", temp); } int get_temperature(float *temp) { int fd = -1; char buf[128]; char *ptr = NULL; DIR *dirp = NULL; struct dirent *direntp = NULL; char w1_path[64] = "/sys/bus/w1/devices/"; char chip_sn[32]; int found = 0; dirp = opendir(w1_path); if( !dirp ) { printf("open folder %s failure: %sn", w1_path, strerror(errno)); return -1; } while( NULL != (direntp = readdir(dirp)) ) { if( strstr(direntp->d_name, "28-")) { strncpy(chip_sn, direntp->d_name, sizeof(chip_sn)); found = 1; } } closedir(dirp); if( !found ) { printf("Can not find ds18b20 chipset\n"); return -2; } strncat(w1_path, chip_sn, sizeof(w1_path)-strlen(w1_path)); strncat(w1_path, "/w1_slave", sizeof(w1_path)-strlen(w1_path)); if( (fd = open(w1_path, O_RDONLY)) < 0) { printf("open file failure: %s\n", strerror(errno)); return -3; } memset(buf, 0, sizeof(buf)); if( read(fd, buf, sizeof(buf)) < 0) { printf("read data from fd = %d failure: %s\n", fd, strerror(errno)); return -4; } ptr = strstr(buf, "t="); if( !ptr ) { printf("Can not find t= string\n"); return -5; } ptr = 2; *temp = atof(ptr)/1000; close(fd); return 0; }