macsbug

Archive for the ‘Pythonista’ Category

YEN rate displayed in Pythonista3

with 3 comments

円レートを iPad に表示するアプリを Pythonista 3 で作りました。      2016.09.24

1ドルを円に換算した値を表示し ” 101.1 ” と音声で知らせ、数値の変化をグラフ表示します。



 

海外(ebay)の部品を購入する時にブラウザーで円レートを見て購入しています。
毎回 アクセスするのは面倒ですので iPad に表示するアプリを作りました。
円高のタイミングに購入し 安くできると いいかなと思っています。


 

機能:
1、1ドルに対する現在の円レートを表示し、金額を「音声」で知らせてくれます。
2、1日、5日、3ヶ月、1年、2年、5年間のグラフを順次表示します。
3、間隔を置いてリアルタイムに表示します。


 


感想:
たいしたソフトではありませんが自分で作った物が動くと楽しいものです。
基本は「為替レート変換君」のデーター取得先を使用しています。
リンク先のデーターをテキストフィールドやウエブビューに表示するものです。
音声で金額を教えてくれるのはチョットいい感じです。

 


レイアウト:Script with UI での配置です。


追記:2018.02.17
円レートを表示しません:以前からですが 2018年2月17日 現在、円レートを表示しません。
_ ブラウザーで 以下の URL 「為替レート変換君」は 1ドル何円かは表示しますが
_ ドルチャートは表示されていません。
_ http://fx.monegle.com/fx.php?rate=1&q=USD
_ よって iPad では 2018年2月17日 現在、ドルチャートの表示が無い為に
_ 円レートを表示しません。
_ 理由は Yahoo Finance からデータが取得できない為です。
_ Yahoo iCharts API は 段階的に廃止されているらしく 何回もAPIが更新されては廃止され
_ の繰りしている様です。
_ その URL は setup の url です。よって 他の方法を模索する事になるかと思います。
_ この件は ネットで検索すると幾つか記事がでてきます。


スクリプト:


import requests
import ui
import time
import speech
import sound

def web(url):
	re = requests.get('http://fx.monegle.com/fx.php?rate=1&q=USD')
	d1 = str(re.text)
	d2 = d1.find('Bid:')
	d3 = d1[d2+4:d2+4+8]
	v['textfield1'].text = str(round(float(d3),2))
	sound.play_effect('Ding_3')
	speech.say(str(round(float(d3),1)))
	for i in range(6):
		v['textfield2'].text = str(url[i][47:49]).upper()
		v['webview1'].load_url(url[i])
		time.sleep(5)
	v['textfield2'].text = str(url[2][47:49]).upper()
	v['webview1'].load_url(url[2])

# setup
url = ['http://ichart.finance.yahoo.com/z?s=USDJPY=X&t=1d&l=on&z=m&a=v&p=s&q=1',
       'http://ichart.finance.yahoo.com/z?s=USDJPY=X&t=5d&l=on&z=m&a=v&p=s&q=1',
       'http://ichart.finance.yahoo.com/z?s=USDJPY=X&t=3m&l=on&z=m&a=v&p=s&q=1',
       'http://ichart.finance.yahoo.com/z?s=USDJPY=X&t=1y&l=on&z=m&a=v&p=s&q=1',
       'http://ichart.finance.yahoo.com/z?s=USDJPY=X&t=2y&l=on&z=m&a=v&p=s&q=1',
       'http://ichart.finance.yahoo.com/z?s=USDJPY=X&t=5y&l=on&z=m&a=v&p=s&q=1',
       'http://ichart.finance.yahoo.com/z?s=USDJPY=X&t=3y&l=on&z=m&a=v&p=s&q=1']
v = ui.load_view('_en')
v.background_color = '#d3dad7'
v.present('sheet') 

# main
while True:
	web(url)
	time.sleep(60)


Written by macsbug

9月 24, 2016 at 7:50 am

カテゴリー: Apple, Pythonista

Pythonista Beginner : Part 3

leave a comment »

GitHubから repo をダウンロードする方法。「GitHubGet.py」を試す。 2016.08.28


GitHubGet.py」は、クリップボードに URL をコピーし実行 すると
自動的に目的のファイル ( 例:GitHubGet-mester ) ができます。


経緯:
Pythonista Beginner : Part 2で 使用した「github_download.py」は
クリップボードにURLをコピーして 実行しますが 入力や解凍操作が必要でした。
「GitHubGet.py」はクリップボードに URL をコピーのみでダウンロードします。


入手方法:「GitHubGet.py」を入手する。
_ 初回は直接「GitHubGet.py」をコピーするか
_ Pythonista Beginner : Part 2の「github_download.py」の方法で入手します。


事例:jsbain の Audio.py をダウンロードしてみます。
_ Audio.py の URL をコピーする。
_ GitHubGet.py を実行する。
_  メモ:Pythonista 3 の場合は 事前に Python 2 to 3 の変換を実行しておく事。
_ 2cf4998… ファイルができ ファイルの中には Audio.py ができます。



感想:
「GitHubGet」を公開された jsbain に感謝致します。
先人達が素晴らしい多くの実例やサンプルを公開されており感謝致します。
これらの実例やサンプルは ほとんど紹介されていない為に 備忘録としました。


 

Written by macsbug

8月 28, 2016 at 1:02 am

カテゴリー: Apple, Pythonista

Pythonista Beginner : Part 2

leave a comment »

GitHub の ファイル を Pythonista 3 に ダウンロード する方法。    2016.08.15



.
編集では ネット上のファイルを ダウンロードする場面が多くあります。
ダウンロードの操作方法は 手間で 時間を費やす事もあります。
xxx.py と xxx.zipスクリプトでダウンロードする方法をまとめました。
これによりファイル操作が容易になり 開発がスムーズに行えます。


概要:
1. ファイルの種類: 「xxx.py」「xxx.pyui」「xxx.zip」があります。
2. スクリプトで入手: 「github_download.py」を使用します。
3. URL: URL を入力するとファイルが ダウンロード されます。
4. 結果: xxx.py や xxx.pyui ができます。zip は xxx.zip ができます。
5. 場所: 作成されるファイルの場所は 「githib_download.py」の場所か
_      Shared Folderに出来ます。
使用環境:
_ iPad 3 iOS 9.3.3 + Pythonista 3 ( 有料:1200円)
_ iMac 27int OSX 10.8.5


 項目: 方法は以下の4つの手順です。
1. ファイルの URL を取得します。
2. github_download.py:このスクリプトでファイルをダウンロードします。
3. github_download.py を実行します
4. ダウンロードの結果と zip ファイルの解凍。


 方法:
1. ファイルの URL を取得します。
_  xxx.py を直接示す URL 又は RW ボタンを開いた時の URL です。
_  以下の様に コピーすると簡単です。URL はクリップボードに入ります。

_ zip File の場合は 以下の様に URL をコピーすると簡単です。

 


 2. github_download.py:このスクリプトでファイルをダウンロードします。
_  参考:bin フォルダー:Pythonista Beginning:
_   2. ptinstaller.py を iPad (Pythonista) に読み込む。
_   最下部に「おさらい:ptinstaller.py の入手と bin フォルダーの作成方法」
_  参考:Pythonista-Tools / Pythonista-Tools / github_download にある。

bin フォルダーの中にある
「github_download.py」
を動かします。

github_download.py の場所:
bin /
GitHub Tools /
github_download /
github_download.py

 


 3. github_download.py を実行する
_ 直前にURLをコピー済みの時は入力欄への入力は不要です。以下の様に
_ 入力済みになっています。末尾に .py や .zip がある事を確認します。
_ その後「Download」と「OK」を選択するだけになります。

方法1で既にURLをコピー済み
の場合はURL欄への入力は不要。
.
未入力の場合はURLを入力し
「Download」を選択する。
方法1で既にURLをコピー済み
の場合はURL欄への入力は不要。
.
未入力の場合は名前を入力し
「OK」を選択する。
zip は名前に「.zip」を付ける。
スクリプトは「.py」を付ける。

 4. ダウンロードの結果と zip ファイルの解凍:

master.zip が 保存されました。
zip の解凍方法:
Extract Archive… ボタンを押すと
解凍され master というフォルダー
が出来ます。フォルダーの中は
xxx.py 等が できます。

 


 補足: スクリプトのチェック方法

マークを選択。
Python 2 to 3 を選択。
変換の種類はUse 2to3 を選択。
修正の必要がある時は 線が引かれ
変更内容は緑色で表示されます。
Apply を押すと 変更されます。

 


 おさらい: ptinstaller.py の入手と bin フォルダーの作成方法。
入手方法:以下のスクリプトを記述し 実行して ptinstaller.py を DL する。
:
import requests as r
o=open(‘ptinstaller.py’,’w’)
o.write(r.get(‘https://raw.githubusercontent.com/ywangd/pythonista-tools-installer/master/ptinstaller.py’).text)
o.close()
:
bin フォルダーの作成方法:
ptinstaller.py を実行すると Fun から Utilitys のメニューがでます。
全てか Github Tools をインストールすると bin フォルダー ができます。
その bin フォルダの中に github_download.py スクリプトがあります。


 感想:
1. スクリプトを作り始めると ネットからのファイルのダウンロードが
_  意外と不便です。  ダウンロードする方法は いろいろありますが
_  スクリプトで ダウンロードする方法 が 既にありました。
_  Pythonista 3上で全てが出来ない為と 忘れる事もあり備忘録としました。
_  そして スクリプトが多くなるとフォルダーの整理が必要になってきます。
2. 課題:Pythonista 3 に組み込まれていない Module のインストール方法が
_     不明。例として matplotlib で使用してみたい Module があります。


 

Written by macsbug

8月 14, 2016 at 2:17 pm

カテゴリー: Apple, Pythonista

Display the graph on the iPad

leave a comment »

ESP8266 のセンサーを iPad でグラフ表示しました。           2016.08.08

リアルタイムにグラフ表示し変化をモニターできます。
日本語音声で「温度は27度です」とか話してくれたり 測定時の動作状況を
サウンドで教えてくれたり 離れていても耳で知ることができます。
音声やサウンドでお知らせしてくれるのは なかなか楽しいですよ。

iOSデバイス上で動作する統合開発環境の Pythonista 3 で製作しました。


機能:
1. ESP8266 BME280 温度、湿度、気圧センサーのデータを受信します。
2. 数値表示:スイッチをオンにすると日本語音声で数値を発音します。
_       温度、湿度、気圧 の必要なものを聞く事ができます。
3. グラフ :現在測定値は右端に表示し リアルタイムに左に移動します。
4. 測定間隔:左下のスイッチで「秒」「分」「時」「日」を選択します。
_       例:[分]は「3分間隔で測りますね」「今33分です」と発音。
5. 動作状態:「時」スイッチの上にあるトグルスイッチ。
_      オンにすると測定時(受信時)にサウンドが鳴ります。


準備:
1. ESP8266 と BME280 を I2C(4本) で接続。
_  ESP8266 : WeMos D1 mini with TELEC:SDA=D6(12), SCL=D7(13)
2. iPad 3 iOS 9.3.3 + Pythonista 3
3. iMac 27int OSX 10.8.5
4. パネルのデザインは画像を参照願います。


ESP2866 と iPad の信号の流れ:

1. iPad   :起動時に ESP8266 へ モード信号 (秒:”1″) を送信する。
2. ESP8266:それを受けて 6秒間隔モードに設定する。
3. ESP8266:iPadへ 6秒モードを送信する。
4. iPad   :ESP8266 からの返事(“1”)により スイッチ(秒)を点灯(緑)。
5. iPad   :EPP8266 からのデーターを受信し表示を繰り返します。

6. iPad   :測定間隔を変更:スイッチでモードをEP8266 へ送る。
7. ESP8266:測定間隔を切り替え モードの返事を iPad へ送る。
8. iPad   :ESP8266 からの返事により スイッチを緑に点灯します。

9. ESP8266:設定された時間間隔で 測定値を iPad へ送り続けます。


.
🍎 グラフを Ui 画面に表示する方法:
1. Pythonモジュール は import matplotlib.pyplot as plt を記述する。
2. 配列された x,y のデーターを用意する。例:x[1,2,3,4],y[3,2,5,7]
3. UI 編集で imageview (画像)の枠を用意する。名前は _panel とする。
4. v = ui.load_view(‘_panel’) で UI を読み込む。名前は v となる。
5. plt.plot(x,y) で Console へ抽画。( Coonsoleの表示は plt.show() )
6. plt.savefig(‘pic.png’) で Console の画像をファイルに保存する。
7. v[‘imageview1’].image = ui.Image.named(‘pic.png’)
_  で保存された画像を UI の imageview (v) に表示する。
メモ:Python の グラフ抽画は Console に表示(plt.show)されます。(5)
_  iPad は imageview に表示します。 (7)
.
🍎 日本語音声を出力する方法:
1. Pythonモジュール は import speech を記述する。
2. speech.say(‘こんにちわ’)
.
🍎 サウンド(sound) を使用する方法:あのマックのコインの音です。
1. Pythonモジュール は import sound を記述する。
2. sound.play_effect(‘Coin_1’)
.
🍎 スイッチ(Switch) の使用方法:

1. スイッチをオン( Action ) すると スイッチ操作音を出す。
_ def son(s):sound.play_effect(‘Click_1’)
_ UI の編集で Switch の「Action」項目に「son」と記述する。
_  Switch が 押されると def son に飛んで来て記述内容が動作します。
.


参考:
warning about too many open figures:pyplotで作ったデータをcloseする事。


感想:
1. Pythonista 3:7月末から始め 知識不足が多々ある中で作りました。
_  スクリプトは不十分な部分が多いと思いますのでご容赦を。
_  製作方法:ほとんどネットで調べて作りました。
_   図書館や本屋に行きましたが 使用できる場面は かなり少なかったです。

2. 問題点:
_  耐久テストが少ない為に 時間経過でクラッシュするかもしれません。
_  おそらく Matplotlib の pyplot で画像を多数作る時に問題があると予想
_  します。グラフ範囲の xlim,ylim は影響が大きく使用しない方が良い。
_  :
_  グラフを見ると言う事は iPad の電源を入れっぱなしにする事になる。
_  そうすると 充電しながらでも電源が持たないかもしれません。

3. 使用感:音声やトーンは楽しい。
_  グラフに興味はある物の 日常ではグラフを見つめ続ける事は少ない。
_  1行で簡単に音声が追加できますので楽しいですね。
_  音声によるアクションや説明は解り易く面白いものです。
_  ただし 音声は多様すると うるさく なるかもしれません。

4. Pythonista ( Python ) の命令:非常に多く大変ですが 凄さに驚くばかりです。
_  複数のグラフを重ねて表示とか目盛りを別々表示とかの機能が凄い!
_  今回のスクリプトよりも もっと良い記述の方法があるかと思います。
_  iPad の UI 機能を駆使する事がポイントですが 現在 情報が少ないです。
_  特に高速グラフィックの方法はなかなか難しそうです。


Pythonista 3:スクリプト

# ipad temp,humi,pres display : 2016.08.08 macsbug
#						rev 1 : 2016.08.11 macsbug
# phthonista 3, ios 9.3.3
import socket
import ui
import numpy as np
import matplotlib.pyplot as plt
import time
import Image
import sys
import datetime
import speech
import os
import sound
import math
from matplotlib.ticker import *

def udp_transceiver(s):					#
	tx.sendto(bytes(s, 'utf-8'), (HOST, PORT))
	
def udp_receiver(s):					#
	global d1, d2, temp, humi, pres, mode, sw
	d1 = str(rx.recv(32), 'utf-8')		# d1 = 't/1/0/0'
	d2 = d1.split('/')					# b/23.45/45.65/1008.235
	mode = d2[0]						# mode
	temp = d2[1]						# temp
	humi = d2[2]						# humi
	pres = d2[3]						# pres
	if mode == 't':sw = d2[1]			# time interval switch

def sw1(s): udp_transceiver('1')		# sw1
def sw2(s): udp_transceiver('2')		# sw2
def sw3(s): udp_transceiver('3')		# sw3
def sw4(s): udp_transceiver('4')		# sw4

def son(s): sound.play_effect('Click_1')# switch sound

def all_of_switch(s):					# button off
	v['button1'].background_color = of	# 1
	v['button2'].background_color = of	# 2
	v['button3'].background_color = of	# 3
	v['button4'].background_color = of	# 4
	
def bot(bot1, bot2, bot3, bot4):		#
	all_of_switch('')					#
	v[str(bot2)].background_color = on	#
	speech.say(str(bot4))				#
	speech.say('現在' + str(bot1) + str(bot3) + 'です')
	
def audio(a1, a2, a3): speech.say(str(a1) + str(a2) + str(a3))

def clocktime(s):						#
	global tm, clock					#
	d = datetime.datetime.today()		# clock time
	tm[4] = d.day; tm[3] = d.hour		# clock time
	tm[2] = d.minute; tm[1] = d.second	# clock time
	v['textfield5'].text = str(d)[0:19]	# datetime display
	clock = tm[int(sw)]					# clock time select
	
# start -------------------------------------------------------
# panel setup --------------------------#
v = ui.load_view('_BME_panel')			# panel install
v.background_color = '#d3dad7'			# panel color
on = '#b0ffb7';of = '#c5c5c5'			# sw on/off color
v['label7'].text = ''					# axis y
v['textfield5'].text = 'start'			# 
all_of_switch('')						# all sw off
v.present('sheet')						# panel in view

# udp setup
HOST, PORT = '192.168.100.47', 7000	# ESP8266 ip, port
rx = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
rx.bind(('', 9000))						# ipad tx port
tx = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)

# variavle setup -----------------------#
speech.say('こんにちわ')					# hello
temp, humi, pres, clock = 0, 0, 0, 0	#
tm = [0, 0, 0, 0, 0]					# clock
mode, d1 = 'a', 't/1/0/0'				# mode t/d, rx data
d2 = [0, 0, 0, 0]						# mode,temp(sw),humi,pres
sw = 1									# time interbal sw
x1 = 60									# x max
sound_onoff = 'off'						# sound on/off sel

# udp check ----------------------------#
udp_transceiver('1')					# ipad -> ESP8266
udp_receiver('');	c = 0				# return check
ret = mode + sw							# return check
while (ret) != 't1':					# return check
	v['textfield5'].text = str(ret)		# ret signal
	udp_transceiver('1')				# re tx
	udp_receiver(''); c = c + 1			# re rx
	vs = '接続できませんでした'			# fail
	if c > 100: speech.say(str(vs))		# fail count

x1 = 60									# sw 1
v['button1'].background_color = on		# sw 1 lamp on
sound.play_effect('Coin_1')				# rx ok

# receive data check -------------------#
udp_receiver('')						# first receive
while mode != 'd'						# return check
v['textfield5'].text = str(d1)			# rx data display
if mode == 'd':							# mode d check
	msg = str(mode) + ' : error'		# error message
	v['textfield5'].text = str(msg)		# error message
	udp_receiver('')					# re mode ck

v['textfield5'].text = str(d1)			# rx data
sound.play_effect('Coin_2')				# rx ok
ty = [temp for i in range(0, 60)]		# temp array setup
hy = [humi for i in range(0, 60)]		# humi array setup
py = [pres for i in range(0, 60)]		# pres array setup
# graph set up -------------------------#
pd = 5									# pres diff
ph = int(float(pres)) + pd				# pres hi
pl = int(float(pres)) - pd				# pres lo
xp = [i for i in range(0, 60)]			# x_line
fig = plt.figure()						# graphics setup
ax1 = fig.add_subplot(111)				# temp, hum
ax2 = ax1.twinx()						# pres axis
ax1.grid(True); ax2.grid(True)			# temp,humi,pres axis

# ==============================================================
# main routine
while True:
	udp_receiver('')					# receive
	clocktime('')						# clock time	
	# ------------------------------------------------------------
	# switch mode : time interval setup
	if mode == 't':sound.play_effect('Coin_1')
	if mode == 't' and sw == '1':
			bot(tm[1], 'button1', '秒', '6秒間隔で測ります')
			x1 = 60; xp = [i for i in range(0, x1)]
	if mode == 't' and sw == '2':
			bot(tm[2], 'button2', '分', '3分間隔で測りますね')
			x1 = 60; xp = [i for i in range(0, x1)]			
	if mode == 't' and sw == '3':
			bot(tm[3], 'button3', '時', '1時間間隔で測りますよ')
			x1 = 24; xp = [i for i in range(0, x1)]			
	if mode == 't' and sw == '4':
			bot(tm[4], 'button4', '日', '8時間毎に測りますね')
			x1 = 7; xp = [i for i in range(0, x1)]
	if mode == 't': plt.xlim(0, x1)		# x axis
		
	# ------------------------------------------------------------
	# data mode : digital display, sound on/off switch
	if mode == 'd':
		if sound_onoff == 'on': sound.play_effect('Ding_3')
		
		v['textfield1'].text = temp; ti = round(float(temp))
		v['textfield2'].text = humi; hi = round(float(humi))
		v['textfield3'].text = pres; pi = round(float(pres))
		v['textfield4'].text = str(clock)

		if v['switch1'].value: audio('温度は', ti, 'どです')
		if v['switch2'].value: audio('湿度は', hi, '%です')
		if v['switch3'].value: audio('気圧は', pi, 'ヘクトパスカルです')
		if v['switch4'].value: sound_onoff = 'on'
		else:sound_onoff = 'off'

		# -----------------------------------------------------------
		# graphics
		ty.pop(0); hy.pop(0); py.pop(0)				# left
		ty.append(temp); hy.append(humi); py.append(pres)# add data
		ph = int(float(pres)) + pd; pl = int(float(pres)) - pd
		
		ax1.plot(xp, ty, color='#2cff00', lw='1')	# temp graph
		ax1.plot(xp, hy, color='#b780ff', lw='1') 	# humi graph
		ax2.plot(xp, py, color='#2be3ff', lw='1')	# pres graph		
		ax2.plot(x1, ph, color='#ffffff', lw='0')	# pres hi
		ax2.plot(x1, pl, color='#ffffff', lw='0')	# pres lo
		
		plt.savefig('_a.png')		# save the graph on the consolen
		v['imageview1'].image = ui.Image.named('_a.png') # imageview
		plt.cla()					# clear axis
		plt.close()					# close a figure window
		fig = plt.figure()			#
		ax1 = fig.add_subplot(111)	#
		ax2 = ax1.twinx()			#
		ax1.grid(True)				#
		ax2.grid(True)				#
	
#------------------------------------------------------------

ESP8266 スケッチ:

// BME280 Temo,Humi,Pres Sensor: ESP8266 & iPad : 2016.08.01 macsbug
// ESP8266 : WeMos D1 mini with TELEC
// UDP communication
// ESP8266(ip:192.168.100.47,port:9000) transmit ---|
// ipad   (ip:192.168.100.22,port:9000) receive  <--|
//
// ipad   (ip:192.168.100.22,port:7000) transmit ---|
// ESP8266(ip:192.168.100.47,port:7000) receive  <--|

#include <ESP8266WiFi.h>                         //
#include <WiFiUDP.h>                             //
#include <Wire.h>                                //
#include <BME280_MOD_1022.h>                     //
#include <Ticker.h>                              //
extern "C" {                                     //
  #include "user_interface.h"                    //
}                                                //
static WiFiUDP UDP;                              //
const char ssid[]="xxxx";                        // wifi ssid
const char pass[]="xxxx";                        // wifi password
const char iPhoneIP[]   = "192.168.100.22";      // iPhone iP
const int  iPhoneTxPort = 7000;                  // UDP Tx port
const int  iPhoneRxPort = 9000;                  // UDP Rx port
char buff[32];                                   // rxceive buffer
Ticker ticker1;                                  // timer
long ta =  -6.5;                                 // temp adjust
long ha = +10.6;                                 // humidity adjust
long pa =  +3.5;                                 // press adjust

void setup(){                                    //
  Serial.begin(115200);                          //
  pinMode(D4, OUTPUT);digitalWrite( D4, LOW);    //
  pinMode(D3, OUTPUT);digitalWrite( D3, LOW);    //
  pinMode(D0, OUTPUT);digitalWrite( D0, LOW);    //
  //---------------------------------------------// BME280 setup
  Wire.begin(D6, D7);                            //
  BME280.readCompensationParams();               //
  BME280.writeOversamplingTemperature(os2x);     // temperature x2
  BME280.writeOversamplingHumidity(os2x);        // humidity x2
  BME280.writeOversamplingPressure(os2x);        // pressure x2
  //---------------------------------------------// WiFi setup
  WiFi.begin(ssid,pass);                         //
  while( WiFi.status() != WL_CONNECTED) {        //
    delay(500);  Serial.print(".");              //
  }                                              //
  Serial.println("WiFi Connect");                //
  UDP.begin(iPhoneTxPort);                       //
  ticker1.attach_ms(6000, report);               //
}                                                //

void loop(){                                     //         
  ESP.wdtDisable();                              //
  int rx = UDP.parsePacket();                    // packet size
  if (rx){                                       // recive
    int len = UDP.read(buff, rx);                // rx lengs
    if (len > 0){                                // rx action
      digitalWrite(D0,HIGH);                     //
      ticker1.detach();                          // timer off
      buff[len] = '\0';                	         // Termination char
      int c = buff[0];                           // header
      String r = "0";                            // No
      long t;                                    // time
      if ( c == '1' ){ r = "1"; t =     6*1000;} // 1:    3s: 60 sec
      if ( c == '2' ){ r = "2"; t =   180*1000;} // 2:  180s: 60 min
      if ( c == '3' ){ r = "3"; t =  4320*1000;} // 3: 4320s: 24 hr  1day
      if ( c == '4' ){ r = "4"; t = 30240*1000;} // 4:30240s:168 hr  7day
      //-----------------------------------------// UDP Transmitt
      String data = "t/" + r + "/0/0";           //
      UDP.beginPacket(iPhoneIP, iPhoneRxPort);   // UDP port
      UDP.print(data);                           // Tx  data
      UDP.endPacket();                           // end packet
      //-----------------------------------------// UDP Transmitt
      Serial.println(data);                      //
      digitalWrite(D0,LOW);                      //
      ticker1.attach_ms(t, report); c = '9';     // t timer set & mesure   
    }                                            //
  }                                              // 
}                                                // 

void report(){                                   //
  digitalWrite(D3,HIGH);                         //
  ESP.wdtDisable();                              //
  //---------------------------------------------// BME280 sensor
  BME280.writeMode(smForced); delay(50);         // chip goes back to sleep
  digitalWrite(D4,HIGH);                         //
  while (BME280.isMeasuring()){delay(250);}      //
  digitalWrite(D4,LOW);                          // BME280 check
  BME280.readMeasurements();                     // read out the data
  String t = String(BME280.getTemperature()+ta); // Temp
  String h = String(BME280.getHumidity()   +ha); // Humidity
  String p = String(BME280.getPressure()   +pa); // Pressure 
  String c = String(int(millis()/1000));         // count
  String data = "d/" + t + "/" + h + "/" + p;    // id+temp+html+pres
  //---------------------------------------------// UDP Transmitt
  UDP.beginPacket(iPhoneIP, iPhoneRxPort);       // UDP port
  UDP.print(data);                               // Tx  data
  UDP.endPacket();                               // end packet
  Serial.println(data);                          //
  digitalWrite(D3,LOW);                          //
  //---------------------------------------------// UDP Transmitt
}                                                //

Written by macsbug

8月 8, 2016 at 11:48 am

カテゴリー: ESP8266, Pythonista

Pythonista Beginner : Part 1

leave a comment »

Pythonista 3 ことはじめ。「ファイルの取り扱い方法」        2016.08.02

iOSデバイス上で動作する統合開発環境の Pythonista 3 の 初心者備忘録。


.
Pythonista 3 の利点:
例えば 日本語の音声発音がたったの1行で可能ですし グラフは3行で表示が可能です。
これを Arduino や ESP8266 で行うには相当な困難があります。
画面のボタンを押したり表示する時に日本語音声で解り易く表現する事が可能な訳です。
古い話ですが「HyperCard」のような事が楽に出来る訳です。
これで 電子工作と iPad が繋がる事になります。
.

.
Apple製品の扱い難い点:
iPad は 一部をApple社が閉じた製品にしている為に 扱い難い面があります。
たとえば現在 FTP接続において読み込みはできるが書込みは出来ません。
編集する上でこれは不便です。今回はこのファイルの扱い方法をまとめました。
.
注:初回の記事の為 必要に応じて内容の追加や変更をするかも知れません。

ファイルの取り扱い方法。 結論:4. の方法をお勧めします。   追記:2016.08.03

. iPad のファイルを マック へ転送する方法。

. iPad Pythonista 3 に GitHub や Gist にあるスクリプトを取り込む方法。

. マック から iPad Pythonista 3 へ転送する方法。       改訂:2016.08.03

. iPad Pythonista3 を マックのブラウザー上で編集と転送する方法。
_                              追記:2016.08.03

5. その他、ブラウザー上のリストを使用する方法。

使用環境:
_ iPad 3 iOS 9.3.3 + Pythonista 3 ( 有料:1200円)
_ iMac 27int OSX 10.8.5  (以後 マック と表記)

. iPad のファイルを マック へ転送する方法。
_  iPadとiMacをHTTPサーバーにして iPad から マック へファイルを読む。
.
_ iPad:以下の SimpleHTTPServer を入力しサーバーを動かす。
.

import http.server
import socketserver
import webbrowser
PORT = 8000
Handler = http.server.SimpleHTTPRequestHandler
httpd = socketserver.TCPServer(('', PORT), Handler)
print ('serving at port', PORT)
httpd.serve_forever()

.
_ マック:ターミナル(Terminal)で以下を入力しサーバーを動かす。

python -m SimpleHTTPServer 8000

_ ターミナルに Serving HTTP on 0.0.0.0 port 8000 … が表示される。

.
_  マック のブラウザーで iPadのIP (例:http://192.168.100.22:8000) を入力する。
_ 例:__SmpleHTTPServer.py を入手する。
.

.
_ マック(Mac)にファイルが取れました。

.
_ そのリストの中味:きちんと取れています。


. iPad Pythonista 3 に GitHubや Gist にあるスクリプトを取り込む方法。
.
_ 例:ywangd / pythonista-tools-installer の下に「 ptinstaller.py」 があります。
_   この 「 ptinstaller.py」を iPad (Pythonista) に読み込みます。
_ 注:この方法は 多数を検証した訳では無く 読み込めない時もあります。
.

.
事前に必要なファイルのURLをメモしておく。
以下のスクリプトにファイル名とURLを記載し Pythonistaの編集画面に入力し実行する。
実行はダイレクト入力欄でも良い。(右下、> の所)
メモ:ptinstaller.py は 読み込むファイル名 で iPad の Pythonista 内に保存するファイル
_  名である。他のファイルを実行する場合は 目的の名前に変更する事。
_  注:以下は3行で書かれていますが 連続した命令です。
_  詳細:o=open(‘ptinstaller.py’,’w’)  で iPad 内にファイル名ができ
_     Pythonista Tools Installer から読み込み
_     読み込んだ ptinstaller.py を iPad へ書込み クローズします。
.

import requests as r; o=open('ptinstaller.py','w'); 
o.write(r.get('https://raw.githubusercontent.com/
ywangd/pythonista-tools-installer/master/ptinstaller.py').text); o.close()

.

.
ptinstaller.py (左) が保存されました。(右)はそのリスト。

.
ptinstaller.py:
_ Pythonista Tools Installer でスクリプトが集約された物です。
_ このサンプルを活用すればかなりな事ができると思います。
_ ptinstaller.py を実行すると以下のようなメニューが表示されます。
_ 選択して「Install」ボタンを押すとスクリプトがインストールされます。
_  binフォルダーができ 種類別のフォルダーやスクリプトが保存されます。
_ スクリプトは139個もあり これだけあれば素晴らしい開発環境になります。
_ 直ぐ動く物は少ないですが修正で動く物もありリストは参考になります。
_ bin Folderの中のPypi Modules Folder にインストールのサンプルがあります。


. マック から iPad Pythonista 3 へ転送する方法。その1
.
1. 画像1:1. と同様に iPad と マック で SimpleHTTPServer を起動します。
_   マック の IP は 192.168.100.4 とします。
_   iPad のブラウザーに 「192.168.100.4:8000」を入力すると マック(Mac)の
_   中が見えます。該当するファイルを選択し URL をコピーします。
2. 画像2:URL を iPad の スクリプトにファイル名(2行目) と
_      URL(3行目)にペーストし動かします。
3. 画像3:iPad にファイルが読み込めました。
.
画像1:iPad で 読み込むファイルのURLを取得する。

.
画像2:iPad で 読み込むファイル名とURLを設定し動かす。(赤い文字)

.
画像3:iPad Pythonista3 へ読み込まれました。


. iPad Pythonista3 を マックのブラウザー上で編集と転送する方法。
_  スクリプト WeBIDE を使用する方法。
1. 画像1:iPad Pythonista 3 の Pythonista 2 Documents フォルダーの中に
_      WebIDE-masterフォルダーがあります。この WebIDE.py を動かします。
_      iPad の IP は 192.168.100.22 とします。
_      WebIDE.py を動かすと Console に IP が示されます。
_      その IP をブラウザーに入力すると 双方が接続されます。
2. 画像2:マック のブラウザーで 192.168.100.22:8080 を入力。
_      編集画面にリスト名とリストを入力し Save ボタンを押す。
_      注:日本語文字ははSaveすると iPad 側で文字化けを起こします。
3. 画像3:iPad にファイルが読み込めました。
4. 画像4:マック のブラウザーで OPen メニューをプルダウンすると
_      iPad Pythonista3 のファイルが表示されます。ファイルを選択すると
_      スクリプトが読み込まれます。注:.py ファイルのみです。
.
画像1:WebIDE.py を動かす。

.
画像2:マックのブラウザー上で編集し Save する。
.

.
画像3:iPad Pythonista3 へ読み込まれました。

.
画像4:OPen メニューで スクリプト を読み込めます。注:.py ファイルのみです。


5. その他、ブラウザー上のリストを使用する方法。
_  ブラウザーに表示されたリストをなぞりコピーし 編集画面へ貼付ける。
_  RAW ボタンのあるリストは全体を選択してコピーする。
_  短いリストは簡単でなんとかできるが すこぶる面倒である。
_  こういう方法では通常のリストしかできない。

参考:
MygeekDaddy.net:Roll your own AirDrop with Pythonista
_ Pythonistaアプリ内のファイルをMac上に保存する。
random($foo):Pythonista and iOS Automation:幾つかの非常に厄介な制限と回避策。
how to install modules:gz, zip ファイルを iPad へ読み込む方法。
Pythonista Tools Installer:Pythonista Tools Installerのインストール方法。
ywangd / pythonista-tools-installer:Pythonista Tools Installerのインストール方法。
MyGeekDaddy.net:Roll your own AirDrop with Pythonista:SimplHTTPServerの方法。
pythonista tools:サンプルがある。

感想:
🍎 ファイルの取り扱いは Pythonista スクリプトの WebIDE.py を使用する事で解決
_   しました。いろいろ調べて試した結果で多数を試していません。
_   今後 新しい方法が見つかるかも知れません。
💻 Pythonista は 7月末からの初心者でさっぱり解りません。
💻 iPadをマックにUSB接続しても Pythonista のドキュメントエリアには繋がらず。
_  幾つかの FTP接続を試したがロックがかかり マックから iPadへは書き込めない。
_  試した事:DiskAID, iMazing, iExplorer, FTPソフト, FileTransfer 等々試す。
_  マックへの読み込みが出来たのは iMazing とFTPソフトのみ。
_  マックからの書込みはどれも出来ず。
💻 外部モジュールのインストール:pipコマンドで外部モジュールを取り込む
💻 パッケージのインストール:幾つかの方法があり出来た物もあった。
💻 課題:外部モジュールや他のファイルの取り込み方法がまだ不明。
💻 課題:2の方法でGoogle Drive に保存し ファイルやモジュールを読み込めるか。
💻 
💻 まだ 入り口ですが 画像やトーン,音声,グラフ等々が数多くの命令で簡単に作れる
_  事が解る。これには あのハイパーカード(HyperCard)以上の物を感じました。


 

Written by macsbug

8月 2, 2016 at 4:23 am

カテゴリー: Apple, Pythonista

ESP8266 of sensors to display to the iPad

leave a comment »

ESP8266 に接続したセンサーの値を iPad に表示しました。       2016.07.29
開発は iOSデバイス上で動作する統合開発環境 Pythonista 3 を使用します。


機能と動作:
ESP8266に接続したBME280センサーの 温度,湿度,気圧 を数値で表示します。
下のスイッチは ESP8266 からデーターを送る時間間隔を設定します。


準備:

1. iPad:Pythonista 3 (1200円) がインストール済みである事。
_  パネルデザイン:UI 編集機能を使用し パネルのデザインを行います。
_  下記の Pythonista のリストをインストール。
2. ESP8266:BME280(紫色のボード) を I2C 接続。
_  下記の ESP8266 のリストをインストール。
3. WiFi 環境


参照:macsbug:Control the ESP8266 in iPad:前回記事。


 

UDP通信:Pythonista (Python)と ESP8266 の基礎。
_    注:勉強不足により記述が不十分かも知れません。





iPad pythonista 3 リスト 2016.07.29 : macsbug


import socket
import ui
import time

def sw1(s):tx.sendto(bytes('1', 'utf-8'), (HOST, PORT))
 
def sw2(s):tx.sendto(bytes('2', 'utf-8'), (HOST, PORT))
 
def sw3(s):tx.sendto(bytes('3', 'utf-8'), (HOST, PORT))
 
def sw4(s):tx.sendto(bytes('4', 'utf-8'), (HOST, PORT))

def sw5(s):tx.sendto(bytes('5', 'utf-8'), (HOST, PORT))

def all(s):
 v['button1'].background_color = on
 v['button2'].background_color = of
 v['button3'].background_color = of
 v['button4'].background_color = of
 v['button5'].background_color = of
 
v = ui.load_view('panel_thp')
v.background_color = '#d3dad7'
v.present('sheet')
HOST, PORT = '192.168.100.47', 7000
rx = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
time.sleep(1)
rx.bind(('', 9000))
tx = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
on = '#d7ffb9'
of = '#bdbdbd'
all('')

while True: 
 d1 = str(rx.recv(32)) # d1 = b'4233/33.85/36.39/1009.90'
 t1 = d1.find('/')
 a1 = d1.find('/', t1+1, len(d1))
 a2 = d1.find('/', a1+1, len(d1))
 mode = d1[2:t1]
 t = mode + d1[t1+1:t1+2]
 if mode == 'd':                           # sensor data
 v['textfield1'].text = d1[t1+1:a1-1]      # temp
 v['textfield2'].text = d1[a1+1:a2-1]      # humi
 v['textfield3'].text = d1[a2+1:len(d1)-2] # pres
 
 if mode == 't':                           # time data
 all('')
 v['button1'].background_color = of
 
 if t.find('t1') > -1:v['button1'].background_color = on
 
 if t.find('t2') > -1:v['button2'].background_color = on
 
 if t.find('t3') > -1:v['button3'].background_color = on
 
 if t.find('t4') > -1:v['button4'].background_color = on
 
 if t.find('t5') > -1:v['button5'].background_color = on

 

ESP8266 スケッチ

// BME280 Temo,Humi,Pres Sensor: ESP8266 & iPad : 2016.07.20 macsbug
// UDP communication
// ESP8266(ip:192.168.100.47,port:9000) transmit ---|
// ipad   (ip:192.168.100.22,port:9000) receive  <--
// ipad   (ip:192.168.100.22,port:7000) transmit ---
// ESP8266(ip:192.168.100.47,port:7000) receive  <--|

#include <ESP8266WiFi.h>                         //
#include <WiFiUDP.h>                             //
#include <Wire.h>                                //
#include <BME280_MOD_1022.h>                     //
#include <Ticker.h>                              //
extern "C" {                                     //
  #include "user_interface.h"                    //
}                                                //
static WiFiUDP UDP;                              //
const char ssid[]="xxxx";                        // wifi ssid
const char pass[]="xxxx";                        // wifi password
const char iPhoneIP[]   = "192.168.100.22";      // iPhone iP
const int  iPhoneTxPort = 7000;                  // UDP Tx port
const int  iPhoneRxPort = 9000;                  // UDP Rx port
char buff[32];                                   // rxceive buffer
Ticker ticker1;                                  // timer
long ta =  -5.3;                                 // temperatue adjust
long ha = +16.7;                                 // humidity   adjust
long pa =  +3.5;                                 // press      adjust

void setup(){                                    //
  Serial.begin(115200);                          //
  //---------------------------------------------// BME280 setup
  Wire.begin(D6, D7); delay(10);                 // SDA, SCL 12,13
  BME280.readCompensationParams();               // read the NVM comp parameters
  BME280.writeOversamplingTemperature(os1x);     // 1x over sampling
  BME280.writeOversamplingHumidity(os1x);        // 1x over sampling
  BME280.writeOversamplingPressure(os1x);        // 1x over sampling
  //---------------------------------------------// WiFi setup
  WiFi.begin(ssid,pass);                         //
  while( WiFi.status() != WL_CONNECTED) {        //
    delay(500);  Serial.print(".");              //
  }                                              //
  Serial.println("WiFi Connect");                //
  UDP.begin(iPhoneTxPort);                       //
  ticker1.attach_ms(3000, report);               //
}                                                //

void loop(){                                     //         
  ESP.wdtDisable();                              //
  int rx = UDP.parsePacket();                    // packet size
  if (rx){                                       // recive
    int len = UDP.read(buff, rx);                // rx lengs
    if (len > 0){                                // rx action
      ticker1.detach();                          // timer off
      buff[len] = '\0';                          // Termination char
      int c = buff[0];                           // header
      String r = "0";                            // No
      long t;                                    // time
      if ( c == '1' ){ r = "1"; t = 3*1000;}     // 1,  3 sec
      if ( c == '2' ){ r = "2"; t = 5*60*1000;}  // 2,  5 min
      if ( c == '3' ){ r = "3"; t = 15*60*1000;} // 3, 15 min
      if ( c == '4' ){ r = "4"; t = 30*60*1000;} // 4, 30 min
      if ( c == '5' ){ r = "5"; t = 60*60*1000;} // 5, 60 min
      //-----------------------------------------// UDP Transmitt
      String data = "t/" + r + "/ / ";           //
      UDP.beginPacket(iPhoneIP, iPhoneRxPort);   // UDP port
      UDP.print(data);                           // Tx  data
      UDP.endPacket();                           // end packet
      //-----------------------------------------// UDP Transmitt
      ticker1.attach_ms(t, report);              // t timer set & measure   
      c = '9';                                   //
    }                                            //
  }                                              // 
}                                                // 

void report(){                                   //
  ESP.wdtDisable();                              //
  //---------------------------------------------// BME280 sensor
  BME280.writeMode(smForced);  delay(50);        // chip goes back to sleep
  while (BME280.isMeasuring()){delay(50);}       // BME280 check
  BME280.readMeasurements();                     // read out the data
  String t = String(BME280.getTemperature()+ta); // Temperature
  String h = String(BME280.getHumidity()   +ha); // Humidity
  String p = String(BME280.getPressure()   +pa); // Pressure 
  String c = String(int(millis()/1000));         // count
  String data = "d/" + t + "/" + h + "/" + p;    // id+temp+html+pres
  //---------------------------------------------// UDP Transmitt
  UDP.beginPacket(iPhoneIP, iPhoneRxPort);       // UDP port
  UDP.print(data);                               // Tx  data
  UDP.endPacket();                               // end packet
  //---------------------------------------------// UDP Transmitt
}                                                //


 

感想:
🍎 製作時間:前回(Control the ESP8266 in iPad)を基に短時間にできました。
🍎 パネルのデザイン:奇麗に作る事が出来 楽しくなります。
🍎 送信の間隔:ESP8266からのデーター送信の時間間隔は iPad から送り
_    ESP8266 の Ticker の Timer 値を設定します。 その設定状態は
_    iPad へ返信し スイッチに色で表示します。
🍎 表示方法:今回 表示は数値のみにしました。
🍎 費用対効果:iPad,iPhone をすでにお持ちでしたら有効に使用できます。
_   Pythonista 3 は有料で1200円ですが アイデア次第で多くの事が出来る
_   可能性があります。この点を考慮すると安いと思われます。
_   ESP8266 でコントローラーや表示装置を作るとこれ以上に費用と手間
_   が必要です。又 ブラウザーに表示する方法は HTML記述の複雑化や行
_   数が大きくなり負担になる事や表現に限界があります。
🍎 データーの保存:ESP8266でSDを使用すれば可能である。
_         iPad側でファイルに保存する事も可能です。
🍎 グラフ表示:一応出来た物の耐久性に不具合があり公開を見送りました。
_   原因は不明で現在 再勉強と調査検討中です。


 

Written by macsbug

7月 29, 2016 at 2:49 am

カテゴリー: ESP8266, Pythonista

Control the ESP8266 in iPad

with 3 comments

iPad で ESP8266 をコントロールする iPadアプリを作りました。      2016.07.28
電子工作で iPad や iPhone との連携が容易に出来る様になります。
開発は iOSデバイス上で動作する統合開発環境 Pythonista 3 を使用します。


 

機能と動作:
1:iPad   :押したスイッチの信号をESP8266へ送る。
2:ESP8266:iPadからの信号でLEDの状態を把握しLEDをオンかオフにする。
3:ESP8266:LEDのオンオフ状態をiPadへフィードバックする。
4:iPad   :LEDがオンならスイッチを橙色、オフなら灰色にする。
5:iPad   :All Clear スイッチで全てのLEDをオフにし、2,3,4 を行う。
6:iPad   :Raed スイッチで ESP8266 LED の状態を読み込み 表示する。


 

iPhone, iPad の iOSアプリに Pythonista 3 (パイソニスタ)開発言語があります。

Pythonista 3:
_ iPad 上で編集し動作も可能。
_ Apple に開発費を支払う必要がない。
_ Pythonista 3 上や サイトに 詳細な Document がある。
_ Python の多くの記事やサンプルが使用できる。
_ サンプルが多数有り、UI 編集機能 の道具もあります。(以下の画像)
:
ユーザーインターフェース( UI )編集機能:
_ パネルデザイン:以下の様に UI 編集機能を使用しパネルのデザインを行います。
_ 部品の色や名前、アクション名(例:sw1)を設定し命令と接続できるようにします。


 

準備:
1. iPad:Pythonista 3 をインストール。(1200円)
_ パネルデザイン:UI 編集機能を使用し パネルのデザインを行います。
2. ESP8266 + LED:GPIO端子にLEDを接続。
3. WiFi 環境
4. iPad:UDP_test 又は UDP Tool+:UDP通信の確認。必要に応じで使用します。
_ UDP通信の物は 幾つかありますので無料のアプリを試してみてください。
5. Pythonista 3 の使用方法を練習してください。


 

通信方法と信号の流れ:
UDP通信( socket )で行い 家庭内のネットを使用します。
例:iPad IP = 192.168.100.22 , ESP8266 IP = 192.168.100.47
iPad 送信 → IP,PORT → ESP8266 : iPadからESP8266へ信号を送信する。
_ 例:iPad(192.168.100.22, 送信port=7000) →
_      → ESP8266(192.168.100.47, 受信port=9000)
iPad 受信 ← IP,PORT ← ESP8266 : ESP8266の信号をiPadで受信する。
_ 例:iPad(192.168.100.22, 受信port=9000) ←
_      ← ESP8266(192.168.100.47, 送信port=7000)


 

UDP通信の基礎

iPad UDP送信
例:”1″ を送信する。受信側のESP8266 の IP は ‘192.168.100.47’, Port=7000

import socket

HOST, PORT = '192.168.100.47', 7000
tx = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
tx.sendto(bytes('1', 'utf-8'), (HOST, PORT))

iPad UDP受信
例:変数 d1 へ受信データーを入れる。受信の長さは 12 とした。Port=9000

import socket

rx = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
rx.bind(('', 9000))
d1 = str(rx.recv(12), 'utf-8')

メモ:UDP通信が それぞれ たったの4行で出来ます。
メモ:SOCK_DGRAM:UDPに使用する。21.21.4.2. socketserver.UDPServer Example
メモ:Pythonista 3 の編集は文字間のスペースや行間のスペースが必要です。


 

UDP通信の確認:
以下のiOSアプリでUDP通信の確認ができます。必要に応じて実施してみてください。
iPad:UDP_test アプリ(無料)による確認:
_ ESP8266への送信やESP8266からの受信の確認ができます。
_ このアプリが無ければ別のUDPアプリを探してください。

例:ESP8266 へ BME280 センサーを接続しUDP通信を行う。
上が iPadの送信:Sendボタンで “1” を IP=192.168.100.47,Port=7000 に送信。
下が iPadの受信:”1″ → ESP8266 → iPad(192.168.100.22,Port=9000) で受信。
_ ”1″ に対する受信内容は:t/1/ /
_ センサー の受信内容は:d/30.91/52.25/1007.13


Pythonista リスト:

import ui
import socket
import time

def sw1(s):tx.sendto(bytes('1', 'utf-8'), (HOST, PORT))
	
def sw2(s):tx.sendto(bytes('2', 'utf-8'), (HOST, PORT))
	
def sw3(s):tx.sendto(bytes('3', 'utf-8'), (HOST, PORT))
	
def sw4(s):tx.sendto(bytes('4', 'utf-8'), (HOST, PORT))

def sw5(s):tx.sendto(bytes('5', 'utf-8'), (HOST, PORT))
	
def sw6(s):tx.sendto(bytes('6', 'utf-8'), (HOST, PORT))
	
def clr(s):tx.sendto(bytes('0', 'utf-8'), (HOST, PORT))

def rea(s):tx.sendto(bytes('7', 'utf-8'), (HOST, PORT))
		
v = ui.load_view('cont_pnl')
v.background_color = '#d3dad7'
v.present('sheet')
HOST, PORT = '192.168.100.47', 7000
rx = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
time.sleep(1)
rx.bind(('', 9000))
tx = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
on = '#ff6161'
of = '#5d5d5d'

while True:
	d1 = str(rx.recv(12), 'utf-8')
	
	if d1.find('1H') > -1:v['button1'].background_color = on
	
	if d1.find('1L') > -1:v['button1'].background_color = of
	
	if d1.find('2H') > -1:v['button2'].background_color = on

	if d1.find('2L') > -1:v['button2'].background_color = of
	
	if d1.find('3H') > -1:v['button3'].background_color = on
	
	if d1.find('3L') > -1:v['button3'].background_color = of
	
	if d1.find('4H') > -1:v['button4'].background_color = on
	
	if d1.find('4L') > -1:v['button4'].background_color = of
	
	if d1.find('5H') > -1:v['button5'].background_color = on
	
	if d1.find('5L') > -1:v['button5'].background_color = of
	
	if d1.find('6H') > -1:v['button6'].background_color = on
	
	if d1.find('6L') > -1:v['button6'].background_color = of
		
	d1 = ''

メモ:v.present(‘sheet’) : UIをデザインした大きさで表示。
メモ:v.present(”)   : UIを全画面の大きさで表示。
メモ:def sw1(s):tx.sendto(bytes(‘1’, ‘utf-8’), (HOST, PORT)):sw1を押したら”1″を送信する。
メモ:v = ui.load_view(‘cont_pnl’):UI cont_pnl を読み込み v と表現する。
メモ;d1 = str(rx.recv(12), ‘utf-8’):ESP8266のデーターを受信し d1 へ入れる。
メモ:if d1.find(‘1H’) > -1:v[‘button1’]:受信に”1H”があるならSW 1を橙色(on)にする。


 

ESP8266スケッチ:

 
// ESP8266 UDP transceiver and Receiver         // 2016.07.28 macsbug
// http://4009.jp/post/2016-04-25-esp-wroom-02/ 
#include <ESP8266WiFi.h>                        //
#include <WiFiUDP.h>                            //

WiFiUDP UDP;                                    //
char buff[32];                                  //
const char ssid[]="xxxx";                       // wifi ssid
const char pass[]="xxxx";                       // wifi password
const char iPhoneIP[]   = "192.168.100.22";     // iPhone iP
const int  iPhoneTxPort = 7000;                 // UDP Tx port
const int  iPhoneRxPort = 9000;                 // UDP Rx port
String all;                                     //
 
void setup()                                    //
  Serial.begin(115200);Serial.println();        //
  pinMode(D0, OUTPUT); digitalWrite(D0, LOW);   // 16, LED off
  pinMode(D1, OUTPUT); digitalWrite(D1, LOW);   //  5, LED off 
  pinMode(D2, OUTPUT); digitalWrite(D2, LOW);   //  4, LED off 
  pinMode(D3, OUTPUT); digitalWrite(D3, LOW);   //  0, LED off 
  pinMode(D4, OUTPUT); digitalWrite(D4, LOW);   //  2, LED off 
  pinMode(D5, OUTPUT); digitalWrite(D5, LOW);   // 14, LED off
  WiFi.softAP(ssid, pass);                      // WiFi connect
  UDP.begin(iPhoneTxPort);                      // iPhoneTxPort
}                                               //
 
void loop() {                                   //
  ESP.wdtDisable();                             //
  int rx = UDP.parsePacket();                   // packet size
  if (rx){                                      // recive
    int len = UDP.read(buff, rx);               // rx lengs
    if (len > 0){                               // rx action
      buff[len] = '\0';                         // Termination char
      int c = buff[0];                          // head haracter
      if ( c == '0' ){ all_clear();}            // 0, all off
      if ( c == '1' ){ sw(16, 1);}              // 1, LED 1 on/off
      if ( c == '2' ){ sw( 5, 2);}              // 2, LED 2 on/off
      if ( c == '3' ){ sw( 4, 3);}              // 3, LED 3 on/off
      if ( c == '4' ){ sw( 0, 4);}              // 4, LED 4 on/off
      if ( c == '5' ){ sw( 2, 5);}              // 5, LED 5 on/off
      if ( c == '6' ){ sw(14, 6);}              // 6, LED 6 on/off
      if ( c == '7' ){ allread();}              // 7, all read
      c = '9';                                  //
    }                                           //
  }                                             //
}                                               //

void sw(int gpio, int n){                       // gpio feed back
  if ( digitalRead(gpio) == 0 ){                // gpio ck = LOW
       digitalWrite(gpio, HIGH);                // SET LED ON 
       UDP.beginPacket(iPhoneIP, iPhoneRxPort); // UDP
       UDP.print( String(n) + "H");             // return LED ON 
       UDP.endPacket();                         // UDP
  } else {                                      // gpio ck = HI
       digitalWrite(gpio, LOW );                // SET LED OFF
       UDP.beginPacket(iPhoneIP, iPhoneRxPort); // UDP
       UDP.print( String(n) + "L");             // return LED OFF 
       UDP.endPacket();                         // UDP
  }                                             //
}                                               //

void all_clear(){                               // led all cler
  ESP.wdtDisable();                             //
  all = "";                                     //
  digitalWrite(D0, LOW); io(16, 1);             // 16 = LOW
  digitalWrite(D1, LOW); io( 5, 2);             //  5 = LOW 
  digitalWrite(D2, LOW); io( 4, 3);             //  4 = LOW 
  digitalWrite(D3, LOW); io( 0, 4);             //  0 = LOW 
  digitalWrite(D4, LOW); io( 2, 5);             //  2 = LOW 
  digitalWrite(D5, LOW); io(14, 6);             // 14 = LOW
  UDP.beginPacket(iPhoneIP, iPhoneRxPort);      // UDP feed back
  UDP.print( all );                             // 1L2L3L4L5L6L
  UDP.endPacket();                              // UDP
}

void allread(){                                 //
  ESP.wdtDisable();                             //
  all = "";                                     //
  io(16, 1);                                    // 16 = read
  io( 5, 2);                                    //  5 = read
  io( 4, 3);                                    //  4 = read 
  io( 0, 4);                                    //  0 = read
  io( 2, 5);                                    //  2 = read 
  io(14, 6);                                    // 14 = read
  UDP.beginPacket(iPhoneIP, iPhoneRxPort);      // UDP feed back
  UDP.print( all );                             // 1x2x3x4x5x6x
  UDP.endPacket();                              // UDP
}                                               //

参照:
Pythonista 3:A Full Python IDE for iOS
Pythonista 3:Pythonista Documentation
ひとりぶろぐ:iOS上で動作する革命的ものづくり環境「Pythonista 3」の魅力をとくと語る
りんごがでている:PythonistaのためのJulia100問100答
hanaken_Nirvana:~Pythonistaより愛をこめて贈る入門者のためのTips①~
hanaken_Nirvana:~Pythonistaより愛をこめて贈る入門者のためのTips②~
scipy-lectures.org:1.4. Matplotlib: plotting
matplotlib.org:matplotlib


感想:
🍎 iPad や iPhone を電子工作のディスプレーやコントローラーに使用できると
_ 素晴らしい事が出来る。そこで 基本的なUDP通信ソフトを作り動きました。
_ これにより だれでも開発ができる様になれば良いかなと思っています。
🍎 経過:Python言語が全く解らない状態で始め1行の理解に1日かかる状態。
_ それでもなんとか動作する様になると楽しくなってきますね。
_ 理解すれば動くという事。進めて行くと この言語の凄さに驚く!
_ なんと数行で数値計算をグラフやウエブの内容を表示できる事に驚く!
_ グラフではヒストグラムを1行でできる事にも驚嘆する。
_ さらに Python 言語の記事やサンプルは多数有り 先人の知識を使用できる。

🍎 Pythonista 3 : ひとりぶろぐ氏の記事、、
_ 「iOS上で動作する革命的ものづくり環境「Pythonista 3」の魅力をとくと語る
_ で触発されました。是非 お読みください。感謝!
🍎 UDP通信:7of9氏の「UDPで送信できた」を参照させて頂きました。感謝!

🍎 Pythonista 3 編集機能:指やパネルキーで出来る様になっている。
_ キー入力は予想を立てた文字が表示され押すだけで命令を一気に入力できる。
_ 色の数値を設定するにはカーソルを起き 指で押すとカラーパネルが出て来て
_ 色を選択してInstallすると命令に追加される。、、いやはや驚きの連続!

🍎 自作例:ESP8266からの温度,湿度,気圧を iPad で受信し数値で表示できた
_ 事とグラフに表示できました。工夫すれば ThingSpeek等のクラウドを使用
_ した方法は不要になるかも知れません。
_ その後に今回のコントローラーを作り今回の記事にしました。
🍎 フィードバック機能:電子工作で重要な機能はフィードバックが出来る事。
_ それが出来ると自動制御が可能になると言う訳ですね。
🍎 課題:家庭内のネットを使用せず iPad と ESP8266 間で直接通信するには
_ どうような方法でおこなうのか?


 

Written by macsbug

7月 28, 2016 at 8:42 am

カテゴリー: ESP8266, Pythonista