Skip to content

Commit 3aba825

Browse files
committed
initial FW for AIRDOS04C with extended range with modified USTSIPIN03A
1 parent 21ce415 commit 3aba825

File tree

1 file changed

+76
-50
lines changed

1 file changed

+76
-50
lines changed

fw/AIRDOS04/AIRDOS04.ino

Lines changed: 76 additions & 50 deletions
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,21 @@
1-
#define TYPE "AIRDOS04A"
1+
#define TYPE "AIRDOS04C"
22
#define DIGTYPE "BATDATUNIT01B"
33
#define ADCTYPE "USTSIPIN03A"
44
// Compiled with: Arduino 1.8.13
55
// MightyCore 2.2.2
66

7-
#define MAJOR 1 // Data format
8-
#define MINOR 1 // Features
7+
#define MAJOR 2 // Data format
8+
#define MINOR 0 // Features
99
#include "githash.h"
1010

11-
//#define CALIBRATION
12-
//#define RADIATION_CLICK
13-
11+
#define RADIATION_CLICK
12+
#define DEBUG
1413

1514
#define XSTR(s) STR(s)
1615
#define STR(s) #s
1716

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
1919

2020
String FWversion = XSTR(MAJOR)"."XSTR(MINOR)"."XSTR(GHRELEASE)"-"XSTR(GHBUILD)"-"XSTR(GHBUILDTYPE);
2121

@@ -108,7 +108,11 @@ String filename = "";
108108
uint16_t fn;
109109
uint16_t count = 0;
110110
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;
112116
uint8_t ADCconf1;
113117
uint8_t ADCconf2;
114118
uint8_t DIGconf1;
@@ -236,6 +240,10 @@ void EnvOut()
236240

237241
wdt_disable();
238242

243+
#ifdef DEBUG
244+
Serial1.println(dataString); // Debug output to debug terminal
245+
#endif
246+
239247
if (SDinserted)
240248
{
241249
// make sure that the default chip select pin is set to output
@@ -302,6 +310,10 @@ void BattOut()
302310
dataString += ",";
303311
dataString += String(readBat(0xc) * 0.1 - 273.15); // temperature
304312

313+
#ifdef DEBUG
314+
Serial1.println(dataString); // Debug output to debug terminal
315+
#endif
316+
305317
if (SDinserted)
306318
{
307319
// make sure that the default chip select pin is set to output
@@ -345,50 +357,47 @@ void DataOut()
345357
digitalWrite(SDpower, HIGH); // SD card power on
346358
digitalWrite(SPI_MUX_SEL, LOW); // SDcard
347359

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
355362

356363
// make a string for assembling the data to log:
357364
String dataString = "";
365+
dataString += "$DT,";
366+
dataString += String(count);
367+
dataString += ",";
368+
dataString += String(event_time[0]);
369+
dataString += "\r\n";
358370

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+
}
360382

361-
// make a string for assembling the data to log:
383+
// Histogram out
362384
dataString += "$HIST,";
363385
dataString += String(count);
364386
dataString += ",";
365387
dataString += String(tm);
366388
dataString += ".";
367389
dataString += String(tm_s100);
368-
dataString += ",";
369-
dataString += String(flux);
370390

371-
for(uint16_t n=0; n<(CHANNELS); n++)
391+
for(uint16_t n=0; n<CHANNELS; n++)
372392
{
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
387393
dataString += ",";
388-
#endif
389394
dataString += String(histogram[n]);
390395
}
391396

397+
#ifdef DEBUG
398+
Serial1.println(dataString); // Debug output to debug terminal
399+
#endif
400+
392401
if (SDinserted)
393402
{
394403
//PORTB = 0b11111110; // SD card power on
@@ -411,7 +420,7 @@ void DataOut()
411420
// if the file is available, write to it:
412421
if (dataFile)
413422
{
414-
dataFile.println(dataString); // write to SDcard (800 ms)
423+
dataFile.println(dataString); // write to SDcard (800 ms)
415424
dataFile.close();
416425
}
417426
// if the file isn't open, pop up an error:
@@ -909,13 +918,16 @@ while(true)
909918

910919
cli(); // disable interrupts during setup
911920
// 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
913922
TCCR1A = 0;
914923
//TCCR1B = 1<<WGM12 | 0<<CS12 | 1<<CS11 | 1<<CS10;
915924
TCCR1B = 1<<WGM12 | 1<<CS12 | 0<<CS11 | 1<<CS10;
916925
// OCR1A = ((F_clock / prescaler) / Fs) - 1
917926
OCR1A = 39063; // Set sampling frequency Fs, period 5 s
918927
//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;
919931
TCNT1 = 0; // reset Timer 1 counter
920932
TIMSK1 = 1<<OCIE1A; // Enable Timer 1 interrupt
921933
sei(); // re-enable interrupts
@@ -928,7 +940,8 @@ void loop()
928940
for(int n=0; n<CHANNELS; n++) // reset histogram
929941
{
930942
histogram[n]=0;
931-
}
943+
};
944+
events_counter = 1; // reset event counter
932945

933946
// dummy conversion
934947
digitalWrite(DSET, HIGH);
@@ -1004,11 +1017,12 @@ void loop()
10041017

10051018
wdt_enable(WDTO_8S); // watchdog for preventing I2C hanging
10061019

1007-
DataOut();
1020+
DataOut(); // Save data from integration time
10081021
for(int n=0; n<CHANNELS; n++) // reset histogram
10091022
{
10101023
histogram[n]=0;
10111024
};
1025+
events_counter = 1; // Start events from 1 (because 0 is record of death time)
10121026

10131027
if (env >= 5*6) // Environment out every 5 minutes
10141028
{
@@ -1021,34 +1035,46 @@ void loop()
10211035
batt = 0;
10221036
BattOut();
10231037
};
1024-
1025-
// dummy conversion
1038+
1039+
// dummy conversion (reset ADC)
10261040
digitalWrite(DSET, HIGH);
10271041
digitalWrite(DRESET, LOW); // L on CONV
10281042
SPI.transfer16(0x0000);
10291043
digitalWrite(DRESET, HIGH);
10301044

10311045
wdt_disable();
10321046

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;
10351051

1052+
continue; // Continue with waiting for next peak detection
1053+
}
10361054
};
10371055
// Signal is going down, we can run ADC
10381056
// delayMicroseconds(4); // This delay is done in cycle overhead
10391057
digitalWrite(DRESET, LOW); // L on CONV
10401058
uint16_t adcVal = SPI.transfer16(0x0000); // 0c8000 +/GND, 0x0000 +/-
10411059

10421060
#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
10441062
#endif
10451063

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+
}
10481078
digitalWrite(DRESET, HIGH);
1049-
1050-
#ifdef RADIATION_CLICK
1051-
digitalWrite(BUZZER, LOW);
1052-
#endif
10531079
}
10541080
}

0 commit comments

Comments
 (0)