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

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

新規登録して質問してみよう
ただいま回答率
85.44%
Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

Arduino

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

Q&A

解決済

3回答

3036閲覧

VScodeでarduinoを使用した際にコンパイルエラーが起こってしまう

babbleman

総合スコア107

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

Arduino

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

0グッド

0クリップ

投稿2020/05/13 02:26

以下のコードを実行しようとしたところコンパイルエラーが起きてしまいます。

arduino

1/* 2 * Sigfox Accelerometerサンプル 3 * UnaShieldの加速度センサが一定の動作を検知したらメッセージをSigfoxで送信します 4 * ライブラリマネージャ(スケッチ_ライブラリのインクルード_ライブラリを管理)で 5 * Adafruit Unified Sensor と Adafruit MMA8451 Library 6 * をインストールしておく必要があります。 7 * Copyright (c) 2018 Kyocera Communication Systems, Co,. Ltd. 8 * Callback - Custom Payload Config : acc::float:32 orientation::char:3 9 */ 10#include "SIGFOX.h" 11#include <Wire.h> 12#include <Adafruit_Sensor.h> 13#include <Adafruit_MMA8451.h> 14//必要に応じ書き換えてください 15//************************************ 16static const bool isDebug = true; 17static const float ACC_THRESHOLD = 1; //移動判定閾値 18//************************************ 19Adafruit_MMA8451 mma = Adafruit_MMA8451(); 20// IMPORTANT: Check these settings with UnaBiz to use the SIGFOX library correctly. 21static const String device = "NOTUSED"; // Set this to your device name if you're using UnaBiz Emulator. 22static const bool useEmulator = false; // Set to true if using UnaBiz Emulator. 23static const bool echo = true; // Set to true if the SIGFOX library should display the executed commands. 24static const Country country = COUNTRY_JP; // Set this to your country to configure the SIGFOX transmission frequencies. 25static UnaShieldV2S transceiver(country, useEmulator, device, echo); // Uncomment this for UnaBiz UnaShield V2S Dev Kit 26static String response; // Will store the downlink response from SIGFOX. 27// IMPORTANT: Check these settings with UnaBiz to use the SIGFOX library correctly. 28void setup() 29{ 30 Serial.begin(9600); // Arduinoハードウェアシリアルを起動(Arduino <-> PC) 31 Serial.println("==========================="); 32 Serial.println("Sigfox UnaShield Accelerometer Sample"); 33 Serial.println("Send a message when the UnaShield is moved."); 34 Serial.println("==========================="); 35 //Sigfoxモジュールを起動 36 if (!transceiver.begin()) stop(F("Unable to init SIGFOX module, may be missing")); // Will never return. 37 //加速度センサ(Adafruit MMA8451)を起動 38 if (! mma.begin(0x1c)) { //// // NOTE: Must use 0x1c for UnaShield V2S 39 Serial.println("Couldnt start"); 40 while (1); 41 } 42 Serial.println("MMA8451 found!"); 43 mma.setRange(MMA8451_RANGE_2_G); 44 Serial.print("Range = "); Serial.print(2 << mma.getRange()); 45 Serial.println("G"); 46} 47void loop() 48{ 49 //加速度センサのRawデータ(14-bit)を取得する 50 mma.read(); 51 if (isDebug) displayMM8451RawData(); 52 //加速度センサイベントを取得する 53 sensors_event_t event; 54 mma.getEvent(&event); 55 if (isDebug) displayMM8451AccData(event); 56 //加速度センサから方向を取得する 57 uint8_t o = mma.getOrientation(); 58 if (isDebug) displayMM8451Orientation(o); 59 //加速度を計算 60 float acc = calcAcc(event.acceleration.x, event.acceleration.y, event.acceleration.z); 61 //所定の加速度以上であれば、Sigfoxメッセージ送信 62 if (abs(acc - 9.8) >= ACC_THRESHOLD) 63 { 64 sendSigfoxMessage(acc, o); 65 delay(2000); 66 } 67 delay(500); 68} 69//ボタン押下をSigfoxメッセージで送信する 70void sendSigfoxMessage(float acc, uint8_t orientation) 71{ 72 Serial.println("\n*****SEND SIGFOX MESSAGE*****"); 73 String sAcc = convertFloatToHex(acc); 74 String sOrientation = convertOrientationToHex(orientation); 75 Serial.print("ACC: "); Serial.print(acc); Serial.print(" -> 0x"); Serial.println(sAcc); 76 Serial.print("Orientation: "); Serial.print(orientation); Serial.print(" -> 0x"); Serial.println(sOrientation); 77 Serial.print("Payload: "); Serial.println(sAcc + sOrientation); 78 transceiver.sendMessage(sAcc + sOrientation); 79 Serial.println("*****************************"); 80} 81//XYZ値から加速度を計算 82float calcAcc(float x, float y, float z) 83{ 84 float acc = sqrt(x * x + y * y + z * z); 85 Serial.print("ACC: "); Serial.print(acc); 86 Serial.print("\tX: "); Serial.print(x); 87 Serial.print("\tY: "); Serial.print(y); 88 Serial.print("\tZ: "); Serial.println(z); 89 return acc; 90} 91//加速度センサのRawデータ(14-bit)を表示する 92void displayMM8451RawData() 93{ 94 Serial.print("X:\t"); Serial.print(mma.x); 95 Serial.print("\tY:\t"); Serial.print(mma.y); 96 Serial.print("\tZ:\t"); Serial.print(mma.z); 97 Serial.println(); 98} 99//加速度センサのXYZ値を表示する 100void displayMM8451AccData(sensors_event_t event) 101{ 102 /* Display the results (acceleration is measured in m/s^2) */ 103 Serial.print("X: \t"); Serial.print(event.acceleration.x); Serial.print("\t"); 104 Serial.print("Y: \t"); Serial.print(event.acceleration.y); Serial.print("\t"); 105 Serial.print("Z: \t"); Serial.print(event.acceleration.z); Serial.print("\t"); 106 Serial.println("m/s^2 "); 107} 108//加速度センサの方向を表示する 109void displayMM8451Orientation(uint8_t o) 110{ 111 switch (o) { 112 case MMA8451_PL_PUF: 113 Serial.println("Portrait Up Front"); 114 break; 115 case MMA8451_PL_PUB: 116 Serial.println("Portrait Up Back"); 117 break; 118 case MMA8451_PL_PDF: 119 Serial.println("Portrait Down Front"); 120 break; 121 case MMA8451_PL_PDB: 122 Serial.println("Portrait Down Back"); 123 break; 124 case MMA8451_PL_LRF: 125 Serial.println("Landscape Right Front"); 126 break; 127 case MMA8451_PL_LRB: 128 Serial.println("Landscape Right Back"); 129 break; 130 case MMA8451_PL_LLF: 131 Serial.println("Landscape Left Front"); 132 break; 133 case MMA8451_PL_LLB: 134 Serial.println("Landscape Left Back"); 135 break; 136 } 137 Serial.println(); 138} 139String convertOrientationToHex(uint8_t o) 140{ 141 String sOrientation = ""; 142 switch (o) { 143 case MMA8451_PL_PUF: 144 sOrientation = "505546"; 145 break; 146 case MMA8451_PL_PUB: 147 sOrientation = "505542"; 148 break; 149 case MMA8451_PL_PDF: 150 sOrientation = "504446"; 151 break; 152 case MMA8451_PL_PDB: 153 sOrientation = "504442"; 154 break; 155 case MMA8451_PL_LRF: 156 sOrientation = "4C5246"; 157 break; 158 case MMA8451_PL_LRB: 159 sOrientation = "4C5242"; 160 break; 161 case MMA8451_PL_LLF: 162 sOrientation = "4C4C46"; 163 break; 164 case MMA8451_PL_LLB: 165 sOrientation = "4C4C42"; 166 break; 167 } 168 return sOrientation; 169} 170//Float型変数をIEEE754に準拠した16進文字列へ変換する 171String convertFloatToHex(float val) 172{ 173 union { 174 uint32_t B32; 175 float Float; 176 } floatb32; 177 floatb32.Float = val; 178 return String(floatb32.B32, HEX); 179} 180

エラー内容は以下の通りです、主にスコープが有効範囲外といっているようにみえます。

error

1NewTes:100:27: error: variable or field 'displayMM8451AccData' declared void 2 3NewTes:100:27: error: 'sensors_event_t' was not declared in this scope 4 5c:\Users\UserName\Desktop\開発\VScode\TESTproject\TEST\NewTes.ino: In function 'void loop()': 6 7NewTes:55:16: error: 'displayMM8451AccData' was not declared in this scope 8 9c:\Users\UserName\Desktop\開発\VScode\TESTproject\TEST\NewTes.ino:55:16: note: suggested alternative: 'displayMM8451RawData'

以下はcpp propertiesの内容です。

{ "configurations": [ { "name": "Win32", "includePath": [ "C:\Users\UserName\Documents\Arduino\libraries\Adafruit_Unified_Sensor", "C:\Users\UserName\Documents\Arduino\libraries\Adafruit_MMA8451_Library", "C:\Program Files (x86)\Arduino\tools\**", "C:\Program Files (x86)\Arduino\hardware\arduino\avr\**", "C:\Program Files (x86)\Arduino\hardware\tools\**", "C:\Users\UserName\Documents\Arduino\libraries\sigfox-shield-arduino-master" ], "forcedInclude": [ "C:\Program Files (x86)\Arduino\hardware\arduino\avr\cores\arduino\Arduino.h" ], "intelliSenseMode": "msvc-x64" } ], "version": 4 }

エラーの解決方法をおしえてください。
よろしくお願いいたします。

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

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

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

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

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

退会済みユーザー

退会済みユーザー

2020/05/13 09:05

Arduino IDEでコンパイルするとどうなりますか?
guest

回答3

0

自己解決

ファイルが置いてあるフォルダを変更したら無事にコンパイルできるようになりました。
回答してくださった皆様、どうもありがとうございました。

投稿2020/05/14 10:15

babbleman

総合スコア107

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

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

thkana

2020/05/14 11:31

どのように変更したのですか Teratailの趣旨からすれば、「あなたが解決すればそれでOK」だけでなく、「同様の問題に引っかかったひとがいたらその解決の役に立つ」というのもあるわけです。あなたの解決法をちゃんと説明しておいて下さい。
guest

0

VSCodeのArduinoコンパイル環境は構築してないし、余計なライブラリをあまり放り込みたくないからダミーのクラスやら関数やら定義してArduino IDEでコンパイルしてみたけど、エラーにならない...

NewTes:100:27: error: variable or field 'displayMM8451AccData' declared void
これが出るためには、
void displayMM8451AccData(sensors_event_t event)のところが何らかの原因で
void displayMM8451AccDataで一旦解釈が終了して変数の宣言になっていて、void型の変数なんてないでしょ、と文句を言っていると考えられるのだけど。

考えにくいけど、なにか不可視の文字が紛れ込んでいるとか。でも、gccは結構ちゃんと不可視な文字も検出してくれるみたいなんだけど。
void displayMM8451AccData(sensors_event_t event)の行をコメントアウトして同内容をコピペでなく打ち直して

C++

1//void displayMM8451AccData(sensors_event_t event) //コメントアウト 2void displayMM8451AccData(sensors_event_t event) //コピペでなく打ち直し

としてみたらどうなるでしょう。

あと、これも問題ないとは思うけど、ソースの置く場所のパスの途中に日本語を混ぜないところにしてみる、とか。
(昔は結構これで引っかかるものって多かったのですけれど。gccは多分大丈夫なはずなんだけど)

あまり期待しないで試してみて下さい。

投稿2020/05/13 12:11

thkana

総合スコア7667

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

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

0

NewTes💯27: error: variable or field 'displayMM8451AccData' declared void

この関数のプロトタイプ宣言がないためにこのエラーが出てます。
追加してやりましょう

投稿2020/05/13 02:41

y_waiwai

総合スコア87849

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

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

babbleman

2020/05/13 02:47

そちらの関数は以下のように宣言されているように見えます。 それ以外にも何かが必要になるのでしょうか? //加速度センサのXYZ値を表示する void displayMM8451AccData(sensors_event_t event)
y_waiwai

2020/05/13 02:51

JAVAとかC#とかとは違って、C/C++ではキーワードの定義位置以降でしか有効になりません。 なので、その関数を使用する行の手前のどこかでプロトタイプ宣言の必要があります #他の関数/変数も同様
babbleman

2020/05/13 03:04

if (isDebug) displayMM8451RawData(); 上の関数に関しては以降で宣言をしているのですが エラー内容が出ておりませんでした。 Accデータのみエラーがでてしまっております。
y_waiwai

2020/05/13 03:16

未定義の関数は、戻り値なし、引数なしの関数と推定してコンパイラさんはコンパイルしてくれます #未定義だ!とワーニングがでますが、デフォルト状態ではワーニング抑止されてますな たまたま、関数仕様が合っているため、リンク時にエラーが出ないで済んでいるだけです
babbleman

2020/05/13 03:22

一応関数群をincludeの手前に書いてみたのですがやはり同様のエラーが発生してしまっております。
y_waiwai

2020/05/13 03:25

同一のエラーでなければ、また他の原因ですね。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.44%

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

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

質問する

関連した質問