#include <Wire.h>
#include <Adafruit_Sensor.h>
#include <Adafruit_BME680.h>
#include <BH1750.h>
#define SEALEVELPRESSURE_HPA (1013.25)
//BME680 Setup
Adafruit_BME680 bme;
//BH1750 Setup
BH1750 lightMeter(0x23);
//SDI-12 Setup
#define DIRO 7
String command;
int Address = 0;
String BMEidentification = "BME680 sensor";
String BHidentification = "BH1750 sensor";
void setup()
{
//Arduino IDE Serial Monitor
Serial.begin(9600);
// ================ BME680 ================
if (!bme.begin(0x76)) {
Serial.println("Could not find a valid BME680 sensor, check wiring!");
while (1);
}
// Set the temperature, pressure and humidity oversampling
bme.setTemperatureOversampling(BME680_OS_8X);
bme.setHumidityOversampling(BME680_OS_2X);
bme.setPressureOversampling(BME680_OS_4X);
bme.setIIRFilterSize(BME680_FILTER_SIZE_3);
bme.setGasHeater(320, 150); // 320*C for 150 ms
// ================ BH1750 ================
Wire.begin();
lightMeter.begin();
// ================ SDI-12 ================
Serial1.begin(1200, SERIAL_7E1); //SDI-12 UART, configures serial port for 7 data bits, even parity, and 1 stop bit
pinMode(DIRO, OUTPUT); //DIRO Pin
//HIGH to Receive from SDI-12
digitalWrite(DIRO, HIGH);
}
void loop()
{
int byte;
//Receive SDI-12 over UART and then print to Serial Monitor
if(Serial1.available()) {
byte = Serial1.read(); //Reads incoming communication in bytes
//Serial.println(byte);
if (byte == 33) { //If byte is command terminator (!)
SDIReceive(command);
command = ""; //reset command string
} else {
if (byte != 0) { //do not add start bit (0)
command += char(byte); //append byte to command string
}
}
}
}
void SDIReceive(String input)
{
String address = String(Address);
//convert address to string
if (String(input.charAt(0)) == "?")
{
SDI12Send("Address Query");
SDI12Send("Address is ...");
Serial.println(address);
SDI12Send(address);
}
if (String(input.charAt(0)) == address) {
//respond to address change command
if (String(input.charAt(1)) == "A")
{
Address = (String(input.charAt(2))).toInt();
address = (String(input.charAt(2)));
Serial.println("Address Change");
Serial.println("Please enter new address:");
SDI12Send("Address Change");
SDI12Send("New Address is ...");
SDI12Send(address);
}
//respond to start measurement command
if (String(input.charAt(1)) == "M")
{
Serial.println("Start Measurement");
SDI12Send("Starting measurement... ");
bme.performReading();
lightMeter.begin();
}
if (String(input.charAt(1)) == "S")
{
Serial.println("Send Data");
SDI12Send("Sending data... ");
//need to send stored data from 'start measurement' command to SDI12Send function eg
if (String(input.charAt(2)) == "0")
{
Serial.print("Temperature = ");
Serial.print(bme.temperature);
Serial.println(" *C");
SDI12Send("Temperature = " + String(bme.temperature) + " *C");
}
if (String(input.charAt(2)) == "1")
{
Serial.print("Pressure = ");
Serial.print(bme.pressure / 100.0);
Serial.println(" hPa");
SDI12Send("Pressure = " + String(bme.temperature/ 100.0) + " hPa");
}
if (String(input.charAt(2)) == "2")
{
Serial.print("Humidity = ");
Serial.print(bme.humidity);
Serial.println(" %");
SDI12Send("Humidity = " + String(bme.humidity) + " %");
}
if (String(input.charAt(2)) == "3")
{
Serial.print("Gas = ");
Serial.print(bme.gas_resistance / 1000.0);
Serial.println(" KOhms");
SDI12Send("Gas = " + String(bme.gas_resistance / 1000.0) + " kOhms");
}
if (String(input.charAt(2)) == "4")
{
Serial.print("Approx. Altitude = ");
Serial.print(bme.readAltitude(SEALEVELPRESSURE_HPA));
Serial.println(" m");
SDI12Send("Approx. altitude = " + String(bme.readAltitude(SEALEVELPRESSURE_HPA)) + " m");
}
if (String(input.charAt(2)) == "5")
{
uint16_t lux = lightMeter.readLightLevel();
SDI12Send("Light intensity = " + String(lux) + " lx");
}
if (String(input.charAt(2)) == "")
{
SDI12Send("Temperature = " + String(bme.temperature) + " *C");
SDI12Send("Pressure = " + String(bme.pressure/ 100.0) + " hPa");
SDI12Send("Humidity = " + String(bme.humidity) + " %");
SDI12Send("Gas = " + String(bme.gas_resistance / 1000.0) + " kOhms");
SDI12Send("Approx. altitude = " + String(bme.readAltitude(SEALEVELPRESSURE_HPA)) + " m");
uint16_t lux = lightMeter.readLightLevel();
SDI12Send("Light intensity = " + String(lux) + " lx");
}
}
if ((String(input.charAt(1)) == "R"))
{
while ((String(input.charAt(1)) == "R")){
Serial.println("Continuous Measurement");
if (String(input.charAt(2)) == "0")
{
Serial.print("Temperature = ");
Serial.print(bme.temperature);
Serial.println(" *C");
SDI12Send("Temperature = " + String(bme.temperature) + " *C");
}
if (String(input.charAt(2)) == "1")
{
Serial.print("Pressure = ");
Serial.print(bme.pressure / 100.0);
Serial.println(" hPa");
SDI12Send("Pressure = " + String(bme.pressure/ 100.0) + " hPa");
}
if (String(input.charAt(2)) == "2")
{
Serial.print("Humidity = ");
Serial.print(bme.humidity);
Serial.println(" %");
SDI12Send("Humidity = " + String(bme.humidity) + " %");
}
if (String(input.charAt(2)) == "3")
{
Serial.print("Gas = ");
Serial.print(bme.gas_resistance / 1000.0);
Serial.println(" KOhms");
SDI12Send("Gas = " + String(bme.gas_resistance / 1000.0) + " kOhms");
}
if (String(input.charAt(2)) == "4")
{
Serial.print("Approx. Altitude = ");
Serial.print(bme.readAltitude(SEALEVELPRESSURE_HPA));
Serial.println(" m");
SDI12Send("Approx. altitude = " + String(bme.readAltitude(SEALEVELPRESSURE_HPA)) + " m");
}
if (String(input.charAt(2)) == "5")
{
uint16_t lux = lightMeter.readLightLevel();
SDI12Send("Light intensity = " + String(lux) + " lux");
}
if (String(input.charAt(2)) == "")
{
SDI12Send("Temperature = " + String(bme.temperature) + " *C");
SDI12Send("Pressure = " + String(bme.pressure/ 100.0) + " hPa");
SDI12Send("Humidity = " + String(bme.humidity) + " %");
SDI12Send("Gas = " + String(bme.gas_resistance / 1000.0) + " kOhms");
SDI12Send("Approx. altitude = " + String(bme.readAltitude(SEALEVELPRESSURE_HPA)) + " m");
uint16_t lux = lightMeter.readLightLevel();
SDI12Send("Light intensity = " + String(lux) + " lx");
}
delay(3000);
int byte;
if (Serial1.available())
{
byte = Serial1.read();
if (byte != 0)
{
Serial1.read();
}
return;
}
}
}
}
}
void SDI12Send(String message)
{
Serial.print("message: "); Serial.println(message);
digitalWrite(DIRO, LOW);
delay(100);
Serial1.print(message + String("\r\n"));
Serial1.flush(); //wait for print to finish
Serial1.end();
Serial1.begin(1200, SERIAL_7E1);
digitalWrite(DIRO, HIGH);
//secondruntoken = 0;
}