BarkBox! Simple Noise & Intrusion Detection Device


#1

About This Project

BarkBox!
This is a device that simply listens for loud sounds, like barking, and looks for motion present and records the events. I created this project because one day I came home to my dog barking and thought how long had he been barking. I could hear him down the hall when I walked into the building. I live in condos btw so I don’t need him barking all day long and making my neighbors upset. Or more to the point why is he barking??? So I thought, “Hey, I got these mic boards laying around from a sensor kit; lets see if I can catch if he is doing it a lot! Oh and I got this PIR motion detector, lets slap that on also!”

When i created the first iteration it only had one mic board for sound detection but I was having problems with it either being way too sensitive or not sensitive enough. I couldn’t find the ‘sweet spot’. So my solution was to not only add another mic, but to add adjustable thresholds for when they consider the reading to in fact be barking. I have one mic board turn pretty sensitive but with a higher threshold and the other with low gain and a lower threshold. It works pretty good together. Also on the first iteration I had a lot of problems with the mics picking up the radio rx/tx because it was so close to the esp8266 module. It also created voltage fluctuations slightly which wasn’t helping. I added 2 capacitors & lowered the esp8266 tx power and it almost got rid of it all. Just recently when I was testing a couple new ESP8266-01S chips, i noticed that the “S” chips completely eliminated the noise from the tx signal & voltage fluctuations. Yay

The settings/how to run it are as follows:

Buttons

  • Arm - resets all counts & starts recording event counts for motion & sound. Both mics must detect the sound at once for it to register as a bark.
  • Notify - turns on text messaging & will send a text when motion is detected.
  • Raw Values? - This live updates the raw values to the dashboard - This WILL slow down polling interval of the mics/motion substantially possibly missing barks or motion events. Just to test & see your average levels

After some playing around with the threshold settings I got it pretty tuned in to identifying when he is barking or not. Turns out overall he is a good dog. :slight_smile:

What’s Connected

This project currently used:
Arduino Uno R3
ESP8266-01S
2x Analog sound microphones
Motion Detector HC-SR501
plus some small parts- AMS1117, capacitors, etc…

Triggers & Alerts

I didn’t use too much for alerts or triggers with this project. Just one trigger that is used for notifying me, if intrusion/motion is detected & I have the “notify me” button enabled. I may add a LED on the board to indicate when motion is detected or bark detected. Maybe a Neopixel strip that also counts the events?

Scheduling

I have the device arm itself everyday at 9am and disarm at 4pm otherwise I always forget to turn it on and then it won’t keep count.

Dashboard Screenshots

Photos of the Project

Video

no video yet…


The Judges Have Spoken! ~CONTEST RESULTS~
#2

Thanks for posting such a good project overview! I really like this project. Do you think you can also post your code? I know it will be helpful for other user who want to replicate something similar that you have done… like me :wink:

Also posting some video would be pretty cool too if you are able to.

I see you are located in North America which qualifies you for the grand prize :slight_smile:
-Benny


#3

Sure, I love sharing. I have a couple more projects too that I will be posting in the next couple days. In the main loop function, the analogread’s for the mics need to be set to ones own mic levels. Otherwise everything else should be plug & play.

#include <CayenneESP8266Shield.h>

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

#define EspSerial Serial
#define ESP8266_BAUD 115200
ESP8266 wifi(EspSerial);


const int barkPin1 = A1;
const int barkPin2 = A0;
const int motionPin = 3;

int barkLevel1;
int barkLevel2;
int threshold1;
int threshold2;
int armed;
int barking1 = 0;
int barking2 = 0;
int trueBark = 0;
int showRaw;
int motion = 0;
int notify;
int prevMotion = 0;
int motionDetects = 0;


void setup()
{
	EspSerial.begin(ESP8266_BAUD);
	delay(10);

//	Serial1.begin(9600);

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

	Cayenne.virtualWrite(V13, 0);
	Cayenne.virtualWrite(V11, 0);

	pinMode(barkPin1, INPUT);
	pinMode(barkPin2, INPUT);
	pinMode(motionPin, INPUT);
}


void loop()
{
	Cayenne.run();

	prevMotion = motion;
	barkLevel1 = 530 - analogRead(barkPin1); //set your mics values here
	barkLevel2 = 1023 - analogRead(barkPin2); //set your mics values here
	motion = digitalRead(motionPin);

	if (motion != prevMotion)
		{
			Cayenne.virtualWrite(V10, motion);

			if (armed == 1)
				{
					if (prevMotion == 0)
						{
							motionDetects++;
							Cayenne.virtualWrite(V11, motionDetects);
						}
					if (notify == 1)
						{
							Cayenne.virtualWrite(V13, 1);
						}
					else
						{
							Cayenne.virtualWrite(V13, 0);
						}
				}
		}


	if (showRaw == 1)
		{
			Cayenne.virtualWrite(V8, barkLevel1);
			Cayenne.virtualWrite(V9, barkLevel2);
		}

	if (armed == 1)
		{
			if (barkLevel1 > threshold1)
				{
					barking1++;
					Cayenne.virtualWrite(V2, barking1);
				}

			if (barkLevel2 > threshold2)
				{
					barking2++;
					Cayenne.virtualWrite(V5, barking2);
				}

			if (barkLevel1 > threshold1 && barkLevel2 > threshold2)
				{
					trueBark++;
					Cayenne.virtualWrite(V6, trueBark);
				}

			//		Serial1.print(barkLevel1);
			//		Serial1.print("  ");
			//    Serial1.println(threshold2);
		}
}




CAYENNE_IN(V1)
{
	armed = getValue.asInt();
	if (armed == 1)
		{
			barking1 = 0;
			barking2 = 0;
			trueBark = 0;
			motionDetects = 0;
			Cayenne.virtualWrite(V2, 0);
			Cayenne.virtualWrite(V5, 0);
			Cayenne.virtualWrite(V6, 0);
			Cayenne.virtualWrite(V11, 0);
		}
}

CAYENNE_IN(V3)
{
	threshold1 = (getValue.asLong() / 1023);
}

CAYENNE_IN(V4)
{
	threshold2 = (getValue.asLong() / 1023);
}

CAYENNE_IN(V7)
{
	showRaw = getValue.asInt();
}
CAYENNE_IN(V12)
{
	notify = getValue.asInt();
}