#include <Wire.h>
#include <FreqCount.h>
const int PWM_PIN = 6; //6番ピンはバリキャップ制御用アナログ出力端子 5番ピンは周波数測定用
const int AFC_PIN = 2; //2番ピンはAFCのONとOFFを制御するデジタル入力端子
const int AFCLED_PIN = 10;//10番ピンにLEDをつなぎAFCのONを表示するためのデジタル出力端子
const int HT16K33_ADDR = 0x70;
const int DIGIT = 4;
const char SEG_CHAR[10] = { 0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x67 };
void sprit_num( int value, int dig, int *output ) {
int i = 0;
while ( i < dig ) {
output[i] = value % 10;
value = value / 10;
i = i + 1;
}
}
void setup() {
pinMode( PWM_PIN, OUTPUT );
pinMode( AFC_PIN, INPUT );
pinMode( AFCLED_PIN, OUTPUT );
Wire.begin();
Wire.beginTransmission( HT16K33_ADDR );
Wire.write( 0x21 );
Wire.write( 0x01 );
Wire.endTransmission();
delay(10);
Wire.beginTransmission( HT16K33_ADDR );
Wire.write( 0x81 );
Wire.write( 0x01 );
Wire.endTransmission();
Serial.begin(57600);
FreqCount.begin(10);//10ミリ秒間パルスを数える(100Hz単位)
delay(10);
}
void loop() {
if (FreqCount.available()) {
boolean afc;
int x = 50;
analogWrite( PWM_PIN, x );//PWM_PINの初期電圧を50に規定
int f1 = FreqCount.read(); //制御用に100Hz単位で計測
//受信周波数を4桁LEDに表示
int number = f1/10; //表示用に1kHz単位に変換
number=number-455; //局発周波数を受信周波数に変換
int disp_val[ DIGIT ];
int i;
sprit_num( number, DIGIT, disp_val );
i = 0;
while ( i < DIGIT ) {
Wire.beginTransmission( HT16K33_ADDR );
Wire.write( i * 2 );
Wire.write( SEG_CHAR[ disp_val[i] ] );
Wire.endTransmission();
delay(10);
i = i + 1;
}
delay(200);
afc = digitalRead( AFC_PIN );
if (afc == HIGH) digitalWrite( AFCLED_PIN, HIGH) ;
if (afc == LOW) digitalWrite( AFCLED_PIN, LOW) ;
while (afc == HIGH){ //AFCがONの場合の動作
int f2 = FreqCount.read(); //f1と比較するためにf2を100Hz単位で読み込む
int diff = f2 - f1 ;
if (x <254 & x > 1){ //これがないとvalueが255(or0)に達した後0(255)に戻ってしまう
if ( diff < 0) x = x +1;
if ( diff > 0) x = x -1;
if ( diff = 0) x = x +0;
analogWrite( PWM_PIN, x );
}
//その時点の周波数を4桁LEDに表示
number = f2/10;
number=number-455;
sprit_num( number, DIGIT, disp_val );
i = 0;
while ( i < DIGIT ) {
Wire.beginTransmission( HT16K33_ADDR );
Wire.write( i * 2 );
Wire.write( SEG_CHAR[ disp_val[i] ] );
Wire.endTransmission();
delay(10);
i = i + 1;
}
delay(500);//0.5秒待つ
afc = digitalRead( AFC_PIN );
}
} //AFCがOFFの場合f1を読み込むところに戻る
}