#include <Wire.h>
#include "SSD1306Ascii.h"
#include "SSD1306AsciiWire.h"
// 0X3C+SA0 - 0x3C or 0x3D
#define I2C_ADDRESS 0x3C
// Define proper RST_PIN if required.
#define RST_PIN -1
int pin = 13;
byte interruptPin = 2;
int cpm = 0;
volatile byte state = LOW;
volatile unsigned long now = millis ();
const int debounceTime = 5; // debounce in milliseconds
volatile unsigned long measure_time = 60000;
unsigned long meas_start = millis ();
int ma5_pointer = 0;
float ma5_arr[5] = {};
float ma5_val = 0;
int ma5_arr_elements = 0;
SSD1306AsciiWire oled;
//------------------------------------------------------------------------------
void setup() {
ma5_arr[0] = 0;
ma5_arr[1] = 0;
ma5_arr[2] = 0;
ma5_arr[3] = 0;
ma5_arr[4] = 0;
ma5_arr[5] = 0;
ma5_pointer = 0;
ma5_val = 0;
ma5_arr_elements = 0;
Serial.begin(115200);
Wire.begin();
Wire.setClock(400000L);
pinMode(pin, OUTPUT);
pinMode(interruptPin, INPUT_PULLUP);
attachInterrupt(digitalPinToInterrupt(interruptPin), counter, LOW);
#if RST_PIN >= 0
oled.begin(&Adafruit128x64, I2C_ADDRESS, RST_PIN);
#else // RST_PIN >= 0
oled.begin(&Adafruit128x64, I2C_ADDRESS);
#endif // RST_PIN >= 0
Serial.println(meas_start);
}
void loop() {
digitalWrite(pin, state);
state = LOW;
// 60 seconds timer
if (millis() - meas_start >= measure_time) {
calc();
cpm = 0;
meas_start = millis();
}
Serial.println(millis() - meas_start);
Serial.println(ma5_pointer);
Serial.println(ma5_val);
Serial.println(ma5_arr_elements);
Serial.println(ma5_arr[0]);
Serial.println(ma5_arr[1]);
Serial.println(ma5_arr[2]);
Serial.println(ma5_arr[3]);
Serial.println(ma5_arr[4]);
Serial.println(cpm);
delay(1000);
disp();
}
void counter() {
// Pin deBounce conditioning
if (digitalRead(interruptPin) == LOW && (millis() - now) >= debounceTime) {
// Serial.println(cpm);
// Serial.println(" pressed:");
// Serial.println(millis()-now);
cpm = cpm + 1;
now = millis ();
blink();
}
}
void blink() {
state = HIGH;
Serial.println(state);
delay(30);
// state = HIGH;
}
void disp() {
oled.clear();
oled.setFont(lcdnums14x24); //lcdnums14x24 // Verdana_digits_24 // Verdana12
oled.setCursor(0,0);
oled.print(cpm);
oled.setFont(Verdana12); //lcdnums14x24 // Verdana_digits_24 // Verdana12
oled.println(" CPM");
oled.setCursor(0,4);
oled.setFont(lcdnums14x24); //lcdnums14x24 // Verdana_digits_24 // Verdana12
oled.print(ma5_val);
oled.setFont(Verdana12); //lcdnums14x24 // Verdana_digits_24 // Verdana12
oled.print(" uSv/h MA5");
oled.setCursor(92,0);
oled.print((measure_time - (millis() - meas_start))/1000);
oled.print(" sec");
delay(500);
}
void calc() {
ma5_val = 0;
ma5_arr[ma5_pointer] = cpm * 0.0054;
// for(byte i = 0; i < 5; i++) {
// if(ma5_arr[i] != NULL){ma5_arr_elements = i+1;} else {break;}
// }
byte i = 0;
while(i < 5 && ma5_arr[i] != 0){
ma5_arr_elements = (i + 1);
i++;
}
// for(byte j = 0; j < ma5_arr_elements; j++) {
// if(ma5_arr[j] == NULL){break;} else {ma5_val = ma5_val + ma5_arr[j];}
// }
byte j = 0;
while(j < ma5_arr_elements && ma5_arr[j] != 0){
ma5_val = ma5_val + ma5_arr[j];
j++;
}
// for(byte j = 0; j < sizeof(ma5_arr) / sizeof(ma5_arr[0]); j++) {
// if(ma5_arr[j] == NULL){break;} else {ma5_val = ma5_val + ma5_arr[j];}
// }
if(ma5_arr_elements != 0){ma5_val = ma5_val / ma5_arr_elements;}
if (ma5_pointer < 4){ma5_pointer++;} else {ma5_pointer = 0;}
}