Arduino 電力量計 DIY 17-3 色気を出して大失敗!

3692.jpg

LCDがI2C接続できるようになったので、
ついでに小さな箱へ組込み変更したまでは良かったのだが・・・
LCDをパラレル接続していたボードを壊してI2C接続をした。

すると、何故かアナログ入力が正常に動作しなくなった!
割込み処理している関係だと思うのだが・・・
LCDのI2C接続ライブラリーの影響だと考えられる
困った。

違いを調査中なのだけど
分からない
温度計測とLCD表示はちゃんと動作する
割込み処理中の I2Cライブラリーによる温度計測は稼働しているが
LCD表示とは相性が悪い

また、パラレル接続アダプターを作るかな~~~(参った)

ちゃんと動作確認してから、壊さないといけませんね

Arduino 電力量計 DIY 17-2 iphone でメッセージを受信する方法(LINE Notify) 続き

LINEへメッセージ転送するサーバー と RSSサーバー の2つに分離
LCDを付加して10秒ごとに発電量や温度などを表示する事にした
3683.jpg
1個で処理しているとハングアップする時が有るので安全重視で機能分割しました。

CPUボード自体は安い(505円-->780円と値上げ)のだが
電源アダプターやLCDが余分に必要なのが出費かな?
メモリーに余裕が有りすぎて持ったいない!

それにしても電力量計のArduino MEGA のメモリー一杯一杯状態は
今回ちょっと修正しただけで時折誤動作する事も有りシステムが安定するまで余分な検証作業が掛かった

今後は ESP8266 を使うことになる。
アナログ入力が1個しか無いので複数の入力が必要な時にはADCのICを併用する必要があります。

Arduino 電力量計 DIY 17 iphone でメッセージを受信する方法(LINE Notify)

Arduino 電力量計 DIY 16 の続き(まとめ)

処理の流れ

Arduino 電力量計(Arduino MEGA + イーサネット シールド)
↓ http
転送サーバー(ESP8266)
↓  https
LINE Notify

iphone (LINEアプリ)

Arduino イーサネット シールドは https 通信がサポートされていないから 直接 LINE Notify へアクセスする事が出来ない
そこでメッセージを転送するローカルサーバーをESP8266で作成した
(転送だけだと思ったいないから RSS通知機能を兼務している)

他にも消え去るアプリも有るのだけど、最重要アプリの対策が出来た事は大きい
これでiOS11を使う事も出来る

3664.jpg 3663.jpg
旧:im.kayac.com    新:LINE Notify

ブラウザーでの入力(デバッグ)
// http://192.168.0.254/?token=1234&message=5678           呼び出し方

メッセージ転送サーバー

const char* token_pv   = "*******************************";
void onRoot() 
{
String token="";
String message="";
int i;
       String msg = "<html><head><title>ESP8266WebSerber</title></head><body><h1>Hello</h1>";

for(i=0;i<server.args();i++)
        {    msg += " " + server.argName ( i ) + ": " + server.arg ( i ) + "<BR>";
       }
msg+="</body></html>";
        server.send(200,"text/html",msg);

for(i=0;i<server.args();i++)
{
if    (server.argName(i)=="token"  ) token  =server.arg(i);
else if (server.argName(i)=="message") message=server.arg(i);
}
if (token  =="") token  =token_pv;
if (message=="") message="メッセージ無し";
sendLineNotify(token,message);
}
void sendLineNotify(const String  token,String message)
 {
const char* host = "notify-api.line.me";
  WiFiClientSecure client;
  //LineのAPIサーバに接続
  if (!client.connect(host, 443)) {
//    Serial.println("Connection failed");
    return;
  }
//  Serial.println("Line Connected");
  //リクエストを送信
  String query = String("message=") + String(message);
  String request = String("") +
               "POST /api/notify HTTP/1.1\r\n" +
               "Host: " + host + "\r\n" +
               "Authorization: Bearer " + token + "\r\n" +
               "Content-Length: " + String(query.length()) +  "\r\n" + 
               "Content-Type: application/x-www-form-urlencoded\r\n\r\n" +
                query + "\r\n";
  client.print(request);
 
  //受信終了まで待つ 
  while (client.connected()) {
    String line = client.readStringUntil('\n');
    if (line == "\r") {
      break;
    }
  }
  
  String line = client.readStringUntil('\n');
client.stop();
//  Serial.println(line);
}


呼び出す側

const String token_pv   = "*********************************";
IPAddress ImTrLine(192,168,0,254);     // no DNS)

void Im_put(String str)
{
  String buf="";
  for(int i=0;;i++)
  {
      if (str[i]==0) break;
      if (str[i]==' ') buf+="%20"; else buf+=str[i];
  }
 String par="GET /?token="+token_pv+"&message="+buf+" HTTP/1.1";
 if (client.connect(ImTrLine, 80))
   {
      client.println(par);
      client.print ("Host:");
      client.println(ImTrLine);
      client.println("Connection: close");
      client.println();
      client.stop();
   }
}



Arduino 電力量計 DIY 16 im.kayac.com サービス終了(困る)

kayac.png
現在のアプリが32ビット版でIOS11からは使えない事は知っていましたが・・・
まさかサービスも終了するとは思っていませんでした。

代替えとして LINE Notify の使用を調査中です。

ESP8266 のスケッチ 大いに参考になりそうです。
「猫の食生活」を超音波距離センサーでLINEに通知してみた  
SSL通信をするためにはそれなりのCPUパワーが必要になります。
Arduinoに使われているAVRでは性能的に難しいのですが、
ESP8266はこの価格にも関わらず、32ビットクロック80MHzの高性能チップを搭載しています。
これによって、SSL通信も軽々とこなしてくれます。

Arduino MEGA で通信が苦しいとなると、
メッセージ送信は ESP8266 で分散処理へ変更する必要がある
ついでにモニター表示をするかな~

・・・・

取り合えず
・LINE アプリ インストール(iphone)
・LINE Notify アクセストークンの発行(PC)
line-0.png line-1.png line2.jpg

・ ESP8266 で Imの送信 & LINEでの受信
3659.jpg

まで動作確認済

Arduino MEGA + イーサネット シールド ではhttps がライブラリー対応されていないようだ!

IFTTTにLINE Channelができました
littleBitsのボタンを押すとIFTTT経由でLINEにメッセージが飛ぶ仕組みを作ってみよう
IFTTTがMakerのためのチャンネルを追加
Arduino勉強会/0P-WiFiからIFTTTを使ってみる

ひょっとしたら IFTTT へ http でメッセージを送信したら LINE へ https でメッセージを送信してくれるのかな?

Eventsをトリガーする方法
IFTTTをMaker Channelにつないだら、イベントのトリガー(IFTTTのifの部分)を作るのは簡単。イベント名とソケットキー(チャンネルに接続したときに割り当てられる)を付けてGETまたはPOSTを送るだけだ。
https://maker.ifttt.com/trigger/{event_name}/with/key/{secret_key}
これにオプションで、レシピの中のアクションに渡したい値(文字列)をJSON型で3つまで付けられる。

{value1:"文字列",value2:"文字列",value3:"文字列"}   たぶん

char v1[16] = "";
char v2[16] = "";
char v3[16] = "";
char header[100] = "POST /trigger/{event_name}/with/key/{secret_key} HTTP/1.1\r\n";
const char* host = "maker.ifttt.com";
const char* contentType = "Content-Type: application/json\r\n\r\n";
char contentLen[50] = {0};
char valueData [150] = {0};

sprintf(contentLen, "Content-Length: %d\r\n", strlen(valueData));
sprintf(valueData, "{\"value1\":\"%s\",\"value2\":\"%s\",\"value3\":\"%s\"}\r\n", v1, v2, v3);

sprintf(str, "%sHost: %s\r\n%s%s%s", header, host, contentLen, contentType, valueData);

client.print(str);


※IFTTTが難解すぎる・・・・・・・う~~
 何故か Makerチャンネルが無い!!

 サポートが無くなったのでしょうか?
IFTTTの「Maker」を使ってみました 有りそうだな~

IFTTTのトリガーおよびアクションをESP8266で実行する
IFTTT の webhooks で メッセージを LINE へ送信する事はできた。(デバッグモード 手動)
ただ IFTTT へは https で接続する必要が有る為 Arduino から使うのは難しそうだ!!
https で接続できるのなら、直接 line へ送信した方が良い
まぁ外部サービスに依存するのは駄目って事で

LINEへのメッセージ中継機能を ESP8266 で作るって事でしょうか
これにモニター表示機能を付加すれば自己完結する

IFTTT で RSS の LINE へのメッセージ送信は出来るが・・・
表示が長ったらしいし、機能面で劣る。

現在 im.kayac.com でメッセージ送信しているのは
①ソーラ発電状況 ②RSS
単に①の為にメッセージ転送するだけだと ESP8266 が勿体ない
から RSS機能に①のメッセージ転送機能を付加する事にした。
作成中
何故かWIFi接続PCはそれほどでもないが、iphoneはWiFi通信に影響が多く通信不能に近い
WIFiアクセスポイントがトチ狂う
どうしたもんじゃろな~

ESP8266でNAT(NAPT)でWi-Fiを中継する
Arduino の ESP8266をwebサーバーにしてみよう

試行錯誤しながら何とか希望の動作をする様に成って来た!
アクセスポイントでサーバーを動作させながら、通常のRSSの処理を行う


#include <ESP8266WiFi.h>
#include <ESP8266WebServer.h>
#include <ESP8266mDNS.h>

const char* ssid = "ssid"; 自宅ネットワークのアクセスポイント
const char* password = "password";

const char *ap_ssid = "ESP8266"; サーバー用のダミーアクセスポイント
const char *ap_password = "password";

IPAddress SvIP (192,168,1,254); サーバー用のダミーIPアドレス
IPAddress SvGatewayIP (192,168,0,1);
IPAddress SvSubnet (255,255,255,0);

IPAddress myIP (192,168,0,254); 自宅ネットワーク上のサーバーIPアドレス
IPAddress myGatewayIP (192,168,0,1);
IPAddress mySubnet (255,255,255,0);

ESP8266WebServer server(80);
WiFiClient client;

setup()
{
WiFi.mode(WIFI_AP_STA); // モード設定

WiFi.softAPConfig(SvIP,SvGatewayIP,SvSubnet);
WiFi.softAP(ap_ssid, ap_password);
IPAddress SvIP = WiFi.softAPIP();

Serial.println();
Serial.print("AP IP address: ");
Serial.println(myIP);

WiFi.config(myIP,myGatewayIP,mySubnet);
WiFi.begin(ssid, password);

server.on("/",onRoot);

}

void loop()
{
server.handleClient();
}

void onRoot()
{
  String msg = "<html><head><title>ESP8266WebSerber</title></head><body><h1>Hello</h1></body></html>";
  server.send(200,"text/html",msg);
}



ブラウザーから http://192.168.0.254/ をアクセスすると
Hello
が表示される

loop内で別の処理を組めば 処理をしながら サーバーアクセスの処理が出来る
私の場合はRSS とLINE Notifyへのメッセージ送信を行う

後ちょっとだ! がんばろう!


Arduino 電力量計 ---> im.kayac.com        ---> iphone


Arduino 電力量計 ---> 転送サーバー ---> LINE Notify ---> iphone

テスト環境で動作確認済
明日、実機をUpdate予定 メモリー不足が不安材料です。

Arduino 電力量計 DIY 15 Newマシーン用のソース公開

スケッチ(ソース)の解読がしやすい為に電力計測の基本機能に特化して公開します。
・起動時にNTPにより時刻を取得します(インターネット環境は必須です)
・割り込み処理を使用して連続計測を行います(余剰・電圧計測なし・幹線計測なしも考慮)
・1秒毎に計測加算しますがリアルタイム表示は各自で変更してください
・温度計測は1分毎に行います(不要ならカット)
・1分毎にSDへデータ保存します。停電が有った場合は復帰後に計測を継続します。
・WEBサーバー機能によりリアル値の表示や時刻毎電力やPCへのデーター転送を行います。
・電力計測用のCTは6個+幹線で記述しています。変更は簡単です。
・PC(太陽光発電状況管理ソフト)へのデータ転送については現行フォーマットは未対応です。
※版権は放棄していませんが個人使用はOKです。
※調整:電圧パラメータを調整して電圧を合わせて下さい。その後電力を調整して下さい。

Arduino 電力量計ソース エンコード unicode (UTF-8) で表示して下さい
拡張子 txt を ino へ変更して使用して下さい

お願い
参照したらコメントを残して下さいな

基本設定

1.ipアドレス
 #define Lip 112 // web local ip 111:通常 112:TEST
 IPAddress ip(192,168,0, Lip); // 固定IP

2.CT数
 #define CT 6 // CT数(パワコン実装数)

3.ADCピン指定
  const byte Tpx[Txm]={ 2, //00 Z ゼロV基準電圧
      3, //01 V1 系統電圧1
      4, //02 V2 系統電圧2
      0, //03 CTa 電力売買1
      0, //04 CTb 電力売買2
      5, //05 CT0 幹線電力
      8,9,10,11,12,13}; //06 CT1..6,7..9 CT パワコンetc個別電力

  計測する場合はADCピン番号を指定(0は計測しない、CT数分指定)

4.HEMS 指定
  #define HEMS 0                 // HEMS運用 適用電圧を指定
  const byte KCTv[CTm] = { 0,0,1,2,0,1,2}; // 適用電圧 0..CT

  0:200V 1:100V 2:100V (単相3線)

5:センサー係数調整
  const float KVT = float(AREF/512.0/(180.0/540.0)/5.1036*100.0);
                          // 電圧センサ係数 100.0v-->5.1036v *(180/540) / 2.5 * 511 AC100
  const float KCT0 = float(AREF/512.0*3000.0/ 32.0);
                          // 電流センサ係数 幹線 (公称変流比:3000:1)
  const float KCT1 = float(AREF/512.0*3000.0/190.0);
                        // 電流センサ係数 PWC (公称変流比:3000:1)
  const float KCTu = (1.0);
           // 電流センサ係数 売買

  使用するトランスやセンサーに合わせて調整


関数

analogReadH()    ADCアナログデジタル変換の関数(前半)
ISR(ADC_vect)    ADCアナログデジタル変換の関数(後半)

TimeUp()       1秒毎に割り込みが発生

SecCalc() 1秒毎の電圧・電流・電力の算出および集計

DayUpdate() 1日分を累計(未処理)

OndoSet()       温度計測

dateTime        SD 日付設定

TdayDsp()       起動時に日付・時刻の確認用(表示機器に合わせて変更) 

Net_init()        ネット環境初期化(DHCPを使用する場合はコメントを復活)

sendNTPpacket
NTP_Call()
setTday
NextDay()
              NTP処理および日付処理関数

TBLinit         SDカード保存ファイルの初期化(NULLファイルの作成)
TBLSave        SDカード保存ファイルの書込み
TBLLoadHx       SDカード保存ファイルの読込み(時刻情報) 
TBLLoadMx       SDカード保存ファイルの読込み(分情報)

web_server()      照会処理
              IPアドレス/       電圧・電力等のリアル情報
              IPアドレス/J      電圧・電力等の時刻別情報(当日)
              IPアドレス/Jyymmdd 電圧・電力等の時刻別情報(指定日yymmdd)

NEXT≫
プロフィール

お気楽どん

Author:お気楽どん

最新記事
最新コメント
ありがとう
気が向いたら
にほんブログ村 ライフスタイルブログへにほんブログ村 その他趣味ブログ 電子工作へ にほんブログ村 環境ブログ 風力発電・太陽光発電へ
天気予報
カテゴリ
検索BOX・タグ一覧
リンク