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

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

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

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Arduino

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

IoT

IoT(Internet of Things)とは、インターネットがコンピュータなどの情報・通信機器のネットワークだけでなく、世の中のある様々なモノに接続されて自動認識・自動制御・遠隔計測などの能力を備えることです。「モノのインターネット」と一般的にいわれます。

マイコン

マイクロコンピュータの略で、CPUにマイクロプロセッサを用いたコンピュータのこと。家電製品、電磁機器などの制御に用いられています。単体でコンピュータとしての機能を一通り備えています。 現代のパーソナルコンピュータに近く、同時期のメインフレームやミニコンピュータと比べ、小さいことが特徴です。

Q&A

解決済

2回答

3091閲覧

【Arduino】変数格納のやり方について

aRyo

総合スコア23

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Arduino

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

IoT

IoT(Internet of Things)とは、インターネットがコンピュータなどの情報・通信機器のネットワークだけでなく、世の中のある様々なモノに接続されて自動認識・自動制御・遠隔計測などの能力を備えることです。「モノのインターネット」と一般的にいわれます。

マイコン

マイクロコンピュータの略で、CPUにマイクロプロセッサを用いたコンピュータのこと。家電製品、電磁機器などの制御に用いられています。単体でコンピュータとしての機能を一通り備えています。 現代のパーソナルコンピュータに近く、同時期のメインフレームやミニコンピュータと比べ、小さいことが特徴です。

0グッド

0クリップ

投稿2021/08/21 04:19

編集2021/08/21 04:43

前提・実現したいこと

Arduinoの基礎的な質問です。
ESP32とBME280を用いて、気温・湿度・気圧データをIFTTを通してGoogleスプレッドシートに記録するプログラムを作成しております。

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

BME280からデータは取れておりIFTTを通してGoogleスプレッドシートに入力が始まったのですがデータは全て”0”と入力されてしまいます。
BME280から得たデータを変数に入れる方法を誤っているのではないか考えています。
正直、自分で何かを作るのは初めてのことで以下のプログラムも殆どブログなどから引用してつぎはぎで貼り付けたものになり、凄く見にくいかもしれません。

/* BME280I2C Modes.ino This code shows how to use predefined recommended settings from Bosch for the BME280I2C environmental sensor. GNU General Public License Written: Dec 30 2015. Last Updated: Sep 23 2017. Connecting the BME280 Sensor: Sensor -> Board ----------------------------- Vin (Voltage In) -> 3.3V Gnd (Ground) -> Gnd SDA (Serial Data) -> A4 on Uno/Pro-Mini, 20 on Mega2560/Due, 2 Leonardo/Pro-Micro SCK (Serial Clock) -> A5 on Uno/Pro-Mini, 21 on Mega2560/Due, 3 Leonardo/Pro-Micro */ #include <BME280I2C.h> #include <Wire.h> // Needed for legacy versions of Arduino. #include <WiFiClientSecure.h> #include <Adafruit_Sensor.h> #include <Adafruit_BME280.h> #define SERIAL_BAUD 115200 const char* ssid = "*******"; const char* password = "*******"; const char* host = "maker.ifttt.com"; const char* event = "*******"; const char* secretkey = "*******"; float temp(NAN), hum(NAN), pres(NAN); /* Recommended Modes - Based on Bosch BME280I2C environmental sensor data sheet. Weather Monitoring : forced mode, 1 sample/minute pressure ×1, temperature ×1, humidity ×1, filter off Current Consumption = 0.16 μA RMS Noise = 3.3 Pa/30 cm, 0.07 %RH Data Output Rate 1/60 Hz Humidity Sensing : forced mode, 1 sample/second pressure ×0, temperature ×1, humidity ×1, filter off Current Consumption = 2.9 μA RMS Noise = 0.07 %RH Data Output Rate = 1 Hz Indoor Navigation : normal mode, standby time = 0.5ms pressure ×16, temperature ×2, humidity ×1, filter = x16 Current Consumption = 633 μA RMS Noise = 0.2 Pa/1.7 cm Data Output Rate = 25Hz Filter Bandwidth = 0.53 Hz Response Time (75%) = 0.9 s Gaming : normal mode, standby time = 0.5ms pressure ×4, temperature ×1, humidity ×0, filter = x16 Current Consumption = 581 μA RMS Noise = 0.3 Pa/2.5 cm Data Output Rate = 83 Hz Filter Bandwidth = 1.75 Hz Response Time (75%) = 0.3 s */ BME280I2C::Settings settings( BME280::OSR_X1, BME280::OSR_X1, BME280::OSR_X1, BME280::Mode_Forced, BME280::StandbyTime_1000ms, BME280::Filter_Off, BME280::SpiEnable_False, BME280I2C::I2CAddr_0x76 // I2C address. I2C specific. ); BME280I2C bme(settings); ////////////////////////////////////////////////////////////////// void setup() { Serial.begin(SERIAL_BAUD); while(!Serial) {} // Wait Wire.begin(); while(!bme.begin()) { Serial.println("Could not find BME280I2C sensor!"); delay(1000); } switch(bme.chipModel()) { case BME280::ChipModel_BME280: Serial.println("Found BME280 sensor! Success."); break; case BME280::ChipModel_BMP280: Serial.println("Found BMP280 sensor! No Humidity available."); break; default: Serial.println("Found UNKNOWN sensor! Error!"); } // Change some settings before using. settings.tempOSR = BME280::OSR_X4; bme.setSettings(settings); } ////////////////////////////////////////////////////////////////// void loop() { printBME280Data(&Serial); delay(500); WiFiServer server(80); // Wi-Fiに接続 Serial.print("Attempting to connect to SSID: "); Serial.println(ssid); WiFi.begin(ssid, password); while (WiFi.status() != WL_CONNECTED) { Serial.print("."); // 接続するまで待機する delay(1000); } Serial.print("Connected to "); Serial.println(ssid); Serial.println("IP address: "); Serial.println(WiFi.localIP()); server.begin(); double temp = temp, press = press, hum = hum;              //ここのやり方間違ってるのかな signed long int temp_cal; unsigned long int press_cal, hum_cal; Serial.print("connecting to "); Serial.println(host); // Use WiFiClient class to create TCP connections WiFiClient client; const int httpPort = 80; if (!client.connect(host, httpPort)) { Serial.println("connection failed"); return; } // We now create a URI for the request String url = "https://maker.ifttt.com/trigger/"; url += event; url += "/with/key/"; url += secretkey; url += "?value1="; url += String(temp); url += "&value2="; url += String(press); url += "&value3="; url += String(hum); Serial.print("Requesting URL: "); Serial.println(url); // This will send the request to the server client.print(String("GET ") + url + " HTTP/1.1\r\n" + "Host: " + host + "\r\n" + "Connection: close\r\n\r\n"); // Read all the lines of the reply from server and print them to Serial while (client.available()) { String line = client.readStringUntil('\r'); Serial.print(line); } } ////////////////////////////////////////////////////////////////// void printBME280Data ( Stream* client ) { BME280::TempUnit tempUnit(BME280::TempUnit_Celsius); BME280::PresUnit presUnit(BME280::PresUnit_Pa); bme.read(pres, temp, hum, tempUnit, presUnit); client->print("Temp: "); client->print(temp);        //これと client->print("°"+ String(tempUnit == BME280::TempUnit_Celsius ? 'C' :'F')); client->print("\t\tHumidity: "); client->print(hum);                              //これと client->print("% RH"); client->print("\t\tPressure: "); client->print(pres);                             //これの値を変数に格納したい client->println("Pa"); double temp = temp, press = press, hum = hum; delay(1000); }

試したこと

ここに問題に対して試したことを記載してください。
変数関連を調べていたのですが、時間が経つばかりなので質問させていただきます。

補足情報(FW/ツールのバージョンなど)

本当はGoogleスプレッドシートに直接入力する方法があるみたいなのですが、やり方が分からず断念しました。何か詳しく書いてある情報等あればご教授ください。
ここにより詳細な情報を記載してください。

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

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

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

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

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

y_waiwai

2021/08/21 04:21

このままではコードが読みづらいので、質問を編集し、<code>ボタンを押し、出てくる’’’の枠の中にコードを貼り付けてください
aRyo

2021/08/21 04:35

コメントありがとうございます。 初投稿でやり方が分かりませんでした。 修正投稿しましたので、宜しければ解決方法ご教授ください。
guest

回答2

0

ベストアンサー

C/C++(そしてArduino)では、変数の仕組みはこんなふうになっています。(初心者向けざっくり説明です)

型名 変数名; で変数が作られる(宣言)。

変数を参照できる範囲は

  • ()や{ }の外(関数の宣言・定義の()や{})で作られたら、ファイル全体で有効:グローバル変数
  • 関数の仮引数として()内で宣言されたら、関数全体で有効
  • { }内で宣言されたら、宣言された後その{ }内でだけ有効:ローカル変数

で、同じ変数名があったら範囲の狭いものが優先。つまり上記で後に書いたものを参照することになります。

そのプログラムでは

...<略> float temp(NAN), hum(NAN), pres(NAN); //グローバル変数。ファイル全体で有効 ...<略> void loop(){ //関数定義に入る ...<略> //このtempやhumは、グローバル変数とは別の変数で、これ以降loop()関数内でだけ有効 double temp = temp, press = press, hum = hum;              //ここのやり方間違ってるのかな //つまり、tempという新しい変数を作り、その変数の値を同じ変数に入れているだけ //ついでにいうと、presとpressは別の変数 ...<略> url += String(temp); //関数内だけ有効のtemp変数 url += String(press); //関数内だけ有効のpress変数 url += String(hum); //関数内だけ有効のhum変数 ...<略> } //loop関数終わり ...<略> void printBME280Data(Stream* client){ ...<略> bme.read(pres, temp, hum, tempUnit, presUnit); //グローバル変数pres,temp,hum等にデータ取得 client->print(temp);//グローバル変数を表示 client->print(hum);//グローバル変数を表示 client->print(pres);//グローバル変数を表示 double temp = temp, press = press, hum = hum; //新しい変数 ...<略> }

としているので、シリアルの表示はそれらしい値がでるけれどIFTTTに送られるのは0(たまたま0なだけでどうなるかわからない値ですが)ということになっています。

プログラミングテクニック的にはグローバル変数は良いこととはされていませんが、このプログラムを動かすという視点でいうなら、「余計な変数宣言をしない」ことで、例えばtempと書けばグローバル変数tempのことになる、ということになるので動作するでしょう。当然ながら、presとpressで混乱したりしてはいけませんが。

あちこちを参考にしてプログラムをでっち上げるのは駄目とは言いませんが、とにかくくっつけて「当たり」を狙うのはいかがなものかと思います。CやC++の入門書程度でも目を通して一通りの知識は抑えないと、プログラミングがギャンブルになってしまいます。

投稿2021/08/21 10:36

thkana

総合スコア7639

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

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

aRyo

2021/08/22 04:37

ありがとうございます。 出来ました!また回答お待ちしております!!
guest

0

全体を充分に検証したわけではないので他の間違いもあるかもしれませんが、ご懸念の通りこれは誤りです。

c

1double temp = temp, press = press, hum = hum; //ここのやり方間違ってるのかな

このとき初期化子の側に現れている temp press hum はグローバル変数のそれではなくここで導入した変数そのものであってまだ初期化していない自分自身で初期化していると解釈されます。 故に内容は不定になってしまいます。

単純に変数名を変えるというのが最も簡単な解決方法でしょう。

投稿2021/08/21 06:21

SaitoAtsushi

総合スコア5446

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

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

aRyo

2021/08/21 06:24

bme280から得たデータを使いたいのですが、グローバル変数にはどのように変えれば良いでしょうか?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問