mirror of
https://github.com/schinken/esp8266-geigercounter.git
synced 2024-11-22 00:20:20 +01:00
initial commit
This commit is contained in:
commit
b6d40408e0
3 changed files with 181 additions and 0 deletions
1
.gitignore
vendored
Normal file
1
.gitignore
vendored
Normal file
|
@ -0,0 +1 @@
|
||||||
|
wifi.h
|
159
GeigerCounter.ino
Normal file
159
GeigerCounter.ino
Normal file
|
@ -0,0 +1,159 @@
|
||||||
|
#include <ESP8266WiFi.h>
|
||||||
|
#include <PubSubClient.h>
|
||||||
|
#include <SoftwareSerial.h>
|
||||||
|
#include <SimpleTimer.h>
|
||||||
|
|
||||||
|
#include "settings.h"
|
||||||
|
#include "wifi.h"
|
||||||
|
|
||||||
|
WiFiClient wifiClient;
|
||||||
|
PubSubClient mqttClient;
|
||||||
|
SoftwareSerial geigerCounterSerial(PIN_UART_RX, PIN_UART_TX);
|
||||||
|
SimpleTimer timer;
|
||||||
|
|
||||||
|
String serialInput = "";
|
||||||
|
char serialInputHelper[RECV_LINE_SIZE];
|
||||||
|
|
||||||
|
int lastCPM = 0, currentCPM = 0;
|
||||||
|
float lastuSv = 0, currentuSv = 0;
|
||||||
|
|
||||||
|
void setup() {
|
||||||
|
|
||||||
|
Serial.begin(115200);
|
||||||
|
geigerCounterSerial.begin(BAUD_GEIGERCOUNTER);
|
||||||
|
|
||||||
|
delay(10);
|
||||||
|
|
||||||
|
Serial.print("Connecting to ");
|
||||||
|
Serial.println(ssid);
|
||||||
|
|
||||||
|
WiFi.begin(ssid, password);
|
||||||
|
|
||||||
|
while (WiFi.status() != WL_CONNECTED) {
|
||||||
|
Serial.print(".");
|
||||||
|
delay(500);
|
||||||
|
}
|
||||||
|
|
||||||
|
Serial.println("");
|
||||||
|
Serial.println("WiFi connected");
|
||||||
|
Serial.println("IP address: ");
|
||||||
|
Serial.println(WiFi.localIP());
|
||||||
|
|
||||||
|
timer.setInterval(300000, updateRadiationValues);
|
||||||
|
}
|
||||||
|
|
||||||
|
void updateRadiationValues() {
|
||||||
|
|
||||||
|
|
||||||
|
char tmp[8];
|
||||||
|
|
||||||
|
if(currentCPM != lastCPM) {
|
||||||
|
String(currentCPM).toCharArray(tmp, 8);
|
||||||
|
Serial.print("Sending CPM");
|
||||||
|
Serial.println(tmp);
|
||||||
|
mqttClient.publish(MQTT_TOPIC_CPM, tmp, true);
|
||||||
|
}
|
||||||
|
|
||||||
|
if(currentuSv != lastuSv) {
|
||||||
|
String(currentuSv).toCharArray(tmp, 8);
|
||||||
|
Serial.print("Sending uSv");
|
||||||
|
Serial.println(tmp);
|
||||||
|
mqttClient.publish(MQTT_TOPIC_USV, tmp, true);
|
||||||
|
}
|
||||||
|
|
||||||
|
lastCPM = currentCPM;
|
||||||
|
lastuSv = currentuSv;
|
||||||
|
}
|
||||||
|
|
||||||
|
void connectMqtt() {
|
||||||
|
|
||||||
|
bool newConnection = false;
|
||||||
|
while (!mqttClient.connected()) {
|
||||||
|
mqttClient.setClient(wifiClient);
|
||||||
|
mqttClient.setServer(mqttHost, 1883);
|
||||||
|
mqttClient.connect("geigercounter", MQTT_TOPIC_LAST_WILL, 1, true, "disconnected");
|
||||||
|
|
||||||
|
delay(1000);
|
||||||
|
newConnection = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(newConnection) {
|
||||||
|
mqttClient.publish(MQTT_TOPIC_LAST_WILL, "connected", true);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
void updateMqttTopics(int cpm, float uSv) {
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
void parseReceivedLine(char* input) {
|
||||||
|
|
||||||
|
char segment = 0;
|
||||||
|
char *token;
|
||||||
|
|
||||||
|
float uSv = 0;
|
||||||
|
float cpm = 0;
|
||||||
|
|
||||||
|
token = strtok(input, delimiter);
|
||||||
|
|
||||||
|
while (token != NULL) {
|
||||||
|
|
||||||
|
switch(segment) {
|
||||||
|
|
||||||
|
// This is just for validation
|
||||||
|
case IDX_CPS_KEY: if (strcmp(token, "CPS") != 0) return; break;
|
||||||
|
case IDX_CPM_KEY: if (strcmp(token, "CPM") != 0) return; break;
|
||||||
|
case IDX_uSv_KEY: if (strcmp(token, "uSv/hr") != 0) return; break;
|
||||||
|
|
||||||
|
case IDX_CPM:
|
||||||
|
Serial.printf("Current CPM: %s\n", token);
|
||||||
|
cpm = String(token).toInt();
|
||||||
|
break;
|
||||||
|
|
||||||
|
case IDX_uSv:
|
||||||
|
Serial.printf("Current uSv/hr: %s\n", token);
|
||||||
|
uSv = String(token).toFloat();
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(segment > 7) {
|
||||||
|
// Invalid! There should be no more than 7 segments
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
token = strtok(NULL, delimiter);
|
||||||
|
segment++;
|
||||||
|
}
|
||||||
|
|
||||||
|
currentuSv = uSv;
|
||||||
|
currentCPM = cpm;
|
||||||
|
}
|
||||||
|
|
||||||
|
void loop() {
|
||||||
|
|
||||||
|
connectMqtt();
|
||||||
|
timer.run();
|
||||||
|
mqttClient.loop();
|
||||||
|
|
||||||
|
if (geigerCounterSerial.available()) {
|
||||||
|
char in = (char) geigerCounterSerial.read();
|
||||||
|
|
||||||
|
serialInput += in;
|
||||||
|
|
||||||
|
if (in == '\n') {
|
||||||
|
serialInput.toCharArray(serialInputHelper, RECV_LINE_SIZE);
|
||||||
|
parseReceivedLine(serialInputHelper);
|
||||||
|
|
||||||
|
serialInput = "";
|
||||||
|
}
|
||||||
|
|
||||||
|
// Just in case the buffer gets to big, start from scratch
|
||||||
|
if(serialInput.length() > RECV_LINE_SIZE + 10) {
|
||||||
|
serialInput = "";
|
||||||
|
}
|
||||||
|
|
||||||
|
Serial.write(in);
|
||||||
|
}
|
||||||
|
}
|
21
settings.h
Normal file
21
settings.h
Normal file
|
@ -0,0 +1,21 @@
|
||||||
|
#define IDX_CPS_KEY 0
|
||||||
|
#define IDX_CPM_KEY 2
|
||||||
|
#define IDX_uSv_KEY 4
|
||||||
|
|
||||||
|
#define IDX_CPM 3
|
||||||
|
#define IDX_uSv 5
|
||||||
|
#define IDX_MODE 6
|
||||||
|
|
||||||
|
#define RECV_LINE_SIZE 37
|
||||||
|
|
||||||
|
#define PIN_UART_RX 2 // 4
|
||||||
|
#define PIN_UART_TX 13 // UNUSED
|
||||||
|
|
||||||
|
#define BAUD_GEIGERCOUNTER 9600
|
||||||
|
|
||||||
|
#define MQTT_TOPIC_CPM "sensor/radiation/cpm"
|
||||||
|
#define MQTT_TOPIC_USV "sensor/radiation/uSv"
|
||||||
|
#define MQTT_TOPIC_LAST_WILL "state/sensor/geigercounter"
|
||||||
|
|
||||||
|
const char* mqttHost = "mqtt.core.bckspc.de";
|
||||||
|
const char* delimiter = ", ";
|
Loading…
Reference in a new issue