SHT7

From Pinguino
Revision as of 15:37, 28 March 2011 by Skc (talk | contribs) (Save mail from Jean-Pierre Mandon about interfacing a SHT7)
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)
Jump to: navigation, search

The SHT7 is a temperature and relative humidity sensor. It works like an I2C device, except it is not a really I2C.

This code use float to ascii conversion ( stdlib.h ) and print a float result on CDC.

// How to communicate with Pinguino and a SHT7 sensor
// Jean-Pierre Mandon 2011

#include <stdlib.h>
#include <string.h>

#define DATA 0            // SDA is connected to pin 0 of Pinguino
#define CLOCK 1            // SCK is connected to pin 1 of Pinguino

void setup()
{
pinMode(DATA,OUTPUT);
pinMode(CLOCK,OUTPUT);
digitalWrite(DATA,1);
digitalWrite(CLOCK,0);
}

unsigned int send_command(unsigned char value)
{
unsigned char i;
unsigned char lowbyte;
unsigned char highbyte;

// start condition
digitalWrite(DATA,1);
delay(1);
digitalWrite(CLOCK,HIGH);
delay(1);
digitalWrite(DATA,LOW);
delay(1);
digitalWrite(CLOCK,LOW);
delay(1);
digitalWrite(CLOCK,HIGH);
delay(1);
digitalWrite(DATA,HIGH);
delay(1);
digitalWrite(CLOCK,LOW);
delay(1);
// send command
for (i=0;i<8;i++)
    {
    if ((value&0x80)==0x80) digitalWrite(DATA,1);
    else digitalWrite(DATA,0);
    value=value<<1;
    delay(1);
    digitalWrite(CLOCK,1);
    delay(1);
    digitalWrite(CLOCK,0);
    delay(1);
    }
// wait for acknowledge   
pinMode(DATA,INPUT);
digitalWrite(CLOCK,1);
delay(5);
if (digitalRead(DATA)) return 0xFFFF;    // bad acknowledge
digitalWrite(CLOCK,0);
// wait for conversion time
delay(500);
// check the data line to know if measurement is OK
if (digitalRead(DATA)) return 0xFFFF;
// reading measurement value high byte
highbyte=0;
for (i=0;i<8;i++)
    {
    digitalWrite(CLOCK,1);
    delay(1);
    if (digitalRead(DATA)) highbyte=highbyte+1;   
    digitalWrite(CLOCK,0);
    delay(1);
    highbyte=highbyte<<1;
    delay(1);
    }
// acknowledge MSB   
pinMode(DATA,OUTPUT);
digitalWrite(DATA,0);
digitalWrite(CLOCK,1);
delay(1);
digitalWrite(CLOCK,0);
delay(1);
// reading measurement value low byte
pinMode(DATA,INPUT);
lowbyte=0;
for (i=0;i<8;i++)
    {
    digitalWrite(CLOCK,1);
    delay(1);
    if (digitalRead(DATA)) lowbyte=lowbyte+1;       
    digitalWrite(CLOCK,0);
    delay(1);
    lowbyte=lowbyte<<1;
    delay(1);
    }
// Set High to DATA line to end communication   
pinMode(DATA,OUTPUT);
digitalWrite(DATA,1);   
return(lowbyte+(highbyte*256));
}

// reset sensor
void reset_SHT7()
{
unsigned char i;
pinMode(DATA,OUTPUT);   
digitalWrite(DATA,1);
for (i=0;i<10;i++)
    {
    digitalWrite(CLOCK,1);
    delay(1);
    digitalWrite(CLOCK,0);
    delay(1);
    }
}

void loop()
{
unsigned int i;
unsigned char chaine[];
float temperature;

delay(3000);
CDC.print("start conversion\n\r",18);
while(1)
    {
    delay(500);
    i=send_command(3);                            // send command 3 to SHT7 ( read temperature )
    if (i<65535)                                // if no error
        {
        temperature=(-40+(0.01*i))/4;            // convert measurement to real value
        x_ftoa(temperature,chaine,2,2);            // convert float value to ascii
        strcat(chaine,"\n\r");                    // add CR/LF to string
        CDC.print(chaine,strlen(chaine));        // print string on CDC
        }
    reset_SHT7();
    }
}