Hallo miteinander,
ich spiele seit gestern zum ersten Mal mit einem i2c-fähigen Sensor.
Dazu habe ich ihn über einen Raspberry Pi angeschlossen und werte ihn über die GPIO-Pins aus.
Ich habe einen Codefetzen im Netz gefunden, der auf den tmp102 ausgerichtet war, mit aber auch die Temperatur des tmp100 ausgibt:
Code:
#include <stdio.h>
#include <stdlib.h>
#include <linux/i2c-dev.h>
#include <fcntl.h>
#include <string.h>
#include <sys/ioctl.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
int main(int argc, char **argv)
{
unsigned int temp = 0;
unsigned char msb, lsb;
int fd; // File descritor
char *fileName = "/dev/i2c-1"; // Name of the port we will be using
int address = 0x4f; // Address of TP102
unsigned char buf[10]; // Buffer for data being read/ written on the I2C bus
if ((fd = open(fileName, O_RDWR)) < 0)
{ // Open port for reading and writing
printf("Failed to open I2C port\n");
exit(1);
}
if (ioctl(fd, I2C_SLAVE, address) < 0)
{ // Set the port options and set the address of the device we wish to speak to
printf("Unable to get bus access to talk to slave\n");
exit(1);
}
buf[0] = 0; // This is the register we wish to read from
if ((write(fd, buf, 1)) != 1)
{ // Send register to read from
printf("Error writing to I2C slave\n");
exit(1);
}
if (read(fd, buf, 1) != 1)
{ // Read back data into buf[]
printf("Unable to read from slave\n");
exit(1);
}
else
{
for (;;)
{
msb = buf[0];
if (read(fd, buf, 1) != 1)
{
printf("Unable to read from slave\n");
exit(1);
}
else
{
lsb = buf[0];
temp = (msb<<8) | lsb;
temp >>= 4;
printf("Temp: %f \n",temp*0.0625);
printf("Raw: %f \n\n", temp*1.00);
usleep(1000000);
}
}
}
return 0;
}
Laut Datenblatt soll der tmp100 ein einstellbare Auflösung haben. Aber ich bin noch nicht wirklich dahinter gestiegen, wie ich die Auflösung einstellen kann.
Momentan kann ich nur Messwerte in 1°C-Schritten auslesen. Da der Sensor einen Messbereich von 180°C hat und mit 12Bit = 4096 Werten auflösen können soll, ergibt sich doch theoretisch eien Schrittweite von 180/4096 von 0.0439453125°C.
Allerdings bekomme ich imemr nur volle Werte alla 23.06250°C oder 24.06250°C ausgegeben.
Die Zahl dieht verdammt nach dem Umrechnungsfaktor aus. Aber ohne den Multiplkator bekomme ich nichts ausgegeben.
Wie kann ich den Sensor nun dazu bewegen, feiner aufgelöste Werte auszuspucken?
Lesezeichen