#define BLYNK_TEMPLATE_ID "TMPL3ISb7Uuj9"
#define BLYNK_TEMPLATE_NAME "SMART CATTLE MONITORING AND PRECISION LIVESTOCK"
#define BLYNK_AUTH_TOKEN "2zVjOxK917SK5M0qt4lYIRpNWF1WuC0p"
#define BLYNK_PRINT Serial
#include<WiFi.h>
#include<WiFiClient.h>
#include<BlynkSimpleEsp32.h>
char ssid[]="Wokwi-GUEST";
char pass[]="";
#include <Wire.h>
#include <DHT.h>
#include <PubSubClient.h>
#include <Arduino.h>
#include <Adafruit_MPU6050.h>
#include <Adafruit_Sensor.h>
#define DHT_PIN 12
#define PULSE_PIN 35
#define COOLDOW_INTERVAL 1000
unsigned long int lastNotificationTime= 0;
#define MQTT_SERVER "broker.emqx.io"
#define MQTT_PORT 1883
#define MQTT_TOPIC_HR "/heartRate"
#define MQTT_TOPIC_TEMP "/tempValue"
#define MQTT_TOPIC_HUM "/humValue"
#define MQTT_TOPIC_ACCEL "/accelData"
#define MQTT_TOPIC_GYRO "/gyroData"
WiFiClient espClient;
PubSubClient client(espClient);
DHT dht(DHT_PIN, DHT22);
Adafruit_MPU6050 mpu;
int t_p=5;
int e_p=18;
float ss=0.034;
long durn;
float dist_cm;
#define LEDPIN 2
BLYNK_WRITE(1)
{
Serial.println("Blynk Read");
}
BLYNK_CONNECTED()
{
Blynk.syncVirtual(V0);
Blynk.syncVirtual(V1);
Blynk.syncVirtual(V2);
Serial.println("Inside Blynk Connected");
}
void myTimerEvent()
{
// You can send any value at any time.
// Please don't send more that 10 values per second.
Blynk.virtualWrite(V0, millis() / 1000);
Blynk.virtualWrite(V1, millis() / 1000);
Blynk.virtualWrite(V2, millis() / 1000);
}
void setup()
{
Blynk.begin(BLYNK_AUTH_TOKEN,ssid,pass);
Wire.begin(23, 22);
Serial.begin(115200);
//Serial.println("Serial Prints Starts...");
Serial.println("Hello, ESP32!");
connectToWiFi();
client.setServer(MQTT_SERVER,MQTT_PORT);
dht.begin();
if (!mpu.begin())
{
Serial.println("MPU6050 not connected!");
while (1);
}
Serial.println("MPU6050 connected!");
Serial.begin(115200);
pinMode(t_p,OUTPUT);
pinMode(e_p, OUTPUT);
pinMode(LEDPIN, OUTPUT);
}
void loop() {
if (!client.connected())
{
reconnect();
}
float temperature = dht.readTemperature();
float humidity = dht.readHumidity();
int16_t pulseValue = analogRead(PULSE_PIN);
float voltage = pulseValue * (3.3 / 4095.0);
int heartRate = (voltage / 3.3) * 675;
Serial.print("Heart Rate: ");
Serial.print(heartRate);
Serial.print(" Temp: ");
Serial.print(temperature);
Serial.print(" Humidity: ");
Serial.println(humidity);
sensors_event_t accel, gyro, temp;
mpu.getEvent(&accel, &gyro, &temp);
Serial.print("Accel: ");
Serial.print(accel.acceleration.x); Serial.print(", ");
Serial.print(accel.acceleration.y); Serial.print(", ");
Serial.println(accel.acceleration.z);
Serial.print("Gyro: ");
Serial.print(gyro.gyro.x); Serial.print(", ");
Serial.print(gyro.gyro.y); Serial.print(", ");
Serial.println(gyro.gyro.z);
client.publish(MQTT_TOPIC_HR, String(heartRate).c_str());
client.publish(MQTT_TOPIC_TEMP, String(temperature).c_str());
client.publish(MQTT_TOPIC_HUM, String(humidity).c_str());
String accelData = String(accel.acceleration.x) + "," + String(accel.acceleration.y) + "," + String(accel.acceleration.z);
String gyroData = String(gyro.gyro.x) + "," + String(gyro.gyro.y) + "," + String(gyro.gyro.z);
client.publish(MQTT_TOPIC_ACCEL, accelData.c_str());
client.publish(MQTT_TOPIC_GYRO, gyroData.c_str());
delay(1000);
digitalWrite(t_p,LOW);
delayMicroseconds(2);
digitalWrite(t_p, HIGH);
delayMicroseconds(10);
digitalWrite(t_p,LOW);
durn=pulseIn(e_p,HIGH);
dist_cm=durn*ss/2;
Serial.println("distance");
Serial.println(dist_cm);
delay(1000);
digitalWrite(LEDPIN, HIGH);
delay(500);
digitalWrite(LEDPIN, LOW);
delay(100);
if(temperature>=40)
{
if(millis()-lastNotificationTime>COOLDOW_INTERVAL)
{
Serial.println("High Temparature detected");
Blynk.virtualWrite(V0,HIGH);
lastNotificationTime=millis();
}
delay(1000);
}
else
{
Blynk.virtualWrite(V0,LOW);
}
if(heartRate>=85){
if(millis()-lastNotificationTime>COOLDOW_INTERVAL)
{
Serial.println("Heart Rate Obnormal");
Blynk.virtualWrite(V1,1);
lastNotificationTime=millis();
}
delay(1000);
}
else
{
Blynk.virtualWrite(V1,0);
}
if((dist_cm>=250)){
if(millis()-lastNotificationTime>COOLDOW_INTERVAL)
{
Serial.println("Cattle out of coverage area");
Blynk.virtualWrite(V2,dist_cm);
lastNotificationTime=millis();
}
delay(1000);
}
else
{
Blynk.virtualWrite(V2,dist_cm);
}
Blynk.run();
}
void connectToWiFi() {
WiFi.begin(ssid, pass);
while (WiFi.status() != WL_CONNECTED) {
delay(1000);
Serial.println("Connecting to WiFi...");
}
Serial.println("Connected to WiFi");
}
void reconnect() {
while (!client.connected()) {
if (client.connect("esp32_neopixel_controller")) {
Serial.println("Connected to MQTT");
// subscribeToCommands();
} else {
Serial.print("Failed, rc=");
Serial.print(client.state());
Serial.println(" Retrying in 5 seconds...");
delay(5000);
}
}
}