The blog so far:
Links should open new tabs / windows
Sections 1-4. Initial thoughts, requirements,excitement and unboxing.
- Blog 1 - The what and why (Garden pond monitoring Background and Introductions)
- Blog 2 - My Method or WWHW (What, Why, How, When)
- Blog 3 - excited as its on the way
- Blog 4 - Arrivals, Unboxing, Github and requirements
Sections 5 -10, design build, code and test, so much testing
- Blog 5 - Getting started with the MKR 1300 (and LoRa Sender Starting LoRa failed!)
- Blog 6 - The Soak Test UPDATE 2 (Test 3 - sump pump and soak)
- Blog 7 - Sensors, connections and starting some code - draft / wip
- Blog 8 - Measure, send, receive, transform, store, display (updated with code)
- Blog 9 - Bringing the hardware all together - Part 1 (updated)
- Blog 10 - Bringing the hardware all together Part 2 (updated)
Sections 11-12+ the launch, final code, final build instructions and ce fin!
- Blog 11 - The launch! Floaty Mc Test Face (this blog).
- Blog 12 - Wrap up, conclusions, and appendicies.
Table of Contents
Introduction
So a thing happened, well actually a few things. The UK since last thursday has had storm upon storm, this has brought plenty of wind, rain, sleet, flying trampolines, wheelie bins and many fences down. Spotting a window of opportunity to safely go ahead and put my baby outside (that has been lovingly cared for as its has been developed on my desk) would be a great chance to really kick the tyres in extreme (relative to the UK) conditions.
One very empty side desk pull out.
So far we have had storm:
- Arwen
- Barra
- Corrie
- Dudley
- Eunice
- Franklin
With Franklin now easing off. Windest day was on Friday night / saturday evening with some 80+mph winds and rain from every direction! The good news, Floaty McTest Face is still reporting in!
Floaty McTest Face
Front view: Floating test platform, with sensor rig now attached. Turbidity Probe, 2No temp probes. Top right, light meter and BME280
Rear view: Floating test platform, with sensor rig now attached.pH probe and TDS probe
Stand offs installed and now to tidy route wiring - note, not a rats tail nest in sight!
Turbidity Sensor and its lack lustre connector put aside, replaced the on PCB connector with a tiny 2.54mm pitch screw connector and used alarm cable.
The inside of the turbidity sensor before heat sealed tubes and mastic to waterproof it all.
The final overnight soak test before packaging it all up into the incredible hammond enclosure for safe keeping and weather proof aquatic adventures.
Remembering to change the loop delay from 1 second to 30 seconds BEFORE I seal her up. (honest)
Everything nicely packaged inside, 6mm clearance to spare.
Top layer comprises of (left to right):
- Turbidity sensor interface board - connects to probe (top) and to MKR 1300 connector shield (bottom)
- TDS sensor interface board - connects to probe (top) and to MKR 1300 connector shield (bottom)
- Enclosure temp / humidity monitor - connects to MKR 1300 connector shield (bottom)
- BME280 breakout board (mine) connects to probe (top) and to MKR 1300 connector shield (bottom)
- Temp probes uppper and lower - connects to probe (top) and to MKR 1300 connector shield (bottom)*1
*1 as the temp probes continued to give me trouble, i ended up breaking them out onto two seperate one wire buses. If i can avoid in future I am likely to go one wire free :) this experience has put me off.
Bottom later comprises of (left to right again)
- Arduino MKR1300 mounted on Arduino Connector Carrier board
- Top right - pH prove sensor breakout connects to probe (top) and to MKR 1300 connector shield (bottom)
- Bottom right - step down power - 12v - 5.5v.
FInally, what you canonot see in the picture is a bonus in enclosure sensor for ambient light. With the case closed I get a read of 515 abritary light units and this stays constant, any change to this will give me an alert via the dashboard (whcih we will get onto)
The makings of a radiation shield, complete with ... ambient light level meter of I am going to smash all the bits on your I2C interface, good luck that with sensor.
All assembled, mid way, one weather proofed BME280 for temp, pressure and humidity and then the ambient light sensor at the very top. The radiation shield, also known as a Stevenson screen <--link for the curious (i learnt)
Test equipment holder! 40mm pipe, with insulation foam inner to which the sensor is either secured (As above) or sits in the middle of, as with the pH probe. Each holder is topped off with a 3d printed snug fitting lid and wire router.
Each test equipment holder allows for the up/down adjustment of the sensor relative to the water level ... (important for floaty mc test face) as how she will sit in the pond was an unknown ...
But does it work?
As they say, the proof is in the pudding, well this pudding looks good to me! Have a look and then I will describe what you see below, below
Enclosure Monitoring
- Temp
- Humidity
- Light level
all inside the enclosure, so to ensure, not too hot, not too cold, not to humid and no sudden changes in light level - the goldilocks zone if you will for the Hammond Enclosure
Pond Monitoring (above water)
- Air humidity
- Air temp
- RSSI
- Air pressure
- Light levels
Pond Monitoring - the water
- Water pH
- Total disolved solids
- Water temp at 10cm and 30cm
- Turbidity
But does it float? Continued
Yes! Floaty Mc Test Face floats. A lift from the pond to check for any water ingress (a gentle shake and listen to internal water noise for the floating platform) - none.
Now if I had thought about including a surface skimmer for all that duck week (cries silently) this would be the ultimate project.
Block Diagram
Outstation (top) logical block diagram showing the consituent components, reasonably high level like any good block diagram should be (any questions please let me know)
Instation (bottom)
Schematics
Arduino Code - Outstation
//Credits and Acknowledgements //https://wiki.dfrobot.com/PH_meter_SKU__SEN0161_ - modified sample Arduino code for the ph meter (temp correction) //https://wiki.dfrobot.com/Gravity__Analog_TDS_Sensor___Meter_For_Arduino_SKU__SEN0244 - modified TDS meter code (temp correction) //https://wiki.dfrobot.com/Turbidity_sensor_SKU__SEN0189 - modfied sample Arduino code for the turbidity sensor (temp correction) //Libraries #include <SPI.h> #include <LoRa.h> #include <Wire.h> #include <Adafruit_Sensor.h> #include <Adafruit_BME280.h> #include "DHT.h" #include <DHT_U.h> #include <math.h> #include <OneWire.h> #include <DallasTemperature.h> #include <DFRobot_B_LUX_V30B.h> //Constants //LUX meter DFRobot_B_LUX_V30B myLux(13,5,6); //pH Sensor #define pHSensorPin 0 #define VREF 5.0 #define SCOUNT 30 //Turbidity Sensor #define TurbSensorPin A1 //TDS Sensor #define TdsSensorPin 3 //DHT22 pin and object name DHT dht(2, DHT22); // Initialize DHT //#define DHTPIN 2 //#define DHTTYPE DHT22 // DHT 22 (AM2302) //Variables int counter = 0; // one wire // Setup a oneWire instance to communicate with any OneWire device OneWire oneWireA (0); OneWire oneWireB (1); // Pass oneWire reference to DallasTemperature library DallasTemperature sensorsA(&oneWireA); DallasTemperature sensorsB(&oneWireB); int deviceCount = 0; float tempCu; float tempCl; //TDS Meter int analogBuffer[SCOUNT]; // store the analog value in the array, read from ADC int analogBufferTemp[SCOUNT]; int analogBufferIndex = 0,copyIndex = 0; float averageVoltage = 0,tdsValue = 0,temperature = tempCl; //pH sensor unsigned long int avgValue; //Store the average value of the sensor feedback float phValue=(((phValue=(float)avgValue*5.0/1024/6)*3.5)); float b; int buf[10],temp; //BME280 Adafruit_BME280 bme; //dht22 int chk; float enc_humidity; //Stores humidity value float enc_temp; //Stores temperature value //lightiness (open enclosure) float lightsensor; //Resistance of grove light sensor (v1.2) in K //turbidity int sensorValue = analogRead(TurbSensorPin); float turbidity = sensorValue * (5.0 / 1024.0); ///////////////////////////////////ends///////////////////////////////// void setup() { Serial.begin(9600); sensorsA.begin(); sensorsB.begin(); dht.begin(); myLux.begin(); if (!bme.begin(0x76)) { Serial.println("Could not find a valid BME280 sensor, check wiring!"); while (1); } LoRa.begin(868E6); } void loop() { int sensorValue = analogRead(TurbSensorPin); float turbidity = sensorValue * (5.0 / 1024.0); sensorsA.requestTemperatures(); sensorsB.requestTemperatures(); //gettemp(); gettds(); getph(); getlight(); Serial.print(bme.readTemperature()); Serial.print(","); Serial.print(bme.readPressure() / 100.0F); Serial.print(","); Serial.print(bme.readHumidity()); Serial.print(","); Serial.print(tdsValue); Serial.print(","); Serial.print(phValue); Serial.print(","); Serial.print(dht.readHumidity()); Serial.print(","); Serial.print(dht.readTemperature()); Serial.print(","); Serial.print(lightsensor,DEC); Serial.print(","); Serial.print(sensorsA.getTempCByIndex(0)); Serial.print(","); Serial.print(sensorsB.getTempCByIndex(0)); Serial.print(","); Serial.print(turbidity); Serial.print(","); Serial.print(myLux.lightStrengthLux()); Serial.print(","); Serial.print("Sending packet: "); Serial.println(counter); LoRa.beginPacket(); LoRa.print(bme.readTemperature()); LoRa.print(","); LoRa.print(bme.readPressure() / 100.0F); LoRa.print(","); LoRa.print(bme.readHumidity()); LoRa.print(","); LoRa.print(tdsValue); LoRa.print(","); LoRa.print(phValue); LoRa.print(","); LoRa.print(dht.readHumidity()); LoRa.print(","); LoRa.print(dht.readTemperature()); LoRa.print(","); LoRa.print(lightsensor,DEC); LoRa.print(","); LoRa.print(sensorsA.getTempCByIndex(0)); LoRa.print(","); LoRa.print(sensorsB.getTempCByIndex(0)); LoRa.print(","); LoRa.print(turbidity); LoRa.print(","); LoRa.print(myLux.lightStrengthLux()); LoRa.print(","); //included at end of main data string as RSSI is added last LoRa.endPacket(); counter++; delay(30000); } ///////////////////////////////////////////////// ////////Function things TDS, pH, Light/////////// ///////////////////////////////////////////////// void gettemp() { // Send command to all the sensors for temperature conversion sensorsA.requestTemperatures(); sensorsB.requestTemperatures(); tempCl = sensorsA.getTempCByIndex(0); tempCu = sensorsB.getTempCByIndex(0); } void gettds() { static unsigned long analogSampleTimepoint = millis(); if(millis()-analogSampleTimepoint > 40U) //every 40 milliseconds,read the analog value from the ADC { analogSampleTimepoint = millis(); analogBuffer[analogBufferIndex] = analogRead(TdsSensorPin); //read the analog value and store into the buffer analogBufferIndex++; if(analogBufferIndex == SCOUNT) analogBufferIndex = 0; } static unsigned long printTimepoint = millis(); if(millis()-printTimepoint > 800U) { printTimepoint = millis(); for(copyIndex=0;copyIndex<SCOUNT;copyIndex++) analogBufferTemp[copyIndex]= analogBuffer[copyIndex]; averageVoltage = getMedianNum(analogBufferTemp,SCOUNT) * (float)VREF / 1024.0; // read the analog value more stable by the median filtering algorithm, and convert to voltage value float compensationCoefficient=1.0+0.02*(temperature-25.0); //temperature compensation formula: fFinalResult(25^C) = fFinalResult(current)/(1.0+0.02*(fTP-25.0)); float compensationVolatge=averageVoltage/compensationCoefficient; //temperature compensation tdsValue=(133.42*compensationVolatge*compensationVolatge*compensationVolatge - 255.86*compensationVolatge*compensationVolatge + 857.39*compensationVolatge)*0.5; //convert voltage value to tds value } } int getMedianNum(int bArray[], int iFilterLen) { int bTab[iFilterLen]; for (byte i = 0; i<iFilterLen; i++) bTab[i] = bArray[i]; int i, j, bTemp; for (j = 0; j < iFilterLen - 1; j++) { for (i = 0; i < iFilterLen - j - 1; i++) { if (bTab[i] > bTab[i + 1]) { bTemp = bTab[i]; bTab[i] = bTab[i + 1]; bTab[i + 1] = bTemp; } } } if ((iFilterLen & 1) > 0) bTemp = bTab[(iFilterLen - 1) / 2]; else bTemp = (bTab[iFilterLen / 2] + bTab[iFilterLen / 2 - 1]) / 2; return bTemp; } void getph() { for(int i=0;i<10;i++) //Get 10 sample value from the sensor for smooth the value { buf[i]=analogRead(pHSensorPin); delay(10); } for(int i=0;i<9;i++) //sort the analog from small to large { for(int j=i+1;j<10;j++) { if(buf[i]>buf[j]) { temp=buf[i]; buf[i]=buf[j]; buf[j]=temp; } } } avgValue=0; for(int i=2;i<8;i++) //take the average value of 6 center sample avgValue+=buf[i]; float phValue1=(float)avgValue*5.0/1024/6; //convert the analog into millivolt phValue=3.5*phValue1; //convert the millivolt into pH value } void getlight() { int sensorValue = analogRead(4); lightsensor=(float)(1023-sensorValue)*10/sensorValue; }
Arduino Code - Instation
#include <SPI.h> #include <LoRa.h> void setup() { Serial.begin(9600); while (!Serial); Serial.println("LoRa Receiver"); if (!LoRa.begin(868E6)) { Serial.println("Starting LoRa failed!"); while (1); } } void loop() { // try to parse packet int packetSize = LoRa.parsePacket(); if (packetSize) { // received a packet Serial.print("RSSI:"); // read packet while (LoRa.available()) { Serial.print((char)LoRa.read()); } // print RSSI of packet // Serial.print("' with RSSI "); Serial.println(LoRa.packetRssi()); } }
Node Red Code
[ { "id": "9a63abc8bf548d52", "type": "tab", "label": "BME280 end to end", "disabled": false, "info": "", "env": [] }, { "id": "9a432e9a0a0a43e1", "type": "serial in", "z": "9a63abc8bf548d52", "name": "LoRA Reciever Bridge to Pi", "serial": "52e690c089097413", "x": 160, "y": 180, "wires": [ [ "eec124d3bdf3987b", "5f9753b43272a6eb" ] ] }, { "id": "eec124d3bdf3987b", "type": "debug", "z": "9a63abc8bf548d52", "name": "Debugging received packets", "active": true, "tosidebar": true, "console": true, "tostatus": true, "complete": "true", "targetType": "full", "statusVal": "payload", "statusType": "auto", "x": 530, "y": 300, "wires": [] }, { "id": "c0f2fc11b1525619", "type": "influxdb out", "z": "9a63abc8bf548d52", "influxdb": "b25ff12e164a2d6b", "name": "Pressure Write to Pi Influx", "measurement": "pressure", "precision": "", "retentionPolicy": "", "database": "pond", "precisionV18FluxV20": "s", "retentionPolicyV18Flux": "", "org": "organisation", "bucket": "bucket", "x": 1110, "y": 220, "wires": [] }, { "id": "57bf657a5a85445a", "type": "influxdb out", "z": "9a63abc8bf548d52", "influxdb": "b25ff12e164a2d6b", "name": "TEMP Write to Pi Influx", "measurement": "temp", "precision": "", "retentionPolicy": "", "database": "pond", "precisionV18FluxV20": "s", "retentionPolicyV18Flux": "", "org": "organisation", "bucket": "bucket", "x": 1100, "y": 180, "wires": [] }, { "id": "5f9753b43272a6eb", "type": "csv", "z": "9a63abc8bf548d52", "name": "", "sep": ",", "hdrin": "", "hdrout": "none", "multi": "one", "ret": "\\n", "temp": "temp,pressure,humidity,tds,ph,ehumid,etemp,light,temp1,temp2,turbid,LUX,RSSI", "skip": "0", "strings": true, "include_empty_strings": "", "include_null_values": "", "x": 450, "y": 180, "wires": [ [ "6c5bd3e935834bd2" ] ] }, { "id": "6c5bd3e935834bd2", "type": "split", "z": "9a63abc8bf548d52", "name": "", "splt": "\\n", "spltType": "str", "arraySplt": 1, "arraySpltType": "len", "stream": false, "addname": "topic", "x": 610, "y": 180, "wires": [ [ "976274677e8b515f" ] ] }, { "id": "976274677e8b515f", "type": "switch", "z": "9a63abc8bf548d52", "name": "", "property": "topic", "propertyType": "msg", "rules": [ { "t": "eq", "v": "temp", "vt": "str" }, { "t": "eq", "v": "pressure", "vt": "str" }, { "t": "eq", "v": "humidity", "vt": "str" }, { "t": "eq", "v": "tds", "vt": "str" }, { "t": "eq", "v": "ph", "vt": "str" }, { "t": "eq", "v": "ehumid", "vt": "str" }, { "t": "eq", "v": "etemp", "vt": "str" }, { "t": "eq", "v": "light", "vt": "str" }, { "t": "eq", "v": "temp1", "vt": "str" }, { "t": "eq", "v": "temp2", "vt": "str" }, { "t": "eq", "v": "turbid", "vt": "str" }, { "t": "eq", "v": "LUX", "vt": "str" }, { "t": "eq", "v": "RSSI", "vt": "str" } ], "checkall": "true", "repair": false, "outputs": 13, "x": 790, "y": 180, "wires": [ [ "57bf657a5a85445a", "6316852894b77a0d" ], [ "c0f2fc11b1525619", "6316852894b77a0d" ], [ "b523ceb37f789015", "6316852894b77a0d" ], [ "0edbd3eca27c989d", "6316852894b77a0d" ], [ "9f820cd854dc0a34", "6316852894b77a0d" ], [ "6316852894b77a0d", "754a152b58450677" ], [ "6316852894b77a0d", "0cac3dc02c126594" ], [ "c80d4374754128ae" ], [ "cb264322d07f71b6", "6316852894b77a0d" ], [ "29665da285c1bc43", "6316852894b77a0d" ], [ "20de70c655b02bf1", "6316852894b77a0d" ], [ "e9edf94e4659a5fc" ], [ "6316852894b77a0d", "76cfa3e059b264d4" ] ] }, { "id": "b523ceb37f789015", "type": "influxdb out", "z": "9a63abc8bf548d52", "influxdb": "b25ff12e164a2d6b", "name": "humid Write to Pi Influx", "measurement": "humidity", "precision": "", "retentionPolicy": "", "database": "pond", "precisionV18FluxV20": "s", "retentionPolicyV18Flux": "", "org": "organisation", "bucket": "bucket", "x": 1100, "y": 260, "wires": [] }, { "id": "0edbd3eca27c989d", "type": "influxdb out", "z": "9a63abc8bf548d52", "influxdb": "b25ff12e164a2d6b", "name": "tds Write to Pi Influx", "measurement": "tds", "precision": "", "retentionPolicy": "", "database": "pond", "precisionV18FluxV20": "s", "retentionPolicyV18Flux": "", "org": "organisation", "bucket": "bucket", "x": 1100, "y": 300, "wires": [] }, { "id": "9f820cd854dc0a34", "type": "influxdb out", "z": "9a63abc8bf548d52", "influxdb": "b25ff12e164a2d6b", "name": "ph Write to Pi Influx", "measurement": "ph", "precision": "", "retentionPolicy": "", "database": "pond", "precisionV18FluxV20": "s", "retentionPolicyV18Flux": "", "org": "organisation", "bucket": "bucket", "x": 1090, "y": 340, "wires": [] }, { "id": "76cfa3e059b264d4", "type": "influxdb out", "z": "9a63abc8bf548d52", "influxdb": "b25ff12e164a2d6b", "name": "rssi Write to Pi Influx", "measurement": "rssi", "precision": "", "retentionPolicy": "", "database": "pond", "precisionV18FluxV20": "s", "retentionPolicyV18Flux": "", "org": "organisation", "bucket": "bucket", "x": 1100, "y": 660, "wires": [] }, { "id": "6316852894b77a0d", "type": "debug", "z": "9a63abc8bf548d52", "name": "", "active": true, "tosidebar": true, "console": false, "tostatus": false, "complete": "false", "statusVal": "", "statusType": "auto", "x": 1130, "y": 20, "wires": [] }, { "id": "754a152b58450677", "type": "influxdb out", "z": "9a63abc8bf548d52", "influxdb": "b25ff12e164a2d6b", "name": "enc_humid Write to Pi Influx", "measurement": "ehumid", "precision": "", "retentionPolicy": "", "database": "pond", "precisionV18FluxV20": "s", "retentionPolicyV18Flux": "", "org": "organisation", "bucket": "bucket", "x": 1120, "y": 380, "wires": [] }, { "id": "0cac3dc02c126594", "type": "influxdb out", "z": "9a63abc8bf548d52", "influxdb": "b25ff12e164a2d6b", "name": "enc_temp Write to Pi Influx", "measurement": "etemp", "precision": "", "retentionPolicy": "", "database": "pond", "precisionV18FluxV20": "s", "retentionPolicyV18Flux": "", "org": "organisation", "bucket": "bucket", "x": 1120, "y": 420, "wires": [] }, { "id": "c80d4374754128ae", "type": "influxdb out", "z": "9a63abc8bf548d52", "influxdb": "b25ff12e164a2d6b", "name": "enc_light Write to Pi Influx", "measurement": "light", "precision": "", "retentionPolicy": "", "database": "pond", "precisionV18FluxV20": "s", "retentionPolicyV18Flux": "", "org": "organisation", "bucket": "bucket", "x": 1110, "y": 460, "wires": [] }, { "id": "cb264322d07f71b6", "type": "influxdb out", "z": "9a63abc8bf548d52", "influxdb": "b25ff12e164a2d6b", "name": "h20_temp1 Write to Pi Influx", "measurement": "temp1", "precision": "", "retentionPolicy": "", "database": "pond", "precisionV18FluxV20": "s", "retentionPolicyV18Flux": "", "org": "organisation", "bucket": "bucket", "x": 1120, "y": 500, "wires": [] }, { "id": "29665da285c1bc43", "type": "influxdb out", "z": "9a63abc8bf548d52", "influxdb": "b25ff12e164a2d6b", "name": "h20_temp2 Write to Pi Influx", "measurement": "temp2", "precision": "", "retentionPolicy": "", "database": "pond", "precisionV18FluxV20": "s", "retentionPolicyV18Flux": "", "org": "organisation", "bucket": "bucket", "x": 1120, "y": 540, "wires": [] }, { "id": "20de70c655b02bf1", "type": "influxdb out", "z": "9a63abc8bf548d52", "influxdb": "b25ff12e164a2d6b", "name": "turbid Write to Pi Influx", "measurement": "turbid", "precision": "", "retentionPolicy": "", "database": "pond", "precisionV18FluxV20": "s", "retentionPolicyV18Flux": "", "org": "organisation", "bucket": "bucket", "x": 1100, "y": 580, "wires": [] }, { "id": "e9edf94e4659a5fc", "type": "influxdb out", "z": "9a63abc8bf548d52", "influxdb": "b25ff12e164a2d6b", "name": "LUX Write to Pi Influx", "measurement": "LUX", "precision": "", "retentionPolicy": "", "database": "pond", "precisionV18FluxV20": "s", "retentionPolicyV18Flux": "", "org": "organisation", "bucket": "bucket", "x": 1100, "y": 620, "wires": [] }, { "id": "52e690c089097413", "type": "serial-port", "serialport": "/dev/ttyACM0", "serialbaud": "9600", "databits": "8", "parity": "none", "stopbits": "1", "waitfor": "", "dtr": "none", "rts": "none", "cts": "none", "dsr": "none", "newline": "\\n", "bin": "false", "out": "char", "addchar": "", "responsetimeout": "10000" }, { "id": "b25ff12e164a2d6b", "type": "influxdb", "hostname": "127.0.0.1", "port": "8086", "protocol": "http", "database": "pond", "name": "pond-test", "usetls": false, "tls": "", "influxdbVersion": "1.8-flux", "url": "http://localhost:8086", "rejectUnauthorized": true } ]
Grafana Dashboard Code
{ "annotations": { "list": [ { "builtIn": 1, "datasource": "-- Grafana --", "enable": true, "hide": true, "iconColor": "rgba(0, 211, 255, 1)", "name": "Annotations & Alerts", "target": { "limit": 100, "matchAny": false, "tags": [], "type": "dashboard" }, "type": "dashboard" } ] }, "editable": true, "fiscalYearStartMonth": 0, "graphTooltip": 0, "id": 1, "links": [], "liveNow": false, "panels": [ { "fieldConfig": { "defaults": { "color": { "mode": "thresholds" }, "mappings": [], "thresholds": { "mode": "percentage", "steps": [ { "color": "green", "value": null }, { "color": "#EAB839", "value": 60 }, { "color": "red", "value": 90 } ] }, "unit": "humidity" }, "overrides": [] }, "gridPos": { "h": 4, "w": 3, "x": 0, "y": 0 }, "id": 12, "options": { "orientation": "auto", "reduceOptions": { "calcs": [ "lastNotNull" ], "fields": "", "values": false }, "showThresholdLabels": false, "showThresholdMarkers": true }, "pluginVersion": "8.3.6", "targets": [ { "datasource": { "type": "influxdb", "uid": "de9vqN07k" }, "groupBy": [ { "params": [ "$__interval" ], "type": "time" }, { "params": [ "null" ], "type": "fill" } ], "measurement": "ehumid", "orderByTime": "ASC", "policy": "default", "refId": "A", "resultFormat": "time_series", "select": [ [ { "params": [ "value" ], "type": "field" }, { "params": [], "type": "mean" } ] ], "tags": [] } ], "title": "Enclosure Humidity", "type": "gauge" }, { "fieldConfig": { "defaults": { "color": { "mode": "continuous-RdYlGr" }, "mappings": [], "thresholds": { "mode": "percentage", "steps": [ { "color": "green", "value": null }, { "color": "red", "value": 30 }, { "color": "#EAB839", "value": 80 } ] }, "unit": "celsius" }, "overrides": [] }, "gridPos": { "h": 4, "w": 3, "x": 3, "y": 0 }, "id": 10, "options": { "orientation": "auto", "reduceOptions": { "calcs": [ "lastNotNull" ], "fields": "", "values": false }, "showThresholdLabels": false, "showThresholdMarkers": true }, "pluginVersion": "8.3.6", "targets": [ { "datasource": { "type": "influxdb", "uid": "de9vqN07k" }, "groupBy": [ { "params": [ "$__interval" ], "type": "time" }, { "params": [ "null" ], "type": "fill" } ], "measurement": "etemp", "orderByTime": "ASC", "policy": "default", "refId": "A", "resultFormat": "time_series", "select": [ [ { "params": [ "value" ], "type": "field" }, { "params": [], "type": "mean" } ] ], "tags": [] } ], "title": "Enclosure Temp (C)", "type": "gauge" }, { "fieldConfig": { "defaults": { "color": { "mode": "thresholds" }, "mappings": [ { "options": { "> 500": { "color": "green", "index": 0, "text": "Enclosure OK" } }, "type": "value" }, { "options": { "from": 0, "result": { "color": "red", "index": 1, "text": "Enc probably open" }, "to": 50 }, "type": "range" }, { "options": { "match": "null", "result": { "color": "orange", "index": 2, "text": "Sensor Error" } }, "type": "special" } ], "thresholds": { "mode": "absolute", "steps": [ { "color": "red", "value": null }, { "color": "green", "value": 500 } ] }, "unit": "lux" }, "overrides": [] }, "gridPos": { "h": 4, "w": 6, "x": 6, "y": 0 }, "id": 14, "options": { "colorMode": "value", "graphMode": "area", "justifyMode": "center", "orientation": "horizontal", "reduceOptions": { "calcs": [ "lastNotNull" ], "fields": "/^light\\.mean$/", "values": false }, "text": {}, "textMode": "value" }, "pluginVersion": "8.3.6", "targets": [ { "datasource": { "type": "influxdb", "uid": "de9vqN07k" }, "groupBy": [ { "params": [ "1m" ], "type": "time" }, { "params": [ "null" ], "type": "fill" } ], "measurement": "light", "orderByTime": "ASC", "policy": "default", "refId": "A", "resultFormat": "time_series", "select": [ [ { "params": [ "value" ], "type": "field" }, { "params": [], "type": "mean" } ] ], "tags": [] } ], "title": "Enclosure Integrity", "type": "stat" }, { "fieldConfig": { "defaults": { "color": { "mode": "continuous-BlYlRd" }, "custom": { "axisLabel": "", "axisPlacement": "auto", "barAlignment": 0, "drawStyle": "line", "fillOpacity": 77, "gradientMode": "hue", "hideFrom": { "legend": false, "tooltip": false, "viz": false }, "lineInterpolation": "smooth", "lineWidth": 2, "pointSize": 5, "scaleDistribution": { "type": "linear" }, "showPoints": "auto", "spanNulls": false, "stacking": { "group": "A", "mode": "none" }, "thresholdsStyle": { "mode": "off" } }, "mappings": [], "thresholds": { "mode": "absolute", "steps": [ { "color": "green", "value": null }, { "color": "red", "value": 80 } ] }, "unit": "ph" }, "overrides": [] }, "gridPos": { "h": 8, "w": 6, "x": 12, "y": 0 }, "id": 18, "options": { "legend": { "calcs": [], "displayMode": "hidden", "placement": "bottom" }, "tooltip": { "mode": "single" } }, "targets": [ { "datasource": { "type": "influxdb", "uid": "de9vqN07k" }, "groupBy": [ { "params": [ "1m" ], "type": "time" }, { "params": [ "null" ], "type": "fill" } ], "measurement": "ph", "orderByTime": "ASC", "policy": "default", "refId": "A", "resultFormat": "time_series", "select": [ [ { "params": [ "value" ], "type": "field" }, { "params": [], "type": "mean" } ] ], "tags": [] } ], "title": "Pond pH", "type": "timeseries" }, { "fieldConfig": { "defaults": { "color": { "mode": "continuous-BlPu" }, "custom": { "axisLabel": "", "axisPlacement": "auto", "barAlignment": 0, "drawStyle": "line", "fillOpacity": 50, "gradientMode": "scheme", "hideFrom": { "legend": false, "tooltip": false, "viz": false }, "lineInterpolation": "smooth", "lineWidth": 1, "pointSize": 5, "scaleDistribution": { "type": "linear" }, "showPoints": "auto", "spanNulls": false, "stacking": { "group": "A", "mode": "none" }, "thresholdsStyle": { "mode": "off" } }, "mappings": [], "thresholds": { "mode": "absolute", "steps": [ { "color": "green", "value": null }, { "color": "red", "value": 80 } ] }, "unit": "ppm" }, "overrides": [] }, "gridPos": { "h": 8, "w": 6, "x": 18, "y": 0 }, "id": 16, "options": { "legend": { "calcs": [], "displayMode": "hidden", "placement": "bottom" }, "tooltip": { "mode": "single" } }, "targets": [ { "datasource": { "type": "influxdb", "uid": "de9vqN07k" }, "groupBy": [ { "params": [ "1m" ], "type": "time" }, { "params": [ "null" ], "type": "fill" } ], "measurement": "tds", "orderByTime": "ASC", "policy": "default", "refId": "A", "resultFormat": "time_series", "select": [ [ { "params": [ "value" ], "type": "field" }, { "params": [], "type": "mean" } ] ], "tags": [] } ], "title": "Pond Total Disolved Solids", "type": "timeseries" }, { "fieldConfig": { "defaults": { "color": { "mode": "continuous-BlYlRd" }, "custom": { "axisLabel": "", "axisPlacement": "auto", "barAlignment": 0, "drawStyle": "line", "fillOpacity": 44, "gradientMode": "none", "hideFrom": { "legend": false, "tooltip": false, "viz": false }, "lineInterpolation": "linear", "lineWidth": 1, "pointSize": 5, "scaleDistribution": { "type": "linear" }, "showPoints": "auto", "spanNulls": false, "stacking": { "group": "A", "mode": "none" }, "thresholdsStyle": { "mode": "line" } }, "mappings": [], "thresholds": { "mode": "absolute", "steps": [ { "color": "green", "value": null } ] }, "unit": "humidity" }, "overrides": [] }, "gridPos": { "h": 8, "w": 6, "x": 0, "y": 4 }, "id": 8, "options": { "legend": { "calcs": [], "displayMode": "hidden", "placement": "bottom" }, "tooltip": { "mode": "single" } }, "targets": [ { "datasource": { "type": "influxdb", "uid": "de9vqN07k" }, "groupBy": [ { "params": [ "1m" ], "type": "time" }, { "params": [ "null" ], "type": "fill" } ], "measurement": "humidity", "orderByTime": "ASC", "policy": "default", "refId": "A", "resultFormat": "time_series", "select": [ [ { "params": [ "value" ], "type": "field" }, { "params": [], "type": "mean" } ] ], "tags": [] } ], "title": "Air Humidity", "type": "timeseries" }, { "fieldConfig": { "defaults": { "color": { "mode": "continuous-BlYlRd" }, "custom": { "axisLabel": "", "axisPlacement": "auto", "axisSoftMax": 30, "axisSoftMin": 0, "barAlignment": 0, "drawStyle": "line", "fillOpacity": 50, "gradientMode": "scheme", "hideFrom": { "legend": false, "tooltip": false, "viz": false }, "lineInterpolation": "smooth", "lineWidth": 1, "pointSize": 5, "scaleDistribution": { "type": "linear" }, "showPoints": "auto", "spanNulls": false, "stacking": { "group": "A", "mode": "none" }, "thresholdsStyle": { "mode": "off" } }, "mappings": [], "thresholds": { "mode": "absolute", "steps": [ { "color": "green", "value": null } ] } }, "overrides": [] }, "gridPos": { "h": 8, "w": 6, "x": 6, "y": 4 }, "id": 2, "options": { "legend": { "calcs": [], "displayMode": "hidden", "placement": "bottom" }, "tooltip": { "mode": "single" } }, "targets": [ { "datasource": { "type": "influxdb", "uid": "de9vqN07k" }, "groupBy": [], "measurement": "temp", "orderByTime": "ASC", "policy": "default", "refId": "A", "resultFormat": "time_series", "select": [ [ { "params": [ "value" ], "type": "field" } ] ], "tags": [] } ], "title": "Air Temp", "type": "timeseries" }, { "fieldConfig": { "defaults": { "color": { "mode": "continuous-BlYlRd" }, "custom": { "axisGridShow": true, "axisLabel": "", "axisPlacement": "auto", "barAlignment": 0, "drawStyle": "line", "fillOpacity": 50, "gradientMode": "hue", "hideFrom": { "legend": false, "tooltip": false, "viz": false }, "lineInterpolation": "smooth", "lineStyle": { "fill": "solid" }, "lineWidth": 1, "pointSize": 5, "scaleDistribution": { "type": "linear" }, "showPoints": "auto", "spanNulls": false, "stacking": { "group": "A", "mode": "none" }, "thresholdsStyle": { "mode": "line" } }, "decimals": 2, "mappings": [], "thresholds": { "mode": "absolute", "steps": [ { "color": "dark-blue", "value": null }, { "color": "red", "value": 80 } ] }, "unit": "celsius" }, "overrides": [ { "matcher": { "id": "byFrameRefID", "options": "A" }, "properties": [ { "id": "mappings", "value": [ { "options": { "-127.00 °C": { "index": 0, "text": "0" } }, "type": "value" } ] } ] } ] }, "gridPos": { "h": 8, "w": 6, "x": 12, "y": 8 }, "id": 20, "options": { "legend": { "calcs": [], "displayMode": "hidden", "placement": "bottom" }, "tooltip": { "mode": "single" } }, "targets": [ { "datasource": { "type": "influxdb", "uid": "de9vqN07k" }, "groupBy": [], "measurement": "temp1", "orderByTime": "ASC", "policy": "default", "refId": "A", "resultFormat": "time_series", "select": [ [ { "params": [ "value" ], "type": "field" } ] ], "tags": [] } ], "title": "Pond Water Temp - 10CM", "transformations": [ { "id": "filterByRefId", "options": {} }, { "id": "filterByValue", "options": { "filters": [ { "config": { "id": "equal", "options": { "value": -127 } }, "fieldName": "temp1" }, { "config": { "id": "greater", "options": { "value": 85 } }, "fieldName": "temp1" } ], "match": "any", "type": "exclude" } } ], "type": "timeseries" }, { "fieldConfig": { "defaults": { "color": { "mode": "continuous-BlYlRd", "seriesBy": "last" }, "custom": { "axisLabel": "", "axisPlacement": "auto", "barAlignment": 0, "drawStyle": "line", "fillOpacity": 50, "gradientMode": "hue", "hideFrom": { "legend": false, "tooltip": false, "viz": false }, "lineInterpolation": "linear", "lineWidth": 1, "pointSize": 5, "scaleDistribution": { "type": "linear" }, "showPoints": "auto", "spanNulls": false, "stacking": { "group": "A", "mode": "none" }, "thresholdsStyle": { "mode": "off" } }, "mappings": [], "thresholds": { "mode": "absolute", "steps": [ { "color": "green", "value": null }, { "color": "red", "value": 80 } ] }, "unit": "celsius" }, "overrides": [] }, "gridPos": { "h": 8, "w": 6, "x": 18, "y": 8 }, "id": 22, "options": { "legend": { "calcs": [], "displayMode": "hidden", "placement": "bottom" }, "tooltip": { "mode": "single" } }, "targets": [ { "datasource": { "type": "influxdb", "uid": "de9vqN07k" }, "groupBy": [ { "params": [ "1m" ], "type": "time" }, { "params": [ "none" ], "type": "fill" } ], "measurement": "temp2", "orderByTime": "ASC", "policy": "default", "refId": "A", "resultFormat": "time_series", "select": [ [ { "params": [ "value" ], "type": "field" }, { "params": [], "type": "mean" } ] ], "tags": [] } ], "title": "Pond Water Temp 30cm", "type": "timeseries" }, { "fieldConfig": { "defaults": { "color": { "mode": "palette-classic" }, "custom": { "axisLabel": "", "axisPlacement": "auto", "barAlignment": 0, "drawStyle": "line", "fillOpacity": 0, "gradientMode": "none", "hideFrom": { "legend": false, "tooltip": false, "viz": false }, "lineInterpolation": "linear", "lineWidth": 1, "pointSize": 5, "scaleDistribution": { "type": "linear" }, "showPoints": "auto", "spanNulls": false, "stacking": { "group": "A", "mode": "none" }, "thresholdsStyle": { "mode": "off" } }, "mappings": [], "thresholds": { "mode": "absolute", "steps": [ { "color": "green", "value": null }, { "color": "red", "value": 80 } ] } }, "overrides": [] }, "gridPos": { "h": 7, "w": 6, "x": 0, "y": 12 }, "id": 4, "options": { "legend": { "calcs": [], "displayMode": "hidden", "placement": "bottom" }, "tooltip": { "mode": "single" } }, "targets": [ { "datasource": { "type": "influxdb", "uid": "de9vqN07k" }, "groupBy": [], "measurement": "rssi", "orderByTime": "ASC", "policy": "autogen", "refId": "A", "resultFormat": "time_series", "select": [ [ { "params": [ "value" ], "type": "field" } ] ], "tags": [] } ], "title": "Receieved LoRa RSSI", "type": "timeseries" }, { "fieldConfig": { "defaults": { "color": { "mode": "continuous-GrYlRd" }, "custom": { "axisLabel": "", "axisPlacement": "auto", "barAlignment": 0, "drawStyle": "line", "fillOpacity": 45, "gradientMode": "scheme", "hideFrom": { "legend": false, "tooltip": false, "viz": false }, "lineInterpolation": "smooth", "lineWidth": 1, "pointSize": 5, "scaleDistribution": { "type": "linear" }, "showPoints": "auto", "spanNulls": false, "stacking": { "group": "A", "mode": "none" }, "thresholdsStyle": { "mode": "off" } }, "decimals": 2, "mappings": [], "thresholds": { "mode": "absolute", "steps": [ { "color": "green", "value": null }, { "color": "red", "value": 80 } ] }, "unit": "pressurehg" }, "overrides": [] }, "gridPos": { "h": 7, "w": 6, "x": 6, "y": 12 }, "id": 6, "options": { "legend": { "calcs": [], "displayMode": "hidden", "placement": "bottom" }, "tooltip": { "mode": "single" } }, "targets": [ { "datasource": { "type": "influxdb", "uid": "de9vqN07k" }, "groupBy": [ { "params": [ "1m" ], "type": "time" }, { "params": [ "null" ], "type": "fill" } ], "measurement": "pressure", "orderByTime": "ASC", "policy": "default", "refId": "A", "resultFormat": "time_series", "select": [ [ { "params": [ "value" ], "type": "field" }, { "params": [], "type": "mean" } ] ], "tags": [] } ], "title": "Air Pressure", "type": "timeseries" }, { "fieldConfig": { "defaults": { "color": { "mode": "continuous-BlYlRd" }, "custom": { "axisLabel": "", "axisPlacement": "auto", "barAlignment": 0, "drawStyle": "line", "fillOpacity": 59, "gradientMode": "hue", "hideFrom": { "legend": false, "tooltip": false, "viz": false }, "lineInterpolation": "smooth", "lineWidth": 1, "pointSize": 5, "scaleDistribution": { "type": "linear" }, "showPoints": "auto", "spanNulls": false, "stacking": { "group": "A", "mode": "none" }, "thresholdsStyle": { "mode": "off" } }, "mappings": [], "thresholds": { "mode": "absolute", "steps": [ { "color": "green", "value": null }, { "color": "red", "value": 80 } ] } }, "overrides": [] }, "gridPos": { "h": 8, "w": 12, "x": 12, "y": 16 }, "id": 24, "options": { "legend": { "calcs": [], "displayMode": "list", "placement": "bottom" }, "tooltip": { "mode": "single" } }, "targets": [ { "datasource": { "type": "influxdb", "uid": "de9vqN07k" }, "groupBy": [ { "params": [ "1m" ], "type": "time" }, { "params": [ "null" ], "type": "fill" } ], "measurement": "turbid", "orderByTime": "ASC", "policy": "default", "refId": "A", "resultFormat": "time_series", "select": [ [ { "params": [ "value" ], "type": "field" }, { "params": [], "type": "mean" } ] ], "tags": [] } ], "title": "Turbidity", "type": "timeseries" }, { "fieldConfig": { "defaults": { "color": { "mode": "continuous-YlBl" }, "custom": { "axisLabel": "", "axisPlacement": "auto", "barAlignment": 0, "drawStyle": "line", "fillOpacity": 59, "gradientMode": "hue", "hideFrom": { "legend": false, "tooltip": false, "viz": false }, "lineInterpolation": "smooth", "lineWidth": 1, "pointSize": 5, "scaleDistribution": { "type": "linear" }, "showPoints": "auto", "spanNulls": false, "stacking": { "group": "A", "mode": "none" }, "thresholdsStyle": { "mode": "off" } }, "mappings": [], "thresholds": { "mode": "absolute", "steps": [ { "color": "green", "value": null }, { "color": "red", "value": 80 } ] }, "unit": "lux" }, "overrides": [] }, "gridPos": { "h": 5, "w": 12, "x": 0, "y": 19 }, "id": 26, "options": { "legend": { "calcs": [], "displayMode": "list", "placement": "bottom" }, "tooltip": { "mode": "single" } }, "targets": [ { "datasource": { "type": "influxdb", "uid": "de9vqN07k" }, "groupBy": [ { "params": [ "1m" ], "type": "time" }, { "params": [ "null" ], "type": "fill" } ], "measurement": "LUX", "orderByTime": "ASC", "policy": "default", "refId": "A", "resultFormat": "time_series", "select": [ [ { "params": [ "value" ], "type": "field" }, { "params": [], "type": "mean" } ] ], "tags": [] } ], "title": "Light Level (LUX)", "type": "timeseries" } ], "schemaVersion": 34, "style": "dark", "tags": [], "templating": { "list": [] }, "time": { "from": "now-30m", "to": "now" }, "timepicker": {}, "timezone": "", "title": "RT Dashboard + Historic", "uid": "eDiXGvA7z", "version": 45, "weekStart": "" }
In Station Positioning
When sat on my desk during the build and test phase, I had approx 5m between the sender and receiver for the two MKR1300s, unsuprisingly I had a great RSSI for the duration.
Having now moved the outstation to the bottom of the garden, approximately 90m from my current position, RSSI without moving the instation end dropped almost of the chart and into the -100 / -103dBm range of, thats not great and right at the end of drops out expected. With some rain at 1020 this morning and a watchful eye on data coming in ... first missed packets were seen, as rain intensity increased albeit for a short duration, data RX dropped off.
Moved the instation reciever at 1248, during conference call :D, not a massive improvement, but better.
Line of sight distance about 90m, out of a window, through a greenhouse, out of another window and then straight to the bottom of the garden.
Top Comments