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

3692.jpg

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

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

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

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

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

LCDモジュールをI2C通信で接続する場合の覚書(ESP8266)

LCDモジュールをI2C通信で接続する場合の覚書

I2C通信用のポート(ライブラリーで固定化されている)
Arduino   では、SDA(データ線)はアナログの4番ピンに,SCL(クロック線)はアナログの5番ピン
Arduino Megaでは,SDAがデジタルの20番ピン,SCLがデジタルの21番ピン
ESP8266  では、SDA(データ線)はGPIO04,SCL(クロック線)はGPIO05

購入した、IICシリアル16×2 LCDモジュール
- I2Cアドレス:0x27 

1602 LCD ブラック IIC/I2C/TWI/SPI シリアル インタフェース ボード モジュール
I2Cアドレス:0x20〜0x27 (ボード上のA0,A1,A2を短絡する事でアドレスを変更)
        0x27 , 0x3F (チップによって開始アドレスが異なる)

ADT7410使用 高精度・高分解能 I2C・16Bit 温度センサモジュール

I2Cアドレス:0x48, 0x49, 0x4A, 0x4B

LiquidCrystal_I2Cライブラリーをインストール


#include "Wire.h" // SDA:GPIO04 SCL:GPIO05
#include "LiquidCrystal_I2C.h"

LiquidCrystal_I2C lcd(0x27, 20, 4); // 0x20 , 0x27 , 0x3F

void setup()
{
lcd.begin();
lcd.setCursor(0,0);
lcd.print("amazon");
lcd.setCursor(0,1);
lcd.print("abcdefgh123456");
}
void loop()
{
}


3688.jpg

ちゃんと表示しました。

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予定 メモリー不足が不安材料です。

NEXT≫
プロフィール

お気楽どん

Author:お気楽どん

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