X

Python Instrument Panel(11)SampleーPush Switch

Androidアプリ「GUI Maker for ESP8266 & ESP32 – Python Inst. Panel」を使って、プッシュスイッチの状態を非同期に取得します。最後に載せてあるXMLをAndroidのブラウザでコピーしてアプリにペーストすることでインストールできます。

タイマーで繰り返し状態を問い合わせるのではなく、プッシュスイッチの状態が変化したときにESP8266またはESP32から文字列が送信されます。それをイベントハンドラで処理します。プッシュスイッチを押している間、赤色の四角が青色になります。同時にプッシュスイッチの状態が変化をグラフに表示します。

先ずは、ESP8266またはESP32のArduinoスケッチを変更します。

スケッチ全体は「Python Instrument Panel(2)Arduinoスケッチ」を見てください。最後にある mySetup()myLoop() を変更します。pinModeINPUT_PULLUPにしてプルアップ抵抗を省略します。buttonStateにプッシュスイッチの状態を覚えておき、変化したとき文字列”HIGH”または”LOW”を送信します。

const int buttonPin = 5;
int buttonState = HIGH;

void mySetup() {
  pinMode(buttonPin, INPUT_PULLUP);
}

void myLoop() {
  int newState = digitalRead(buttonPin);
  if (newState != buttonState) {
    buttonState = newState;
    String str = buttonState ? "HIGH" : "LOW";
    Serial.println(str);
    client.println(str);
  }
}

では、パネルを作りましょう。

をタップして編集モードにして、をタップして新規パネルを表示します。

 

パネルに名前を付けておきます。

ExecCodeアイテムを使ってArduinoスケッチの動作を確認しておきます。をタップしてESP8266またはESP32と接続します。下記のPythonコードをExecCodeアイテムに入力してAndroid入力画面から抜けると、イベントハンドラ lineReceived() が登録され、有効になります。

プッシュスイッチを操作して、ログに”HIGH”、”LOW”が表示されることを確認します。

次に、パネルにTextアイテム、PlotViewアイテムを配置します。

Panel setup scriptです。事前にExecCodeアイテムで使ったコードに、表示のためのコードを追加しています。PlotViewの横軸に時刻を表示するため、現在時刻とデータを渡しています。

Items[2].StringFormat = 'HH:mm:ss'
Items[2].ClearData()
Items[2].Invalidate()

def lineReceived(text):
	print text
	if text == 'HIGH':
		Items[1].B = 0xFF0000FF
		Items[2].AddData(DateTime.Now, 1)
	else:
		Items[1].B = 0x0000FFFF
		Items[2].AddData(DateTime.Now, 0)
	Items[2].Invalidate()

Remote.RaiseEvents = True

完成したパネルのPanel contextは次のようになります。Androidのブラウザでコピーして、で追加した新規パネルのPanel context でペースト、さらにで新規パネルが”Push Switch”パネルになります。

<?xml version="1.0" encoding="utf-8"?>
<PanelContext xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <Id>62ef9aa8-03fb-4b14-8e91-7dbe8442b397</Id>
  <PredefinedId>00000000-0000-0000-0000-000000000000</PredefinedId>
  <Name>Push Switch</Name>
  <ItemList>
    <ItemContext>
      <Id>2107a561-1f6e-48b6-9724-a55e522038c0</Id>
      <Index>1</Index>
      <ItemType>3</ItemType>
      <X>210</X>
      <Y>-60</Y>
      <TextW>200</TextW>
      <TextH>100</TextH>
      <TextText />
      <TextFontSize>50</TextFontSize>
      <TextTextAlignment>1</TextTextAlignment>
      <TextF>255</TextF>
      <TextB>4278190335</TextB>
      <TextScript />
      <V1_0_5 />
    </ItemContext>
    <ItemContext>
      <Id>1646e413-ff97-45e2-80e5-b70b41a16199</Id>
      <Index>2</Index>
      <ItemType>6</ItemType>
      <X>0</X>
      <Y>0</Y>
      <PlotViewH>200</PlotViewH>
      <PlotViewText>Push Switch</PlotViewText>
      <PlotViewScript />
      <V1_0_5 />
    </ItemContext>
  </ItemList>
  <CurrentItemId>1646e413-ff97-45e2-80e5-b70b41a16199</CurrentItemId>
  <SetupScript>Items[2].StringFormat = 'HH:mm:ss'
Items[2].ClearData()
Items[2].Invalidate()

def lineReceived(text):
	print text
	if text == 'HIGH':
		Items[1].B = 0xFF0000FF
		Items[2].AddData(DateTime.Now, 1)
	else:
		Items[1].B = 0x0000FFFF
		Items[2].AddData(DateTime.Now, 0)
	Items[2].Invalidate()

Remote.RaiseEvents = True</SetupScript>
  <TeardownScript />
</PanelContext>

 

snoopy: