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

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

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

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

解決済

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

Shokotao
Shokotao

総合スコア8

Arduino

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

3回答

0評価

0クリップ

2766閲覧

投稿2018/07/11 06:15

編集2018/07/11 06:57

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

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

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

C

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文を追加しました。そのコードが以下となります。

C

#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ページの「注目」タブのフィードに表示されやすくなります。

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

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

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

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

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

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

まだ回答がついていません

会員登録して回答してみよう

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

ただいまの回答率
87.20%

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

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

質問する

関連した質問

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

Arduino

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