Make your pet dishes tweet!

details

You give your pets everything: Food, water, a home, toys, and love. Why not give them a twitter account?

This project allows you to monitor your pets’ eating habits and receive alerts when their supplies are low. It’s also a cute, fun way to learn how to interact with the Arduino, Twitter, sensors, and Ethernet.


Here is the part list. Depending on your individual needs, you may substitute the scale, amplifier, or water sensor.

  • An Arduino Uno
  • An Arduino Ethernet Shield (W5100 )
  • A cheap digital kitchen or postal scale ($20 at Bed Bath and Beyond) for the strain gauge.
  • An instrumentation amplifier to boost the strain gauge output.
  • A water level sensor. For ease of use, I chose the this one from Jameco.
  • A prototyping board, prototyping shield, or ability to create circuit boards.
  • A 5V USB power supply and USB A-B cable.
  • Something to protect your kit from the pets. I used a cheap plastic storage bin.
  • A couple resistors, some spare parts from around the house, and some creativity.

 

Code

/* Tweeting pet dishes
 ver 0.5b
 June 25, 2011
 
 This code uses NeoCat's Twitter library and
 the Ethernet Shield. See the Instructable for more information
 
 by Daniel Gentleman for
 the Adafruit/Instructables Make It Tweet Challenge.
 */


#if defined(ARDUINO) && ARDUINO > 18   // Arduino 0019 or later
#include 
#endif
#include 
#include 
#include 

// The MAC address is on a sticker on the Ethernet shield.
byte mac[] = { 
  0x90, 0xA2, 0xDA, 0x00, 0x3E, 0x28 };
byte ip[] = { 
  192,168,1, 222 };

// Your Token to Tweet (get it from http://arduino-tweet.appspot.com/)
Twitter twitter("YOUR TOKEN HERE");

// Variables variables variables
const int foodPin = A2; // Analog 0 for measuring the food weight
const int ledPin = 3; // LED
const int waterPin = 2; // digital 9 for water sensor
int foodWeight; // Variable for storing food weight
//const int ledPin = 13; // LED pin for water level
int waterState = 0; // Variable for setting water state
int lastWaterState = 0; // Variable for last water state
const int lowFood = 25; // if the food level is below this, it will tweet
int lastFoodWeight; // Last Food State placeholder
int foodTweet = 0; // 
int foodValue = 0; // 
char msg[125]; // make a nice fat buffer (125 characters) for tweets
int waterAlarmState = 0; // Have we reported water yet?
int foodAlarmState = 0; // Have we reported an empty bowl?
String tweet = "Starting Up" ; 

void setup()
{
  delay(1000);
  Ethernet.begin(mac, ip);
  Serial.begin(9600);
  pinMode(waterPin, INPUT);
  pinMode(foodPin, INPUT);
  pinMode(ledPin, OUTPUT);
  delay(1000);
  foodWeight = getFood();
  waterState = getWater();
}
const int analogInPin = A2;  // Analog input pin that the potentiometer is attached to
const int analogOutPin = 13; // Analog output pin that the LED is attached to

int sensorValue = 0;        // value read from the pot
int outputValue = 0;        // value output to the PWM (analog out)



void loop(){
  lastFoodWeight = foodWeight;
  foodWeight = getFood();
  if (foodWeight > (lastFoodWeight + 20)){ //If we fed the pets at least 20
    String gotfed = "Thanks for feeding me! My bowl is now ";
    String tweet = gotfed + foodWeight + "% full!";
    Serial.println(tweet);
    postTweet(tweet);
    foodAlarmState = 0; // Clears food alarm if it was below critical
  }
  if (foodWeight < (lastFoodWeight - 10)){ // If the pets ate at least 10
    int ateweight = lastFoodWeight - foodWeight; 
    if (ateweight > 100){
      ateweight = 0;
    }
    String atefood = "I just ate ";
    String tweet = atefood + ateweight +"% of my food!";
    Serial.println(tweet);
    postTweet(tweet);
  }
  if (foodWeight < lowFood){ // If the food is beneath the low threshold
    if (foodAlarmState != 1){
      String foodwarning = "I am almost out of food! I have only ";
      String tweet = foodwarning + foodWeight + " percent left!";
      Serial.println(tweet);
      postTweet(tweet);
      foodAlarmState = 1;
    }
  }
  if (getWater() == 0){
    if (waterAlarmState != 1){
      String waterPre = "My food is at ";
      String tweet = waterPre + foodWeight + "% but my water is low!";
      Serial.println(tweet);
      postTweet(tweet);
      waterAlarmState = 1; // Sets water alarm state (so it won't tweet forever)
    }
  }
  if (waterState > lastWaterState){
    String tweet = "Thanks for the water!";
    Serial.println(tweet);
    postTweet(tweet);
    waterAlarmState = 0; // Clears water alarm state
  }

  delay(2000); // Regular loop delay
}

int getFood()
{
  // read the analog in value:
  int foodValue = analogRead(foodPin); // first sample
  Serial.print(foodValue);
  if (foodValue >= 600) {
    foodValue = 599;
  }
  if (foodValue <= 582) {
    foodValue = 583;
  }
  int bowlPercent = map(foodValue, 583, 599, 1, 100);
  Serial.print("food level = " );                       
  Serial.println(bowlPercent);
  return bowlPercent;
}


int getWater(){
  lastWaterState = waterState;
  waterState = digitalRead(waterPin);
  if (waterState == HIGH) {
    Serial.println("Water is LOW");
    waterState = 0;
    digitalWrite(ledPin, HIGH);
    return 0;    
  }
  else{
    Serial.println("Water is good");
    waterState = 1;
    digitalWrite(ledPin, LOW);
    return 1;
  }
}

void postTweet(String tweet){
  String termTweet = tweet + "\0" ;// Terminate the tweet with a null
  Serial.print(termTweet);
  Serial.println(" - Terminated tweet");
  int twtlen = (termTweet.length()+3); // count the characters, add 3 just in case
  Serial.print(twtlen);
  Serial.println(" - Tweet length");
  termTweet.toCharArray(msg,twtlen); // Convert it to an array called msg
  Serial.print("Attempted tweet ");
  Serial.println(msg);
  //  tweet.toCharArray(msg,twtlen);
  Serial.println("connecting ...");
  if (twitter.post(msg)) {
    // Specify &Serial to output received response to Serial.
    // If no output is required, you can just omit the argument, e.g.
    // int status = twitter.wait();
    int status = twitter.wait(&Serial);
    if (status == 200) {
      Serial.println("OK.");
      delay (120000); // Wait two minutes before doing anything after a tweet (don't spam!) 
    } 
    else {
      Serial.print("failed : code ");
      Serial.println(status);
    }
  } 
  else {
    Serial.println("connection failed.");
  }
}


 

You can see more detail about the project and get the source code from Instrcutables.

 

 

You give your pets everything: Food, water, a home, toys, and love. Why not give them a twitter account?

This project allows you to monitor your pets’ eating habits and receive alerts when their supplies are low. It’s also a cute, fun way to learn how to interact with the Arduino, Twitter, sensors, and Ethernet.


Here is the part list. Depending on your individual needs, you may substitute the scale, amplifier, or water sensor.

  • An Arduino Uno
  • An Arduino Ethernet Shield (W5100 )
  • A cheap digital kitchen or postal scale ($20 at Bed Bath and Beyond) for the strain gauge.
  • An instrumentation amplifier to boost the strain gauge output.
  • A water level sensor. For ease of use, I chose the this one from Jameco.
  • A prototyping board, prototyping shield, or ability to create circuit boards.
  • A 5V USB power supply and USB A-B cable.
  • Something to protect your kit from the pets. I used a cheap plastic storage bin.
  • A couple resistors, some spare parts from around the house, and some creativity.

 

Code

/* Tweeting pet dishes
 ver 0.5b
 June 25, 2011
 
 This code uses NeoCat's Twitter library and
 the Ethernet Shield. See the Instructable for more information
 
 by Daniel Gentleman for
 the Adafruit/Instructables Make It Tweet Challenge.
 */


#if defined(ARDUINO) && ARDUINO > 18   // Arduino 0019 or later
#include 
#endif
#include 
#include 
#include 

// The MAC address is on a sticker on the Ethernet shield.
byte mac[] = { 
  0x90, 0xA2, 0xDA, 0x00, 0x3E, 0x28 };
byte ip[] = { 
  192,168,1, 222 };

// Your Token to Tweet (get it from http://arduino-tweet.appspot.com/)
Twitter twitter("YOUR TOKEN HERE");

// Variables variables variables
const int foodPin = A2; // Analog 0 for measuring the food weight
const int ledPin = 3; // LED
const int waterPin = 2; // digital 9 for water sensor
int foodWeight; // Variable for storing food weight
//const int ledPin = 13; // LED pin for water level
int waterState = 0; // Variable for setting water state
int lastWaterState = 0; // Variable for last water state
const int lowFood = 25; // if the food level is below this, it will tweet
int lastFoodWeight; // Last Food State placeholder
int foodTweet = 0; // 
int foodValue = 0; // 
char msg[125]; // make a nice fat buffer (125 characters) for tweets
int waterAlarmState = 0; // Have we reported water yet?
int foodAlarmState = 0; // Have we reported an empty bowl?
String tweet = "Starting Up" ; 

void setup()
{
  delay(1000);
  Ethernet.begin(mac, ip);
  Serial.begin(9600);
  pinMode(waterPin, INPUT);
  pinMode(foodPin, INPUT);
  pinMode(ledPin, OUTPUT);
  delay(1000);
  foodWeight = getFood();
  waterState = getWater();
}
const int analogInPin = A2;  // Analog input pin that the potentiometer is attached to
const int analogOutPin = 13; // Analog output pin that the LED is attached to

int sensorValue = 0;        // value read from the pot
int outputValue = 0;        // value output to the PWM (analog out)



void loop(){
  lastFoodWeight = foodWeight;
  foodWeight = getFood();
  if (foodWeight > (lastFoodWeight + 20)){ //If we fed the pets at least 20
    String gotfed = "Thanks for feeding me! My bowl is now ";
    String tweet = gotfed + foodWeight + "% full!";
    Serial.println(tweet);
    postTweet(tweet);
    foodAlarmState = 0; // Clears food alarm if it was below critical
  }
  if (foodWeight < (lastFoodWeight - 10)){ // If the pets ate at least 10
    int ateweight = lastFoodWeight - foodWeight; 
    if (ateweight > 100){
      ateweight = 0;
    }
    String atefood = "I just ate ";
    String tweet = atefood + ateweight +"% of my food!";
    Serial.println(tweet);
    postTweet(tweet);
  }
  if (foodWeight < lowFood){ // If the food is beneath the low threshold
    if (foodAlarmState != 1){
      String foodwarning = "I am almost out of food! I have only ";
      String tweet = foodwarning + foodWeight + " percent left!";
      Serial.println(tweet);
      postTweet(tweet);
      foodAlarmState = 1;
    }
  }
  if (getWater() == 0){
    if (waterAlarmState != 1){
      String waterPre = "My food is at ";
      String tweet = waterPre + foodWeight + "% but my water is low!";
      Serial.println(tweet);
      postTweet(tweet);
      waterAlarmState = 1; // Sets water alarm state (so it won't tweet forever)
    }
  }
  if (waterState > lastWaterState){
    String tweet = "Thanks for the water!";
    Serial.println(tweet);
    postTweet(tweet);
    waterAlarmState = 0; // Clears water alarm state
  }

  delay(2000); // Regular loop delay
}

int getFood()
{
  // read the analog in value:
  int foodValue = analogRead(foodPin); // first sample
  Serial.print(foodValue);
  if (foodValue >= 600) {
    foodValue = 599;
  }
  if (foodValue <= 582) {
    foodValue = 583;
  }
  int bowlPercent = map(foodValue, 583, 599, 1, 100);
  Serial.print("food level = " );                       
  Serial.println(bowlPercent);
  return bowlPercent;
}


int getWater(){
  lastWaterState = waterState;
  waterState = digitalRead(waterPin);
  if (waterState == HIGH) {
    Serial.println("Water is LOW");
    waterState = 0;
    digitalWrite(ledPin, HIGH);
    return 0;    
  }
  else{
    Serial.println("Water is good");
    waterState = 1;
    digitalWrite(ledPin, LOW);
    return 1;
  }
}

void postTweet(String tweet){
  String termTweet = tweet + "\0" ;// Terminate the tweet with a null
  Serial.print(termTweet);
  Serial.println(" - Terminated tweet");
  int twtlen = (termTweet.length()+3); // count the characters, add 3 just in case
  Serial.print(twtlen);
  Serial.println(" - Tweet length");
  termTweet.toCharArray(msg,twtlen); // Convert it to an array called msg
  Serial.print("Attempted tweet ");
  Serial.println(msg);
  //  tweet.toCharArray(msg,twtlen);
  Serial.println("connecting ...");
  if (twitter.post(msg)) {
    // Specify &Serial to output received response to Serial.
    // If no output is required, you can just omit the argument, e.g.
    // int status = twitter.wait();
    int status = twitter.wait(&Serial);
    if (status == 200) {
      Serial.println("OK.");
      delay (120000); // Wait two minutes before doing anything after a tweet (don't spam!) 
    } 
    else {
      Serial.print("failed : code ");
      Serial.println(status);
    }
  } 
  else {
    Serial.println("connection failed.");
  }
}


 

You can see more detail about the project and get the source code from Instrcutables.

 

 

1
COMMENTS

Please Login to comment
1 Comment authors
Mira Recent comment authors
  Subscribe  
newest oldest most voted
Notify of
Mira
Guest

For most up-to-date information you have to go to see the
web and on internet I found this website as a finest web site
for most up-to-date updates.