Obter a temperatura do PI usando C

11

Eu sei que você pode obter a temperatura usando a ferramenta vcgencmd, mas eu queria saber se existe alguma API que eu possa usar em C para obter a temperatura programaticamente sem ler o stdout do vcgencmd?

opc0de
fonte
Você pode achar útil: mjmwired.net/kernel/Documentation/sysfs-rules.txt
goldilocks

Respostas:

13

Você pode ler o arquivo /sys/class/thermal/thermal_zone0/temp, conforme especificado nesta resposta . Trata-se de medir a partir da linha de comando, e o arquivo é lido com cat. Mas você deve conseguir abrir o arquivo em C. A temperatura é retornada em mili-graus centígrados e como números ASCII. Talvez assim, não testado :)

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
fonte
Experiência me levou a acreditar que a interface de fluxo de alto nível não é confiável em proc / sys arquivos, e você deve usar open()e read()em vez disso - mas YMMV. Há também um "libsysfs", mas foi abandonado e os desenvolvedores do kernel explicitamente disseram às pessoas para ficarem longe dele.
goldilocks
@goldilocks Interesting! Eu não sabia disso, pensei que só se comporta como qualquer arquivo. Você pode muito bem estar certo.
FREPA
2

Como a @Frepa disse, agora existe um driver térmico de kernel para o RaspberryPi, portanto a maneira mais fácil é usá-lo. Até onde eu sei, não é assim que vgencmdfunciona. Foi capaz de ler a temperatura mesmo antes da existência do driver térmico do kernel. Ele está usando um mecanismo de comunicação especial disponível no RaspberryPi chamado mailboxpara se comunicar com o VideoCore OS em execução na GPU. Está parcialmente documentado aqui .

Krzysztof Adamski
fonte
O curso Baking Pi tem um pouco mais de material da caixa de correio, mas é usado apenas para gráficos.
FREPA