You cannot select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			| 
				
					
						
							 | 
			12 months ago | |
|---|---|---|
| .. | ||
| .htu21d.c.swp | 12 months ago | |
| .htu21d.h.swp | 12 months ago | |
| .main.c.swp | 12 months ago | |
| HTU21D | 12 months ago | |
| Makefile | 12 months ago | |
| Readme.md | 12 months ago | |
| htu21d.c | 12 months ago | |
| htu21d.h | 12 months ago | |
| htu21d.o | 12 months ago | |
| main.c | 12 months ago | |
| main.o | 12 months ago | |
| rpiz.png | 12 months ago | |
		
			
				
				Readme.md
			
		
		
			
			
		
	
	Introduction
This repository guides you to implement and use the HTU21D temperature and humidity sensor by using I2C communication. The repository contains the following files:
htu21d.hlibrary header fileshtu21d.cimplemenation methods filemain.can example file to test I2C communication using the libraryhtu21dexampleoutput file precompiled in a raspberry pi zero that returns temperature and humidity
Setup the raspberry
Enable I2C on the Raspberry Pi:
- Run sudo raspi-config.
 - Navigate to Interfacing Options → I2C and enable it.
 - Reboot the Pi.
 
Install I2C Tools and Development Libraries:
sudo apt-get update
sudo apt-get install i2c-tools libi2c-dev
Check if the sensor is detected:
sudo i2cdetect -y 1
This command should show an address for the HTU21D, typically 0x40.
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f
00:                         -- -- -- -- -- -- -- --
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
40: 40 -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
70: -- -- -- -- -- -- -- --
My own header files for HTU21D sensor
This is a detailed guide to configure and create your own files to comunicate with each sensor used by the air-quality sensor.
Header
Create the Header File htu21d.h with Header Guard and Includes:
#ifndef HTU21D_H
#define HTU21D_H
// I2C Address
#define HTU21D_I2C_ADDR 0x40
// Commands
#define HTU21D_TEMP 0xE3
#define HTU21D_HUMID 0xE5
#define HTU21D_RESET 0xFE
// Function declarations:
// Temp
int getTemperature(int fd, double *temperature);
// Humidity
int getHumidity(int fd, double *humidity);
#endif // HTU21D_H
Implement the Sensor Communication htu21d.c
#include <unistd.h> //to send commands to and receive from I2C device
#include <sys/ioctl.h>//setting up and controlling the I2C device settings
#include <linux/i2c-dev.h>//definitions for system calls and structures specific to I2C
#include <i2c/smbus.h>//SMBus commands in a more standardized way for I2C
#include <stdio.h>//perror
#include "htu21d.h" // my own header file
// Reset function:
int reset(int fd)
{
        if(0 > ioctl(fd, I2C_SLAVE, HTU21D_I2C_ADDR))
        {
                perror("Failed to open the bus");
                return -1;
        }
        i2c_smbus_write_byte(fd, HTU21D_RESET);
        return 0;
}
// Get temperature:
int getTemperature(int fd, double *temperature)
{
        reset(fd);
        char buf[3];
        __s32 res = i2c_smbus_read_i2c_block_data(fd, HTU21D_TEMP,3,buf);
        if(res<0)
        {
                perror("Failed to read from the device");
                return -1;
        }
        *temperature = -46.85 + 175.72 * (buf[0]*256 + buf[1]) / 65536.0;
        return 0;
}
// Get humidity:
int getHumidity(int fd, double *humidity)
{
        reset(fd);
        char buf[3];
        __s32 res = i2c_smbus_read_i2c_block_data(fd, HTU21D_HUMID, 3, buf);
        if(res<0)
        {
                perror("Failed to read from the device");
                return -1;
        }
        *humidity = -6 + 125 * (buf[0]*256 + buf[1]) / 65536.0;
        return 0;
}
Using the library
#include <stdio.h>
#include <errno.h>
#include <stdlib.h>
#include <string.h>
#include <fcntl.h>
#include "htu21d.h"
int main()
{
        char filename[20];
        snprintf(filename, 19, "/dev/i2c-%d", 1);
        int fd = open(filename, O_RDWR);
        if (0 > fd)
        {
                fprintf(stderr, "ERROR: Unable to access HTU21D sensor module: %s\n", strerror (errno));
                exit(-1);
        }
        // Retrieve temperature and humidity
        double temperature = 0;
        double humidity = 0;
        if ( (0 > getHumidity(fd, &humidity)) || (0 > getTemperature(fd, &temperature)) )
        {
                fprintf(stderr, "ERROR: HTU21D sensor module not found\n");
                exit(-1);
        }
        // Print temperature and humidity on the screen
        printf("HTU21D Sensor Module\n");
        printf("%5.2fC\n", temperature);
        printf("%5.2f%%rh\n", humidity);
        return 0;
}
Compiling and testing
Then to properly compile whitout a make file:
gcc -o example main.c htu21d.c -li2c
or
gcc -o example main.c htu21d.c -I. -li2c
Wiring htu21d to Rasp-zero
Htu -> Rasp-Zero VIN -> GPIO 1 GND -> GPIO 9 or (6) SCL -> GPIO 5 SDA -> GPIO 3
