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:
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.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; }
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?







Zitieren

Lesezeichen