macsbug

Archive for 8月 2016

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

How to install OS X

with 2 comments

OS X をインストールする方法。                2016.08.23


OS Xを HDに作成すると以下の様なメッセージがでて インストールが動作しません。
「アプリケーションを検証できません」の意味が解りません。
「ダウンロード中に破損したか不正に変更された可能性があります」には
_ ちょっと たじろぎましたが これは正しくない表示ですね。
「このアプリケーションを削除してから、Mac App Store の購入済み”ページ
_ にアクセスして新しくダウンロードしてください」
_ えっ、削除したりダウンロードしたり そんな面倒な事をするのですか。


原因:アプリケーションが真性なものであるかどうかを検証する為の証明書を
_  アップルが変えてしまった為です。

方法:
1. App Storeでもう一度ダウンロードする。
_  ダウンロードは1時間半くらいかかります。
_  購入記録から削除されている場合 この方法は実施できません。
.
2. マックの日付を変更し 次に OS X Maverics インストール(例) を使用する。
_  準備:各 OS X インストールを用意してください。(一番上の画像)
_  環境設定で日付を2016年2月1日に変更してインストールを動かします。

以上で インストールは動作し30〜50分程度で準備ができインストールできます。

インストール後は環境設定の日付を もとに戻しておきましょう。


感想:
1. OS X を HD に作る事は少ないので知りませんでした。
_  これは2016年2月頃の話なのですね。
2. App Store から DL する時に 購入記録を探し難く 迷いました。
_  友人の場合は 購入記録から削除されて DL できない状態がありました。
3. ターミナルで日付の変更をする方法がありますが 素人には分かり難いです。
4. 各バージョンの OS X インストールは保存しておいた方が良いですね。
_  私は全ての OS X インストールを保存しておき それを使用しました。
5. アップルさん 面倒な事しないで欲しいです。
6. 購入記録が削除されている場合 と OS X インストールが無い場合は
_  どうするのでしょうか。

Written by macsbug

8月 23, 2016 at 2:28 am

カテゴリー: Apple

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