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
