美文网首页
【树莓派+arduino实验记录19】数字温度传感器ds18b2

【树莓派+arduino实验记录19】数字温度传感器ds18b2

作者: Geekero | 来源:发表于2020-09-15 15:43 被阅读0次

Arduino

/************************************
 * name: Digital Temperature Sensor-ds18b20
 * function: you can see the value of current temperature displayed on the LCD.
 ************************************/
#include <OneWire.h>
#include <DallasTemperature.h>
#include <LiquidCrystal_I2C.h>
#include <Wire.h>
LiquidCrystal_I2C lcd(0x27, 16, 2); //set the LCD address to 0x27 for a 16 chars and 2 line display
#define ONE_WIRE_BUS  7 //ds18b20 module attach to pin7
//Setup a oneWire instance to communicate with any OneWire devices (not just Maxi/Dallas temperature ICs)
OneWire oneWire(ONE_WIRE_BUS);
//Pass our oneWire reference to Dallas Temperature.
DallasTemperature sensors(&oneWire);

void setup()
{
  //start serial port
  Serial.begin(9600);
  sensors.begin(); //initialize the bus
  lcd.init(); //initialize the lcd
  lcd.backlight(); //turn on the backlight
}

void loop(void)
{
  //call sensors.requestTemperatures() to issue a global temperature
  //request to all devices on the bus
  //Serial.print("Requesting temperatures...");
  sensors.requestTemperatures(); //send the command to get temperatures
  lcd.setCursor(0, 0); 
  lcd.print("TemC: ");
  lcd.print(sensors.getTempCByIndex(0)); //print the temperature on lcd1602
  lcd.print(char(223)); //print the unit "C"
  lcd.print("C");
  //Serial.print("Tem: ");
  //Serial.println(sensors.getTempCByIndex(0));
  //Serial.print(" C");
  lcd.setCursor(0, 1);
  lcd.print("TemF: ");
  lcd.print(1.8*sensors.getTempCByIndex(0) + 32.0); //print the temperature on lcd1602
  lcd.print(char(223)); //print the unit "F"
  lcd.print("F");
  //Serial.print("Tem: ");
  //Serial.println(1.8*sensors.getTempCByIndex(0) + 32.0);
  //Serial.print(" F");
  //Serial.print("");
  //Serial.print("Temperature for device 1 (index 0) is: ");
  //Serial.println(sensors.getTempCByIndex(0)); //print the temperature on the serial monitor
}

树莓派

sudo apt-get update
sudo apt-get upgrade

修改文件:

sudo vi /boot/config.txt 

在文件最后加上:

dtoverlay=w1-gpio

重启:

sudo reboot

查看温度:

pi@raspberrypi:~ $ sudo modprobe w1-gpio
pi@raspberrypi:~ $ sudo modprobe w1-therm
pi@raspberrypi:~ $ cd /sys/bus/w1/devices/
pi@raspberrypi:/sys/bus/w1/devices $ ls
28-0119397a0210  w1_bus_master1
pi@raspberrypi:/sys/bus/w1/devices $ cd 28-0119397a0210
pi@raspberrypi:/sys/bus/w1/devices/28-0119397a0210 $ ls
alarms  driver  eeprom  ext_power  hwmon  id  name  power  resolution  subsystem  temperature  uevent  w1_slave
pi@raspberrypi:/sys/bus/w1/devices/28-0119397a0210 $ cat w1_slave 
de 01 4b 46 7f ff 0c 10 c3 : crc=c3 YES
de 01 4b 46 7f ff 0c 10 c3 t=29875

t = 29875 / 1000 = 29.875℃

C

#include <stdio.h>
#include <dirent.h>
#include <string.h>
#include <fcntl.h>
#include <stdlib.h>
#include <unistd.h>

int main(void)
{
    DIR *dir;
    struct dirent *dirent;
    char dev[16];      // Dev ID
    char devPath[128]; // Path to device
    char buf[256];     // Data from device
    char tmpData[6];   // Temp C * 1000 reported by device
    char path[] = "/sys/bus/w1/devices";
    ssize_t numRead;

    dir = opendir(path);
    if (dir != NULL)
    {
        while ((dirent = readdir(dir)))
       // 1-wire devices are links beginning with 28-
       if (dirent->d_type == DT_LNK && 
               strstr(dirent->d_name, "28-") != NULL){
            strcpy(dev, dirent->d_name);
            printf("\nDevice: %s\n", dev);
       }
       (void) closedir(dir);
   }
   else
   {
       perror ("Couldn't open the w1 devices directory");
       return 1;
   }
   // Assemble path to OneWire device
   sprintf(devPath, "%s/%s/w1_slave", path, dev);
   // Read temp continuously
   // Opening the device's file triggers new reading
   while(1){
       int fd = open(devPath, O_RDONLY);
       if (fd == -1)
       {
           perror("Couldn't open the w1 device.");
           return 1;
       }
       while((numRead = read(fd, buf, 256)) > 0)
       {
           strncpy(tmpData, strstr(buf, "t=") + 2, 5);
           float tempC = strtof(tmpData, NULL);
           printf("Device: %s - ", dev);
           printf("Temp: %.3f C ", tempC / 1000);
           printf("%.3f F\n\n", (tempC / 1000) * 9 / 5 + 32);
       }
       close(fd);
   }
   /* return 0; --never called due to loop */
}

Python

#!/usr/bin/env python
#-------------------------------------------------
# Note:
#       ds18b20's data pin must be connected to pin7.
#       replace the 28-XXXXXXXXXX as yours.
#-------------------------------------------------
import os
ds18b20 = ''

def setup():
    global ds18b20
    for i in os.listdir('/sys/bus/w1/devices'):
        if i != 'w1_bus_master1':
            ds18b20 = i

def read():
    #global ds18b20
    location = '/sys/bus/w1/devices/' + ds18b20 + '/w1_slave'
    tfile = open(location, 'r')
    text = tfile.read()
    tfile.close()
    secondline = text.split("\n")[1]
    temperaturedata = secondline.split(' ')[9]
    temperature = float(temperaturedata[2:])
    temperature = temperature / 1000
    return temperature

def loop():
    while True:
        if read() != None:
            print("Current temperature: %0.3f C" % read())

def destroy():
    pass


if __name__ == "__main__":
    try:
        setup()
        loop()
    except KeyboardInterrupt:
        destroy()

相关文章

网友评论

      本文标题:【树莓派+arduino实验记录19】数字温度传感器ds18b2

      本文链接:https://www.haomeiwen.com/subject/dvqpektx.html