Introduction: OpenTrashCan: a Smart Internet Connected Trash Can That Talks
OpenTrashCan connects to your wifi network and sends you an email when its full, talks to you, and can even be controlled from the OpenTrashCan App for Android phones. See it in action here:
Want to buy one? Sign up for the preorder list here: OpenTrashCan
This project started out serious, then I kept thinking of funny things I wanted to make it do. The only way I could think to present it was a corny infomercial style video. Open Trash Can uses the Arduino Leonardo micro-controller. The trash can uses one range sensor in the front that opens the lid when it detects motion. There is a second range sensor in the back that detects the fill level of the trash can. Speech is played using an mp3 shield, through computer speakers. Emails are sent using a wifi shield shied and Temboo.
You need:
A cheap trash can (this one is from Target)
Computer Speakers
An Arduino Leonardo
An Iduino Yun Shield
An Elechouse MP3 Shield
Googly Eyes (don't skimp on these, get the good ones)
A 4GB SD Card
A Micro Servo Motor
2 HC-Sr04 Range Sensors
Some Jumper Wires
A Hot Glue Gun
A drill
Some wire cutters or heavy duty scissors
A Mini Breadboard
An HC-06 Bluetooth Module
A 9V battery or Wall Adapter (to power the Arduino board)
Step 1: Setup the Servo Motor
The lid moves up and down with a micro servo motor. The first step is to set the servo motor into the correct position before it is attached to the trash can. In this case we want to set it to 180 degrees.
Follow the connections in the first picture. Using male to male jumper wires connect the servo ground (black or purple) to the ground on the Arduino board, the power wire (red) to the 5v pin, and the control wire (yellow or orange) to pin 9 on the board.
Open up the Arduino IDE and upload this code to your Arduino board:
#include <Servo.h> Servo myservo; // create servo object to control a servo void setup() { myservo.attach(9); // attaches the servo on pin 9 to the servo object } void loop() { myservo.write(180); // sets servo to 180 degree position }
Step 2: Prepare the Lid
Now that your servo is set to 180 degrees you can unplug everything and we are going to attach it to the trash can lid.
We are aiming for the setup in the first picture.
In the second picture you can see a small nub/axle thing on the left side. You need to remove that small axle on the RIGHT side with either scissors or wire cutters.
Cut a small square in the area where the servo sits in the second and third picture, so that it can sit flat.
Make sure the orientation is the same as the pictures, and hot glue the servo into place.
Feed the servo horn through the hole in the lid and attach it to the servo as shown in the pictures.
Carefully attach the googly eyes EXACTLY as shown.
Step 3: Prepare the Body of the Trash Can
Using a hot glue gun, glue the computer speakers to the side of the can.
Trace the ultrasonic range sensor with a pen on the trash can, and drill out the two holes to fit the sensor.
Do the same on the backside to add the second range sensor (this one is for detecting the fill level).
Use the double sided tape on your mini breadboard to stick to the can.
Use two screws to attach the Arduino Leonardo.
**Ignore the two holes I put in the back side, originally I wanted to put the rear fill sensor there but did not anticipate the lid swinging in front of it. **
Step 4: Connect Your Can to Your Wifi Network.
Connect all 3 of your shields, and lets connect them to your wifi network.
If you are using a Yun board follow this link to get connected to your network:
For the Leonardo and Iduino shield follow these instructions:
Step 5: Make the Connections.
Use the diagram above to make all the connections. You will need male to male and male to female wires to make long enough connections from the sensors to the board.
Tape the wires coming from the front sensor to the inside of the trash can to keep them out of the way (shown in the last picture).
Step 6: Load the SD Card.
To make this trash can talk we are using a method called speech store and forward. Simply put, speech snippets are store on an SD card in .mp3 format which are then played through the computer speakers.
Here I have attached the 3 speech snippets I used in the demo video. Load these onto your SD card and plug the SD card into the mp3 shield.
Step 7: Upload This Code to Your Boards
Now before we upload the Arduino sketch you need to sign up for a Temboo Account and get your credentials. Temboo is a service that makes using API's extremely quick and easy. This script makes calls to Temboo in order to send the email when the trash can is full.
Sign up for a Temboo Account and navigate to the "APPLICATIONS" section to get your
- Temboo account name
- App key name
- App key
Upload this code to your Arduino board:
//Trash Can #include #include #include "TembooAccount.h" #include #include // software serial #1: TX = digital pin 10, RX = digital pin 11 SoftwareSerial portOne(10, 11); SoftwareSerial Geno(7,8); // Rx , Tx Servo trashServo; int trigPin = 2; int echoPin = 4; long duration, cm, inches; unsigned char Data[10]; unsigned char i; int counter = 0; int trigPin1 = 5; int echoPin1 = 6; long duration1, cm1, inches1; void setup() { portOne.begin(9600); Serial.begin (9600); Serial.println("bridge opening..."); Bridge.begin(); Serial.println("bridge OPEN!!"); Geno.begin(9600); SetVolume(25); trashServo.attach(9); pinMode(trigPin, OUTPUT); pinMode(echoPin, INPUT); pinMode(trigPin1, OUTPUT); pinMode(echoPin1, INPUT); delay(5000); Serial.println("Initiate Smart Trash Can..."); } void playTrack(int track){ delay(1000); Data[0] = 0x7E; Data[1] = 0x04; Data[2] = 0xA0; Data[3] = 0x00; Data[4] = 0x00 + track; Data[5] = 0x7E; Command(Data,5); play_pause(); delay(3000); } void playTrackFULL(int track){ delay(1000); Data[0] = 0x7E; Data[1] = 0x04; Data[2] = 0xA0; Data[3] = 0x00; Data[4] = 0x00 + track; Data[5] = 0x7E; Command(Data,5); trashServo.write(160); play_pause(); delay(300); trashServo.write(180); delay(200); trashServo.write(160); delay(100); trashServo.write(180); delay(100); trashServo.write(160); delay(200); trashServo.write(180); delay(100); trashServo.write(160); delay(100); trashServo.write(180); delay(600); trashServo.write(160); delay(200); trashServo.write(180); delay(100); trashServo.write(160); delay(100); trashServo.write(180); delay(100); trashServo.write(160); delay(200); trashServo.write(180); delay(200); trashServo.write(160); delay(100); trashServo.write(180); delay(200); trashServo.write(160); delay(300); trashServo.write(180); delay(200); trashServo.write(160); delay(100); trashServo.write(180); delay(200); trashServo.write(160); delay(300); trashServo.write(180); delay(200); } void playTrackHEY(int track){ delay(1000); Data[0] = 0x7E; Data[1] = 0x04; Data[2] = 0xA0; Data[3] = 0x00; Data[4] = 0x00 + track; Data[5] = 0x7E; Command(Data,5); trashServo.write(150); play_pause(); delay(400); trashServo.write(180); delay(300); trashServo.write(160); delay(100); trashServo.write(180); delay(100); trashServo.write(160); delay(200); trashServo.write(180); delay(200); trashServo.write(160); delay(400); trashServo.write(180); delay(400); } void playTrackHI(int track){ delay(1000); Data[0] = 0x7E; Data[1] = 0x04; Data[2] = 0xA0; Data[3] = 0x00; Data[4] = 0x00 + track; Data[5] = 0x7E; Command(Data,5); trashServo.write(150); play_pause(); delay(400); trashServo.write(180); delay(300); trashServo.write(160); delay(100); trashServo.write(180); delay(100); trashServo.write(160); delay(200); trashServo.write(180); delay(200); trashServo.write(160); delay(100); trashServo.write(180); delay(300); trashServo.write(160); delay(400); trashServo.write(180); } void SetVolume( int vol){ Data[0] = 0x7E; // START Data[1] = 0x03; // Length Not 0x02 Data[2] = 0xA7; // Command Data[3] = vol; // new volume Data[4] = 0x7E; // END Command(Data,5); } void Command(unsigned char *Data, int length){ for(int i=0; i 1000) { trashServo.write(80); //Lid open delay(5000); } digitalWrite(trigPin1, LOW); //Inside Sensor delayMicroseconds(1); digitalWrite(trigPin1, HIGH); delayMicroseconds(2); digitalWrite(trigPin1, LOW); pinMode(echoPin1, INPUT); duration1 = pulseIn(echoPin1, HIGH); inches1 = (duration1 / 2) / 74; Serial.println(inches1); if (inches1 < 3 && counter == 0) { counter ++; playTrackFULL(2); Serial.println("Sending Email..."); TembooChoreo SendEmailChoreo; // Invoke the Temboo client SendEmailChoreo.begin(); // Set Temboo account credentials SendEmailChoreo.setAccountName(TEMBOO_ACCOUNT); SendEmailChoreo.setAppKeyName(TEMBOO_APP_KEY_NAME); SendEmailChoreo.setAppKey(TEMBOO_APP_KEY); // Set profile to use for execution SendEmailChoreo.setProfile("EmailTest"); // Identify the Choreo to run SendEmailChoreo.setChoreo("/Library/Google/Gmail/SendEmail"); // Run the Choreo; when results are available, print them to serial SendEmailChoreo.run(); while(SendEmailChoreo.available()) { char c = SendEmailChoreo.read(); Serial.print(c); } SendEmailChoreo.close(); Serial.println("Email Sent..."); } //Serial.println(incoming); if (incoming == 111){ //Open Lid from App trashServo.write(80); delay(2000); } //Serial.println(incoming); if (incoming == 49){ playTrackFULL(2); //I have reached capacity } //Serial.println(incoming); if (incoming == 50){ playTrackHEY(1); //hey get out of there } //Serial.println(incoming); if (incoming == 51){ playTrackHI(3); //Hi, I am open Trash Can } }//ends loop
In the Arduino IDE click to add a new tab and create a header file called: TembooAccount.h Add this code to your header file and fill it in with your Temboo credentials.
//header file /* IMPORTANT NOTE about TembooAccount.h TembooAccount.h contains your Temboo account information and must be included alongside your sketch. To do so, make a new tab in Arduino, call it TembooAccount.h, and copy this content into it. */ #define TEMBOO_ACCOUNT "********" // Your Temboo account name #define TEMBOO_APP_KEY_NAME "*******" // Your Temboo app key name #define TEMBOO_APP_KEY "******************************" // Your Temboo app key /* The same TembooAccount.h file settings can be used for all Temboo SDK sketches. Keeping your account information in a separate file means you can share the main .ino file without worrying that you forgot to delete your credentials. */
Step 8: FINALLY!
Plug your computer speakers into the mp3 shield, power the Arduino board, and the speakers and you should be good to go.
The OpenTrashCan App for Android phones can be downloaded here:
http://wirebeings.com/open-trash-can.html
You may need to enable installation of apps from unknown developers in the settings of your Android phone in order for it to install.