AVRのI2CとSPI / 温度センサーLM75BD、EEPROM、リアルタイムクロックDS3231によるデータロガー / アラーム割り込みのタイミングでロギングする

以下のいずれかのタイミングでロギングするのであれば、DS3231のINT信号でAVRへ外部割り込み(またはピン変化割り込み)をかけてロギングルーチンを実行するのが簡単でよい。AVRの内蔵タイマーでも同じことはできるが、超長時間タイマーを作るのは面倒である。

  • 1秒間に1回
  • 1分間に1回
  • 1時間に1回
  • いち日に1回
  • 1週間に1回
  • ひと月に1回

ここでは、DS3231のアラーム1を利用して任意のタイミングで日時と温度とを取得し、それをEEPROMに記録してみる。
f:id:ti-nspire:20200210101214p:plain:h290 f:id:ti-nspire:20200211083519p:plain:h290

全ファイル: https://github.com/ti-nspire/AVR/tree/master/DataLogger_alarm_Interrupt
メインファイルのみ:

/***********************************************************************************/
/***** 秒,分,時,曜,日,月,年,温度0,温度1,温度2,温度3を1レコードとしてロギングする *****/
/***********************************************************************************/

#include <avr/io.h>
#include <util/delay.h>
#include "USART.h"
//#include "myI2Cv2.h"
//#include "mySPIv2.h"
//#include "DS3231.h"
//#include "EEPROM25_256v2.h"
#include "DataLogger.h"
#include "LM75v2.h"

volatile uint8_t alarmActivated = 0;
ISR(INT0_vect){
    alarmActivated = 1; // INT0に割り込みがかかったら(DS3231の!INT信号のfalling edgeが検知されたら)、それを示すフラグを立てる。
}
void initInterrupt0(){
    EIMSK |= (1 << INT0);  // INT0 (外部割り込み要求0)を有効化する。
    EICRA |= (1 << ISC01); // 立ち下がりエッジで割り込むことにする。
    sei();                 // グローバル割り込みを有効化する。
}


int main(){
    // 温度センサーLM75をスレーブとしてn個実体化する。この値をEEPROMにロギングする。
    uint8_t n = 4; 
    uint16_t tempBuff[n];
    LM75v2 tempSensor[n];
    for(int i=0; i<n; i++){
        tempSensor[i] = LM75v2(i);
    }
    
    initUSART();
    initInterrupt0();    
    Logger.init();
    Logger.menu();
    while(1){

        if(alarmActivated && !Logger.EEPROMisFull()){     // アラームが発動して、かつEEPROMが満杯でなければ、
            for(int i=0; i<n; i++){
                tempBuff[i] = tempSensor[i].getTempRaw(); // n個の温度センサーからそれぞれ温度データを取得して、
            }
            Logger.storeIntoEEPROM(tempBuff);             // (日時と)温度データを記録してから、
            
        }
        alarmActivated = 0;                               // アラーム発動フラグを解除する。を繰り返す。


        _delay_ms(200);
    }

    // unreachable:
    Logger.quit();
    return 0;
}

f:id:ti-nspire:20200210101710p:plain:w350
f:id:ti-nspire:20200210105726p:plain:w350