5. 1-wireを用いて温度を測定する。

例題
 温度センサーからデータを読み、日付・時間とともに表示するをプログラムを作り、コンパイルし、TINIに転送して実行しなさい。

解答例
import java.io.*;
import java.util.Enumeration;
import com.dalsemi.onewire.OneWireAccessProvider;
import com.dalsemi.onewire.OneWireException;
import com.dalsemi.onewire.adapter.DSPortAdapter;
import com.dalsemi.onewire.container.*;
import java.util.Calendar;

class temp{
    public static void main(String args[]) {
        
        (new temp()).tempDisp();
    }
    
    public void tempDisp() {
        Calendar cal = Calendar.getInstance();  // 日付情報を得る
        String myString = String.valueOf(cal.get(Calendar.YEAR))+"/"
            +String.valueOf(cal.get(Calendar.MONTH)+1)+"/"
            +String.valueOf(cal.get(Calendar.DAY_OF_MONTH ))+" "
            +String.valueOf(cal.get(Calendar.HOUR_OF_DAY))+":"
            +String.valueOf(cal.get(Calendar.MINUTE))+":"
            +String.valueOf(cal.get(Calendar.SECOND));
        System.out.println(getTemperatures()+myString);  //温度情報と繋げて表示
    } 

    public String getTemperatures() {    //温度を測定し文字列にする
        byte[] state;
        OneWireContainer28 tc;     // 用いているセンサーのコンテナ

        String val="";
        try {
        // アダプターに接続する
            DSPortAdapter adapter = OneWireAccessProvider.getDefaultAdapter();
        // アダプターを排他的に使用する
            adapter.beginExclusive(true);
        // アダプターにつながってるネットワーク内を検索する 
            adapter.setSearchAllDevices();
            adapter.targetAllFamilies();
            adapter.setSpeed(adapter.SPEED_REGULAR);
        // 検索されたデバイスをリストアップする
            Enumeration e = adapter.getAllDeviceContainers();
        // リストの先頭に温度センサーがある予定
            OneWireContainer c = (OneWireContainer)e.nextElement();
        // 用いているセンサーとしてキャストする
            tc = (OneWireContainer28)c;
        // センサーの状態を読む
            state = tc.readDevice();
        // 温度を測定する
            tc.doTemperatureConvert(state);
            state = tc.readDevice();
        // 測定結果を摂氏で得て文字列に変換する。
            val = String.valueOf(tc.getTemperature(state))+" ";
        } catch (Exception e) {
            System.out.println("Temp " + e.toString());
            return "Temp.Error";
        }
        return val;
    }
}



build.batのBuildDependencyの最後に
-add OneWireContainer28
のオプションを追加してください。
コンパイルしtini形式に変換されるとbinディレクトリに入ります。これをftpにてTINIに 転送します。

転送が完了したらtelnetにて実行します。

温度と日付が表示されれば成功です!

問題5-1

 上で用いたtemp.javaをスレッドを用いて10秒毎に温度を表示するように変更しなさい。

ヒント:1秒毎に数字をカウントアップする。
以下のプログラムは永久ループですから、psコマンドでプロセス番号を調べてからそのプロセスをkillしてください。
class ThreadTest {
	public static void main(String [] args){
		new timer().start();
	}
}

class timer extends Thread{
	public void run(){
		int counter=0;
		while(true) {
			System.out.println(counter++);
			try {
				Thread.sleep(1000);
			}
			catch(Exception e){}
		}
	}
}


問題5-2

 起動時オプション(引数)を用いて、何か引数があったときにセンサーの説明(description)を表示してから計測を始めるようしなさい。

ヒント:1-wireのドキュメントを読む。


TOPページへ戻る