電音の工場ブログ

趣味の電子工作を中心としたブログです.音モノの工作が多いです.

こんなかんじ

こんなかんじ

ほとんどをtokoyaさんのこの記事のスケッチから流用して、今のところ後に示すような感じになっています。

やっていること

秋月RTCモジュールから定周期割り込み(60秒周期)をINT0の立下りエッジで貰ったときに、RTCの時刻を読み出してアナログ入力値と一緒にしてシリアルに流す

ことをやっています。ついでに処理しているときにArduinoの基板上のLEDを光らせているのですが、これはシリアル送信時にTXのLEDが光るからなくても良かったかも。

アナログ入力にはCdSが繋がっていてその値を昼夜ログしてグラフ化するため、の はずだったのですが、昨日書いたようにちとやる木がしおれつつあります。

#include 

int RTC = 0xA2 >> 1;
int pin = 13;
int int0 = 2;
volatile int flag = LOW;
int analogPin = 0;

void setup()
{
  Wire.begin();
  Serial.begin(9600);
  InitRTC();
  pinMode(pin, OUTPUT);
  pinMode(int0, INPUT);
  digitalWrite(int0, HIGH); // pull-up
  attachInterrupt(0, func, FALLING);
}

void loop()
{
  if(Serial.available() > 0)
  {
    byte recv = Serial.read();
    byte param[20];
    int count = 0;
    switch(recv)
    {
      case 'R':
        ReadRTC();
        Serial.println("");
        break;
      case 'W':
        while(count < 14)
        {
          if(Serial.available() > 0)
            param[count++] = Serial.read() & 0x0F;
        }
        SetRTCTime(param);
        break;
      default:
        break;
    }
  }

  if (flag) {
    digitalWrite(pin, HIGH);
    ReadRTC();
    Serial.print("  :: ");
    Serial.println(analogRead(analogPin));
    delay(300);
    digitalWrite(pin, LOW);
    flag = LOW;
  }
}

void func(void)
{
  flag = HIGH;
}

void ReadRTC()
{
  Wire.beginTransmission(RTC);
  Wire.send(0x02);
  Wire.endTransmission();
  Wire.requestFrom(RTC, 7);
  byte rbuf[7];
  for(int i = 0; i < 7; i++)
  {
    if(Wire.available())
    {
      rbuf[i] = Wire.receive();
    }
  }
  Serial.print((rbuf[6] & 0x3F) + 2000);
  Serial.print("/");
  Out(rbuf[5] & 0x1F);
  Serial.print("/");
  Out(rbuf[3] & 0x3F);
  Serial.print(" ");
  Out(rbuf[2] & 0x3F);
  Serial.print(":");
  Out(rbuf[1] & 0x7F);
  Serial.print(":");
  Out(rbuf[0] & 0x7F);
//  Serial.println("");
}

void Out(byte d)
{
  if(d < 16)
    Serial.print("0");
  Serial.print(d, HEX);
}

void SetRTCTime(byte *param)
{
  byte sbuf[7];
  sbuf[6] = param[2] << 4 | param[3];
  sbuf[5] = param[4] << 4 | param[5] | 0x80;
  sbuf[4] = 0;
  sbuf[3] = param[6] << 4 | param[7];
  sbuf[2] = param[8] << 4 | param[9];
  sbuf[1] = param[10] << 4 | param[11];
  sbuf[0] = param[12] << 4 | param[13];
  Wire.beginTransmission(RTC);
  Wire.send(0x02);
  Wire.send(sbuf, 7);
  Wire.endTransmission();
}

void InitRTC(void)
{
  byte buf[2];
  buf[0] = 0x00;
  buf[1] = 0x11; // Set TIE
  Wire.beginTransmission(RTC);
  Wire.send(0x00);
  Wire.send(buf, 2);
  Wire.endTransmission();

  buf[0] = 0x82; // TD[1:0]=2'b10, 1Hz
  buf[1] = 60;   // count 1Hz 60times
  Wire.beginTransmission(RTC);
  Wire.send(0x0E);
  Wire.send(buf, 2);
  Wire.endTransmission();
}