【ラズパイ】ネットワークでセンサーデータを送信する。

前回までの状況はこちら。

今回は実際にセンサーの情報をWindows側に送信したいと思います。

ラズパイ側のPythonソースをこのように作成しました。

import json
import urllib.request
import time
from sense_hat import SenseHat

sense = SenseHat()

url = 'http://192.168.1.3:8000'
headers = {
    'Content-Type': 'application/json',
}

while True:
    temp = int(sense.get_temperature())
    hum = int(sense.get_humidity())
    press = int(sense.get_pressure())
    data = {
        'temperature': temp,
        'humidity': hum,
        'pressure': press,
    }
    req = urllib.request.Request(url, json.dumps(data).encode(), headers)
    with urllib.request.urlopen(req) as res:
        body = res.read()
    time.sleep(1)

センサーから温度、湿度、気圧の測定データを取得し、このデータをJson形式にして送信しています。

この処理を1秒周期で実行します。

最近のWebAPIは送受信するデータの量が増えてきているので、どのようなデータ形式も一行の文字列で表現できるJsonを使用するのが今の一般的です。

Windows側(サーバ側)の出力はこうなりました。(受信側のコードは前回から変更していません。)

温度と湿度は、ラズパイ本体からの熱の影響を受けているので、実際の部屋の中の数値とは異なりますが、まぁ、良い感じです。

【C#】【ピクロス】【ALTSEED】実際にサイズを変更する

前回までの状況はこちら。

最新ソースはこちら。(gitHub)

https://github.com/takishita2nd/Picross

前回はサイズ変更ダイアログに数字を入力するところまでできましたので、今回は実際にその数字を反映させる処理を作成していきます。

まずは、ダイアログからROWとCOLを取得する処理を追加します。

class Dialog
{
        public int GetRowValue()
        {
            return int.Parse(_rowValue);
        }

        public int GetColValue()
        {
            return int.Parse(_colValue);
        }

これをダイアログを表示する側で使用します。

        dialog.SetAction(() =>
        {
            dialog.Hide();
            int row = dialog.GetRowValue();
            int col = dialog.GetColValue();
            while(row != drawSquares.Count)
            {
                if(drawSquares.Count > row)
                {
                    var rowList = drawSquares[drawSquares.Count - 1];
                    foreach(var c in rowList)
                    {
                        asd.Engine.RemoveObject2D(c.getBackTexture());
                    }
                    drawSquares.RemoveAt(drawSquares.Count - 1);
                }
                else
                {
                    List<DrawSquare> rowList = new List<DrawSquare>();
                    for (int c = 0; c < drawSquares[0].Count; c++)
                    {
                        var square = new DrawSquare(drawSquares.Count, c);
                        asd.Engine.AddObject2D(square.getBackTexture());
                        rowList.Add(square);
                    }
                    drawSquares.Add(rowList);
                }
            }
            while(col != drawSquares[0].Count)
            {
                if(drawSquares[0].Count > col)
                {
                    foreach(var r in drawSquares)
                    {
                        asd.Engine.RemoveObject2D(r[r.Count - 1].getBackTexture());
                        r.RemoveAt(r.Count - 1);
                    }
                }
                else
                {
                    int rowindex = 0;
                    int colindex = drawSquares[0].Count;
                    foreach (var r in drawSquares)
                    {
                        var square = new DrawSquare(rowindex, colindex);
                        asd.Engine.AddObject2D(square.getBackTexture());
                        r.Add(square);
                        rowindex++;
                    }
                }
            }
        });

SetAction()には、ダイアログでOKをクリックしたときに実行される処理をラムダ式で記述しています。

ダイアログを非表示にすると同時にROW、COLを取得し、その値に合わせて実際のピクロスのサイズを変更します。

ROWの値を変えると縦方向にマスが増えたり減ったり、COLの値を変えると横方向に、という感じです。

これはまずはROW、COLが増えたかどうかを判断し処理を変える必要があります。

ROWを変える場合は、マスのLISTオブジェクト

List<List<DrawSquare>> drawSquares

これの一番外のLISTを追加、削除します。

COLを変える場合は内側のLISTにオブジェクトを追加、削除します。

あと、実際に動かしてみて分かったのですが、エンジンにテクスチャなどのオブジェクトを追加する順番によって表示に影響が出る(後に追加した方が上に上書きされる)ので、

それを防ぐために、テクスチャの描画プライオリティを設定する必要がありました。

今回は

マスオブジェクト<<<<<ダイアログ<<パレット

の順番にプライオリティを設定しました。

動作結果はこうなりました。

ようやくここまで来たかって感じです。

次回はピクロス解析のカギとなる数字を入力する部分を作成していきます。