Python Instrument Panel(9)SampleーColor LED


Androidアプリ「GUI Maker for ESP8266 & ESP32 – Python Inst. Panel」を使って、Color LEDの色を操作します。最後に載せてあるXMLをAndroidのブラウザでコピーしてアプリにペーストすることでインストールできます。

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

スケッチ全体は「Python Instrument Panel(2)Arduinoスケッチ」を見てください。最後にある process() を変更します。Androidアプリから”R:255″等の文字列を送るとColor LEDに加わる電圧が変化します(PWMですが)。

String process(String str) {
  Serial.println(str);
  
  if (str.startsWith("R:")) {
    int r = str.substring(2).toInt();
    analogWrite(12, r * 4);
  }
  else if (str.startsWith("G:")) {
    int r = str.substring(2).toInt();
    analogWrite(13, r * 4);
  }
  else if (str.startsWith("B:")) {
    int r = str.substring(2).toInt();
    analogWrite(14, r * 4);
  }
  
  return "";
}

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

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

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

ExecCodeアイテムを使ってArduinoスケッチの動作を確認しておきます。をタップしてESP8266またはESP32と接続します。下記のPythonコードをExecCodeアイテムに入力してAndroid入力画面から抜けると、ESP8266またはESP32に”R:255″、”G:0″、”B:0″という文字列が送信され、Color LEDが赤色になります。

ExecCodeアイテムのPythonコードを変更して、緑色単色、青色単色にできることを確認します。

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

赤色用SliderのScriptです。変数valueに0~1の実数が渡されるので255を掛けて0~255の整数に変換しています。赤色用InputFieldにその整数を表示しています。また”R:<整数>”形式の文字列にしてESP8266またはESP32に送信しています。

r = int(value * 255)
Items[7].Text = str(r)
msg = 'R:%d' % r
print msg
if Remote.Writer != None:
	Remote.Writer.WriteLine(msg)
	Remote.Writer.Flush()

InputFieldのScriptには数値を入力したときの処理を書いておきます。

r = int(text)
Items[4].Value = r / 255

ButtonのScriptには三色のSliderの値を0にする処理を書いておきます。

Items[4].Value = 0
Items[5].Value = 0
Items[6].Value = 0

三色のSliderの値で色を変化させたいItems[10]のTextアイテムのために、Panel setup scriptに関数UpdateColor()を用意します。

各色のSliderのScriptから呼びます。

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

<?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>a0cb7781-65d4-460d-b48b-966ade1a5244</Id>
  <Name>Color LED</Name>
  <ItemList>
    <ItemContext>
      <Id>65419806-cb21-461c-879e-bed5465dd3e2</Id>
      <Index>1</Index>
      <ItemType>3</ItemType>
      <X>20</X>
      <Y>-30</Y>
      <TextW>45</TextW>
      <TextH>45</TextH>
      <TextText>R</TextText>
      <TextFontSize>24</TextFontSize>
      <TextTextAlignment>1</TextTextAlignment>
      <TextF>4294967295</TextF>
      <TextB>4278190335</TextB>
      <TextScript />
      <V1_0_5 />
    </ItemContext>
    <ItemContext>
      <Id>99ba1caf-39f8-4216-ac4d-6d97a79a94b6</Id>
      <Index>2</Index>
      <ItemType>3</ItemType>
      <X>20</X>
      <Y>-90</Y>
      <TextW>45</TextW>
      <TextH>45</TextH>
      <TextText>G</TextText>
      <TextFontSize>24</TextFontSize>
      <TextTextAlignment>1</TextTextAlignment>
      <TextF>4294967295</TextF>
      <TextB>16711935</TextB>
      <TextScript />
      <V1_0_5 />
    </ItemContext>
    <ItemContext>
      <Id>579657ca-e0c6-4f93-8c35-8af662b275c6</Id>
      <Index>3</Index>
      <ItemType>3</ItemType>
      <X>20</X>
      <Y>-150</Y>
      <TextW>45</TextW>
      <TextH>45</TextH>
      <TextText>B</TextText>
      <TextFontSize>24</TextFontSize>
      <TextTextAlignment>1</TextTextAlignment>
      <TextF>4294967295</TextF>
      <TextB>65535</TextB>
      <TextScript />
      <V1_0_5 />
    </ItemContext>
    <ItemContext>
      <Id>7f7c43a0-b0c9-4e5b-8610-28f582bddce3</Id>
      <Index>4</Index>
      <ItemType>2</ItemType>
      <X>70</X>
      <Y>-30</Y>
      <SliderW>300</SliderW>
      <SliderH>45</SliderH>
      <SliderValue>0.34117648</SliderValue>
      <SliderInterval>0.1</SliderInterval>
      <SliderScript>r = int(value * 255)
Items[7].Text = str(r)
UpdateColor()
msg = 'R:%d' % r
print msg
if Remote.Writer != None:
	Remote.Writer.WriteLine(msg)
	Remote.Writer.Flush()
</SliderScript>
      <V1_0_5 />
    </ItemContext>
    <ItemContext>
      <Id>611400e1-2389-458f-a583-bb7bac6154e8</Id>
      <Index>5</Index>
      <ItemType>2</ItemType>
      <X>70</X>
      <Y>-90</Y>
      <SliderW>300</SliderW>
      <SliderH>45</SliderH>
      <SliderValue>1</SliderValue>
      <SliderInterval>0.1</SliderInterval>
      <SliderScript>g = int(value * 255)
Items[8].Text = str(g)
UpdateColor()
msg = 'G:%d' % g
print msg
if Remote.Writer != None:
	Remote.Writer.WriteLine(msg)
	Remote.Writer.Flush()
</SliderScript>
      <V1_0_5 />
    </ItemContext>
    <ItemContext>
      <Id>e283ef11-7a7a-4e45-ac0e-6c3abed54ca1</Id>
      <Index>6</Index>
      <ItemType>2</ItemType>
      <X>70</X>
      <Y>-150</Y>
      <SliderW>300</SliderW>
      <SliderH>45</SliderH>
      <SliderValue>0</SliderValue>
      <SliderInterval>0.1</SliderInterval>
      <SliderScript>b = int(value * 255)
Items[9].Text = str(b)
UpdateColor()
msg = 'B:%d' % b
print msg
if Remote.Writer != None:
	Remote.Writer.WriteLine(msg)
	Remote.Writer.Flush()
</SliderScript>
      <V1_0_5 />
    </ItemContext>
    <ItemContext>
      <Id>92ad5805-dc45-4e3d-9290-336888ed499c</Id>
      <Index>7</Index>
      <ItemType>1</ItemType>
      <X>380</X>
      <Y>-30</Y>
      <InputFieldW>70</InputFieldW>
      <InputFieldH>45</InputFieldH>
      <InputFieldText>87</InputFieldText>
      <InputFieldFontSize>24</InputFieldFontSize>
      <InputFieldScript>r = float(text)
Items[4].Value = r / 255</InputFieldScript>
      <V1_0_5 />
    </ItemContext>
    <ItemContext>
      <Id>9b3b8dc9-6368-4e2f-ab7a-d6ac7d442128</Id>
      <Index>8</Index>
      <ItemType>1</ItemType>
      <X>380</X>
      <Y>-90</Y>
      <InputFieldW>70</InputFieldW>
      <InputFieldH>45</InputFieldH>
      <InputFieldText>255</InputFieldText>
      <InputFieldFontSize>24</InputFieldFontSize>
      <InputFieldScript>g = float(text)
Items[5].Value = g / 255</InputFieldScript>
      <V1_0_5 />
    </ItemContext>
    <ItemContext>
      <Id>50a61200-382e-43b7-85ff-6cc96ed00696</Id>
      <Index>9</Index>
      <ItemType>1</ItemType>
      <X>380</X>
      <Y>-150</Y>
      <InputFieldW>70</InputFieldW>
      <InputFieldH>45</InputFieldH>
      <InputFieldText>0</InputFieldText>
      <InputFieldFontSize>24</InputFieldFontSize>
      <InputFieldScript>b = float(text)
Items[6].Value = b / 255</InputFieldScript>
      <V1_0_5 />
    </ItemContext>
    <ItemContext>
      <Id>fee38201-2fd2-4a55-8011-ebeba3608dfa</Id>
      <Index>10</Index>
      <ItemType>3</ItemType>
      <X>460</X>
      <Y>-30</Y>
      <TextW>160</TextW>
      <TextH>165</TextH>
      <TextText />
      <TextFontSize>24</TextFontSize>
      <TextTextAlignment>0</TextTextAlignment>
      <TextF>255</TextF>
      <TextB>1476329727</TextB>
      <TextScript />
      <V1_0_5 />
    </ItemContext>
    <ItemContext>
      <Id>d588b751-e2a0-46bc-a756-0dc7f73897c7</Id>
      <Index>11</Index>
      <ItemType>0</ItemType>
      <X>460</X>
      <Y>-210</Y>
      <ButtonW>160</ButtonW>
      <ButtonH>60</ButtonH>
      <ButtonText>Reset</ButtonText>
      <ButtonFontSize>24</ButtonFontSize>
      <ButtonTextAlignment>1</ButtonTextAlignment>
      <ButtonScript>Items[4].Value = 0
Items[5].Value = 0
Items[6].Value = 0</ButtonScript>
      <V1_0_5 />
    </ItemContext>
  </ItemList>
  <CurrentItemId>92ad5805-dc45-4e3d-9290-336888ed499c</CurrentItemId>
  <SetupScript>def UpdateColor():
	r = int(Items[4].Value * 255)
	g = int(Items[5].Value * 255)
	b = int(Items[6].Value * 255)
	Items[10].B = (r &lt;&lt; 24) + (g &lt;&lt; 16) + (b &lt;&lt; 8) + 0xff
</SetupScript>
</PanelContext>