「AVRのI2CとSPI / 温度センサーLM75BD、EEPROM、リアルタイムクロックDS3231によるデータロガー / アラーム割り込みのタイミングでロギングする -」ではDS3231のアラーム1を利用して任意のタイミングで日時と温度とを取得したが、今度はもっとこまかい周期でデータが取得できるようにする。具体的には、DS3231から出力した1Hzの方形波をAVRのタイマー1でカウントして一定の秒数ごとにロギングルーチンを実行する。
単純に_delay_ms()
函数でデータ取得周期を設定するのとほぼ同じことであるが、AVRの内蔵タイマーや_delay_ms()
函数だけで最長約18時間のデータ取得周期を設定するのは面倒である。
全ファイル: 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; }