///////////////////////////////////////////////////////////////////////////////
// Alle Variablen:
// cpmlast CPM der letzten 1 Minuten Messung
// ushlast Mikrosievert der letzten 1 Minuten Messung
// nshlast Nanosievert der letzten 1 Minuten Messung
// counter Zählwert für die Nummerierung von 1-999 erhöht sich alle
// 10 Minuten um einen Wert.
// Beim Sende String gehört noch für kleiner 100 dann 0 und
// für kleiner 10 dann 00 davor gesetzt.
//send01minute = HIGH >> wird alle 01 Minuten auf HIGH gesetzt (Achtung muss
// nach dem senden wieder auf LOW gesetzt werden)
//send10minute = HIGH >> wird alle 10 Minuten auf HIGH gesetzt (Achtung muss
// nach dem senden wieder auf LOW gesetzt werden)//
//send60minute = HIGH >> wird alle 60 Minuten auf HIGH gesetzt (Achtung muss
// nach dem senden wieder auf LOW gesetzt werden)//
// OutstringAlarmGelb >> wird alle 60 Minuten ins Meshcom gesendet wenn der
// cpmlast Wert über 50 ist
// OutstringAlarmOrange >> wird alle 60 Minuten ins Meshcom gesendet wenn der
// cpmlast Wert über 100 ist
// OutstringAlarmRot >> wird alle 60 Minuten ins Meshcom gesendet wenn der
// cpmlast Wert über 200 ist
// OutstringParm >> Parameter
// OutstringUnit >> Units
//////////////////////////////////////////////////////////////////////////////
const int interruptPin = 3; // CPM Sensor Input
int pulse = 0;
int cpm = 0;
int cpmlast = 0; //letzer Wert zum Versenden
float ush = 0;
float ushlast = 0; //letzer Wert zum Versenden
int nsh = 0;
int nshlast = 0; //letzer Wert zum Versenden
int counter = 1;
int send01minute = LOW;
int send10minute = LOW;
int send60minute = LOW;
String Outstring10 = ""; //String für LoRa TX alle 10 Minuten
String Outstring60 = ""; //String für LoRa TX alle 60 Minuten
String OutstringAlarmGelb = ""; //Alarm String für Meshcom
String OutstringAlarmOrange = ""; //Alarm String für Meshcom
String OutstringAlarmRot = "";
String OutstringParm = "";
String OutstringUnit = ""; //Alarm String für Meshcom
unsigned long previousMillisA = 0;
unsigned long intervalA=60UL * 1000UL; //Interval 1 Minute
unsigned long previousMillisB = 0;
unsigned long intervalB=600UL * 1000UL; //Interval 10 Minuten
unsigned long previousMillisC = 0;
unsigned long intervalC=3600UL * 1000UL; //Interval 1 Stunde
#include <SPI.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#define input 3 //Pin 3 Eingang Geigerzaehle
Adafruit_SSD1306 display = Adafruit_SSD1306(128, 64, &Wire);
void setup() {
Wire.begin();
Wire.setClock(400000L);
display.begin(SSD1306_SWITCHCAPVCC, 0x3C);
pinMode(input, INPUT);
previousMillisA = millis();
previousMillisB = millis();
previousMillisC = millis();
}
void loop()
{
int inputState = digitalRead(input);
if (inputState == LOW)
{
pulse = 1;
}
// Nach 1 Minute //////////////////////////////////////////
unsigned long currentMillisA = millis(); // Hohle aktuelle Zeit
if ((unsigned long)(currentMillisA - previousMillisA) >= intervalA)
{
cpmlast = cpm; //erzeuge Werte zum Versenden
ushlast = ush; //erzeuge Werte zum Versenden
nshlast = nsh; //erzeuge Werte zum Versenden
cpm = 0;
send01minute = HIGH; //Sendeteil 1 Minute weiter unten im Programm
previousMillisA = millis();
}
// Nach 10 Minuten //////////////////////////////////////////
unsigned long currentMillisB = millis(); // Hohle aktuelle Zeit
if ((unsigned long)(currentMillisB - previousMillisB) >= intervalB)
{
counter++;
if (counter == 1000) {counter = 0;}
send10minute = HIGH; //Sendeteil 10 Minuten weiter unten im Programm
previousMillisB = millis();
}
// Nach 1 Stunde //////////////////////////////////////////
unsigned long currentMillisC = millis(); // Hohle aktuelle Zeit
if ((unsigned long)(currentMillisC - previousMillisC) >= intervalC)
{
send60minute = HIGH; //Sendeteil 60 Minuten weiter unten im Programm
previousMillisC = millis();
}
// berechne CPM /////////////////////////////////////
if (pulse >= 1)
{
cpm++;
pulse = 0;
}
// berechne us/h und ns/h //////////////////////////
ush = (cpm * 0.0057);
nsh = (ush * 1000);
display.begin(SSD1306_SWITCHCAPVCC, 0x3c);
display.clearDisplay();
display.setTextColor(WHITE);
display.setTextSize(1);
display.setCursor(23, 0);
display.print("LoRa-Radiation");
display.setTextSize(2);
display.setCursor(5, 15);
display.print(" CPM:");
display.print(cpm);
display.setTextSize(2);
display.setCursor(5, 32);
display.print("us/h:");
display.print(ush);
display.setCursor(5, 50);
display.print("ns/h:");
display.print(nsh);
// display.setCursor(80, 50);
// display.print(counter);
display.display();
//delay(200); // Damit wird die Empfindlichkeit eingestellt
//////////////////////////////////////////////////////////////////////////////////////
// Bilde Outstring und Sende alle 60 Minuten
//////////////////////////////////////////////////////////////////////////////////////
if (send60minute == HIGH)
{
Outstring60 = "OE3BCB-3>APRS:!4812.02N/01553.80E";
if ((cpmlast < 50) && (cpmlast > 0)) {Outstring60 += "5";} //Grün
if ((cpmlast < 100) && (cpmlast > 50)) {Outstring60 += "4";} //Gelb
if ((cpmlast < 200) && (cpmlast > 100)) {Outstring60 += "3";} //Orange
if (cpmlast > 200) {Outstring60 += "2";} //Rot
Outstring60 += "LoRa Radiation Meter Neulengbach";
//////////////////////////////////////////////////////////////////////////////////////
// Bilde Outstring und Sende Alarm in das Meshcom System
//////////////////////////////////////////////////////////////////////////////////////
if ((cpmlast < 100) && (cpmlast > 50))
{
OutstringAlarmGelb = "OE3BCB-3>APRS:OE3BCB-5:Alarmwert Radiation GELB mit";
OutstringAlarmGelb += " ";
OutstringAlarmGelb += cpmlast;
OutstringAlarmGelb += "CPM";
}
if ((cpmlast < 200) && (cpmlast > 100))
{
OutstringAlarmOrange = "OE3BCB-3>APRS:OE3BCB-5:Alarmwert Radiation ORANGE mit";
OutstringAlarmGelb += " ";
OutstringAlarmGelb += cpmlast;
OutstringAlarmGelb += "CPM";
}
if (cpmlast > 200)
{
OutstringAlarmRot = "OE3BCB-3>APRS:OE3BCB-5:Alarmwert Radiation ROT mit";
OutstringAlarmGelb += " ";
OutstringAlarmGelb += cpmlast;
OutstringAlarmGelb += "CPM";
}
send60minute = LOW;
}
// Hier fehlt noch der Sende Teil von Lora !!!!
// Es ist fraglich ob die genau GPS Position mit übertragen werden soll oder nicht
//////////////////////////////////////////////////////////////////////////////////////
// Bilde Outstring und Sende alle 10 Minuten
//////////////////////////////////////////////////////////////////////////////////////
if (send10minute == HIGH)
{
Outstring10 = "OE3BCB-3>APRS:T#";
if((counter < 100) && (counter >10)) {Outstring10 += "0";}
if((counter < 10) && (counter > 0)) {Outstring10 += "00";}
if(counter == 0) {Outstring10 += "000";}
Outstring10 += counter;
Outstring10 += ",";
Outstring10 += cpmlast;
Outstring10 +=",";
Outstring10 += "000";
Outstring10 += ",";
Outstring10 += "000";
Outstring10 += ",";
Outstring10 += "000";
Outstring10 += ",";
Outstring10 += "000";
Outstring10 += ",";
Outstring10 += "00000000";
send10minute = LOW;
}
// Hier fehlt noch der Sende Teil von Lora !!!!
}
//ENDE GUT ALLES GUT