Raspberry Pi IoT In C Using Linux Drivers - 1-Wire And The DS18B20 |
Written by Harry Fairhead | |||||||
Monday, 22 November 2021 | |||||||
Page 3 of 3
You can build the circuit in a variety of ways. You can solder the resistor to the temperature sensor and then use some longer wires with clips to connect to the Pi. You could also solder directly to the Pi, which is a good plan for the Pi Zero, or use a prototyping board. Once the driver is loaded and the device is recognized you will find a set of new folders in the w1/devices folder: Most of the files have functions that are obvious from their names but there are some points of detail:
It is also worth knowing that the device is also added to the hwmon folder and that folder is replicated in the devices folder. The reason for this is to allow integration with any hwmon software you may have – there are no advantages over using the device directly. The 1-Wire master also has some useful files in the w1_bus_master folder: therm_bulk_read Takes a temperature from all devices w1_master_add Manually registers a slave device w1_master_attempts Number of times a search was attempted w1_master_max_slave_count Maximum number of slaves to search for w1_master_name Name of the device (w1_bus_masterX) w1_master_pullup 5V strong pull-up 0 enabled, 1 disabled w1_master_remove Manually remove a slave device w1_master_search Number of searches left to do w1_master_slave_count Number of slaves found w1_master_slaves Names of the slaves, one per line w1_master_timeout Delay in seconds between searches w1_master_timeout_us Delay in microseconds between searches Normally a temperature conversion is triggered when you read the appropriate file but if you write trigger to the therm_bulk_read file all of the connected devices are read and the readings stored for the next time you read the device. Reading the file returns 0 if no bulk conversion is in progress, -1 if at least one device is still converting and 1 if conversion is complete but there is still data to be read from the devices. You can set the w1_master_search to a small number if the attached devices rarely change. If your devices never change you could set it to zero and use w1_master_add to add the serial numbers. The w1_master_timeout and w1_master_timeout_us determine the interval between searches for devices. Each time a search occurs w1_master_search is decremented and w1_master_attempts is incremented. You can use the w1_master_slave_count and w1_master_slaves as an alternative way of discovering what devices are installed: int getDevices(char path[][100], int *num) { char buffer[500]; int fd = open("/sys/bus/w1/drivers/w1_master_driver/ w1_bus_master1/w1_master_slaves", O_RDONLY); read(fd, buffer, 500); close(fd); *num = 0; for (char *p = strtok(buffer, "\n"); p != NULL; p = strtok(NULL, "\n")) { snprintf(path[(*num)++], 100, Notice that the names are separated by newline characters and the strtok function splits the string on “/n”. You have to make sure that buffer is big enough to read all the names in one go. A complete program that reads and displays the data of the first device connected to the 1-Wire bus is: #define _DEFAULT_SOURCE #include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <sys/ioctl.h> #include <fcntl.h> FILE *doCommand(char *cmd) { FILE *fp = popen(cmd, "r"); if (fp == NULL) { printf("Failed to run command %s \n\r", cmd); exit(1); } return fp; } void load1w(int pin) { FILE *fd = doCommand("sudo dtparam -l"); char output[1024]; int txfound = 0; while (fgets(output, sizeof(output), fd) != NULL) { printf("%s\n\r", output); fflush(stdout); if (strstr(output, "w1-gpio") != NULL) { txfound = 1; } } pclose(fd); if (txfound == 0) { char cmd[100]; snprintf(cmd, 100, In Chapter But Not In This Extract
Summary
Raspberry Pi IoT In C Using Linux DriversBy Harry FairheadBuy from Amazon. Contents
<ASIN:1871962641> <ASIN:B08W9V7TP9> To be informed about new articles on I Programmer, sign up for our weekly newsletter, subscribe to the RSS feed and follow us on Twitter, Facebook or Linkedin.
Comments
or email your comment to: comments@i-programmer.info <ASIN:187196265X> <ASIN:1871962692> <ASIN:1871962609> <ASIN:1871962617> <ASIN:1871962455> <ASIN:1871962463> |
|||||||
Last Updated ( Saturday, 27 November 2021 ) |