macsbug

Just another WordPress.com site

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 @ 2:49 am

カテゴリー: ESP8266, Pythonista

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト / 変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト / 変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト / 変更 )

Google+ フォト

Google+ アカウントを使ってコメントしています。 ログアウト / 変更 )

%s と連携中

%d人のブロガーが「いいね」をつけました。