/* * ds18b20.c: * Extend wiringPi with the DS18B20 1-Wire temperature sensor. * This is used in the Pi Weather Station and many other places. * Copyright (c) 2016 Gordon Henderson *********************************************************************** * This file is part of wiringPi: * https://github.com/WiringPi/WiringPi/ * * wiringPi is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation, either version 3 of the * License, or (at your option) any later version. * * wiringPi is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with wiringPi. * If not, see . *********************************************************************** */ #include #include #include #include #include #include #include #include #include #include "wiringPi.h" #include "ds18b20.h" #define W1_PREFIX "/sys/bus/w1/devices/28-" #define W1_POSTFIX "/w1_slave" /* * myAnalogRead: ********************************************************************************* */ static int myAnalogRead (struct wiringPiNodeStruct *node, int pin) { int chan = pin - node->pinBase ; int fd = node->fd ; char buffer [4096] ; char *p ; int temp, sign ; if (chan != 0) return -9999 ; // Rewind the file - we're keeping it open to keep things going // smoothly lseek (fd, 0, SEEK_SET) ; // Read the file - we know it's only a couple of lines, so this ought to be // more than enough if (read (fd, buffer, 4096) <= 0) // Read nothing, or it failed in some odd way return -9998 ; // Look for YES, then t= if (strstr (buffer, "YES") == NULL) return -9997 ; if ((p = strstr (buffer, "t=")) == NULL) return -9996 ; // p points to the 't', so we skip over it... p += 2 ; // and extract the number // (without caring about overflow) if (*p == '-') // Negative number? { sign = -1 ; ++p ; } else sign = 1 ; temp = 0 ; while (isdigit (*p)) { temp = temp * 10 + (*p - '0') ; ++p ; } // We know it returns temp * 1000, but we only really want temp * 10, so // do a bit of rounding... temp = (temp + 50) / 100 ; return temp * sign ; } /* * ds18b20Setup: * Create a new instance of a DS18B20 temperature sensor. ********************************************************************************* */ int ds18b20Setup (const int pinBase, const char *deviceId) { int fd ; struct wiringPiNodeStruct *node ; char *fileName ; // Allocate space for the filename if ((fileName = malloc (strlen (W1_PREFIX) + strlen (W1_POSTFIX) + strlen (deviceId) + 1)) == NULL) return FALSE ; sprintf (fileName, "%s%s%s", W1_PREFIX, deviceId, W1_POSTFIX) ; fd = open (fileName, O_RDONLY) ; free (fileName) ; if (fd < 0) return FALSE ; // We'll keep the file open, to make access a little faster // although it's very slow reading these things anyway )-: node = wiringPiNewNode (pinBase, 1) ; node->fd = fd ; node->analogRead = myAnalogRead ; return TRUE ; }