Uzyskaj temperaturę PI za pomocą C.

11

Wiem, że możesz uzyskać temperaturę za pomocą narzędzia vcgencmd, ale zastanawiałem się, czy istnieje jakiś interfejs API, którego można użyć w C, aby uzyskać temperaturę programowo bez odczytywania standardowego poziomu vcgencmd?

opc0de
źródło
Może ci się to przydać: mjmwired.net/kernel/Documentation/sysfs-rules.txt
goldilocks

Odpowiedzi:

13

Możesz przeczytać plik /sys/class/thermal/thermal_zone0/temp, jak określono w tej odpowiedzi . Tam chodzi o pomiary z linii poleceń, a plik jest odczytywany za pomocą cat. Ale powinieneś być w stanie po prostu otworzyć plik w C. Temperatura jest zwracana w stopniach Celsjusza i jako liczby ASCII. Być może tak, nie testowałem :)

FILE *temperatureFile;
double T;
temperatureFile = fopen ("/sys/class/thermal/thermal_zone0/temp", "r");
if (temperatureFile == NULL)
  ; //print some message
fscanf (temperatureFile, "%lf", &T);
T /= 1000;
printf ("The temperature is %6.3f C.\n", T);
fclose (temperatureFile);
Frepa
źródło
Doświadczenie doprowadziło mnie do przekonania, że ​​interfejs strumieniowy wysokiego poziomu nie jest niezawodny w plikach proc / sys, więc powinieneś użyć open()i read()zamiast tego - ale YMMV. Istnieje również „libsysfs”, ale został on porzucony, a twórcy jądra wyraźnie powiedzieli ludziom, aby trzymali się od niego z daleka.
Złotowłosa
@goldilocks Ciekawe! Nie wiedziałem tego, myślałem, że zachowuje się jak każdy plik. Być może masz rację.
Frepa
2

Jak powiedział @Frepa, istnieje teraz sterownik termiczny jądra dla RaspberryPi, więc najłatwiej jest go użyć. O ile wiem, jednak nie tak to vgencmddziała. Był w stanie odczytać temperaturę, zanim jeszcze istniał sterownik jądra termicznego. Korzysta ze specjalnego mechanizmu komunikacji dostępnego na RaspberryPi, zwanego mailboxw celu komunikacji z systemem operacyjnym VideoCore działającym na GPU. Jest to częściowo udokumentowane tutaj .

Krzysztof Adamski
źródło
Kurs Baking Pi zawiera trochę więcej materiałów do skrzynki pocztowej, ale jest tam używany tylko do grafiki.
Frepa,