c语言树莓派温度,树莓派通过C语言读取ds18b20的温度值

树莓派通过C语言读取ds18b20的温度值

对于极客们,树莓派是上等的DIY神器;对于项目开发者,树莓派也不失为一种省时、省力的明智选择。因为有好多人在玩树莓派,所以其开源的资料比较多,好多东西我们可以拿来即用,不用重复造轮子。下面,就跟我学习一下怎么在树莓派上用C语言读取ds18b20的温度值。

树莓派上的ds18b20驱动已经有人实现了,所以我们只需要去编写应用程序就OK啦!话说当年学的不咋地的Linux高编在这里居然用到了。

硬件准备:

树莓派(Raspberry Pi),我用的是二代的

DS18b20温度传感器 + 一个10K电阻(或直接买ds18b20模块,也就是店家帮你焊接好电阻了)

杜邦线(两头都是母的)

接线方式:

ds18b20的信号线连接树莓派的GPIO7

0818b9ca8b590ca3270a3433284dd417.png

确认硬件连接是否正确,然后读取温度:

1,首先升级内核(如果版本太老,可能无法正常读ds18b20)

sudo apt-get update

sudo apt-get upgrade

2,挂载设备驱动,确认设备是否生效

sudo modprobe w1-gpio

sudo modprobe w1-therm

cd  /sys/bus/w1/devices/

ls

0818b9ca8b590ca3270a3433284dd417.png

28-00000495db35就是外接的温度传感器设备,但并不是每个客户端都显示一样的,这个是传感器的序列号。

3,查看当前温度

cd  28-00000495db35

ls

0818b9ca8b590ca3270a3433284dd417.png

cat  w1_slave

0818b9ca8b590ca3270a3433284dd417.png

第二行的t=26187就是当前的温度值,要换算成摄氏度,除以1000,即当前温度为16187 / 1000=26.187摄氏度。

确定设备正常后,我们写代码,以后通过代码读取温度。

#include

#include

#include

#include

#include

#include

#include

#include

#define BUFSIZE 128

int main(void)

{

float temp;

int i, j;

int fd;

int ret;

char buf[BUFSIZE];

char tempBuf[5];

fd = open("/sys/bus/w1/devices/28-00000495db35/w1_slave", O_RDONLY); //以只读方式打开ds18b20设备文件

if(-1 == fd){ //打开设备文件出错

perror("open device file error"); //打印出错信息(原因)

return 1;

}

while(1){

ret = read(fd, buf, BUFSIZE); //将设备文件中的内容读入buf中

if(0 == ret){ //返回0表示读文件结束

break; //跳出循环体

}

if(-1 == ret){ //读文件出错

if(errno == EINTR){ //出错是由中断引起的

continue; //继续读文件

}

perror("read()"); //打印出错信息(原因)

close(fd); //关闭文件

return 1;

}

}

for(i=0;i

if(buf[i] == 't'){ //如果读到‘t’,说明后面马上出现温度值

for(j=0;j

tempBuf[j] = buf[i+2+j]; //将温度值以字符串的形式写入tempBuf中

}

}

}

temp = (float)atoi(tempBuf) / 1000; //将字符串转换为浮点型温度数据

printf("%.3f C\n",temp); //打印出温度值

close(fd); //关闭文件

return 0;

}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
下面是ds18b20温度传感器的C语言代码: ```c #include <stdio.h> #include <wiringPi.h> #define PIN 7 // GPIO7 void delay_us(int us) { delayMicroseconds(us); } void write_bit(int bit) { digitalWrite(PIN, LOW); delay_us(2); if (bit) { digitalWrite(PIN, HIGH); } delay_us(60); digitalWrite(PIN, HIGH); } int read_bit() { int bit; digitalWrite(PIN, LOW); delay_us(2); digitalWrite(PIN, HIGH); delay_us(14); bit = digitalRead(PIN); delay_us(45); return bit; } void write_byte(int byte) { int i; for (i = 0; i < 8; i++) { write_bit(byte & 0x01); byte >>= 1; } } int read_byte() { int i, byte = 0; for (i = 0; i < 8; i++) { byte |= (read_bit() << i); } return byte; } float read_temperature() { int t_low, t_high; float temperature; pinMode(PIN, OUTPUT); digitalWrite(PIN, HIGH); delay_us(500); pinMode(PIN, OUTPUT); digitalWrite(PIN, LOW); delay_us(500); pinMode(PIN, INPUT); delay_us(80); write_byte(0xcc); // skip ROM write_byte(0x44); // convert T pinMode(PIN, INPUT); delay_us(40000); pinMode(PIN, OUTPUT); digitalWrite(PIN, LOW); delay_us(2); pinMode(PIN, INPUT); delay_us(10); write_byte(0xcc); // skip ROM write_byte(0xbe); // read scratchpad t_low = read_byte(); t_high = read_byte(); temperature = ((t_high << 8) | t_low) * 0.0625; return temperature; } int main() { float temperature; wiringPiSetup(); while (1) { temperature = read_temperature(); printf("Temperature: %.2f\n", temperature); delay(1000); } return 0; } ``` 这个程序使用了wiringPi库来控制GPIO口,读取ds18b20温度。程序的主函数里无限循环地读取温度并输出。你可以根据需要修改程序。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值