【Java】Raspberry piで部屋の明るさを計測

pigpioを使った明るさを取得するプログラムをJavaで書いてみたので、自分用に内容を記事にしときたいと思います。

前回の記事でフォトトランジスタを動かす為の配線を行いましたので、これを動かしていきます。

プログラムはリモートでテストしていきます。

使用するライブラリはこれ。
https://github.com/nkolban/jpigpio

私が改造した奴がこれ。
https://github.com/nompor/jpigpio

今回はオリジナルのライブラリでも問題なく処理できると思うのでどっちを使ってもOK。

プログラムはSPI通信を利用しますのでRaspberry Piの設定でオンにしておきましょう。

作成したプログラムは光の強さが数値で表示されるようになっています。

import jpigpio.PigpioException;
import jpigpio.PigpioSocket;

public class IlluminanceSensor{

	PigpioSocket pi = null;
	int sensor;
	public static void main(String[] args) throws InterruptedException, PigpioException {
		new IlluminanceSensor().execute();
	}

	void execute() throws PigpioException, InterruptedException{
		pi = new PigpioSocket("IPアドレス", 8888);
		sensor = pi.spiOpen(0, 1000000, 0);
		try {
			while(true) {
				// 関数を呼び出してch0 のデータを取得
				double ch0_voltage  = measure(0x00);
				// 関数を呼び出してch1 のデータを取得
				double ch1_voltage  = measure(0x10);

				System.out.printf("ch0 = {:%.3f}[V], ch1 = {:%.3f}[V]\n", ch0_voltage, ch1_voltage);
				Thread.sleep(1000);
			}
		} finally {
			pi.spiClose(sensor);
			pi.gpioTerminate();
		}
	}


	// IC からデータを取得する関数を定
	double measure(int ch) throws PigpioException {
		// SPI インターフェイスでデータの送受信を行う

		//start connection bit 0111 1000
		//1=X
		//2=X
		//3=X
		//4={MSBF=1,LSB=0}
		//5={CH0=0,CH1=1}
		//6={SINGLE ENDED MODE=1,PSEUDO-DIFFERENTIAL MODE=0}
		//7=1
		//8=X
		byte[] ad = new byte[2];
		pi.spiXfer( sensor, new byte[] {(byte)(0x68 | ch),0x00}, ad );

		double val = ((ad[0] & 0x03) << 8) + (ad[1] & 0xff);
		// 受信した2バイトのデータを10 ビットデータにまとめる
		// output code = 1024 * Vin / Vdd
		double voltage =  ( val * 3.3 ) / 1024;
		// 結果を返す
		return voltage;
	}
}
実行結果

ch0 = {:0.000}[V], ch1 = {:0.039}[V]
ch0 = {:0.000}[V], ch1 = {:0.035}[V]
ch0 = {:0.074}[V], ch1 = {:0.045}[V]
ch0 = {:0.000}[V], ch1 = {:0.032}[V]
ch0 = {:0.071}[V], ch1 = {:0.032}[V]
ch0 = {:0.000}[V], ch1 = {:0.042}[V]
ch0 = {:0.000}[V], ch1 = {:0.045}[V]
ch0 = {:0.000}[V], ch1 = {:0.035}[V]

関連記事