実現したいこと
arduinoでLINE通知する際、日時も含めたいです。
発生している問題・分からないこと
日時の取得とシリアルでの表示は参考サイトを元に実現できましたが、
LINEへ通知する際、どの型を使用して日時の文字を送信すれば良いのか分かりませんでした。
→ 型を調べたところ、「sprintf()関数」を使用するみたいですが詳細は不明でした。
該当のソースコード
#include <Adafruit_NeoPixel.h> #include <WiFi.h> #include <WiFiClientSecure.h> #include <time.h> #define SENSOR 8 //WiFi const char* ssida = "**********"; const char* pwa = "*********"; //LINE Notify設定 const char* host = "notify-api.line.me"; const char* token = "**********"; const char* message = "動きあり"; //時刻 #define JST 3600* 9 // line通知 void send_line() { // HTTPSへアクセス(SSL通信)するためのライブラリ WiFiClientSecure client; // サーバー証明書の検証を行わずに接続する場合に必要 client.setInsecure(); Serial.println("Try"); //LineのAPIサーバにSSL接続(ポート443:https) if (!client.connect(host, 443)) { Serial.println("Connection failed"); return; } Serial.println("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'); Serial.println(line); } // ********************************************************************* void setup() { // センサーをつないだピン(9番ピン)をGPIOの入力として使用する pinMode(SENSOR, INPUT); // ここに処理を書く Serial.begin(115200); Serial.println("setup"); //Wifi接続開始 WiFi.begin( ssida, pwa ); // 接続が確立するまで“.”を出力して待つ int i = 1; while ( WiFi.status() != WL_CONNECTED ){ if( i > 60 ){ //60秒でタイムアウト ESP.restart(); //再起動 } delay( 1000 ); //1秒待つ Serial.print("."); i++; } // 接続完了通知 Serial.println("WiFi is connected!"); // IPアドレス表示 Serial.println(WiFi.localIP()); //時刻 configTime( JST, 0, "ntp.nict.jp", "ntp.jst.mfeed.ad.jp" ); } void loop() { // put your main code here, to run repeatedly: // センサーからの電圧を読み取り、その値から動作を分岐する // 読み取った値が”High”(センサーが感知した場合) if(digitalRead(SENSOR)) { // センサーで動きを検出時 Serial.println("検出"); // 時刻表示 time_t t; struct tm *tm; static const char *wd[7] = {"Sun","Mon","Tue","Wed","Thr","Fri","Sat"}; t = time(NULL); tm = localtime(&t); Serial.printf(" %04d/%02d/%02d(%s) %02d:%02d:%02d\n", tm->tm_year+1900, tm->tm_mon+1, tm->tm_mday, wd[tm->tm_wday], tm->tm_hour, tm->tm_min, tm->tm_sec); //LINE通知 send_line(); delay(30000); //30秒間待機 } else { // 待機時 Serial.println("*** 待機中 ***"); } }
試したこと・調べたこと
上記の詳細・結果
型を調べたところ、「sprintf()関数」を使用するみたいですが詳細は不明でした。
以下、sprint()関数を用いて実行してみましたがエラーとなってしまいました。
sprintf( "%04d/%02d/%02d(%s) %02d:%02d:%02d\n", tm->tm_year+1900, tm->tm_mon+1, tm->tm_mday, wd[tm->tm_wday], tm->tm_hour, tm->tm_min, tm->tm_sec);
補足
特になし
0 コメント