Arduinoでコンパイルエラーが発生する原因と対処方法について

このQ&Aのポイント
  • Arduinoで「コンパイル時にエラーが発生しました。」というメッセージが表示されるがスケッチ上に黄色い帯が表示されない場合、原因として「RTClib.h」というファイルの配置やライブラリの不足が考えられる。
  • 「RTClib.h」ファイルを同じ場所に置き、スケッチに以下のコードを追加することで問題を解決できる。
  • また、DS1307チップを使用している場合は、Wireライブラリを追加する必要がある。
回答を見る
  • ベストアンサー

Arduinoでコンパイルエラーについて

お世話になります。 Arduinoで検証すると「コンパイル時にエラーが発生しました。」と出ますがスケッチ上に黄色い帯が出ません。 なにが原因なのでしょう? 参考にしたスケッチ http://www.mauroalfieri.it/en/elettronica/data-logging-con-arduino.html これに「RTClib.h」というファイルを同じ場所に置きました。 テキストファイルに以下のスケッチをコピーし「RTClib.h」を作成します。 // Code by JeeLabs http://news.jeelabs.org/code/ // Released to the public domain! Enjoy! // Simple general-purpose date/time class (no TZ / DST / leap second handling!) class DateTime { public: DateTime (uint32_t t =0); DateTime (uint16_t year, uint8_t month, uint8_t day, uint8_t hour =0, uint8_t min =0, uint8_t sec =0); DateTime (const char* date, const char* time); uint16_t year() const { return 2000 + yOff; } uint8_t month() const { return m; } uint8_t day() const { return d; } uint8_t hour() const { return hh; } uint8_t minute() const { return mm; } uint8_t second() const { return ss; } uint8_t dayOfWeek() const; // 32-bit times as seconds since 1/1/2000 long secondstime() const; // 32-bit times as seconds since 1/1/1970 uint32_t unixtime(void) const; protected: uint8_t yOff, m, d, hh, mm, ss; }; // RTC based on the DS1307 chip connected via I2C and the Wire library class RTC_DS1307 { public: static uint8_t begin(void); static void adjust(const DateTime& dt); static void sqw(int sqw); uint8_t isrunning(void); static DateTime now(); }; // RTC using the internal millis() clock, has to be initialized before use // NOTE: this clock won't be correct once the millis() timer rolls over (>49d?) class RTC_Millis { public: static void begin(const DateTime& dt) { adjust(dt); } static void adjust(const DateTime& dt); static DateTime now(); protected: static long offset; }; みなさま、どうかよろしくお願い致します。

質問者が選んだベストアンサー

  • ベストアンサー
  • Wr5
  • ベストアンサー率53% (2177/4070)
回答No.3

>同じ「コンパイルエラー」が発生してしまいました。 確認に使ったのは「arduino-1.0.1」ですが… #2の後半に記述した手順でコンパイルは通りましたよ。 # Windows7 Pro(64bit)…だけど関係ないと思われますが。 対応するシールドも持っていないので動作検証まではできません。 # そしてシールドを購入する気もありません。今のところ必要性ないし。 エラーメッセージ不明なので私はここで終わり…ですかね。

dt50ax1vt250
質問者

お礼

ご丁寧に、ありがとうございます。 私が使っているVerは「1.0.5-r2」と書いて有ります。 Verの違いでエラーが発生するのでしょうか・・・ Wir5様の所で、エラーが発生しなかった。と言うことが分かってとてもよかったです。 本当に、ありがとうございました。

その他の回答 (2)

  • Wr5
  • ベストアンサー率53% (2177/4070)
回答No.2

>これも、試してみたのですが・・・・違うところがエラーに。 >RTClib内の情報をマルッと書き換えたりしたのですがエラーに。 >ライブラリを使わずに同じホルダーに入れたらこんなエラーに。 どんなエラーですか?と…… まぁ、試してみました。 どうも、ある程度手を入れてあるRTClibみたいですね。 ということで…#1で回答した際のRTClibはディレクトリごと削除。 質問に書かれたサイトのリンク先にある「Download sketch del data logging」の「GitHub」のリンク先から同じようにDownload ZIPで取得。 展開するとRTClib.hとRTClib.cppが出てきますので、元々のスケッチが置かれているディレクトリにコピーしてください。 その後で、Arduinoコンパイラを起動して「検証・コンパイル」で。

dt50ax1vt250
質問者

お礼

重ね重ね、ありがとうございます。 Wr5様の所ではエラーが発生しませんか? 同じ「コンパイルエラー」が発生してしまいました。 PCの問題でしょうか・・・・ WIN7なのですが。 検証していただき、ありがとうございました。

  • Wr5
  • ベストアンサー率53% (2177/4070)
回答No.1

>テキストファイルに以下のスケッチをコピーし「RTClib.h」を作成します。 RTClib.hだけ…ですか??? RTC_DS1307クラスのadjust()の実体とかどこにあるんでしょう??? https://github.com/adafruit/RTClib で、右側の「Download ZIP」からZIPファイルを入手し、 展開してできたRTClib-masterディレクトリの中身をArduinoコンパイラのlibrariesディレクトリに入れればいいんじゃないですかね? # 実際にはlibrariesディレクトリにRTClibというディレクトリを掘って、その中…でしょうかねぇ……。 その後、Arduinoコンパイラ起動して、[スケッチ]-[ライブラリを使用]-[RTClib]を選択…でよいかと……。

dt50ax1vt250
質問者

お礼

早速ありがとうございます。 これも、試してみたのですが・・・・違うところがエラーに。 RTClib内の情報をマルッと書き換えたりしたのですがエラーに。 ライブラリを使わずに同じホルダーに入れたらこんなエラーに。 もう少し、試してみます。 何か、情報が有りましたら よろしくお願い致します。

関連するQ&A

  • コンパイルエラー。間違ってるのは誰?(どこ?)

    Effective C++の「型変換をさせたいなら、メンバでない関数をクラステンプレートの中で定義しよう」という項目に乗っていたコードを実験してみたのですが、コンパイルでエラーが出るようです。 ----- template<typename T> class Rational { T numerator_value; T denominator_value; public: Rational(const T& num=0, const T& den=1) :numerator_value(num), denominator_value(den){} const T numerator(){return numerator_value;} const T denominator(){return denominator_value;} void show() const { std::cout<<"numerator="<<numerator_value<<": denominator="<<denominator_value<<std::endl; } friend const Rational operator*(const Rational& lhs, const Rational& rhs) //←引数がおかしい? { return Rational(lhs.numerator()*rhs.numerator(), lhs.denominator()*rhs.denominator()); } }; int main() { Rational<int> obj1(1,10); Rational<int> obj2; obj2=obj1*10; obj2.show(); return 0; } ----- こういうコードを書いたのですが、friend関数の部分で「'const Rational<T>' から 'Rational<T> &' へ 'this' ポインタを変換できません」等と怒られます。 引数に取る二つの値のどちらもおかしいようで、コンパイルのエラーを出さないようにするためには、constと&を外さないといけないようです。 引数はEffectiveC++の掲載コードをそのまま使っています。 これは、私のコードがおかしいのか、本のコードがおかしいのかどちらでしょうか?

  • コンパイルエラー: LNK2001

    今、ベクトル計算を簡単にするクラスを作ってみようとしています。 //vector3.h template<class TT> class vector3{ public:   enum{NUM=3};   TT x[NUM];   void set(const TT *vv)void set(const TT *vv){     int i;     for(i=0;i<NUM;i++){       x[i]=vv[i];     }   } }; のように、set関数をクラスの中に書いていると問題無いのですが、以下のように、 //vector3.h template<class TT> class vector3{ public:   enum{NUM=3};   TT x[NUM];   void set(const TT *vv); }; //test.cpp #include"vector3.h" template<class TT> void vector3<TT>::set(const TT *vv){   int i;   for(i=0;i<NUM;i++){     x[i]=vv[i];   } } と、cppファイルの中に書き換えると以下のようにエラーが出るようになります。 error LNK2001: 外部シンボル ""public: void __thiscall vector3<double>::set(double const *)" (?set@?$vector3@N@@QAEXPBN@Z)" は未解決です。 fatal error LNK1120: 外部参照 1 が未解決です。 これはいったい何故なのでしょうか? 使用しているのはVisualC++2008ExpressEditionです 宜しくお願いします。

  • Arduino 全部のピンをチェックするスケッチ

    お世話になります。 スケッチで質問が有ります。 これだと、1個のピンしか見ていないと思うのですが、複数のピンもしくは全部のピンをチェックして変化があるか判断したいのです。 void loop() { DateTime now = RTC.now(); val = digitalRead(); if(val != old_val) { よろしくお願い致します。

  • 機器のI/OをArduinoでSDに記録したい

    皆様、お世話になります。 Arduinoでデーターロガーのスケッチを作成しています。 スケッチしてみましたが動くかどうか確認とこう直した方が良いなど改善点が有れば、お願い致します。 2番ピンに変化が有った時(ONかOFF)に時間と2番ピンの状態をSDカードに記録したいのです。 これが、うまくいけば系統を増やしていきたいです。 書いたスケッチ #include <SD.h> // この値は使用しているシールドや基板に合わせて変更すること。たとえば、 // イーサーネットシールドは 4 // Adafruit のSDシールドは 10 // Sparkfun のSDシールドは 8 const int chipSelect = 4; void setup() { // シリアルポート初期化 Serial.begin(9600); while (!Serial) { ; // USBケーブルが接続されるのを待つ。この待ちループは Leonardo のみ必要。 pinMode(2,INPUT) ; //スイッチに接続ピンをデジタル入力に設定A } Serial.print(F("Initializing SD card...")); // SSピン(Unoは10番、Megaは53番)は使わない場合でも出力にする必要があります。 // そうしないと、SPIがスレーブモードに移行し、SDライブラリが動作しなくなります。 pinMode(SS, OUTPUT); // SDライブラリを初期化 if (!SD.begin(chipSelect)) { Serial.println(F("Card failed, or not present")); // 失敗、何もしない while(1); } Serial.println(F("ok.")); // 日付と時刻を返す関数を登録 SdFile::dateTimeCallback( &dateTime ); } void loop() { // ファイルを開く File dataFile = SD.open("datalog.txt", FILE_WRITE); // もし2番ピンに変化が有れば書き込む if (digitalRead(2)==HIGH) { int value = digitalRead(2); dataFile.println(value); dataFile.close(); // シリアルポートにも出力 Serial.println(value); } if (digitalRead(2)==LOW) { int value = digitalRead(2); dataFile.println(value); dataFile.close(); // シリアルポートにも出力 Serial.println(value); } // ファイルが開けなかったらエラーを出力 else { Serial.println(F("error opening datalog.txt")); } } void dateTime(uint16_t* date, uint16_t* time) { uint16_t year = 2014; uint8_t month = 7, day = 22, hour = 14, minute = 0, second = 0; // GPSやRTCから日付と時間を取得 // FAT_DATEマクロでフィールドを埋めて日付を返す *date = FAT_DATE(year, month, day); // FAT_TIMEマクロでフィールドを埋めて時間を返す *time = FAT_TIME(hour, minute, second); } よろしくお願い致します。

  • コンパイル時のエラー。

    いつも大変お世話になりありがとうございます。 public static void main(String[] args)は何の意味があるのですか? http://www.task-notes.com/entry/20150930/1443582000 などを見てもイマイチ納得がいきません。 下記のプログラムでは public static void main(String[] args)がないためにエラーになりました。 解らないため適当な箇所に付け足したら、また異なったエラーになりました。 ;を付け足すとまた別のエラーが出ます。 ご多忙中恐れ入ります。 アドバイスのほど宜しくお願い申し上げます。 class Hero { public static void main(String[] args) private int point; Hero(int p) {point = p; } int getPoint() { return point; } void addPoint(int p) { point += p; } } コンパイルエラー C:\JAVA>javac Hero.java Hero.java:3: エラー: ';'がありません public static void main(String[] args) ^ エラー1個

  • C++初心者です

    C++初心者です どうも行き詰ってしまったのでまた投稿させていただきました。 文字数が足りないため前回の投稿から何を作ろうとしているか見ていただけると嬉しいです。 http://okwave.jp/qa/q5993632.html どうか間違っているところご指摘お願いできないでしょうか。 最後の部分は根本的にできていないので助けていただけると幸いです #include <iostream> #include <string> #include <cstdlib> #include <ctime> #include <map> using namespace std; class Cards { string Name; string Explain; public: Cards(const string e):Explain(e){} const string GetExplain() const {return Explain;} }; class Game { public: static const int KindsOfCards = 4; virtual Cards* SetCard(); }; Cards* Game::SetCard() { switch(rand() % KindsOfCards) { case 1: return new Square; case 2: return new Half; case 3: return new Reverse; case 4: return new Plus; } } class Square : public Cards { public: Square() : Cards("「二乗」 (二乗する)"){} virtual void Excute(); }; class Half : public Cards { public: Half() : Cards("「半分」 (2分の1にする)"){} virtual void Excute(); }; class Reverse : public Cards { public: Reverse() : Cards("「反転」 (符号を反転する)"){} virtual void Excute(); }; class Plus : public Cards { public: Plus() : Cards("「Plus17」", "(17を加える)"){} virtual void Excute(); }; void Square::Excute() { Now[i+1] = Now[i]*Now[i]; return Now[i+1]; } void Half::Excute() { Now[i+1] = Now[i]/2; return Now[i+1]; } void Reverse::Excute() { Now[i+1] = Now[i]*(-1); return Now[i+1]; } void Plus::Excute() { Now[i+1] = Now[i]+(17); return Now[i+1]; } int main() { int Level; Level = 3; srand((unsigned) time(NULL)); map<int,int> Target; for(int i = 0; i <= Level; i++) { Target[i]; } int Now; int T(int t) { public: Cards* c = SetCard(); Target[0](int t0){t0 = rand() % 100;} Target[0] = Now; Target[1](int t1){t1 = c->Excute();} target[2](int t2){t2 = c->Excute();} Target[3](int t3){t3 = c->Excute();} target[3] = t; } cout << "●所有しているカード●" << endl; for(int i = 1; i <= Level; i++) { cout << i << ":" << c->GetExplain() << endl; } cout << "目 標 値:" << T << endl; cout << "現在の数値:" << Now << endl; }

  • Arduinoのスケッチで「変化が有った時」に変更

    お世話になります。 このスケッチを見るとHIGHの時に記録するようになっていると考えていますが、HIGHかLOWの変化の有った時に記録したいのですが、どのように変更すれば良いか教えて下さい。 また、記録上の0000 0000 0000のようにスペースを開けて記録する場合のスケッチも教えていただけますか。 参考にしたHP http://www.mauroalfieri.it/en/elettronica/data-logging-con-arduino.html 元のスケッチのチャンネル数はアナログ4chですがこれにデジタル12chを加え合計16chにしてみました。 実機では、まだ検証していませんがソフト上ではエラーは発生していません。 その他、改善点なども有りましたら、ご教授お願い致します。 皆様、よろしくお願い致します。 // Date and time functions using a DS1307 RTC connected via I2C and Wire lib #include <Wire.h> #include "RTClib.h" #include <SD.h> #define readButton 16 #define CS 10 RTC_DS1307 RTC; char buffer[40]; File myFile; void setup () { Serial.begin(57600); Serial.print("Initializing SD card..."); pinMode(CS, OUTPUT); pinMode(readButton, INPUT); if (!SD.begin(CS)) { Serial.println("initialization failed!"); return; } Serial.println("initialization done."); Wire.begin(); RTC.begin(); RTC.sqw(1); //0 Led off - 1 Freq 1Hz - 2 Freq 4096kHz - 3 Freq 8192kHz - 4 Freq 32768kHz if (! RTC.isrunning()) { Serial.println("RTC is NOT running!"); // following line sets the RTC to the date & time this sketch was compiled RTC.adjust(DateTime(__DATE__, __TIME__)); } } void loop () { DateTime now = RTC.now(); sprintf(buffer, "%02d/d/%d d:%02d:%02d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d", now.day(), now.month(), now.year(), now.hour(), now.minute(), now.second(), digitalRead( A1 ), digitalRead( A2 ), digitalRead( A3 ),digitalRead( A4 ), digitalRead( A5 ), digitalRead( A6 ), digitalRead( A7 ),digitalRead( A8 ), digitalRead( A9 ), digitalRead( A10 ), digitalRead( A11 ),analogRead( A0 ), analogRead( A1 ), analogRead( A2 ), analogRead( A3 )); Serial.println( buffer ); myFile = SD.open("dati.log", FILE_WRITE); if (myFile) { myFile.println(buffer); myFile.close(); } else { Serial.println("error opening dati.log"); } if ( digitalRead( readButton ) == HIGH ) { Serial.println(" "); Serial.println("Log Reading Saved ----------- "); Serial.println(" "); myFile = SD.open("dati.log"); if (myFile) { while (myFile.available()) { Serial.write(myFile.read()); } myFile.close(); } delay( 5000 ); } delay(1000); }

  • コンパイルできません

    Javaを独習中の、初心者です。何方か、教えてください。 或る入門書で、「メソッドのパラメター化」との項目の中に、下記 サンプルプログラムが載っておりまして、その通りに、入力実行しましたが、「Generics.java:5: ';'がありません。return T.toString() data;」とのエラーメッセージが表示され、試行錯誤してみましたが、解りません。何処が、エラーなのかお教え頂ければ幸いです。 1 import java.util.Data; 2 3 class Generics { 4 public static <T> String geneMethod( T data ) { 5 return T.toString() data; 6 } 7 8 public static void main( String[] args ) { 9 String str = 10 Generics.<String>geneMethod("aaa"); 11 System.out.println( str); 12 Data data = 13 Generics.<Data>geneMethod( new Data()); 14 System.out.println( data ); 15 } 16 } 以上、宜しくお願い致します。  

    • ベストアンサー
    • Java
  • arduinoで7セグメントを使いたい

    arduinoで下記のスケッチを使って7セグメントledを動かしているのですが、 /////////////////////////////////////////////////////////////////////////////////////////////////////// //LED表示関数を定義 void NumPrint(int Number){ for (int w=0; w<=7; w++){ digitalWrite(w+1,Num_Array[Number][w]); } } /////////////////////////////////////////////////////////////////////////////////////////////////////// (1)この部分がどのような動作をしているのかわかりません。 (2)また、arduinoMEGAを使用して22~29番ピンを出力にして動かそうとしても上手くいきません。 (1)についての説明と(2)の解決法を知りたいです。 よろしくお願いしますm(._.)m ↓使っているスケッチ(1~8番ピンが出力のもので上手く動作します) void setup(){ //1~8番ピン デジタル出力へセット for (int i=1; i<=8; i++){ pinMode(i,OUTPUT); } } //LEDレイアウトを定義 //0,1,2,3,4,5,6,7,8,9,0,. の順。 boolean Num_Array[11][8]={ {0,0,0,1,0,0,0,1},{1,1,0,1,0,1,1,1},{0,0,1,1,0,0,1,0},{1,0,0,1,0,0,1,0}, {1,1,0,1,0,1,0,0},{1,0,0,1,1,0,0,0},{0,0,0,1,1,0,0,0},{1,1,0,1,0,0,0,1}, {0,0,0,1,0,0,0,0},{1,0,0,1,0,0,0,0},{1,1,1,0,1,1,1,1} }; //LED表示関数を定義 void NumPrint(int Number){ for (int w=0; w<=7; w++){ digitalWrite(w+1,Num_Array[Number][w]); } } void loop(){ for(int t=0;t<=10;t++){ NumPrint(t); delay(500); } }

  • templateを使ったときの未解決の外部シンボルエラー

    以下のプログラムを、Visual C++ 2008でビルドすると、 『error LNK2019: 未解決の外部シンボル "class A<double> __cdecl add(class A<double> const &,double const &)" (?add@@YA?AV?$A@N@@ABV1@ABN@Z) が関数 _main で参照されました。』 のエラーになります。 template < typename T > class A { private: T x, y; public: A( const T& xx, const T& yy ):x(xx),y(yy){} T getx() const {return x;} T gety() const {return y;} friend A<T> add( const A<T>&, const T& ); }; template < typename T > A<T> add( const A<T>& a, const T& z ){ return A(a.x+z, a.y+z); } /* 直前のテンプレートでこの関数を作ったつもりです A<double> add( const A<double>& a, const double& z){ return A<double>(a.x+z, a.y+z); } /**/ #include <iostream> int main() { A<double> a(1.0, 2.0); double z=3.0; std::cout << add(a,z).getx() << "\n"; } どう書けばよいのでしょうか。