質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
LINE Messaging API

LINE Messaging APIは、メッセージの送信・返信ができるAPIです。Web APIを経由しアプリケーションサーバとLINEのAPIでやり取りが可能。複数のメッセージタイプや分かりやすいAPIリファレンスを持ち、グループチャットにも対応しています。

Arduino

Arduinoは、AVRマイコン、単純なI/O(入出力)ポートを備えた基板、C言語を元としたArduinoのプログラム言語と、それを実装した統合開発環境から構成されたシステムです。

Q&A

解決済

1回答

264閲覧

DHT22で取得した温度と湿度をArduinoを使ってLINEに通知したい

tomohiro.camper

総合スコア2

LINE Messaging API

LINE Messaging APIは、メッセージの送信・返信ができるAPIです。Web APIを経由しアプリケーションサーバとLINEのAPIでやり取りが可能。複数のメッセージタイプや分かりやすいAPIリファレンスを持ち、グループチャットにも対応しています。

Arduino

Arduinoは、AVRマイコン、単純なI/O(入出力)ポートを備えた基板、C言語を元としたArduinoのプログラム言語と、それを実装した統合開発環境から構成されたシステムです。

0グッド

0クリップ

投稿2024/02/25 14:35

編集2024/02/27 11:00

DHT22で取得した温度と湿度をArduinoと使ってLINEに通知したい

ここに実現したいことを箇条書きで書いてください。
1 DHT22で温度と湿度を取得する
2 取得した温度と湿度をLINEで通知する

前提

Arduinoを使い、本体のBOOTボタンを押すと、あらかじめ設定した文字列
(const char* message = "aaaaaa";)をLINEに通知するまではできました。

発生している問題・エラーメッセージ

送信する文字列はchar型でなくてはいけないようですが、
LINEに送信したい文字列はDHT22で取得した温度と湿度なので、
messageはString型でなくてはいけないのですが、String型の文字列をchar型に変換することはできますか?
無理やり、

// 湿度を取得
float humidity = dht.readHumidity();
// 温度を取得
float temperature = dht.readTemperature();

ondo = String(temperature) + String("゚C、");
shitsudo = String(humidity) + String("%です。");

message = String("現在の室温は") + String(ondo) + String("湿度は") + String(shitsudo);

としたところ、エラー(35?)が出てしまいLINE送信できません。
String型をchar型に変換する方法はありませんか?

該当のソースコード

Arduino

1#include <WiFi.h> 2#include <WiFiClientSecure.h> 3#include <DHT.h> 4#include <DHT_U.h> 5 6// WiFi設定 7const char* ssid = "自宅WiFiのSSID"; 8const char* password = "自宅WiFiのパスワード"; 9 10// ピン設定 11const int swPin = 0; 12const int PIN_DHT = 23; 13 14String ondo = ""; 15String shitsudo = ""; 16String soushin = ""; 17 18// LINE Notify設定 19const char* host = "notify-api.line.me"; 20const char* token = "LINEのトークン"; 21const char* message = "aaaaaa"; 22DHT dht(PIN_DHT,DHT22); 23 24void setup() 25{ 26 Serial.begin(115200); 27 delay(10); 28 29 // dhtライブラリの初期処理 30 dht.begin(); 31 32 // We start by connecting to a WiFi network 33 Serial.println(); 34 Serial.println(); 35 Serial.print("Connecting to "); 36 Serial.println(ssid); 37 38 WiFi.begin(ssid, password); 39 40 while (WiFi.status() != WL_CONNECTED) { 41 delay(500); 42 Serial.print("."); 43 } 44 45 Serial.println(""); 46 Serial.println("WiFi connected"); 47 Serial.println("IP address: "); 48 Serial.println(WiFi.localIP()); 49 50 // ピンを入力状態にする 51 pinMode(swPin, INPUT_PULLUP); 52} 53 54// line通知 55void send_line() { 56 57 // HTTPSへアクセス(SSL通信)するためのライブラリ 58 WiFiClientSecure client; 59 60 // サーバー証明書の検証を行わずに接続する場合に必要 61 client.setInsecure(); 62 63 Serial.println("Try"); 64 65 //LineのAPIサーバにSSL接続(ポート443:https) 66 if (!client.connect(host, 443)) { 67 Serial.println("Connection failed"); 68 return; 69 } 70 Serial.println("Connected"); 71 72 // リクエスト送信 73 String query = String("message=") + String(message); 74 String request = String("") + 75 "POST /api/notify HTTP/1.1\r\n" + 76 "Host: " + host + "\r\n" + 77 "Authorization: Bearer " + token + "\r\n" + 78 "Content-Length: " + String(query.length()) + "\r\n" + 79 "Content-Type: application/x-www-form-urlencoded\r\n\r\n" + 80 query + "\r\n"; 81 client.print(request); 82 83 // 受信完了まで待機 84 while (client.connected()) { 85 String line = client.readStringUntil('\n'); 86 if (line == "\r") { 87 break; 88 } 89 } 90 91 String line = client.readStringUntil('\n'); 92 Serial.println(line); 93} 94 95// スイッチの変数宣言 96int sw_val = 0; 97 98void loop() 99{ 100 // put your main code here, to run repeatedly: 101 int sw_state = digitalRead(swPin); 102 103 dht.readHumidity(); 104 dht.readTemperature(); 105 106 if (sw_state==LOW) 107 { 108 // 湿度を取得 109 float humidity = dht.readHumidity(); 110 // 温度を取得 111 float temperature = dht.readTemperature(); 112 113 ondo = String(temperature) + String("゚C、"); 114 shitsudo = String(humidity) + String("%です。"); 115 116 soushin = String("現在の室温は") + String(ondo) + String("湿度は") + String(shitsudo); 117 118 message = soushin; 119 120 send_line(); 121 } 122}

試したこと

char[] charArray = message.ToCharArray();

message = soushin.c_str()

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

118行目を
message = soushin.c_str();
とすることで少なくとも(ESP32 Devmoduleとして)コンパイルは通りますけれど? (動作チェックまではしていません)
それでなにか不都合があるのですか?


・エラーメッセージは(内容を損なわない自信があるのでない限り)全文を転記してください。それは、何故エラーになったのかという重要な情報です。不完全な転記では、結局回答者が追試験してみなければいけなくなります(まぁ、ちゃんと転記されていても大抵追試験はすることになるのですが、必要な情報が省略されて一手間余計感は否めません)
・試したことは、「試したこと」と「その結果」まで(できれば、なぜそうしてみたのかも)記してください。あなたが頑張ったことのアピールではなく、解決への情報とするためです。
・Arduinoには各種ボードがあり、それぞれコンパイラ設定や機種別ライブラリに癖があったりします。また、同じデバイスに対していくつかのライブラリがあったり、またボードやライブラリのバージョンで変更があったりもします。使用するハードウェアと、使用したライブラリ、バージョンを明らかにしてください。
(以上の「お願い」には今回は解決に寄与しない部分もあるかも知れませんが、一般にそれだけの情報が欲しいと思うもの、ということでご理解ください)


別解的に。たまたま今似たようなことをやっていて、自分の送信ルーチンは以下のようになっています。ご参考まで。

Arduino

1const String lineToken = "_your_line_token"; 2 3 WiFiClientSecure client; 4 client.setInsecure(); 5 HTTPClient http; 6 http.begin(client, "https://notify-api.line.me/api/notify"); 7 String host = "notify-api.line.me"; 8 String query = String("message=") + str; 9 http.addHeader("Host", host, false, false); 10 http.addHeader("Authorization", "Bearer " + lineToken, false, false); 11 http.addHeader("Content-Length", String(query.length()), false, false); 12 http.addHeader("Content-Type", "application/x-www-form-urlencoded", false, false); 13 http.POST(query); 14 http.end();

コメントのやりとりより、
"Content-Type: application/x-www-form-urlencoded\r\n\r\n"ということで、%はエスケープ文字になるということです。
'%'自身を表示したければ%35と表記するということのようで。

投稿2024/02/25 22:24

編集2024/02/27 10:40
thkana

総合スコア7639

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

tomohiro.camper

2024/02/26 11:52

thkanaさん コメントありがとうございます。 まずは、いろいろとご指摘いただいたこと、大変勉強になりました。 今後も質問させていただく機会があると思いますので、できるだけ詳細に記述しようと思います。 118行目を message = soushin.c_str(); としたところ、コンパイルまではうまくいくのですが、 Try Connected 35 という表示が出て、LINE通知は送られません。 この記述をなくし、21行目の const char* message = "aaaaaa"; のみで送信すると、 Try Connected 1d という表示され、通知を送ることができます。 この「35」というのは何かのエラー番号なのかと思い、LINE notifyについて調べてみたのですが、 見つけることができませんでした。 当方の環境です。 ボード WayinTop ESP32開発ボード ライブラリ DHT-sensor-library(1.4.6) ESP-Line-Notify(2.1.1) よろしくお願いいたします。
thkana

2024/02/26 12:57 編集

では、まず message = "現在の室温は12.3゚C、湿度は34.5%です。" としてどうなるか確かめてみたらいかがですか? もしかしたら、℃(これは一文字)の表記にいわゆる半角カナ記号を使っているのがよくないのかも知れません。 (これはあてずっぽですが...) 当然、逆に soushin = String("aaaaaa"); message = soushin.c_str(); としたらどうなるかも試してみたくなりますね。
tmp

2024/02/27 09:12

application/x-www-form-urlencodedだから、パーセントエンコーディングですね。
thkana

2024/02/27 10:07

では%記号自体は%25に置換すればよい、ということかしら(試してたソースを消しちゃったので...)
tomohiro.camper

2024/02/27 10:33

tmpさん thkanaさん 114行目を shitsudo = String(humidity) + String("%です。"); ↓ shitsudo = String(humidity) + String("%25です。"); にしたところ、無事に温度と湿度を取得してLINEに通知雨を送ることができました。 ありがとうございました。 パーセントエンコーディング、勉強になりました。 参考までに、tmpさん、application/x-www-form-urlencodedというのは、 どこからわかる情報なのでしょうか。何か参照した方が良いドキュメント等がありましたら、 教えていただけると勉強になります。
thkana

2024/02/27 10:36

横から言っちゃうと、あなたが質問に上げたソースの79行目に書いてある。 > "Content-Type: application/x-www-form-urlencoded\r\n\r\n" +
tomohiro.camper

2024/02/27 10:59

thkanaさん ありがとうございます。 使いたいソースをつぎはぎで作ったのですが、1行ずつしっかりと読み直して、意味を勉強しようと思います。 この度はありがとうございました。とても勉強になりました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問