Raspberry PI B+ の gpio で CNY70 とその他のコンポーネント (コンパレーターを含む) を使用して水道メーターを読み取ろうとしています。私は配線 pi 割り込みを使用してこれを行い、立ち上がりと立ち下がりを切り替えて、誤った割り込みに対処します。私のプログラムには奇妙な回避策が含まれていますが、機能しているようです。唯一の問題は、より多くの vmem がかかり、約 10 時間後に動作を停止することです。私はどこでも直接メモリ管理を行っておらず、全体に 69 行のコードが含まれているため、これは奇妙です。これは配線 pi のバグですか、それとも何か他のことが起こっていますか?
プログラム全体は次のとおりです。
#include <stdio.h>
#include <time.h>
#include <stdlib.h>
#include <wiringPi.h>
#include <limits.h>
#include <sys/time.h>
void myInterrupt1(void);
void printtime(){
char buffer[30];
struct timeval tv;
time_t curtime;
gettimeofday(&tv, NULL);
curtime=tv.tv_sec;
strftime(buffer,30,"%m-%d-%Y %T.",localtime(&curtime));
printf("%s%ld\n",buffer,tv.tv_usec);
fflush(stdout);
}
void callJson(void){
struct timeval tv;
gettimeofday(&tv, NULL);
int time = tv.tv_sec;
static int timeprev = 0;
if (time - timeprev > 1){
timeprev = time;
system("./watermeter.sh");
printf("SEND!!!!\n");
fflush(stdout);
}
}
void myInterrupt0(void){
if (digitalRead(1)==1){
wiringPiISR(1, INT_EDGE_FALLING, &myInterrupt1);
printf("rising\n");
printtime();
callJson();
}
}
void myInterrupt1(void){
if (digitalRead(1)==0){
wiringPiISR(1, INT_EDGE_RISING, &myInterrupt0);
printf("falling\n");
printtime();
}
}
int main (void){
wiringPiSetup();
if (digitalRead(1)==0){
wiringPiISR(1, INT_EDGE_RISING, &myInterrupt0);
}
else{
wiringPiISR(1, INT_EDGE_FALLING, &myInterrupt1);
}
// printtime();
for(;;){
sleep(UINT_MAX);
}
return 0;
}
.watermeter.sh は、Domoticz API の呼び出しを処理する bash スクリプトです。printtime 関数全体は、最初に二重割り込みと誤った割り込みの問題を調査するために作成されましたが、これは既知の配線 pi の問題です。