因此,我被招募到我們學校的Baja賽車隊,在那裏我們設計構建並與越野沙丘車類型賽車競爭。我是CS專業大學畢業生,在Python方面有相當多的經驗,因此被要求幫助電氣團隊與我們想要的所有傳感器接口。到目前爲止這麼好,但現在我正在使用一個讀取環境溫度和物體溫度的紅外溫度傳感器。 (我們打算把它放在引擎上的某個地方讀取它的溫度並輸出到我們的GUI)Raspberry Pi - 與啓用i2c的紅外溫度傳感器(MLX90614)接口
問題是似乎只有使用這種傳感器的庫全部用C編寫,通常與arduinos一起使用...儘管如此,我編譯和編輯了一些我在網上找到的C代碼,它效果很好!在C. :(因爲我們的項目完全基於python;我真的很喜歡通過i2c和Python讀取這個傳感器的一些幫助,雖然我沒有很多編寫庫的經驗,尤其是對於電子學。提示將是巨大的,引導我在正確的方向下面是我們目前使用的我基本上要在Python同樣的事情的C代碼:!
//fordit: gcc MLXi2c.c -o i2c -l bcm2835
#include <stdio.h>
#include <bcm2835.h>
#include <stdlib.h>
#include <fcntl.h>
#include <string.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include<time.h>
#define AVG 1 //averaging samples
#define LOGTIME 10 //loging period
int main(int argc, char **argv)
{
unsigned char buf[6];
unsigned char i,reg;
double temp=0,calc=0, skytemp,atemp;
FILE *flog;
flog=fopen("mlxlog.csv", "a");..
bcm2835_init();
bcm2835_i2c_begin();
bcm2835_i2c_set_baudrate(25000);.
// set address...........................................................................................
bcm2835_i2c_setSlaveAddress(0x5a);
....
printf("\nOk, your device is working!!\n");
....
....
while(1) {
time_t t = time(NULL);
<------>struct tm tm = *localtime(&t);
<------>calc=0;
<------>reg=7;
<------>for(i=0;i<AVG;i++){
<------> bcm2835_i2c_begin();
<------> bcm2835_i2c_write (®, 1);
<------> bcm2835_i2c_read_register_rs(®,&buf[0],3);
<------> temp = (double) (((buf[1]) << 8) + buf[0]);
<------> temp = (temp * 0.02)-0.01;
<--> temp = temp - 273.15;
<------> calc+=temp;
<------> sleep(1);
<------> }
<------>skytemp=calc/AVG;
<------>calc=0;
<------>reg=6;
<------>for(i=0;i<AVG;i++){
<------> bcm2835_i2c_begin();
<------> bcm2835_i2c_write (®, 1);
<------> bcm2835_i2c_read_register_rs(®,&buf[0],3);
<------> temp = (double) (((buf[1]) << 8) + buf[0]);
<------> temp = (temp * 0.02)-0.01;
<--> temp = temp - 273.15;
<------> calc+=temp;
<------> sleep(1);
<------> }
<------>atemp=calc/AVG;
<------>printf("%02d-%02d %02d:%02d:%02d\n Tambi=%04.2f C, Tobj=%04.2f C\n", tm.tm_mon + 1, tm.tm_mday, tm.tm_hour, tm.tm_min, tm.tm_sec,atemp,skytemp);
<------>fprintf(flog,"%04d-%02d-%02d %02d:%02d:%02d,%04.2f,%04.02f\n",tm.tm_year+1900, tm.tm_mon +1, tm.tm_mday,tm.tm_hour, tm.tm_min, tm.tm_sec,atemp,skytemp);
<------>fflush(flog);
<------>sleep(LOGTIME-(2*AVG));
}
...
printf("[done]\n");
}
在此先感謝
- 埃迪
爲什麼不簡單地從Python中調用C程序而不是重寫整個事情呢? – jDo
我不知道你能做到嗎?你介意闡述嗎? 我其實想到這個,如果我能從C程序中得到返回的值到Python,我會是金。 –
如果你有一個不能無限運行的程序,就像'import subprocess; sens_val = subprocess.check_output([「path_to_your_c_program」]) 如果你的C程序運行無限(例如在一個'while(1)'循環中就像在arduino上一樣),你可以簡單地刪除那個循環,每次執行讀取一次傳感器讀數,將其打印到標準輸出並退出。 – jDo