Archive for 7月 2016
ESP8266 of sensors to display to the iPad
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側でファイルに保存する事も可能です。
🍎 グラフ表示:一応出来た物の耐久性に不具合があり公開を見送りました。
_ 原因は不明で現在 再勉強と調査検討中です。
Control the ESP8266 in iPad
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 間で直接通信するには
_ どうような方法でおこなうのか?
WA-MIKAN
WA-MIKAN(和みかん) 基板は 8月に秋月で販売予定。 2016.07.13
LDOは、新日本無線株式会社の NJM2845DL1-33 800mA。
マイクロSDカードスロット搭載。
詳細:WA-MIKAN(和みかん)説明資料 に詳しく書かれています。
設計者の山本 三七男氏によると
来月発売になるのは、WA-MIKANというボードです。
SD-WiFiボードの発展形です。GR-CITRUSに接続するように作られていますが、
単独でも動作できるように設計しています。
最終回路図は、まだ、公開できていませんが、ほとんど同じものが、
下記URLに公開しています。 、、、と述べています。
:
機能:
WA-MIKAN1.7:資料は内容が詳細に書かれています。
_ USB端子に Fuse(F01)がありボード及び接続するPCのUSBの保護が出来ている。
_ EN端子に 確実な動作の為の Capacitor(C4 0.1uF) がある。
_ RESET端子に Capacitorはない。(スイッチサイエンスも同様)
_ SD Card 用に端子を使用している為、空きの端子を確認する事。
_ 単独で使用する場合:USB接続は別に用意する必要がある。
_ 単独で使用する場合:自動書込みの機能は無い。
_ 単独で使用する場合:外部電源が必要です。
予想価格:他の方からの情報では、「来月、秋月から、、1,000円か980円かで出る」
、、と聞いています。
感想:
LDO:新日本無線株式会社の NJM2845DL1-33 はドロップ電圧が少なく高性能です。
SD CARD Slot: 新たに素晴らしい事が出来る様になります。
_ SDから起動が出来る。
_ SDを交換するだけで異なるスケッチが動作する。
_ 大きなHTML文や画像を沢山保存できる。
_ データーロガーになる。
_ 無線環境が無くともデーターを保持できる。
Learning ESP8266
2016年7月1日、ESPRESSIFはオライリーアニマルブックシリーズに参加し
「Learning ESP8266」を2017年1月に出版するとの事。 2016.07.13
ESP8266 Joins the O’Reilly Animal Books Series:Learning ESP8266
著者はあの有名なAlasdair Allan氏:写真はgithubの画像をリンク。
販売:
Learning ESP8266 は、O’REILLY Shop Books で pre-order中($29.99)です。
著者:
Alasdair Allan氏は「iOS Sensor Apps with Arduino」
「Learning iOS Programming, 2nd Edition」等々多数の著者でもあります。
記憶にあると思いますが、2011年4月に「iPhoneや3G iPadが手に入れましたか?
Appleはあなたの移動を記録しています の件で ビデオでは
「我々はファイルが発見された方法」を議論されています。
Make:Installing and Building an Arduino Sketch,,,2015年4月では、
インストールArduinoのIDEのカスタムビルドは、本当に簡単にできませんでした。
私はMac上だし、、、、”と苦労話が書かれています。
感想:
発売日は 2017年1月で待ちきれない感じです。
オライリーアニマルブックシリーズでの表紙は ゴキブリ? なのでしょうか。コメツキムシでした。
何冊か購入していますが 画像の雰囲気にちょっと戸惑うというか合っている?