Skip to content

Commit

Permalink
get_time()導入。getTime受信後動作停止に変更
Browse files Browse the repository at this point in the history
  • Loading branch information
Blue-Crescent committed Feb 7, 2024
1 parent d391f6b commit 010a43b
Show file tree
Hide file tree
Showing 5 changed files with 41 additions and 43 deletions.
37 changes: 17 additions & 20 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -44,8 +44,6 @@ RTCなどを使用して時刻を維持し、マイコン側で時を刻まな
![](img/IMG_5777.jpeg)
![](img/IMG_5776.jpeg)



| 基板シルク | 機能 |
| ----- | --------------------------------------------------------------------------------------------------------------- |
| SEL | L: 40kHz<br/>H: 60kHz |
Expand All @@ -54,35 +52,24 @@ RTCなどを使用して時刻を維持し、マイコン側で時を刻まな
| GND | 基準電位 |
| VDD | 1.1~3.3 v |



負論理出力でした。JJY信号の波形の立下りが1秒幅になります。

![](img/wave%20(2).jpeg)
![](D:\Documents\Arduino\libraries\JJYreceiver\img\wave%20(2).jpeg)

JJY波形



![](img/wave%20(3).jpeg)
![](D:\Documents\Arduino\libraries\JJYreceiver\img\wave%20(3).jpeg)

H

![wave (5).jpeg](D:\Documents\Arduino\libraries\JJYreceiver\img\wave%20(5).jpeg)


![](img/wave%20(5).jpeg)
L



![](img/wave%20(6).jpeg)
![wave (6).jpeg](D:\Documents\Arduino\libraries\JJYreceiver\img\wave%20(6).jpeg)

P,M





補足
lgt8f328pを使用する場合は、書き込み時にVccは5Vが出力されます。この受信モジュールは3.6Vが絶対最大定格ですので、書き込み時は受信モジュールを外すか、電圧レギュレーターをライタとの間に設けて保護してください。3.3Vでも書き込めました。

Expand All @@ -99,6 +86,8 @@ https://ja.aliexpress.com/item/1005005254051736.html

JJYデータの受信を開始します。ピン番号にはJJY受信モジュール出力を接続したマイコンの入力端子番号を設定します。

マイコンのクロック精度は、100ppmの発振器で2時間で1秒弱程度ずれますので、適宜受信してください。

### power(bool)

引数はtrueがモジュール動作状態、falseがモジュール停止状態です。
Expand Down Expand Up @@ -127,15 +116,23 @@ JJYデータはLを含むデータが多いので、短めの点灯時間が多

JJY受信モジュールのデータ出力をマイコンの端子変化割り込み対応の端子に接続し、その端子の変化割り込みルーチンで呼び出してください。



### getTime()

時刻を取得します。時刻が受信できていない場合は-1を返します。
受信時刻を取得します。時刻が受信できていない場合は-1を返します。

getTime()が戻り値を返すには最低2つの内部の時刻受信データが一致する必要があります。JJYは1分かけて時刻情報を送信していますので、受信には最低2分かかります。良好な状態で3分程度、ノイズがある環境だと数分~受信不可となります。

delta_tick()が受信後も供給されている場合は、マイコンのクロック精度で刻んで維持している現在時刻が返されます。供給されていない場合は最後に受信した時刻を返します。現在時刻が確定した時点で内部受信動作は停止します。再び受信動作を実行する場合はbegin()を呼び出します。

getTime()が戻り値を返すには最低2つの内部の時刻受信データが一致する必要があります。JJYは1分かけて時刻情報を送信していますので、受信には最低2分かかります。良好な状態で3分程度、ノイズがある環境だと数分~受信不可となります。
[Note] v0.2.0より動作を変更

マイコンのクロック精度は、100ppmの発振器で2時間で1秒弱程度ずれますので、適宜受信してください。
## get_time()

現在時刻を取得します。getTime()は受信時刻を指し停止するのに対して、こちらの時刻は受信中か否かにかかわらず常に時を刻んでいます。begin()により受信が成功すると時刻が校正されます。

[Note]v0.2.0より追加

## サンプルスケッチ

Expand Down
20 changes: 6 additions & 14 deletions examples/JJYreceiver.ino
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
#include <JJYReceiver.h>

#include "lgt_LowPower.h"
#include <SoftwareSerial.h>
#include <MsTimer2.h>
Expand All @@ -22,11 +24,10 @@ void setup() {
// Debug print
debugSerial.begin(115200);

// Time for clock ticktock
// 10msec Timer for clock ticktock
MsTimer2::set(10, ticktock);
MsTimer2::start();


// JJYReceiver lib setup.
digitalWrite(MONITORPIN,HIGH);
delay(1000);
Expand All @@ -51,20 +52,11 @@ void loop() {
time_t now = jjy.getTime();
if(now != -1){
String str = String(ctime(&now));
debugSerial.println(str); // Print current localtime.

// After time received, it can release Timer and isr routine.
detachInterrupt(digitalPinToInterrupt(DATA));

// If RTC used, it can stop Timer after RTC time updated.
// MsTimer2::stop();
debugSerial.println(str); // Print current date time.
}else{
String str = "Receiving:";
debugSerial.print(str);
str = String(ctime(&now));
debugSerial.println(str); // Print current localtime.
}



debugSerial.println(str);
}
}
2 changes: 1 addition & 1 deletion library.properties
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
name=JJYReceiver
version=0.1.3
version=0.2.0
author=BlueCrescent
maintainer=BlueCrescent <[email protected]>
sentence=JJY standard radio signal wave receiver library.
Expand Down
20 changes: 14 additions & 6 deletions src/JJYReceiver.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -22,12 +22,13 @@ JJYReceiver::~JJYReceiver(){
}

JJYReceiver::clock_tick(){
globaltime = globaltime + 1;
if(state == TIMEVALID) return;
for(uint8_t index = 0; index < VERIFYLOOP; index++){
localtime[index] = localtime[index] + 1;
}
}


int JJYReceiver::distance(uint8_t* arr1, uint8_t* arr2, int size) {
int hammingDistance = 0;
uint8_t temp;
Expand Down Expand Up @@ -73,27 +74,33 @@ time_t JJYReceiver::getTime() {
time_t diff3 = labs(localtime[2] - localtime[0]);
if( diff1 < 2){
state = TIMEVALID;
digitalWrite(ponpin,HIGH);
//power(false);
globaltime = localtime[1];
return globaltime;
}else if(diff2 < 2){
state = TIMEVALID;
digitalWrite(ponpin,HIGH);
//power(false);
globaltime = localtime[2];
return globaltime;
}else if(diff3 < 2){
state = TIMEVALID;
digitalWrite(ponpin,HIGH);
//power(false);
globaltime = localtime[0];
return globaltime;
}
if(state == TIMEVALID)
power(false);
return;
//DEBUG_PRINT(diff1);
//DEBUG_PRINT(" ");
//DEBUG_PRINT(diff2);
//DEBUG_PRINT(" ");
//DEBUG_PRINTLN(diff3);
return -1;
}
time_t JJYReceiver::get_time() {
return globaltime;
}

JJYReceiver::delta_tick(){
uint8_t data = digitalRead(datapin)==HIGH ? 1 : 0;
Expand Down Expand Up @@ -209,12 +216,13 @@ JJYReceiver::power(){
return (digitalRead(ponpin) == LOW) ? true : false;
}
JJYReceiver::power(bool power){
if(ponpin == -1) return true;
if(power == true){
if(ponpin != -1) digitalWrite(ponpin,LOW);
digitalWrite(ponpin,LOW);
delay(300);
return true;
}else{
if(ponpin != -1) digitalWrite(ponpin,HIGH);
digitalWrite(ponpin,HIGH);
return false;
}
}
Expand Down
5 changes: 3 additions & 2 deletions src/JJYReceiver.h
Original file line number Diff line number Diff line change
Expand Up @@ -57,7 +57,7 @@ class JJYReceiver {
volatile uint8_t rcvcnt = 0;
volatile enum STATE state = INIT;
volatile unsigned long risingtime[2], fallingtime[2];
int datapin,ponpin,selpin;
uint8_t datapin,ponpin = -1 ,selpin = -1;
// int agcpin;
volatile uint8_t markercount = 0;

Expand All @@ -75,7 +75,7 @@ class JJYReceiver {
volatile uint8_t CONST_H [N] = {0xFF,0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};
volatile uint8_t CONST_L [N] = {0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};

int monitorpin = -1;
uint8_t monitorpin = -1;
volatile time_t localtime[3] = {-100,-200,-300};
volatile time_t globaltime;
volatile struct tm timeinfo;
Expand Down Expand Up @@ -109,6 +109,7 @@ class JJYReceiver {
int max_of_three(uint8_t a, uint8_t b, uint8_t c);
bool calculateParity(uint8_t value, uint8_t bitLength, uint8_t expectedParity);
time_t getTime();
time_t get_time();
#ifdef DEBUG_BUILD
int debug();
int debug2();
Expand Down

0 comments on commit 010a43b

Please sign in to comment.