AVRのI2CとSPI / 温度センサーLM75BD、EEPROM、リアルタイムクロックDS3231によるデータロガー / 一定の秒数ごとにロギングする

AVRのI2CとSPI / 温度センサーLM75BD、EEPROM、リアルタイムクロックDS3231によるデータロガー / アラーム割り込みのタイミングでロギングする -」ではDS3231のアラーム1を利用して任意のタイミングで日時と温度とを取得したが、今度はもっとこまかい周期でデータが取得できるようにする。具体的には、DS3231から出力した1Hzの方形波をAVRのタイマー1でカウントして一定の秒数ごとにロギングルーチンを実行する。

単純に_delay_ms()函数でデータ取得周期を設定するのとほぼ同じことであるが、AVRの内蔵タイマーや_delay_ms()函数だけで最長約18時間のデータ取得周期を設定するのは面倒である。

f:id:ti-nspire:20200211081800p:plain:h290f:id:ti-nspire:20200211083226p:plain:h290
f:id:ti-nspire:20200211080149p:plain:h540 f:id:ti-nspire:20200211080227p:plain:h540

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

/***********************************************************************************/
/***** 秒,分,時,曜,日,月,年,温度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_1Hz_counter.h"
#include "LM75v2.h"

volatile uint8_t periodElapsed = 0;
ISR(TIMER1_OVF_vect){
    periodElapsed = 1;
}
void initTimer1(){
    TCCR1A |= (1 << WGM11);
    TCCR1B |= (1 << WGM13) | (1 << WGM12);
    TCCR1B |= (1 << CS12) | (1 << CS11) | (1 << CS10);
    TIMSK1 |= (1 << TOIE1);
    TCNT1 = 0;
    sei();
}
void getTemp_storeTemp(LM75v2 *sensor, uint8_t n, uint16_t *buff){
    for(int i=0; i<n; i++){
        buff[i] = sensor[i].getTempRaw(); // n個のデータを取得し、
    }
    Logger_1Hz.storeIntoEEPROM(buff);     // それをEEPROMに記録する。
}


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();
    Logger_1Hz.init();
    Logger_1Hz.menu();                          // メニューを抜けたら、
    loop_until_bit_is_set(PIND, PD5);           // 外部クロックのrising edgeで
    initTimer1();                               // タイマー1を開始したあとすぐに、
    getTemp_storeTemp(tempSensor, n, tempBuff); // n個のデータを取得し、それをEEPROMに格納し、

    while(!Logger_1Hz.EEPROMisFull()){ // EEPROMが満杯になるまでロギングし続ける。

        if(periodElapsed){                              // 指定した秒数が経過したら、
            getTemp_storeTemp(tempSensor, n, tempBuff); // n個のデータを取得し、それをEEPROMに格納し、
        }
        periodElapsed = 0;                              // 再度、指定した秒数が経過するのを待つ。を繰り返す。

        _delay_ms(200);
    }


    Logger_1Hz.quit();
    return 0;
}