Vanessa Benavidez
Published © MIT

Camp Stone

Smart camp that implements a safer camping experience for the environment and the camper.

BeginnerFull instructions providedOver 1 day128
Camp Stone

Things used in this project

Hardware components

Argon
Particle Argon
×1
Analog Ambient Light Sensor For Arduino
DFRobot Analog Ambient Light Sensor For Arduino
×1
Grove - Air quality sensor v1.3
Seeed Studio Grove - Air quality sensor v1.3
×1
Gravity: I2C BME280 Environmental Sensor
DFRobot Gravity: I2C BME280 Environmental Sensor
×1
NeoPixel Ring: WS2812 5050 RGB LED
Adafruit NeoPixel Ring: WS2812 5050 RGB LED
×1
Gravity: Analog Flame Sensor For Arduino
DFRobot Gravity: Analog Flame Sensor For Arduino
×1
LED (generic)
LED (generic)
×2
0.96" OLED 64x128 Display Module
ElectroPeak 0.96" OLED 64x128 Display Module
×1

Software apps and online services

Visual Studio 2015
Microsoft Visual Studio 2015
Adafruit Dashboard

Hand tools and fabrication machines

3D Printer (generic)
3D Printer (generic)
Laser cutter (generic)
Laser cutter (generic)

Story

Read more

Schematics

Camp Stone Schematics

Camp Stone Breadboard

Code

Camp Stone Code

C/C++
Code for smart camp. Flame sensor turns LEDs red or green from reading result, ambient light sensor turns on neopixels when sun goes down, BME280 reads environment and displays results on OLED, air quality sensor reads air quality. All results are published to an Adafruit dashboard except light readings.
/*
 * Project Camp_Stone
 * Description: Smart Camp 
 * Author: Vanessa Benavidez
 * Date: August 2 2021
 */

SYSTEM_MODE(SEMI_AUTOMATIC);

//BME
#include "Adafruit_BME280.h"
Adafruit_BME280 bme;
float tempC;
float tempF;
float pressPA;
float humidRH;

//OLED
#include "Adafruit_SSD1306.h"
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
#define OLED_RESET 4
#define SCREEN_ADDRESS 0x3c
#define BME_ADDRESS 0x76
Adafruit_SSD1306 display(OLED_RESET);

//Air Quality Sensor
#include "Air_Quality_Sensor.h"
AirQualitySensor sensor(A2);
int current_quality;

//Ambient Light Sensor
const int LIGHTSENSOR = A3;

//Neopixels
#include "neopixel.h"
#include "colors.h"
#define PIXEL_PIN D7
#define PIXEL_COUNT 60
#define PIXEL_TYPE WS2812B
int i;
const int BRI = 30;
Adafruit_NeoPixel pixel(PIXEL_COUNT, PIXEL_PIN, PIXEL_TYPE);

//FlameSensor
const int FLAMESENSOR = A1;
const int GREENLEDPIN = D5;
const int REDLEDPIN = D4;
int sensorReading;

//MQTT
#include "Adafruit_MQTT.h"
#include "Adafruit_MQTT/Adafruit_MQTT_SPARK.h"
#include "Adafruit_MQTT/Adafruit_MQTT.h"
#include "credentials.h"
int lastTime;
int lastTime2;
int lastTime3;
TCPClient TheClient;
Adafruit_MQTT_SPARK mqtt(&TheClient, AIO_SERVER, AIO_SERVERPORT, AIO_USERNAME, AIO_KEY);
Adafruit_MQTT_Publish mqttpublishTemperature = Adafruit_MQTT_Publish(&mqtt, AIO_USERNAME "/feeds/temperature");
Adafruit_MQTT_Publish mqttpublishPressure = Adafruit_MQTT_Publish(&mqtt, AIO_USERNAME "/feeds/pressure");
Adafruit_MQTT_Publish mqttpublishHumidity = Adafruit_MQTT_Publish(&mqtt, AIO_USERNAME "/feeds/humidity");
Adafruit_MQTT_Publish mqttpublishAirQuality = Adafruit_MQTT_Publish(&mqtt, AIO_USERNAME "/feeds/airquality");
Adafruit_MQTT_Publish mqttpublishFlameSensor = Adafruit_MQTT_Publish(&mqtt, AIO_USERNAME "/feeds/flamesensor");

void setup()
{

  Serial.begin(9600);

  //BME
  Serial.begin(9600);
  bme.begin(0x76);

  //OLED
  display.begin(SSD1306_SWITCHCAPVCC, SCREEN_ADDRESS);
  display.display();
  delay(5000);
  display.clearDisplay();
  display.setTextSize(1);
  display.setTextColor(WHITE);
  display.display();

  //AirQuality
  sensor.init();

  //AmbientLightSensor
  pinMode(LIGHTSENSOR, INPUT);

  //Neopixel
  pixel.begin();
  pixel.clear();
  pixel.show();

  //FlameSensor
  pinMode(FLAMESENSOR, INPUT);
  pinMode(GREENLEDPIN, OUTPUT);
  pinMode(REDLEDPIN, OUTPUT);

  //MQTT
  WiFi.connect();
}

void loop()
{

  bmeDisplayed();

  readAirquality();

  readLight();

  readFlame();

  MQTT_connect();

  publishValues();
}

void bmeDisplayed()
{
  tempC = bme.readTemperature();
  pressPA = bme.readPressure();
  humidRH = bme.readHumidity();

  tempF = (tempC * 1.8) + 32;

  display.setCursor(0, 0);
  display.clearDisplay();
  display.printf("Temp is %0.1f\n", tempC);
  display.printf("Pressure is %0.1f\n", pressPA);
  display.printf("Humidity is %0.1f\n", humidRH);
  display.display();
}

void readAirquality()
{
  current_quality = sensor.slope();
  if (current_quality >= 0)
  {
    if (current_quality == 0)
      Serial.println("High pollution! Force signal active");
    else if (current_quality == 1)
      Serial.println("High pollution!");
    else if (current_quality == 2)
      Serial.println("Low pollution!");
    else if (current_quality == 3)
      Serial.println("Fresh air!");
  }
}

void readLight()
{
  float reading = analogRead(LIGHTSENSOR);
  float square_ratio = reading / 1023.0;
  square_ratio = pow(square_ratio, 2.0);
  Serial.printf("Light level is %02f\n", reading);
  delay(1000);

  if (reading < 130)
  {
    for (i = 0; i < 60; i++)
    {
      pixel.setPixelColor(i, 0xFFFF00);
      pixel.setBrightness(BRI);
      pixel.show();
    }
  }
  else
  {
    pixel.clear();
    pixel.show();
  }
}

void readFlame()
{
  sensorReading = analogRead(FLAMESENSOR);
  if (sensorReading < 3497)
  {
    digitalWrite(REDLEDPIN, HIGH);
    digitalWrite(GREENLEDPIN, LOW);
  }
  else
  {
    digitalWrite(GREENLEDPIN, HIGH);
    digitalWrite(REDLEDPIN, LOW);
    Serial.printf("Flame reading is %i\n", sensorReading);
  }
}

void MQTT_connect()
{
  int8_t ret;
  if (mqtt.connected())
  {
    return;
  }
  Serial.print("Connecting to MQTT... ");
  while ((ret = mqtt.connect()) != 0)
  {
    Serial.printf("%s\n", (char *)mqtt.connectErrorString(ret));
    Serial.printf("Retrying MQTT connection in 5 seconds..\n");
    mqtt.disconnect();
    delay(5000);
  }
  Serial.printf("MQTT Connected!\n");
}

void publishValues()
{
  if ((millis() - lastTime2 > 1000))
  {
    if (mqtt.Update())
    {
      mqttpublishFlameSensor.publish(sensorReading);
      Serial.printf("Publishing %i \n", sensorReading);
    }
    lastTime2 = millis();
  }
  if ((millis() - lastTime3 > 3000))
  {
    if (mqtt.Update())
    {
      mqttpublishAirQuality.publish(current_quality);
      Serial.printf("Publishing %i \n", current_quality);
    }
    lastTime3 = millis();
  }

  if ((millis() - lastTime > 60000))
  {
    if (mqtt.Update())
    {
      mqttpublishTemperature.publish(tempF);
      Serial.printf("Publishing %0.2f \n", tempF);
      mqttpublishPressure.publish(pressPA);
      Serial.printf("Publishing %0.2f \n", pressPA);
      mqttpublishHumidity.publish(humidRH);
      Serial.printf("Publishing %0.2f \n", humidRH);
    }
    lastTime = millis();
  }
}

Credits

Vanessa Benavidez

Vanessa Benavidez

3 projects • 1 follower

Comments

Add projectSign up / Login