私のmain.cpp
ファイルでは、クラスのコンストラクターを呼び出します。コンストラクターで、いくつかの静的関数からこのクラスの変数を設定します。すべての問題は、NTP サーバーからの時刻の設定に関するものです。
ゲッターである静的関数はwhile
、フラグをチェックするためにループを使用します。時間が設定されていない場合、フラグは false であり、NTP サーバーが少なくとも 1 回応答した場合は true です。フラグが false の場合、while
ループは永遠に時間を取得しようとする必要があり (時間なしで続行する理由がないため)、true の場合は時間を返します。
コンストラクターは、先ほど説明したように、ゲッターを呼び出して変数を設定します。
そのクラスのオブジェクトを main で宣言すると、シリアル印刷で何も得られないため、プログラムは実行されません。私が宣言をアウトコメントすると、それは機能します。while
また、シリアルプリントを中に入れたので、中に刺さったようにも見えず、出ませんでした。以下にコードを示します。
コンストラクター:
#import "DayTime.h"
#include "NTP.h"
DayTime::DayTime(){
hour = NTP::getLCThour();
minutes = NTP::getMin();
seconds = NTP::getSec();
}
main.cpp
ファイル:
#include <Arduino.h>
#include <SPI.h>
#include "NTP.h"
#include "DayTime.h"
#include "DayNumber.h"
DayTime DT;
DayNumber DN;
int main(void)
{
init();
setup();
for (;;)
loop();
return 0;
}
void setup() {
Serial.begin(9600);
NTP::startEthernetAndUdp();
}
void loop() {
NTP::getTime();
// Serial.println(DT.hour);
// Serial.println(DT.getTimeToDec());
delay(3000);
ここで、DT という名前の DayTime オブジェクトの宣言にコメントを付けると、getTime 関数が機能します。
NTP.cpp のパーツ:
1) 最初のゲッター:
int NTP::getLCThour(){
while(timeNTPSet==false){
Serial.print("kolaw");
getTime();
}
return lcthour;
}
2) ヘッダーのフラグの宣言:
static bool timeNTPSet;
これはパブリック変数です。
3) .cpp ファイルの先頭での定義:
bool NTP::timeNTPSet= false;
これは、インクルード後の .cpp ファイルで設定されます。
そして、フラグを true に設定する関数の最後の部分:
NTP NTP::getTime(){
if (testNtpServer()){
timeNTPSet = true;
// We've received a packet, read the data from it
Udp.read((unsigned char*)packetBuffer, NTP_PACKET_SIZE);
testNTPServer 関数は、少なくとも 1 つから時間を取得するために、3 ~ 4 つの異なる NTP サーバーをテストするだけです。また、前述のように DayTime オブジェクトの宣言にコメントを付ければ問題なく動作します。
これどうやってするの?