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

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

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

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Arduino

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

Q&A

解決済

1回答

2677閲覧

Arduino M0 ProとTiny RTC I2C ModulesのArduino IDEシリアルモニタ上への出力不良について

bobby2128

総合スコア42

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Arduino

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

0グッド

0クリップ

投稿2017/02/22 05:10

###前提・実現したいこと
Arduino M0 ProとTiny RTC I2C Modulesを配線し、シリアルモニタ上に時間情報を出力させたいのですが、下記のように正常に時間情報をArduino IDE上に出力してくれません。

もともと、Arduino UNOでは実行可能だったのですが、Arduino M0 Proに変更してコンパイルした際に、UNOでは見られなかったコンパイルエラーが発生し質問させていただきました参考(前回の質問:https://teratail.com/questions/66738)。それを解決する方法として

RTC_DS1307 RTC; // RTC Modul を
RTC_DS1307 RttC; // RTC Modul
に書き換え、コンパイルできるようになりましたが、実行するとシリアルモニタ上に出力された時間情報が、適切では無かったので困っています。
(※Arduino UNOを用いた際は、正確に時間情報が出力されます。また、時間は事前にパソコンの時間と同期させるようプログラムを実行し完了しています。)

アイデアやアドバイス等ございましたら、お教えいただきますと幸甚に存じます。

###発生している問題・エラーメッセージ

Temperatur: 0.00 °C Mo, 165.165.2165 165:165:165

###該当のソースコード

c

1// Tiny RTC (DS1307) 2 3#include <Wire.h> // I2C-Bibliothek einbinden 4#include "RTClib.h" // RTC-Bibliothek einbinden 5 6RTC_DS1307 RttC; // RTC Modul 7 8#include <OneWire.h> // OneWire-Bibliothek einbinden 9#include <DallasTemperature.h> // DS18B20-Bibliothek einbinden 10 11 12 13#define DS18B20_PIN 2 // Pin für DS18B20 definieren Arduino D2 14 15OneWire oneWire(DS18B20_PIN); // OneWire Referenz setzen 16DallasTemperature sensors(&oneWire); // DS18B20 initialisieren 17 18void setup(void) { 19 20 // Initialisiere I2C 21 Wire.begin(); 22 23 // Initialisiere RTC 24 RttC.begin(); 25 26 // Serielle Ausgabe starten 27 Serial.begin(9600); 28 29 // Begrüßungstext auf seriellem Monitor ausgeben 30 Serial.println("Starte Datum, Zeit und Temperatur - blog.simtronyx.de"); 31 32 // Prüfen ob RTC läuft 33 if (! RttC.isrunning()) { 34 35 // Aktuelles Datum und Zeit setzen, falls die Uhr noch nicht läuft 36 RttC.adjust(DateTime(__DATE__, __TIME__)); 37 38 Serial.println("Echtzeituhr wurde gestartet und auf Systemzeit gesetzt."); 39 } 40 else Serial.println("Echtzeituhr laeuft bereits."); 41 42 sensors.begin(); // DS18B20 starten 43} 44 45void loop(){ 46 47 DateTime now=RttC.now(); // aktuelle Zeit abrufen 48 show_time_and_date(now); // Datum und Uhrzeit ausgeben 49 50 sensors.requestTemperatures(); // Temperatursensor auslesen 51 show_temperature(sensors.getTempCByIndex(0)); // Temperatur ausgeben 52 53 delay(3000); // 30 Sekunden warten bis zur nächsten Ausgabe 54} 55 56// Wochentag ermitteln 57String get_day_of_week(uint8_t dow){ 58 59 String dows=" "; 60 switch(dow){ 61 case 0: dows="So"; break; 62 case 1: dows="Mo"; break; 63 case 2: dows="Di"; break; 64 case 3: dows="Mi"; break; 65 case 4: dows="Do"; break; 66 case 5: dows="Fr"; break; 67 case 6: dows="Sa"; break; 68 } 69 70 return dows; 71} 72 73// Datum und Uhrzeit ausgeben 74void show_time_and_date(DateTime datetime){ 75 76 // Wochentag, Tag.Monat.Jahr 77 Serial.print(get_day_of_week(datetime.dayOfWeek())); 78 Serial.print(", "); 79 if(datetime.day()<10)Serial.print(0); 80 Serial.print(datetime.day(),DEC); 81 Serial.print("."); 82 if(datetime.month()<10)Serial.print(0); 83 Serial.print(datetime.month(),DEC); 84 Serial.print("."); 85 Serial.println(datetime.year(),DEC); 86 87 // Stunde:Minute:Sekunde 88 if(datetime.hour()<10)Serial.print(0); 89 Serial.print(datetime.hour(),DEC); 90 Serial.print(":"); 91 if(datetime.minute()<10)Serial.print(0); 92 Serial.print(datetime.minute(),DEC); 93 Serial.print(":"); 94 if(datetime.second()<10)Serial.print(0); 95 Serial.println(datetime.second(),DEC); 96} 97 98// Temperatur ausgeben 99void show_temperature(float temp){ 100 101 Serial.print("Temperatur: "); 102 Serial.print(temp); 103 Serial.print(" "); // Hier müssen wir ein wenig tricksen 104 Serial.write(176); // um das °-Zeichen korrekt darzustellen 105 Serial.println("C"); 106}

###試したこと
コンパイルエラーの解決方法
前回の質問:https://teratail.com/questions/66738

###補足情報(言語/FW/ツール等のバージョンなど)
Arduino M0 Pro
Arduino IDE 1.8.0
Tiny RTC I2C Modules
DS1307

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

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

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

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

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

guest

回答1

0

ベストアンサー

先ほどの質問の回答と矛盾してしまい申し訳ないのですが、先ほど回答した通り、既にRTCがマクロで提供されているようです。
なので、冒頭の

C

1RTC_DS1307 RttC; // RTC Modul 2 3```を削除し、コード内では今まで通りRTC.now()などとやれば良いのかもしれません。

投稿2017/02/22 05:20

ttyp03

総合スコア16996

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

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

bobby2128

2017/02/22 07:13

ttyp03様 いつもありがとうございます。 ご指定いただきました箇所を削除し、その他の箇所は今まで通りで実行しますと、 C:\Users\y.y\Documents\Arduino\Tiny_RTC_DS1307_DS18B20\Tiny_RTC_DS1307_DS18B20.ino: In function 'void setup()': Tiny_RTC_DS1307_DS18B20:24: error: request for member 'begin' in '1073746944u', which is of pointer type 'Rtc*' (maybe you meant to use '->' ?) RTC.begin(); ^ Tiny_RTC_DS1307_DS18B20:33: error: request for member 'isrunning' in '1073746944u', which is of pointer type 'Rtc*' (maybe you meant to use '->' ?) if (! RTC.isrunning()) { ^ Tiny_RTC_DS1307_DS18B20:36: error: request for member 'adjust' in '1073746944u', which is of pointer type 'Rtc*' (maybe you meant to use '->' ?) RTC.adjust(DateTime(__DATE__, __TIME__)); ^ C:\Users\yoshinaga.y\Documents\Arduino\Tiny_RTC_DS1307_DS18B20\Tiny_RTC_DS1307_DS18B20.ino: In function 'void loop()': Tiny_RTC_DS1307_DS18B20:47: error: request for member 'now' in '1073746944u', which is of pointer type 'Rtc*' (maybe you meant to use '->' ?) DateTime now=RTC.now(); // aktuelle Zeit abrufen ^ exit status 1 request for member 'begin' in '1073746944u', which is of pointer type 'Rtc*' (maybe you meant to use '->' ?) 上記のように出力されました。 ライブラリがM0用とUNO用で違いがあるのでしょうか。 お手数おかけいたしますが、どうかよろしくお願いいたします。
ttyp03

2017/02/22 07:36

RTCはアドレスを指しているようですね。 なので、RTC->now(); のように . を -> に置き換えてみてください。
bobby2128

2017/02/22 07:52

ttyp03様 いつもありがとうございます。ご提案いただきました通り変更し実行すると、 以下のようなエラーになりました。お手数おかけし大変恐縮ですが、どうかご確認をよろしくお願いいたします。 C:\Users\y.y\Documents\Arduino\Tiny_RTC_DS1307_DS18B20\Tiny_RTC_DS1307_DS18B20.ino: In function 'void setup()': Tiny_RTC_DS1307_DS18B20:24: error: 'union Rtc' has no member named 'begin' RTC->begin(); ^ Tiny_RTC_DS1307_DS18B20:33: error: 'union Rtc' has no member named 'isrunning' if (! RTC->isrunning()) { ^ Tiny_RTC_DS1307_DS18B20:36: error: 'union Rtc' has no member named 'adjust' RTC->adjust(DateTime(__DATE__, __TIME__)); ^ C:\Users\yoshinaga.y\Documents\Arduino\Tiny_RTC_DS1307_DS18B20\Tiny_RTC_DS1307_DS18B20.ino: In function 'void loop()': Tiny_RTC_DS1307_DS18B20:47: error: 'union Rtc' has no member named 'now' DateTime now=RTC->now(); // aktuelle Zeit abrufen ^ exit status 1 'union Rtc' has no member named 'begin'
ttyp03

2017/02/22 08:00

エラーメッセージを見る限り、beginやisrunningなどが、RTCのメンバにないと言われていますね。 自動的に定義されるRTCと、元々使っていたRTC_DS1307クラスは別物なのかもしれません。 申し訳ないですが、今日はここまでとさせてください(強制退社日なので…)
bobby2128

2017/02/22 08:04

ttyp03様 お忙しい中、コメントいただき誠にありがとうございます。 自身で英語のサイトを調べてみると https://forum.arduino.cc/index.php?topic=421270.0 上記のサイトで同様な症状がみられていることがわかりました。 専門用語で英語なので本当に同じ症状かはよくわかりませんが。。。
ttyp03

2017/02/22 23:43

おはようございます。 リンク先見てみました。 同じ症状のようですね。 同じ手順で解決できるのではと思います。 要点としては、 ・RTCは内部で使っているので同じ名前を使わない(別名で宣言する) ・TimeLib.hをインクルードする ・setup()でsetSyncProvider(rtc.now().unixtime()) を実行する ・時間はnow()で取得できる(戻り値はtime_t型) こんなところでしょうか。
bobby2128

2017/02/23 06:51

ttyp03様 こんにちはご連絡いただき誠にありがとうございます。 要点をまとめていただき、ありがとうございました。 以下に修正したプログラムと、新たに表示されたエラー文を投稿させていただきます。 お手数おかけいたしますが、どうかご確認をよろしくお願いいたします。
bobby2128

2017/02/23 06:52

【プログラム】 // Tiny RTC (DS1307) #include <Wire.h> // I2C-Bibliothek einbinden #include "RTClib.h" // RTC-Bibliothek einbinden #include <TimeLib.h> RTC_DS1307 ABC; // RTC Modul #include <OneWire.h> // OneWire-Bibliothek einbinden #include <DallasTemperature.h> // DS18B20-Bibliothek einbinden #define DS18B20_PIN 2 // Pin für DS18B20 definieren Arduino D2 OneWire oneWire(DS18B20_PIN); // OneWire Referenz setzen DallasTemperature sensors(&oneWire); // DS18B20 initialisieren void setup(void) { //add this setSyncProvider(ABC.now().unixtime()); // Initialisiere I2C Wire.begin(); // Initialisiere RTC ABC.begin(); // Serielle Ausgabe starten Serial.begin(9600); // Begrüßungstext auf seriellem Monitor ausgeben Serial.println("Starte Datum, Zeit und Temperatur - blog.simtronyx.de"); // Prüfen ob RTC läuft if (! ABC.isrunning()) { // Aktuelles Datum und Zeit setzen, falls die Uhr noch nicht läuft ABC.adjust(DateTime(__DATE__, __TIME__)); Serial.println("Echtzeituhr wurde gestartet und auf Systemzeit gesetzt."); } else Serial.println("Echtzeituhr laeuft bereits."); sensors.begin(); // DS18B20 starten } void loop(){ DateTime now=ABC.now(); // aktuelle Zeit abrufen show_time_and_date(now); // Datum und Uhrzeit ausgeben sensors.requestTemperatures(); // Temperatursensor auslesen show_temperature(sensors.getTempCByIndex(0)); // Temperatur ausgeben delay(3000); // 30 Sekunden warten bis zur nächsten Ausgabe } // Wochentag ermitteln String get_day_of_week(uint8_t dow){ String dows=" "; switch(dow){ case 0: dows="So"; break; case 1: dows="Mo"; break; case 2: dows="Di"; break; case 3: dows="Mi"; break; case 4: dows="Do"; break; case 5: dows="Fr"; break; case 6: dows="Sa"; break; } return dows; } // Datum und Uhrzeit ausgeben void show_time_and_date(DateTime datetime){ // Wochentag, Tag.Monat.Jahr Serial.print(get_day_of_week(datetime.dayOfWeek())); Serial.print(", "); if(datetime.day()<10)Serial.print(0); Serial.print(datetime.day(),DEC); Serial.print("."); if(datetime.month()<10)Serial.print(0); Serial.print(datetime.month(),DEC); Serial.print("."); Serial.println(datetime.year(),DEC); // Stunde:Minute:Sekunde if(datetime.hour()<10)Serial.print(0); Serial.print(datetime.hour(),DEC); Serial.print(":"); if(datetime.minute()<10)Serial.print(0); Serial.print(datetime.minute(),DEC); Serial.print(":"); if(datetime.second()<10)Serial.print(0); Serial.println(datetime.second(),DEC); } // Temperatur ausgeben void show_temperature(float temp){ Serial.print("Temperatur: "); Serial.print(temp); Serial.print(" "); // Hier müssen wir ein wenig tricksen Serial.write(176); // um das °-Zeichen korrekt darzustellen Serial.println("C"); }
bobby2128

2017/02/23 06:53

【エラー文】 C:\Users\y.y\Documents\Arduino\Tiny_RTC_DS1307_DS18B20\Tiny_RTC_DS1307_DS18B20.ino: In function 'void setup()': Tiny_RTC_DS1307_DS18B20:20: error: 'class DateTime' has no member named 'unixtime' setSyncProvider(ABC.now().unixtime()); ^ In file included from C:\Users\y.y\Documents\Arduino\Tiny_RTC_DS1307_DS18B20\Tiny_RTC_DS1307_DS18B20.ino:5:0: C:\Users\y.y\Documents\Arduino\Tiny_RTC_DS1307_DS18B20\Tiny_RTC_DS1307_DS18B20.ino: In function 'void show_time_and_date(DateTime)': C:\Users\y.y\Documents\Arduino\libraries\Time/TimeLib.h:79:28: error: expected unqualified-id before '(' token #define dayOfWeek(_time_) ((( _time_ / SECS_PER_DAY + 4) % DAYS_PER_WEEK)+1) // 1 = Sunday ^ C:\Users\y.y\Documents\Arduino\Tiny_RTC_DS1307_DS18B20\Tiny_RTC_DS1307_DS18B20.ino:79:41: note: in expansion of macro 'dayOfWeek' Serial.print(get_day_of_week(datetime.dayOfWeek())); ^ C:\Users\y.y\Documents\Arduino\libraries\Time/TimeLib.h:79:39: error: expected primary-expression before '/' token #define dayOfWeek(_time_) ((( _time_ / SECS_PER_DAY + 4) % DAYS_PER_WEEK)+1) // 1 = Sunday ^ C:\Users\y.y\Documents\Arduino\Tiny_RTC_DS1307_DS18B20\Tiny_RTC_DS1307_DS18B20.ino:79:41: note: in expansion of macro 'dayOfWeek' Serial.print(get_day_of_week(datetime.dayOfWeek())); ^ exit status 1 'class DateTime' has no member named 'unixtime'
ttyp03

2017/02/23 08:13

Arduinoの公式サイトから辿れる、RTCのサンプルは参考にならないでしょうか。 http://www.arduino.org/learning/tutorials/boards-tutorials/rtc-example 正直RTCだけでも色々種類があってどれを使うのが正解なのかわかりません。 基本的にArduinoの知識がないのでそろそろ限界になってきました。すみません。
bobby2128

2017/02/23 09:26

ttyp03様 ここまで親身になってご支援いただき誠にありがとうございました。 RTCのサンプルについてもご助言いただき誠にありがとうございました。サンプルのスケッチ内にある RTCInt.hというヘッダファイルを以下に示すサイトより作成しインクルードし実行したのですが、エラーが出てくる結果となっている現状です。 https://dev.toppers.jp/trac_user/contrib/browser/rtos_arduino/trunk/arduino_lib/libraries/RTC/src/RTCInt.h?rev=136 https://dev.toppers.jp/trac_user/contrib/browser/rtos_arduino/trunk/arduino_lib/libraries/RTC/src/RTCInt.cpp 従いまして、問題が複雑化してしまったので、現状使っているRTCモジュールにこだわらず、Arduino M0 ProにてRTC機能を実現する手法について、新たに質問させていただきました。 https://teratail.com/questions/66958?modal=q-comp 重ね重ね、これまでのご指導ありがとうございました。今後ともどうかよろしくお願いいたします。
ttyp03

2017/02/23 23:47

解決に至る回答ができず大変申し訳ないです。 同じ環境が用意できれば良いのですが、なかなかそうもいかないので難しいですね。 新たな質問も拝見してみます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問