以下のいずれかのタイミングでロギングするのであれば、DS3231のINT信号でAVRへ外部割り込み(またはピン変化割り込み)をかけてロギングルーチンを実行するのが簡単でよい。AVRの内蔵タイマーでも同じことはできるが、超長時間タイマーを作るのは面倒である。
- 1秒間に1回
- 1分間に1回
- 1時間に1回
- いち日に1回
- 1週間に1回
- ひと月に1回
ここでは、DS3231のアラーム1を利用して任意のタイミングで日時と温度とを取得し、それをEEPROMに記録してみる。
全ファイル: 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; }