Ds1621 domix.c

De MicElectroLinGenMet.

Page: Linux_sur_CompactFlash

/* Test DS1621 sur interface I2C de type Velleman (port //) sur DomiX (Linux sur CF) (8/2006) 	*/
/* Fonctionne aussi avec l'interface I2C de type philips sur port // 				*/
/* Par domos domos78<at>free<point>fr 								*/
/* Affichage de la t° tout les 60s 								*/
 
/* 8/4/2007 */
/* Test avec accés device i2c sans fonction smbus (i2c.h). */
/* Exemple inspiré de Linux Magazine HS23 (Electronique). */
/* gcc -Wall -o ds1621 -O3 ds1621_.c */
 
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>
#include <fcntl.h>
#include <errno.h>
#include <syslog.h>
#include <linux/i2c-dev.h>
#include <sys/ioctl.h>
 
#define I2C_SLAVE       0x0703  /* Change slave address                 */
 
static int i2c_fd ;
int res ;
 
#define DEVICE "/dev/i2c-0"
#define ds1621_addr 0x9E >> 1		// Adr. i2c DS1621 (A0, A1, A2 à  Vcc)
 
 
/*------------------------------------------------------------------------------*/
/* Fonctions i2c 								*/
/*------------------------------------------------------------------------------*/
void i2c_init()
{
	i2c_fd = open( DEVICE, O_RDWR );
	if ( i2c_fd < 0 )
	{
		syslog(LOG_ERR, "Erreur, impossible d'ouvrir %s", DEVICE );
		exit(1) ;
	}
}
 
//-----------------------------------------------------------------------------
void SelectSlave(unsigned char slaveaddr)
{
	int res ;
	res = ioctl(i2c_fd, I2C_SLAVE, slaveaddr) ;
	//printf("Code retour 'SelectSlave': %d\n", res) ;
	if ( res < 0 )
	{
		syslog(LOG_ERR, "Erreur, impossible de sélectionner le composant i2c à l'adresse 0x%x: '%s'",  slaveaddr, strerror(errno));
		close ( i2c_fd );
		exit(1) ;
	}
}
 
/*------------------------------------------------------------------------------*/
/* Fonctions DS1621 								*/
/*------------------------------------------------------------------------------*/
int i2c_init_ds1621(unsigned char addr)
{
	int res ;
	char buff[10] ;
 
	SelectSlave(addr) ;
	buff[0] = 0xAC ;
	buff[1] = 0x01 ;
	res = write( i2c_fd, buff, 2 );
	if ( res < 0 )
	{
		syslog(LOG_ERR, "Erreur init DS1621 addr 0x%x: '%s', Abandon programme !", addr, strerror(errno));
		close ( i2c_fd );
		exit(1) ;
	}
	/* start temperature conversion */
	errno = 0 ;	
	buff[0] = 0xEE ;
	write( i2c_fd, buff, 1 );
	sleep(1) ;
	return 1 ;
}
 
//-----------------------------------------------------------------------------
double i2c_gettemp_ds1621(unsigned char addr)
{
	int k, count, slope, temp;
	char buff[10] ;
	int res ;
 
	SelectSlave(addr) ;
	/* stop conversion */
	errno = 0 ;	
	buff[0] = 0x22 ;
	res = write( i2c_fd, buff, 1 );
	if ( res < 0 )
	{
		syslog(LOG_ERR, "Erreur écriture DS1621 addr 0x%x: '%s'", ds1621_addr, strerror(errno) );
		return 255 ;	// 255 car retourne normalement la t°.
	}
	else
	{
		/* Temperature reading (1 Celsius degree precision) */
		buff[0] = 0xAA ;
		write( i2c_fd, buff, 1 );
		read(i2c_fd, buff, 1) ;
		temp = buff[] ;
		/* Counter reading (fraction of degree) ) */
		buff[0] = 0xA8 ;
		write( i2c_fd, buff, 1 );
		read(i2c_fd, buff, 1) ;
		count = buff[] ;
		/* slope reading */
		buff[0] = 0xA9 ;
		write( i2c_fd, buff, 1 );
		read(i2c_fd, buff, 1) ;
		slope = buff[] ;
		k = temp;
		if (slope != ) 
		{
			k = temp*100-25+(100*(slope-count))/slope;
		}
		//printf("Temp DS1621_1: %2.1f°\n", (float)k/100) ;
		/* start temperature conversion */
		buff[0] = 0xEE ;
		write( i2c_fd, buff, 1 );
		return (float)k/100 ;
	}
}
 
/*------------------------------------------------------------------------------*/
int main ( int argc, char ** argv )
{
	double temp_1 ;
 
	openlog("ds1621", LOG_PID, LOG_USER) ;
	syslog(LOG_INFO, "Démarrage ...") ;
 
	// Init i2c.
  	i2c_init() ;
 
	// Init ds1621.
  	i2c_init_ds1621(ds1621_addr) ;
 
  	sleep(1);
 
	while (1)
	{   
		temp_1 = i2c_gettemp_ds1621(ds1621_addr) ;	// Lit t° ds1621.
	 	//printf("Temp: %2.1f°\n", temp_1) ;	
		syslog(LOG_INFO, "Température: %2.1f°", temp_1) ;
	 	sleep(60) ;	
	}
}
 
/*------------------------------------------------------------------------------*/

10 août 2006


Administration wiki