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

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

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

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

Q&A

解決済

3回答

3255閲覧

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

Shokotao

総合スコア8

Arduino

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

0グッド

0クリップ

投稿2018/07/11 06:15

編集2018/07/11 06:57

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

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

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

C

1void printFormattedFloat(float x, uint8_t precision) { 2char buffer[10]; 3 dtostrf(x, 7, precision, buffer); 4 Serial.print(buffer); 5} 6 7// print out the measurements 8void printCompensatedMeasurements(void) { 9float temp, humidity, pressure, pressureMoreAccurate; 10double tempMostAccurate, humidityMostAccurate, pressureMostAccurate; 11char buffer[80]; 12 temp = BME280.getTemperature(); 13 humidity = BME280.getHumidity(); 14 pressure = BME280.getPressure(); 15 pressureMoreAccurate = BME280.getPressureMoreAccurate(); 16 tempMostAccurate = BME280.getTemperatureMostAccurate(); 17 humidityMostAccurate = BME280.getHumidityMostAccurate(); 18 pressureMostAccurate = BME280.getPressureMostAccurate(); 19 printFormattedFloat(tempMostAccurate, 2); 20 Serial.print(" "); 21 printFormattedFloat(humidityMostAccurate, 2); 22 Serial.print(" "); 23 printFormattedFloat(pressureMostAccurate, 2); 24 Serial.println(); 25} 26 27 28// setup wire and serial 29 30void setup() 31{ 32 Wire.begin(); 33 Serial.begin(9600); 34 pinMode(16,INPUT); 35 pinMode(17,OUTPUT); 36 digitalWrite(17,0); 37} 38 39// main loop 40void loop() 41{ 42 uint8_t chipID; 43 chipID = BME280.readChipId(); 44 Serial.print("ChipID = 0x"); 45 Serial.print(chipID, HEX); 46 47 // need to read the NVM compensation parameters 48 BME280.readCompensationParams(); 49 50 BME280.writeOversamplingPressure(os1x); 51 BME280.writeOversamplingTemperature(os1x); 52 BME280.writeOversamplingHumidity(os1x); 53 54 BME280.writeMode(smForced); 55 while (BME280.isMeasuring()) { 56 Serial.println("Measuring..."); 57 delay(50); 58 } 59 Serial.println("Done!"); 60 // read out the data - must do this before calling the getxxxxx routines 61 BME280.readMeasurements(); 62 Serial.print("Temp="); 63 Serial.println(BME280.getTemperature()); // must get temp first 64 Serial.print("Humidity="); 65 Serial.println(BME280.getHumidity()); 66 Serial.print("Pressure="); 67 Serial.println(BME280.getPressure()); 68 Serial.print("PressureMoreAccurate="); 69 Serial.println(BME280.getPressureMoreAccurate()); // use int64 calculcations 70 Serial.print("TempMostAccurate="); 71 Serial.println(BME280.getTemperatureMostAccurate()); // use double calculations 72 Serial.print("HumidityMostAccurate="); 73 Serial.println(BME280.getHumidityMostAccurate()); // use double calculations 74 Serial.print("PressureMostAccurate="); 75 Serial.println(BME280.getPressureMostAccurate()); // use double calculations 76 77 // Example for "indoor navigation" 78 // We'll switch into normal mode for regular automatic samples 79 80 BME280.writeStandbyTime(tsb_0p5ms); // tsb = 0.5ms 81 BME280.writeFilterCoefficient(fc_16); // IIR Filter coefficient 16 82 BME280.writeOversamplingPressure(os16x); // pressure x16 83 BME280.writeOversamplingTemperature(os2x); // temperature x2 84 BME280.writeOversamplingHumidity(os1x); // humidity x1 85 BME280.writeMode(smNormal); 86 87 while (1) { 88 while (BME280.isMeasuring()) { 89 } 90 91 // read out the data - must do this before calling the getxxxxx routines 92 BME280.readMeasurements(); 93 printCompensatedMeasurements(); 94 delay(1000); // do this every 5 seconds 95 } 96}

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

C

1#include "BME280_MOD-1022.h" 2#include "Wire.h" 3 4void printFormattedFloat(float x, uint8_t precision) { 5char buffer[10]; 6 dtostrf(x, 7, precision, buffer); 7 Serial.print(buffer); 8} 9 10// print out the measurements 11void printCompensatedMeasurements(void) { 12float temp, humidity, pressure, pressureMoreAccurate; 13double tempMostAccurate, humidityMostAccurate, pressureMostAccurate; 14char buffer[80]; 15 temp = BME280.getTemperature(); 16 humidity = BME280.getHumidity(); 17 pressure = BME280.getPressure(); 18 pressureMoreAccurate = BME280.getPressureMoreAccurate(); 19 tempMostAccurate = BME280.getTemperatureMostAccurate(); 20 humidityMostAccurate = BME280.getHumidityMostAccurate(); 21 pressureMostAccurate = BME280.getPressureMostAccurate(); 22 printFormattedFloat(tempMostAccurate, 2); 23 Serial.print(" "); 24 printFormattedFloat(humidityMostAccurate, 2); 25 Serial.print(" "); 26 printFormattedFloat(pressureMostAccurate, 2); 27 Serial.println(); 28} 29 30// ここにLEDの変数を追加しました。 31int ledPin1; 32int ledPin2; 33int ledPin3; 34 35 36// setup wire and serial 37 38void setup() 39{ 40 Wire.begin(); 41 Serial.begin(9600); 42 pinMode(16,INPUT); 43 pinMode(ledPin1,OUTPUT); 44 pinMode(ledPin2,OUTPUT); 45 pinMode(ledPin3,OUTPUT); 46 digitalWrite(17,0); 47 48// それぞれの番号の場所に刺す様にしました。 49 ledPin1=9; 50 ledPin2=6; 51 ledPin3=3; 52} 53 54// main loop 55void loop() 56{ 57 uint8_t chipID; 58 chipID = BME280.readChipId(); 59 Serial.print("ChipID = 0x"); 60 Serial.print(chipID, HEX); 61 62 // need to read the NVM compensation parameters 63 BME280.readCompensationParams(); 64 65 BME280.writeOversamplingPressure(os1x); 66 BME280.writeOversamplingTemperature(os1x); 67 BME280.writeOversamplingHumidity(os1x); 68 69 BME280.writeMode(smForced); 70 while (BME280.isMeasuring()) { 71 Serial.println("Measuring..."); 72 delay(50); 73 } 74 Serial.println("Done!"); 75 // read out the data - must do this before calling the getxxxxx routines 76 BME280.readMeasurements(); 77 Serial.print("Temp="); 78 Serial.println(BME280.getTemperature()); // must get temp first 79 Serial.print("Humidity="); 80 Serial.println(BME280.getHumidity()); 81 Serial.print("Pressure="); 82 Serial.println(BME280.getPressure()); 83 Serial.print("PressureMoreAccurate="); 84 Serial.println(BME280.getPressureMoreAccurate()); // use int64 calculcations 85 Serial.print("TempMostAccurate="); 86 Serial.println(BME280.getTemperatureMostAccurate()); // use double calculations 87 Serial.print("HumidityMostAccurate="); 88 Serial.println(BME280.getHumidityMostAccurate()); // use double calculations 89 Serial.print("PressureMostAccurate="); 90 Serial.println(BME280.getPressureMostAccurate()); // use double calculations 91 92 93// ここに変数を指定しました。 94int tempe 95tempe = BME280.getTemperature() 96 97// ここにif文を追加しました。 98 if(tempe>=20&&tempe<25) 99 { 100 digitalWrite(ledPin1,1); 101 delay(1000); 102 digitalWrite(ledPin1,0); 103 } 104 else if(tempe>=25&&tempe<30) 105 { 106 digitalWrite(ledPin2,1); 107 delay(1000); 108 digitalWrite(ledPin2,0); 109 } 110 else if(tempe>=30) 111 { 112 digitalWrite(ledPin3,1); 113 delay(1000); 114 digitalWrite(ledPin3,0); 115 } 116 117 // Example for "indoor navigation" 118 // We'll switch into normal mode for regular automatic samples 119 120 BME280.writeStandbyTime(tsb_0p5ms); // tsb = 0.5ms 121 BME280.writeFilterCoefficient(fc_16); // IIR Filter coefficient 16 122 BME280.writeOversamplingPressure(os16x); // pressure x16 123 BME280.writeOversamplingTemperature(os2x); // temperature x2 124 BME280.writeOversamplingHumidity(os1x); // humidity x1 125 BME280.writeMode(smNormal); 126 127 while (1) { 128 while (BME280.isMeasuring()) { 129 } 130 131 // read out the data - must do this before calling the getxxxxx routines 132 BME280.readMeasurements(); 133 printCompensatedMeasurements(); 134 delay(1000); // do this every 5 seconds 135 } 136}

するとこの様なエラー文が表示されました。
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の出力を変えるというものです。
至らない点が多いですが回答よろしくお願いします。

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

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

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

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

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

guest

回答3

0

ベストアンサー

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

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

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

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

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

arduino

1int tempe; 2tempe = BME280.getTemperature();

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

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

投稿2018/07/11 14:07

編集2018/07/11 14:08
MasahikoHirata

総合スコア3747

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

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

MasahikoHirata

2018/07/11 14:15

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

2018/07/11 14:17

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

2018/07/11 14:20

100行目以降での’if'文で。 私的には誤解を防ぐため以下のように。 ' if(tempe>=20&&tempe<25)'は'if((tempe>=20)&&(tempe<25))' まあコンパイラが偉ければ。でも視覚的にも2つの条件の’AND'で分かりやすいでしょ?
MasahikoHirata

2018/07/11 14:21

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

2018/07/12 15:45

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

0

まず気が付くのは’temp’

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

arduino

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

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

投稿2018/07/11 06:28

MasahikoHirata

総合スコア3747

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

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

Shokotao

2018/07/11 06:30

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

0

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


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

int tempe
tempe = BME280.getTemperature()

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

投稿2018/07/11 06:22

編集2018/07/11 07:12
y_waiwai

総合スコア87774

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

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

Shokotao

2018/07/11 06: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' 「ファイル」メニューの「環境設定」から 「より詳細な情報を表示する:コンパイル」を有効にすると より詳しい情報が表示されます。
y_waiwai

2018/07/11 06:32

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

2018/07/11 06:35

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

2018/07/11 06:36

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

2018/07/11 06:37

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

2018/07/11 06:40

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

2018/07/11 06:44

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

2018/07/11 08:45

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問