1
- #define TYPE " AIRDOS04A "
1
+ #define TYPE " AIRDOS04C "
2
2
#define DIGTYPE " BATDATUNIT01B"
3
3
#define ADCTYPE " USTSIPIN03A"
4
4
// Compiled with: Arduino 1.8.13
5
5
// MightyCore 2.2.2
6
6
7
- #define MAJOR 1 // Data format
8
- #define MINOR 1 // Features
7
+ #define MAJOR 2 // Data format
8
+ #define MINOR 0 // Features
9
9
#include " githash.h"
10
10
11
- // #define CALIBRATION
12
- // #define RADIATION_CLICK
13
-
11
+ #define RADIATION_CLICK
12
+ #define DEBUG
14
13
15
14
#define XSTR (s ) STR(s)
16
15
#define STR (s ) #s
17
16
18
- #define CHANNELS 1024 // number of channels in the buffer for histogram
17
+ #define CHANNELS 4 // number of channels in the buffer for histogram
18
+ #define MAX_EVENTS 500 // number of events per integration time
19
19
20
20
String FWversion = XSTR(MAJOR)" ." XSTR(MINOR)" ." XSTR(GHRELEASE)" -" XSTR(GHBUILD)" -" XSTR(GHBUILDTYPE);
21
21
@@ -108,7 +108,11 @@ String filename = "";
108
108
uint16_t fn;
109
109
uint16_t count = 0 ;
110
110
boolean SDinserted = true ;
111
- uint8_t histogram[CHANNELS];
111
+ uint16_t histogram[CHANNELS];
112
+ uint16_t event_time[MAX_EVENTS];
113
+ uint8_t event_time2[MAX_EVENTS];
114
+ uint16_t event_channel[MAX_EVENTS];
115
+ uint16_t events_counter;
112
116
uint8_t ADCconf1;
113
117
uint8_t ADCconf2;
114
118
uint8_t DIGconf1;
@@ -236,6 +240,10 @@ void EnvOut()
236
240
237
241
wdt_disable ();
238
242
243
+ #ifdef DEBUG
244
+ Serial1.println (dataString); // Debug output to debug terminal
245
+ #endif
246
+
239
247
if (SDinserted)
240
248
{
241
249
// make sure that the default chip select pin is set to output
@@ -302,6 +310,10 @@ void BattOut()
302
310
dataString += " ," ;
303
311
dataString += String (readBat (0xc ) * 0.1 - 273.15 ); // temperature
304
312
313
+ #ifdef DEBUG
314
+ Serial1.println (dataString); // Debug output to debug terminal
315
+ #endif
316
+
305
317
if (SDinserted)
306
318
{
307
319
// make sure that the default chip select pin is set to output
@@ -345,50 +357,47 @@ void DataOut()
345
357
digitalWrite (SDpower, HIGH); // SD card power on
346
358
digitalWrite (SPI_MUX_SEL, LOW); // SDcard
347
359
348
- uint16_t noise = 4 ;
349
- uint32_t flux=0 ;
350
-
351
- for (uint16_t n=noise; n<(CHANNELS); n++)
352
- {
353
- flux += histogram[n];
354
- }
360
+ readRTC ();
361
+ TCNT1 = 0 ; // reset Timer 1 counter
355
362
356
363
// make a string for assembling the data to log:
357
364
String dataString = " " ;
365
+ dataString += " $DT," ;
366
+ dataString += String (count);
367
+ dataString += " ," ;
368
+ dataString += String (event_time[0 ]);
369
+ dataString += " \r\n " ;
358
370
359
- readRTC ();
371
+ // Evens out
372
+ for (uint16_t n=1 ; n<events_counter; n++)
373
+ {
374
+ dataString += " $E," ;
375
+ dataString += String (event_time2[n]);
376
+ dataString += " ," ;
377
+ dataString += String (event_time[n]);
378
+ dataString += " ," ;
379
+ dataString += String (event_channel[n]);
380
+ dataString += " \r\n " ;
381
+ }
360
382
361
- // make a string for assembling the data to log:
383
+ // Histogram out
362
384
dataString += " $HIST," ;
363
385
dataString += String (count);
364
386
dataString += " ," ;
365
387
dataString += String (tm);
366
388
dataString += " ." ;
367
389
dataString += String (tm_s100);
368
- dataString += " ," ;
369
- dataString += String (flux);
370
390
371
- for (uint16_t n=0 ; n<( CHANNELS) ; n++)
391
+ for (uint16_t n=0 ; n<CHANNELS; n++)
372
392
{
373
- /*
374
- if (n>600)
375
- {
376
- dataString += "\t,";
377
- dataString += String(n);
378
- dataString += "*";
379
-
380
- }
381
- */
382
- #ifdef CALIBRATION
383
- dataString += " \t ," ;
384
- dataString += String (n);
385
- dataString += " *" ;
386
- #else
387
393
dataString += " ," ;
388
- #endif
389
394
dataString += String (histogram[n]);
390
395
}
391
396
397
+ #ifdef DEBUG
398
+ Serial1.println (dataString); // Debug output to debug terminal
399
+ #endif
400
+
392
401
if (SDinserted)
393
402
{
394
403
// PORTB = 0b11111110; // SD card power on
@@ -411,7 +420,7 @@ void DataOut()
411
420
// if the file is available, write to it:
412
421
if (dataFile)
413
422
{
414
- dataFile.println (dataString); // write to SDcard (800 ms)
423
+ dataFile.println (dataString); // write to SDcard (800 ms)
415
424
dataFile.close ();
416
425
}
417
426
// if the file isn't open, pop up an error:
@@ -909,13 +918,16 @@ while(true)
909
918
910
919
cli (); // disable interrupts during setup
911
920
// Configure Timer 1 interrupt
912
- // F_clock = 8 MHz, prescaler = 1024, Fs = 0.125 Hz
921
+ // F_clock = 8 MHz, prescaler = 1024, Fs = 7.8125 kHz
913
922
TCCR1A = 0 ;
914
923
// TCCR1B = 1<<WGM12 | 0<<CS12 | 1<<CS11 | 1<<CS10;
915
924
TCCR1B = 1 <<WGM12 | 1 <<CS12 | 0 <<CS11 | 1 <<CS10;
916
925
// OCR1A = ((F_clock / prescaler) / Fs) - 1
917
926
OCR1A = 39063 ; // Set sampling frequency Fs, period 5 s
918
927
// OCR1A = (62500/2)-1; // Set sampling frequency Fs, period 4 s
928
+ event_time[0 ] = 0 ;
929
+ event_time2[0 ] = 0 ;
930
+ event_channel[0 ] = 0 ;
919
931
TCNT1 = 0 ; // reset Timer 1 counter
920
932
TIMSK1 = 1 <<OCIE1A; // Enable Timer 1 interrupt
921
933
sei (); // re-enable interrupts
@@ -928,7 +940,8 @@ void loop()
928
940
for (int n=0 ; n<CHANNELS; n++) // reset histogram
929
941
{
930
942
histogram[n]=0 ;
931
- }
943
+ };
944
+ events_counter = 1 ; // reset event counter
932
945
933
946
// dummy conversion
934
947
digitalWrite (DSET, HIGH);
@@ -1004,11 +1017,12 @@ void loop()
1004
1017
1005
1018
wdt_enable (WDTO_8S); // watchdog for preventing I2C hanging
1006
1019
1007
- DataOut ();
1020
+ DataOut (); // Save data from integration time
1008
1021
for (int n=0 ; n<CHANNELS; n++) // reset histogram
1009
1022
{
1010
1023
histogram[n]=0 ;
1011
1024
};
1025
+ events_counter = 1 ; // Start events from 1 (because 0 is record of death time)
1012
1026
1013
1027
if (env >= 5 *6 ) // Environment out every 5 minutes
1014
1028
{
@@ -1021,34 +1035,46 @@ void loop()
1021
1035
batt = 0 ;
1022
1036
BattOut ();
1023
1037
};
1024
-
1025
- // dummy conversion
1038
+
1039
+ // dummy conversion (reset ADC)
1026
1040
digitalWrite (DSET, HIGH);
1027
1041
digitalWrite (DRESET, LOW); // L on CONV
1028
1042
SPI.transfer16 (0x0000 );
1029
1043
digitalWrite (DRESET, HIGH);
1030
1044
1031
1045
wdt_disable ();
1032
1046
1033
- TCNT1 = 0 ; // reset Timer 1 counter
1034
- }
1047
+ uint16_t reltime = TCNT1; // Record death time
1048
+ event_time[0 ] = reltime;
1049
+ event_time2[0 ] = 0 ;
1050
+ event_channel[0 ] = 0 ;
1035
1051
1052
+ continue ; // Continue with waiting for next peak detection
1053
+ }
1036
1054
};
1037
1055
// Signal is going down, we can run ADC
1038
1056
// delayMicroseconds(4); // This delay is done in cycle overhead
1039
1057
digitalWrite (DRESET, LOW); // L on CONV
1040
1058
uint16_t adcVal = SPI.transfer16 (0x0000 ); // 0c8000 +/GND, 0x0000 +/-
1041
1059
1042
1060
#ifdef RADIATION_CLICK
1043
- if (adcVal>320 ) digitalWrite (BUZZER, HIGH) ; // buzzer click on ADC conversion.
1061
+ if (adcVal>=CHANNELS) PORTD ^= 0x80 ; // digitalWrite(BUZZER, !digitalRead(BUZZER)) ; // buzzer click
1044
1062
#endif
1045
1063
1046
- adcVal >>= 6 ;
1047
- if (histogram[adcVal]<255 ) histogram[adcVal]++;
1064
+ if (adcVal<CHANNELS) // Record single event if energy is above threshold
1065
+ {
1066
+ histogram[adcVal]++;
1067
+ }
1068
+ else
1069
+ {
1070
+ uint16_t reltime = TCNT1;
1071
+ // uint16_t reltime = TCNT1L;
1072
+ // reltime |= TCNT1H<<8;
1073
+ event_time[events_counter] = reltime;
1074
+ event_time2[events_counter] = store;
1075
+ event_channel[events_counter] = adcVal;
1076
+ if (events_counter<(MAX_EVENTS-1 )) events_counter++;
1077
+ }
1048
1078
digitalWrite (DRESET, HIGH);
1049
-
1050
- #ifdef RADIATION_CLICK
1051
- digitalWrite (BUZZER, LOW);
1052
- #endif
1053
1079
}
1054
1080
}
0 commit comments