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

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

ただいまの
回答率

90.34%

  • Arduino

    575questions

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

BME280で取得した数値によってLEDの出力を変えたい(言語:C)

解決済

回答 3

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 256

Shokotao

score 2

Arduino nanoとBME280、そしてC言語を使って、電子おもちゃを作ろうとしております。
動作としては、BME280で得た気温の数値によってLEDの光り方を変化させるというものです。

それを作るべくC言語をいろいろ編集していたところ、IF文の作成のところで躓いてしまいました。

最初、BME280から気温等をインプットし、シリアルモニタに出力するコードを作りました。
そして、無事出力できました。

void printFormattedFloat(float x, uint8_t precision) {
char buffer[10];
  dtostrf(x, 7, precision, buffer);
  Serial.print(buffer);
}

// print out the measurements
void printCompensatedMeasurements(void) {
float temp, humidity,  pressure, pressureMoreAccurate;
double tempMostAccurate, humidityMostAccurate, pressureMostAccurate;
char buffer[80];
  temp      = BME280.getTemperature();
  humidity  = BME280.getHumidity();
  pressure  = BME280.getPressure();
  pressureMoreAccurate = BME280.getPressureMoreAccurate(); 
  tempMostAccurate     = BME280.getTemperatureMostAccurate();
  humidityMostAccurate = BME280.getHumidityMostAccurate();
  pressureMostAccurate = BME280.getPressureMostAccurate();
  printFormattedFloat(tempMostAccurate, 2);
  Serial.print(" ");
  printFormattedFloat(humidityMostAccurate, 2);
  Serial.print(" ");
  printFormattedFloat(pressureMostAccurate, 2);
  Serial.println();
}


// setup wire and serial

void setup()
{
  Wire.begin();
  Serial.begin(9600);
  pinMode(16,INPUT);
  pinMode(17,OUTPUT);
  digitalWrite(17,0);
}

// main loop
void loop()
{
  uint8_t chipID;
  chipID = BME280.readChipId();
  Serial.print("ChipID = 0x");
  Serial.print(chipID, HEX);

  // need to read the NVM compensation parameters
  BME280.readCompensationParams();

  BME280.writeOversamplingPressure(os1x);
  BME280.writeOversamplingTemperature(os1x);
  BME280.writeOversamplingHumidity(os1x);

  BME280.writeMode(smForced);
  while (BME280.isMeasuring()) {
    Serial.println("Measuring...");
    delay(50);
  }
  Serial.println("Done!");
  // read out the data - must do this before calling the getxxxxx routines
  BME280.readMeasurements();
  Serial.print("Temp=");
  Serial.println(BME280.getTemperature());  // must get temp first
  Serial.print("Humidity=");
  Serial.println(BME280.getHumidity());
  Serial.print("Pressure=");
  Serial.println(BME280.getPressure());
  Serial.print("PressureMoreAccurate=");
  Serial.println(BME280.getPressureMoreAccurate());  // use int64 calculcations
  Serial.print("TempMostAccurate=");
  Serial.println(BME280.getTemperatureMostAccurate());  // use double calculations
  Serial.print("HumidityMostAccurate=");
  Serial.println(BME280.getHumidityMostAccurate()); // use double calculations
  Serial.print("PressureMostAccurate=");
  Serial.println(BME280.getPressureMostAccurate()); // use double calculations

  // Example for "indoor navigation"
  // We'll switch into normal mode for regular automatic samples

  BME280.writeStandbyTime(tsb_0p5ms);        // tsb = 0.5ms
  BME280.writeFilterCoefficient(fc_16);      // IIR Filter coefficient 16
  BME280.writeOversamplingPressure(os16x);    // pressure x16
  BME280.writeOversamplingTemperature(os2x);  // temperature x2
  BME280.writeOversamplingHumidity(os1x);     // humidity x1
  BME280.writeMode(smNormal);

  while (1) {
    while (BME280.isMeasuring()) {
    }

    // read out the data - must do this before calling the getxxxxx routines
    BME280.readMeasurements();
    printCompensatedMeasurements();
    delay(1000);    // do this every 5 seconds
  }
}

そしてその後、if文を追加しました。そのコードが以下となります。

#include "BME280_MOD-1022.h"
#include "Wire.h"

void printFormattedFloat(float x, uint8_t precision) {
char buffer[10];
  dtostrf(x, 7, precision, buffer);
  Serial.print(buffer);
}

// print out the measurements
void printCompensatedMeasurements(void) {
float temp, humidity,  pressure, pressureMoreAccurate;
double tempMostAccurate, humidityMostAccurate, pressureMostAccurate;
char buffer[80];
  temp      = BME280.getTemperature();
  humidity  = BME280.getHumidity();
  pressure  = BME280.getPressure();
  pressureMoreAccurate = BME280.getPressureMoreAccurate(); 
  tempMostAccurate     = BME280.getTemperatureMostAccurate();
  humidityMostAccurate = BME280.getHumidityMostAccurate();
  pressureMostAccurate = BME280.getPressureMostAccurate();
  printFormattedFloat(tempMostAccurate, 2);
  Serial.print(" ");
  printFormattedFloat(humidityMostAccurate, 2);
  Serial.print(" ");
  printFormattedFloat(pressureMostAccurate, 2);
  Serial.println();
}

// ここにLEDの変数を追加しました。
int ledPin1;
int ledPin2;
int ledPin3;


// setup wire and serial

void setup()
{
  Wire.begin();
  Serial.begin(9600);
  pinMode(16,INPUT);
  pinMode(ledPin1,OUTPUT);
  pinMode(ledPin2,OUTPUT);
  pinMode(ledPin3,OUTPUT);
  digitalWrite(17,0);

// それぞれの番号の場所に刺す様にしました。
  ledPin1=9;
  ledPin2=6;
  ledPin3=3;
}

// main loop
void loop()
{
  uint8_t chipID;
  chipID = BME280.readChipId();
  Serial.print("ChipID = 0x");
  Serial.print(chipID, HEX);

  // need to read the NVM compensation parameters
  BME280.readCompensationParams();

  BME280.writeOversamplingPressure(os1x);
  BME280.writeOversamplingTemperature(os1x);
  BME280.writeOversamplingHumidity(os1x);

  BME280.writeMode(smForced);
  while (BME280.isMeasuring()) {
    Serial.println("Measuring...");
    delay(50);
  }
  Serial.println("Done!");
  // read out the data - must do this before calling the getxxxxx routines
  BME280.readMeasurements();
  Serial.print("Temp=");
  Serial.println(BME280.getTemperature());  // must get temp first
  Serial.print("Humidity=");
  Serial.println(BME280.getHumidity());
  Serial.print("Pressure=");
  Serial.println(BME280.getPressure());
  Serial.print("PressureMoreAccurate=");
  Serial.println(BME280.getPressureMoreAccurate());  // use int64 calculcations
  Serial.print("TempMostAccurate=");
  Serial.println(BME280.getTemperatureMostAccurate());  // use double calculations
  Serial.print("HumidityMostAccurate=");
  Serial.println(BME280.getHumidityMostAccurate()); // use double calculations
  Serial.print("PressureMostAccurate=");
  Serial.println(BME280.getPressureMostAccurate()); // use double calculations


// ここに変数を指定しました。
int tempe
tempe = BME280.getTemperature()

// ここにif文を追加しました。
  if(tempe>=20&&tempe<25)
    {
      digitalWrite(ledPin1,1);
      delay(1000);
      digitalWrite(ledPin1,0);
    }
    else if(tempe>=25&&tempe<30)
    {
      digitalWrite(ledPin2,1);
      delay(1000);
      digitalWrite(ledPin2,0);
    }
    else if(tempe>=30)
    {
      digitalWrite(ledPin3,1);
      delay(1000);
      digitalWrite(ledPin3,0);
    }

  // Example for "indoor navigation"
  // We'll switch into normal mode for regular automatic samples

  BME280.writeStandbyTime(tsb_0p5ms);        // tsb = 0.5ms
  BME280.writeFilterCoefficient(fc_16);      // IIR Filter coefficient 16
  BME280.writeOversamplingPressure(os16x);    // pressure x16
  BME280.writeOversamplingTemperature(os2x);  // temperature x2
  BME280.writeOversamplingHumidity(os1x);     // humidity x1
  BME280.writeMode(smNormal);

  while (1) {
    while (BME280.isMeasuring()) {
    }

    // read out the data - must do this before calling the getxxxxx routines
    BME280.readMeasurements();
    printCompensatedMeasurements();
    delay(1000);  // do this every 5 seconds
  }
}

するとこの様なエラー文が表示されました。
Arduino:1.8.5 (Mac OS X), ボード:"Arduino Nano, ATmega328P"

In file included from /Users/KaishuYanagida/Desktop/sfc/おもちゃWS/bme280/bme280.ino:1:0:
sketch/BME280_MOD-1022.h:41:21: warning: extra tokens at end of #ifndef directive
#ifndef BME280_MOD-1022_H ^ sketch/BME280_MOD-1022.h:42:21: warning: ISO C99 requires whitespace after the macro name #define BME280_MOD-1022_H
^
/Users/KaishuYanagida/Desktop/sfc/おもちゃWS/bme280/bme280.ino: In function 'void loop()':
bme280:94: error: expected initializer before 'tempe'
tempe = BME280.getTemperature()
^
bme280:102: error: 'else' without a previous 'if'
else if(tempe>=25&&tempe<30)
^
bme280:102: error: 'tempe' was not declared in this scope
else if(tempe>=25&&tempe<30)
^
exit status 1
expected initializer before 'tempe'

私がやりたいことは上にも書いた通り、BME280で取得した値によってLEDの出力を変えるというものです。
至らない点が多いですが回答よろしくお願いします。

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 3

checkベストアンサー

+1

質問者の本気度に動かされ、色々秋葉原で購入して試してみた。

まずIDEにスイッチサイエンスのBME280
を登録。

’I2C接続かぁ’とか思いながら。
コンパイルすると。。。
あっ。
こっちかぁ。
MOD-1022
再度コンパイル。
今度は質問者のエラーに。
でも同じ名前のZIPで内容が違うのGitHubは勘弁。

94行目で’tempe’?まあ良いが。
と見てみたらy-waiwai殿の指摘通りセミコロンが';'

94と95行目を以下のように書き換えると。。。

int tempe;
tempe = BME280.getTemperature();


コンパイルは通りました。

さて、さらに何がしたかったかを検証してみるので。次に続く。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/07/11 23:15

    次に33行目から
    'int ledPin1;'とか変数を宣言しているけど値が不定。
    よってsetup()では変なところを初期化。
    できればpinを確定してプログラムの先頭で
    例えば
    #define ledPin 1
    とか実際のピン番号を設定して、変数は変わるから’変数’。プログラム動作時に変わらないでしょ?

    キャンセル

  • 2018/07/11 23:17

    その後に51行目から
    ledPin1=9;
    とか。
    おいおいその前に値が定まっていないから’pinMode’がどっかを初期化してる。。

    キャンセル

  • 2018/07/11 23:20

    100行目以降での’if'文で。

    私的には誤解を防ぐため以下のように。

    ' if(tempe>=20&&tempe<25)'は'if((tempe>=20)&&(tempe<25))'
    まあコンパイラが偉ければ。でも視覚的にも2つの条件の’AND'で分かりやすいでしょ?

    キャンセル

  • 2018/07/11 23:21

    後は明日の仕事の合間に動かしてみる。

    キャンセル

  • 2018/07/13 00:45

    細かい回答ありがとうございます。
    こちらも無知ながら試行錯誤しています。
    来週の火曜日が課題の最終提出日なのでとても切羽詰まっています。
    また何か質問をするかもしれませんがその際はまたよろしくお願いします・・・・。

    キャンセル

  • 2018/07/13 21:14

    頑張って。同じ環境用意中。

    キャンセル

+1

まず気が付くのは’temp’

関数の内部でローカルに宣言して他の関数(if文の部分)で参照?

void printCompensatedMeasurements(void) {
float temp, humidity,  pressure, pressureMoreAccurate;


ここで宣言してるじゃん。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/07/11 15:30

    すみません。
    初心者なので全然わからないです・・・。
    宣言しているので、なんでしょうか。

    キャンセル

-1

このコードでちゃんとコンパイルできるのでしょうか。
エラーが出るなら、エラーメッセージをコピペしてそのまま出してください。


ワーニングはパスするとして、、

int tempe
tempe = BME280.getTemperature()

この2行、セミコロンがついてません。このせいで次の行でエラーが出てます
まずはこれを修正してやり直してみてください

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/07/11 15:26

    int tempe
    tempe = BME280.getTemperature()

    if(tempe>=20&&tempe<25)
    {
    digitalWrite(ledPin1,1);
    delay(1000);
    digitalWrite(ledPin1,0);
    }
    else if(tempe>=25&&tempe<30)
    {
    digitalWrite(ledPin2,1);
    delay(1000);
    digitalWrite(ledPin2,0);
    }
    else if(tempe>=30)
    {
    digitalWrite(ledPin3,1);
    delay(1000);
    digitalWrite(ledPin3,0);
    }

    に対して

    Arduino:1.8.5 (Mac OS X), ボード:"Arduino Nano, ATmega328P"

    In file included from /Users/KaishuYanagida/Desktop/sfc/おもちゃWS/bme280/bme280.ino:1:0:
    sketch/BME280_MOD-1022.h:41:21: warning: extra tokens at end of #ifndef directive
    #ifndef __BME280_MOD-1022_H
    ^
    sketch/BME280_MOD-1022.h:42:21: warning: ISO C99 requires whitespace after the macro name
    #define __BME280_MOD-1022_H
    ^
    /Users/KaishuYanagida/Desktop/sfc/おもちゃWS/bme280/bme280.ino: In function 'void loop()':
    bme280:94: error: expected initializer before 'tempe'
    tempe = BME280.getTemperature()
    ^
    bme280:102: error: 'else' without a previous 'if'
    else if(tempe>=25&&tempe<30)
    ^
    bme280:102: error: 'tempe' was not declared in this scope
    else if(tempe>=25&&tempe<30)
    ^
    exit status 1
    expected initializer before 'tempe'

    「ファイル」メニューの「環境設定」から
    「より詳細な情報を表示する:コンパイル」を有効にすると
    より詳しい情報が表示されます。

    キャンセル

  • 2018/07/11 15:32

    えーと、そのコードは質問のコードには含まれてないようですが。
    なにがどうなってるんでしょうか。

    キャンセル

  • 2018/07/11 15:35

    回答を待っている間に自分のわかる範囲とこのコードを教えてくれた学生に話を聞いて変更しました。
    質問した際のコードを変更するのでそちらをみて回答して頂けるとありがたいです。
    初心者ゆえ至らぬ部分が多く申し訳ないです。

    キャンセル

  • 2018/07/11 15:36

    y_waiwai殿。ですよね。
    それと質問でソースは注意書きにもあるように'<code>'で添付されないと難読。

    キャンセル

  • 2018/07/11 15:37

    C言語の基本的な文法がわかっていないようにお見受けします。
    そこらへん、もちっと勉強してこられてはいかがでしょうか。

    キャンセル

  • 2018/07/11 15:40

    コードを修正なさるのなら、質問自体を修正して、<code>ボタンを押して、'''の枠の中にコードを貼り付けてください

    キャンセル

  • 2018/07/11 15:44

    授業自体がコードをそこまで勉強せずに文字の羅列だと思っておけという教授なので、C言語を勉強する時間がなく最終課題が出されている状況です。
    勉強したらこんな愚問は聞きませんよね・・・・。
    本当にごめんなさい。

    キャンセル

  • 2018/07/11 16:13

    回答更新

    キャンセル

  • 2018/07/11 17:45

    ありがとうございます。
    やってみます。

    キャンセル

同じタグがついた質問を見る

  • Arduino

    575questions

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