livestalk_monitoring — ESP32-S3 simulation

An interactive ESP32-S3 circuit simulation you can run free in your browser on Velxio, by khadtarprerana.

Components

Sketch code

#include <Wire.h>
#include <LiquidCrystal_I2C.h>

#define SDA_PIN 8
#define SCL_PIN 9

#define MPU6050_ADDR 0x68
#define MCP9808_ADDR 0x18

#define ALERT_PIN 10

// GPS pins
#define GPS_RX 16
#define GPS_TX 17

#define TEST_MODE true

float testTemperature = 32.0;
String TEST_ACTIVITY = "LOW";

LiquidCrystal_I2C lcd(0x27, 16, 2);

String gpsData = "";

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

  Wire.begin(SDA_PIN, SCL_PIN);

  // MPU6050
  Wire.beginTransmission(MPU6050_ADDR);
  Wire.write(0x6B);
  Wire.write(0);
  Wire.endTransmission();

  // LCD
  lcd.init();
  lcd.backlight();

  // LED
  pinMode(ALERT_PIN, OUTPUT);
  digitalWrite(ALERT_PIN, LOW);

  // GPS
  Serial1.begin(9600, SERIAL_8N1, GPS_RX, GPS_TX);

  lcd.setCursor(0, 0);
  lcd.print("Livestock");

  lcd.setCursor(0, 1);
  lcd.print("Monitoring");

  delay(2000);
  lcd.clear();

  Serial.println("Livestock Monitoring Started");
  Serial.println("GPS Started");
}

void loop() {

  // ---------------- MPU6050 ----------------

  int16_t ax = 0;
  int16_t ay = 0;
  int16_t az = 0;

  Wire.beginTransmission(MPU6050_ADDR);
  Wire.write(0x3B);
  Wire.endTransmission(false);

  Wire.requestFrom(MPU6050_ADDR, 6, true);

  if (Wire.available() >= 6) {
    ax = Wire.read() << 8 | Wire.read();
    ay = Wire.read() << 8 | Wire.read();
    az = Wire.read() << 8 | Wire.read();
  }

  long movement = abs(ax) + abs(ay) + abs(az - 16384);


  // ---------------- TEMPERATURE ----------------

  float temperature = 0;

  if (TEST_MODE == true) {

    temperature = testTemperature;

  } else {

    Wire.beginTransmission(MCP9808_ADDR);
    Wire.write(0x05);
    Wire.endTransmission(false);

    Wire.requestFrom(MCP9808_ADDR, 2, true);

    if (Wire.available() >= 2) {

      byte msb = Wire.read();
      byte lsb = Wire.read();

      int temp = ((msb & 0x1F) << 8) | lsb;

      temperature = temp * 0.0625;
    }
  }


  // ---------------- ACTIVITY ----------------

  String activity;

  if (TEST_MODE == true) {

    activity = TEST_ACTIVITY;

  } else {

    if (movement < 3000) {
      activity = "LOW";
    }
    else if (movement < 12000) {
      activity = "NORMAL";
    }
    else {
      activity = "HIGH";
    }
  }


  // ---------------- STATUS ----------------

  String status;

  if (activity == "LOW" && temperature > 30.0) {
    status = "ATTENTION";
  }
  else {
    status = "NORMAL";
  }


  // ---------------- LED ----------------

  if (status == "ATTENTION") {
    digitalWrite(ALERT_PIN, HIGH);
  }
  else {
    digitalWrite(ALERT_PIN, LOW);
  }


  // ---------------- GPS ----------------

  while (Serial1.available()) {

    char c = Serial1.read();

    Serial.write(c);

    gpsData += c;

    // Keep memory small
    if (gpsData.length() > 200) {
      gpsData = gpsData.substring(gpsData.length() - 200);
    }
  }


  // ---------------- SERIAL OUTPUT ----------------

  Serial.println();
  Serial.print("Temperature: ");
  Serial.print(temperature, 1);
  Serial.print(" C | Activity: ")

More projects by khadtarprerana