所以我被招到我学校的巴哈赛车队,在那里我们设计、制造和与越野沙丘车类型的汽车竞争。我是一名计算机专业的学生,对python有相当丰富的经验,因此我被要求帮助电气团队与我们想要在车上安装的所有传感器进行接口。到目前为止还不错,但我现在使用的是红外温度传感器,它可以读取环境温度和物体温度。(我们将把这个放在引擎上的某个地方,读取它的温度并输出到我们的GUI)
问题是,似乎使用过这种传感器的唯一库都是用C编写的,通常与arduinos一起使用。。。尽管如此,我还是编辑了一些我在网上找到的C代码,太好了!(因为我们的项目完全是基于python的,所以我真的希望有人通过i2c和python来阅读这个传感器,尽管我在编写库方面没有太多的经验,尤其是在电子方面。任何小贴士都能帮我找到正确的方向。下面是我们当前使用的C代码,我想在Python中使用相同的代码:
//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");
}
提前谢谢!在
更改:
while(1)
-每次执行只读取一次。如果传感器需要重复启动,那么可能需要一个for/while循环;只是不要让它成为一个无限循环,除非您计划从python中终止进程。在printf
现在输出一个由起始和结束管道/|分隔的JSON字符串return 0;
添加到main()
以便python的子进程模块知道 怎么了将其保存为mlx90614_query.c并编译:
您的C程序现在输出现有的调试消息和此json(“|”用作分隔符):
^{pr2}$将其另存为一个python脚本,与mlx90614_query位于同一个文件夹中(如果复制/粘贴到交互式解释器,则多余的空格会导致问题):
输出:
很抱歉偷了你的作业-只需<;3到代码:D
相关问题 更多 >
编程相关推荐