その11 LCD表示式、Lan接続型 温度-湿度計 TempLanRH へ


LCD表示式、Lan接続型の 温度-湿度計です。
TempLan(Lan型温度計)に、湿度を組み合わせたものです。

7SEG-LED表示方式のものからLEDを取り去りLCD表示にして、Xportを追加したものといってもいいでしょう。
今回も2つのセンサーを搭載し、2つのA/D変換入力を切換えながら約10秒間隔でデーターをLANで転送します。

温度センサーは、LM35A
湿度センサーユニットは、マルツ電波で購入した、HSM-20G(写真の緑色の基盤)です。

電源投入後1〜2分ぐらいは初期変動があるようです。



 

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=shift_jis">
<title>TempLanRH</title>
</head>
<body>
<p style="text-align: center; font-size: xx-large;">TempLanRH 2.1
</p>
<center>
<a href="http://www.lantronix.com/lang/jp/products/ds_xport.shtml">XPort</a>
&amp; PIC オンライン 温度-湿度計!<br>
<br>
<applet code="TempLanRH01.class" height="600" width="800"></applet><br>
<address> Copyright &#169; <a href="http://ohta.no-ip.com/">Ohtan's
Design Co.</a>
</address>
</center>
</body>
</html>

import java.applet.*;
import java.awt.*;
import java.net.*;
import java.io.*;
import java.text.*;

public class TempLanRH01 extends Applet implements Runnable
{
Thread timer;

Graphics OffGC;
Image OffScreenImage;

InetAddress xport_ip = null;
int port = 10001;

int inum01 = 0 ;
int inum02 = 0 ;

int grx = 50 ;
int gry01 = 550 ;
int gry02 = 550 ;

double num01 ;
double num02 ;

Socket xport_socket;
BufferedReader socketin;

String buff;
String buff01;
String buff02;
String sTM = "TM";
String sRH = "RH";

public void initOffGC()
{
OffGC.setColor(Color.black);
OffGC.setFont(new Font("Serif",Font.BOLD,18));
OffGC.drawLine( 45, 550, 750, 550); // 時間軸
OffGC.drawLine( 50, 555, 50, 50); // 温度軸

OffGC.drawLine( 45, 500, 750, 500); // 5℃

OffGC.drawLine( 45, 450, 750, 450); // 10℃

OffGC.drawLine( 45, 400, 750, 400); // 15℃

OffGC.drawLine( 45, 350, 750, 350); // 20℃

OffGC.drawLine( 45, 300, 750, 300); // 25℃

OffGC.drawLine( 45, 250, 750, 250); // 30℃

OffGC.drawLine( 45, 200, 750, 200); // 35℃

OffGC.drawLine( 45, 150, 750, 150); // 40℃

OffGC.drawLine( 45, 100, 750, 100); // 45℃

OffGC.drawLine( 45, 50, 750, 50); // 50℃

OffGC.setColor(Color.blue);
OffGC.drawString("0",30,555);

OffGC.drawString("5",30,505);

OffGC.drawString("10",20,455);

OffGC.drawString("15",20,405);

OffGC.drawString("20",20,355);

OffGC.drawString("25",20,305);

OffGC.drawString("30",20,255);

OffGC.drawString("35",20,205);

OffGC.drawString("40",20,155);

OffGC.drawString("45",20,105);

OffGC.drawString("50",20,55);

OffGC.setColor(Color.green);

OffGC.drawString("0",770,555);

OffGC.drawString("10",760,505);

OffGC.drawString("20",760,455);

OffGC.drawString("30",760,405);

OffGC.drawString("40",760,355);

OffGC.drawString("50",760,305);

OffGC.drawString("60",760,255);

OffGC.drawString("70",760,205);

OffGC.drawString("80",760,155);

OffGC.drawString("90",760,105);

OffGC.drawString("100",750,55);
}

public void init()
{
OffScreenImage = createImage(800,600);
OffGC = OffScreenImage.getGraphics();
try
{
xport_ip = InetAddress.getByName(getCodeBase().getHost());
}

catch(UnknownHostException e){}

try
{
xport_socket = new Socket(xport_ip, port);
socketin = new BufferedReader(
new InputStreamReader(xport_socket.getInputStream()));
}
catch(IOException e){}
initOffGC();

}

public void start()
{
timer = new Thread(this);
timer.start();
}

public void stop()
{
try
{
socketin.close();
xport_socket.close();
}
catch(IOException e){}

timer = null;
}

public void run()
{
Thread me = Thread.currentThread();
while(timer == me)
{
try
{
Thread.currentThread().sleep(100);
}
catch(InterruptedException e){}

try
{
buff = socketin.readLine();
}
catch(IOException e){}

if( buff.equals(sTM) ) {

try
{
buff01 = socketin.readLine(); // 温度データーの読み込み
}
catch(IOException e){}

num01 = Double.parseDouble(buff01);
num01 = 10.0 * num01;
inum01 = (int)num01;

gry01 = -inum01 + 550 ;

}

if( buff.equals(sRH) ) {

try
{
buff02 = socketin.readLine(); // 湿度データーの読み込み
}
catch(IOException e){}

num02 = Double.parseDouble(buff02);
num02 = 10.0 * num02;
inum02 = (int)num02;

gry02 = -inum02/2 + 550 ; // 1/2する事によって、温度表示ようエリアをスケーリングして共用する。

}

String t01 = " " + buff01 + "℃ " + buff02 + "%";

Dimension d = getSize();

if(grx > 750){
grx = 50 ;
OffGC.clearRect(0, 0, d.width, d.height);
initOffGC();
}


Font CurrentFont = OffGC.getFont();

Font font = new Font("MS 明朝" , Font.BOLD , 36);
OffGC.setFont(font);
FontMetrics metrics = getFontMetrics(font);

OffGC.setColor(Color.black);
OffGC.clearRect(0, 0, 400, 40);

OffGC.drawString(t01, 30, 35); // 現在の湿度-湿度を数値で表示

OffGC.setColor(Color.blue);
OffGC.fillOval(grx, gry01, 2, 2);

OffGC.setColor(Color.green);
OffGC.fillOval(grx, gry02, 2, 2);

grx = grx + 2 ;

OffGC.setFont(CurrentFont);

repaint();
}
}

public void paint(Graphics g)
{
g.drawImage(OffScreenImage,0,0,this);
}

public void update(Graphics g)
{
paint(g);
}

public void destroy()
{
OffGC.dispose();
}
}

Lan接続の温度-湿度計がついに90%完成いたしました!

TempLanを単一電源化し、ついでに湿度計を足してしまえ!っていう乗りでしたが、
これがどうして、なかなか一筋縄では行きませんでした。

Lan型温度計と、Lan型湿度計としては、そんなに苦労しないでできてしまったのですが、
2つを一つのシステムの中に混ぜてしまうというのはなかなか思ったよりも大変でした。

元となるPICのアセンブラーが大変で、
プログラムが大きくなると、
今までまともに動いていたはずのものが、
動作がおかしくなって暴走(何もしない)してしまいます。

仕方なしに、
無駄なルーチンをサブルーチンにまとめ直して、
全体を小型化してやっとまともに動きました。

そこまで行くのには、
部分的に動作が正しい事を検証しながら、
だんだん大きくしていって、
おかしくなったら、
サブルーチン化して小型化するを繰り返していきます。

バグで暴走しているのか、アドレスのアクセス範囲を超えてしまったかは、
部分的に実験していくしかありません。

アセンブラーと、Xportを利用する為のJava アプレットの開発を平行して行わなくてはなりません。
これもなかなかの作業です。

Javaがオブジェクト指向の言語であり、そのオブジェクト指向になれていない上に、
Socketというクラスを利用するのですが、初心者のわたしには何を扱っているのかが分かりにくく、
しかも、スレードという技術(平行処理)を利用しなくては今回のような処理はやりにくいので・・・
そのうえ、コンピューター上に文字列表示ではなくて、グラフを書く・・・オフスクリーンの手法も必要で・・・

D/Aコンバート部分ではハードウエアの知識も・・・

えーい、なかなか面白かったじゃねーか!
でも、完璧じゃあ無い!
素人だからかんべんしてくだせぃ!

Java アプレットのままでは、データーの垂れ流しはできても、
外部にファイルとして記録する事が制限されている。

今一度、Java アプリケーションを作って、
外部ファイルとして記録を残せるようにしたい。

今回のおもしろかったところは、転送データーの識別方法だった!
Javaの通信コードは非常に素直なのだ。

英文字はすべてASCIIコードで送り側も、
受け取り側も非常に素直にデーターをやり取りできた。

元々温度データーはバイナリーではなく、
小数点も含めて4文字のASCIIコードで送っている。

そこで、データーを送る前に、”TM"とか、"RH"とか文字列を送って、
受け取る側でいまから何が送られてくるのか判断してやれば良い訳だった!

ところが、Javaがオブジェクト指向であったが為に落居いる初心者のトラップにまんまとはまってしまった。
String クラスのオブジェクトを == で同一判断をやってしまった。何をやっても一致しない。当たり前だった。

こういう場合は、equals()を使用すべしと、様々なJavaの教科書に載っていました。
いやー、初心者、初心者!

本当にいろいろありましたが、趣味だからこの辺で!


注意事項
General disclaimer
トッ プページへ
なお、当ホームページで公開しているデーター(写真、音声)等を個人の枠を超えて複製・転用する事はご遠慮下さいませ。
ご意見/苦情/ご感想はこちらまで