美文网首页
【树莓派+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