Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- //
- //Sensirion SHT71 (http://www.acmesystems.it/?id=89) by Douglas Gilbert
- #include <math.h>
- #include <stdio.h>
- #include <stdlib.h>
- #include <unistd.h>
- #include "./z2-gpio.h"
- // -----------------------------------------------------------------------
- // SHT71 sensor define
- // -----------------------------------------------------------------------
- #define CLOCK_BIT 53
- #define DATA_BIT 54
- #define DATA_LINE_IN gpio_dir_in(DATA_BIT)
- #define DATA_LINE_OUT gpio_dir_out(DATA_BIT)
- #define DATA_LINE_LOW set_gpio_value(DATA_BIT, 0)
- #define DATA_LINE_HIGH set_gpio_value(DATA_BIT, 1)
- #define DATA_LINE_READ get_gpio_value(DATA_BIT)
- #define CLOCK_LINE_LOW set_gpio_value(CLOCK_BIT, 0)
- #define CLOCK_LINE_HIGH set_gpio_value(CLOCK_BIT, 1)
- #define CMD_RESET 0x1e
- #define CMD_READ_TEMP 0x03
- #define CMD_READ_HUM 0x05
- // -----------------------------------------------------------------------
- // Send the start sequence
- // -----------------------------------------------------------------------
- static void SendStart(void)
- {
- CLOCK_LINE_LOW;
- DATA_LINE_OUT;
- DATA_LINE_HIGH;
- usleep(1000);
- CLOCK_LINE_HIGH;
- usleep(1000);
- DATA_LINE_LOW;
- usleep(1000);
- CLOCK_LINE_LOW;
- usleep(1000);
- CLOCK_LINE_HIGH;
- usleep(1000);
- DATA_LINE_HIGH;
- usleep(1000);
- CLOCK_LINE_LOW;
- }
- // -----------------------------------------------------------------------
- // Sensor reset
- // -----------------------------------------------------------------------
- static void SendReset (void)
- {
- int k;
- DATA_LINE_OUT;
- DATA_LINE_HIGH;
- for (k = 0; k < 12; k++) {
- CLOCK_LINE_HIGH;
- usleep(1000);
- CLOCK_LINE_LOW;
- usleep(1000);
- }
- CLOCK_LINE_HIGH;
- usleep(1000);
- DATA_LINE_LOW;
- usleep(1000);
- CLOCK_LINE_LOW;
- usleep(1000);
- CLOCK_LINE_HIGH;
- usleep(1000);
- DATA_LINE_HIGH;
- usleep(1000);
- CLOCK_LINE_LOW;
- }
- // -----------------------------------------------------------------------
- // Send a byte to the sensor
- // -----------------------------------------------------------------------
- static int SendByte(unsigned char byte)
- {
- unsigned char tempbyte;
- int k;
- DATA_LINE_OUT;
- tempbyte = byte;
- for (k = 0x80; k > 0; k /= 2) {
- if (tempbyte & k){
- DATA_LINE_HIGH;
- } else {
- DATA_LINE_LOW;
- }
- usleep(1000);
- CLOCK_LINE_HIGH;
- usleep(1000);
- CLOCK_LINE_LOW;
- usleep(1000);
- }
- DATA_LINE_IN;
- CLOCK_LINE_HIGH;
- usleep(10000);
- CLOCK_LINE_LOW;
- usleep(10000);
- return 1;
- }
- // -----------------------------------------------------------------------
- // Read a byte from the sensor
- // -----------------------------------------------------------------------
- static unsigned char ReadByte(int withack)
- {
- unsigned char tempbyte;
- int k;
- tempbyte = 0;
- DATA_LINE_IN;
- for (k = 0x80; k > 0; k /= 2) {
- CLOCK_LINE_HIGH;
- usleep(1000);
- if (DATA_LINE_READ){
- tempbyte |= k;
- }
- CLOCK_LINE_LOW;
- usleep(1000);
- }
- if (withack) {
- DATA_LINE_OUT;
- DATA_LINE_HIGH;
- usleep(1000);
- DATA_LINE_LOW;
- usleep(1000);
- CLOCK_LINE_HIGH;
- usleep(1000);
- CLOCK_LINE_LOW;
- usleep(1000);
- DATA_LINE_IN;
- } else {
- DATA_LINE_OUT;
- DATA_LINE_HIGH;
- usleep(1000);
- CLOCK_LINE_HIGH;
- usleep(1000);
- CLOCK_LINE_LOW;
- usleep(1000);
- DATA_LINE_IN;
- }
- return tempbyte;
- }
- // ----------------------
- // Read the temperature
- // ----------------------
- static int ReadTemperature(void)
- {
- unsigned char Lsb, Msb, Chk;
- SendStart();
- usleep(1000);
- SendByte(CMD_READ_TEMP);
- usleep(500000);
- Msb = ReadByte(1);
- Lsb = ReadByte(1);
- Chk = ReadByte(0);
- return (Msb << 8) + Lsb;
- }
- // ------------------
- // Read the humidity
- // ------------------
- static int ReadHumidity(void)
- {
- unsigned char Lsb, Msb, Chk;
- SendStart();
- if (! SendByte(CMD_READ_HUM))
- return 0;
- while (DATA_LINE_READ)
- ;
- Msb = ReadByte(1);
- Lsb = ReadByte(1);
- Chk = ReadByte(0);
- return (Msb << 8) + Lsb ;
- }
- float AirDensity(float humidity, float temperature, float barometric)
- {
- barometric = 758.952;
- float kelvin = (273.15 + temperature);
- float exponent = exp(-5315.56 / kelvin);
- float pressure = (0.0004646 * (barometric - (4990221.6 * humidity * exponent)));
- return (pressure / kelvin) ;
- }
- // ----------
- // main code
- // ----------
- //int main(int argc, char ** argv)
- int main(int argc, char *argv[])
- {
- int opt, soh, sot;
- int do_reset = 0;
- double dew_point_lf, denominator, numerator;
- float rel_humidity, temperature_c, Tn = 243.12, m = 17.62;
- gpio_export(DATA_BIT);
- gpio_export(CLOCK_BIT);
- gpio_dir_out(CLOCK_BIT);
- SendReset();
- usleep(100000);
- soh = ReadHumidity();
- sot = ReadTemperature();
- // rel_humidity = -2.0468 + (0.0367 * soh) + (-1.5955E-6 * soh * soh);
- rel_humidity = -4 + (0.0405 * soh) + -2.8E-6;
- if (rel_humidity > 99.9)
- rel_humidity = 100.0;
- else if (rel_humidity < 0.1)
- rel_humidity = 0.0;
- temperature_c = -39.66 + (0.01 * sot);
- printf (" Rel. Humidity : %.2f %% RH\n", rel_humidity);
- printf (" Temperature : %.2f °C\n", temperature_c);
- printf ("Barometric Pressure : %.3f mmHg\n", 758.952);
- gpio_unexport(53);
- gpio_unexport(54);
- numerator = log(rel_humidity / 100) + ((m * temperature_c) / (Tn + temperature_c));
- denominator = m - log(rel_humidity / 100) - ((m * temperature_c) / (Tn + temperature_c));
- printf (" Dew Point : %.2f ºC\n", Tn * (numerator / denominator));
- printf (" Air Density : %.7f g/cm^3\n", AirDensity(rel_humidity, temperature_c, 0.00));
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement