Remote & Base Sensor Station - Now with IoT!


#1

About This Project

This is a project I put together that is basicly two sensor stations; a base and a remote station. The base station features the powerhouse of the 'duinos; the almighty MEGA! Its connected to the internet by a ESP8266-01 and connects to the remote station via 2.4GHZ nRF24L01 chips. A DHT22 rides on its back via a proto board that the ESP and nRF chips share with it. The remote station can reach anywhere in my house and relays back its sensor data roughly every 2 min. It features a roughty BMP280 for temperature and barometric pressure data, another strapping young DHT22 sensor for humidity, and between it all, a crafty voltage divider for measuring the ever fleeting 18650 lithium batteries. The batteries I have currently are suffering from fatigue and don’t stay around much longer than five to seven days. It took me a couple days of wrestling with the nRF24L01 chips to get them to play nice together but finally got it. I’m currently working on adding in another remote station that feeds its data back to the Mega and runs on battery too hopefully for much longer.

I use the sensor data from this project to feed a couple other projects info as you may have noticed from my other ones. The first set of code if the base station, the second is the remote station.

Mega code:

#include <SPI.h>
#include <nRF24L01.h>
#include <RF24.h>
#include <CayenneESP8266Shield.h>
#include <DHT.h>
#include <SimpleTimer.h>

#define DHTPIN 7
#define DHTTYPE DHT22

DHT dht(DHTPIN, DHTTYPE);

SimpleTimer timer;

float dataInfo[6];
float far;

RF24 radio(9, 10);
const uint64_t pipe[2] = {0xE8E8F0F0E1LL, 0xE8E8F0F0E1LL};

float hum1;
float temp1;


char token[] = "your token";
char ssid[] = "your wifi";
char password[] = "password";

#define EspSerial Serial3
ESP8266 wifi(EspSerial);

void setup() {
	Serial.begin(9600);
	delay(10);

	EspSerial.begin(9600);
	delay(10);

	Cayenne.begin(token, wifi, ssid, password);


	radio.begin();
	radio.setDataRate(RF24_250KBPS);
	radio.openReadingPipe(1, pipe[1]);
	radio.openReadingPipe(2, pipe[2]);
	radio.startListening();


	dht.begin();

	timer.setInterval(15000, getTemp);

}




void loop()
{
	Cayenne.run();
	timer.run();

	if ( radio.available() )
		{
			Cayenne.virtualWrite(V0, 1);
			digitalWrite(12, HIGH);
			getData();
		}
}


void getData()
{
	radio.read(&dataInfo, sizeof(dataInfo));
	delay(200);

	digitalWrite(12, LOW);
	Cayenne.virtualWrite(V0, 0);

	far = ((dataInfo[0] * 1.8) + 32);

	Cayenne.virtualWrite(V1, dataInfo[0]);
	Cayenne.virtualWrite(V6, far);
	Cayenne.virtualWrite(V2, dataInfo[1]);
	Cayenne.virtualWrite(V3, dataInfo[2]);
	Cayenne.virtualWrite(V4, dataInfo[3]);
	Cayenne.virtualWrite(V5, dataInfo[4]);
	Cayenne.virtualWrite(V11, dataInfo[4]);
	Cayenne.virtualWrite(V10, dataInfo[2]);
	Cayenne.virtualWrite(V12, far);
}


void getTemp()
{
	temp1 = dht.readTemperature(true);
	delay(100);
	hum1 = dht.readHumidity();
}



CAYENNE_OUT(V13)
{
	Cayenne.virtualWrite(V13, temp1);
	Cayenne.virtualWrite(V15, temp1);
}

CAYENNE_OUT(V14)
{

	Cayenne.virtualWrite(V14, hum1);
	Cayenne.virtualWrite(V16, hum1);
}

Remote Code:

#include <SPI.h>
#include <nRF24L01.h>
#include <RF24.h>
#include <SimpleTimer.h>
#include <Wire.h>
#include <Adafruit_Sensor.h>
#include <Adafruit_BMP280.h>
#include <DHT.h>

#define DHTPIN 2
#define DHTTYPE DHT22

SimpleTimer timer;
Adafruit_BMP280 bmp;
DHT dht(DHTPIN, DHTTYPE);

RF24 radio(9, 10);
const uint64_t pipe = 0xE8E8F0F0E1LL;

float pressurePa;
float pressureIn;
float temperature; 
int altimeter;
float volts;
float dataInfo[6];
int motion;
int hum;


void setup() {
  Serial.begin(9600);

  bmp.begin();
  dht.begin();
  
  radio.begin();
  radio.setDataRate(RF24_250KBPS);
  radio.openWritingPipe(pipe);
  
  timer.setInterval(300000, getReadings);
}


void loop()
{
   timer.run();

}

void getReadings()
{
//   radio.powerUp();

   pressurePa = bmp.readPressure();
   temperature = bmp.readTemperature();
   altimeter = bmp.readAltitude (1050.35);
   delay(250);
   pressureIn = pressurePa * 0.000295;

   hum = dht.readHumidity();
   delay(250);
   volts = ((analogRead(A2) * (5.0 / 1023.0)) / 0.08933);

  dataInfo[0] = temperature;
  dataInfo[1] = hum;
  dataInfo[2] = pressureIn;
  dataInfo[3] = altimeter;
  dataInfo[4] = volts;
  dataInfo[5] = motion;
  
  radio.write(dataInfo, sizeof(dataInfo));
//  Serial.println(temperature);
//  Serial.println(hum);
//  radio.powerDown();
}

What’s Connected

Arduino Mega
Arduino Nano V3
ESP8266-01
2x nRF24L01 RF Chips
2x DHT22 sensors
BMP280 sensor
2x 18650 Lipo batts
LM1113v3 LDO linear regulator
3D Printed PLA batt holder
and a couple resistors and a capacitor

Triggers & Alerts

I use the remote temp to trigger my fireplace on and off.

Scheduling

NA - All sensor data

Dashboard Screenshots

Photos of the Project

Remote Station:


Battery Case I printed:

Main Hub - Mega:


IoT Fireplace
The Judges Have Spoken! ~CONTEST RESULTS~
#2

Nice. I have a bunch of nrf transceivers kicking around. Btw, they are one of the only radios around that can run off a 2032 coin cell.


#3

I need to optimize how it sends to get some better batt life out of them. I need to move the BMP280 off the remote station. No reason it can’t be on the powered base.


#4

Good update!:v: