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の出力を変えるというものです。
至らない点が多いですが回答よろしくお願いします。
まだ回答がついていません
会員登録して回答してみよう