Je ne vous présente plus le service PushingBox permettant de simplifier les notifications.
Vous avez sans doute vu la vidéo de Pépito, mon chat (@PepitoTheCat)

Dans cet article je vous propose de partager les informations qui vous permettront de faire tweeter votre chat, de manière simple et à très bas cout.

Ce qu’il vous faut

  • Une chatière. La mienne a un système de verrouillage manuel qui permet de bloquer la trappe d’un côté ou des deux. Je vous conseille une identique, les capteurs d’ouverture seront plus simples à placer et vous pourrez déterminer si le chat entre ou sort.
  • Un Arduino avec Shield Ethernet. Pour l’exemple j’utilise un Shield officiel (Wiznet) mais vous pouvez facilement adapter le principe à un Shield non officiel (ENC28J60) moins cher.
  • Deux capteurs d’ouverture magnétique.

Le montage

Connexion de l’Arduino

Pour les branchements, les capteurs d’ouvertures se comportent comme un simple interrupteur.
Je les ai branchés sur les entrées 2 et 3, mais vous pouvez modifier cela facilement.

Création d’un scénario sur PushingBox

Avant de pouvoir programmer l’Arduino, il faut vous inscrire sur www.pushingbox.com et créer un scénario pour récupérer un DeviceID. C’est l’identifiant unique qui permet d’appeler un scénario de notification via un simple GET ou POST.
Pour plus de détail, vous pouvez consulter cet article : PushingBox – notifiez n’importe quoi vers n’importe où

Programmation de l’Arduino

////
//
// General code from http://www.pushingbox.com for Arduino + Ethernet Shield (official)
//
////
 
#include <SPI.h>
#include <Ethernet.h>
 
  /////////////////
 // MODIFY HERE //
/////////////////
byte mac[] = { 0x00, 0xAA, 0xBB, 0xCC, 0xDE, 0x39 };   // Be sure this address is unique in your network
 
//Your secret DevID from PushingBox.com. You can use multiple DevID  on multiple Pin if you want
#define DEVID1 "YOUR_DEVID1"        //Scenario : "Pépito rentre"
#define DEVID2 "YOUR_DEVID2"        //Scenario : "Pépito sort"
 
//Numeric Pin where you connect your switch
int capteurInterieurPin = 2;   //Capteur interieur
int capteurExterieurPin = 3;   //Capteur exterieur
 
// Debug mode
#define DEBUG true
  ///////
 //End//
///////
 
char serverName[] = "api.pushingbox.com";
boolean trappeOuverteInterieur = false;
boolean trappeOuverteExterieur = false;
long lastReadingTime = 0;
 
// Initialize the Ethernet client library
// with the IP address and port of the server 
// that you want to connect to (port 80 is default for HTTP):
EthernetClient client;
 
void setup() {
  Serial.begin(9600);
 
  pinMode(capteurInterieurPin, INPUT);  
  pinMode(capteurExterieurPin, INPUT); 
 
  // start the Ethernet connection:
  if (Ethernet.begin(mac) == 0) {
    Serial.println("Failed to configure Ethernet using DHCP");
    // no point in carrying on, so do nothing forevermore:
    for(;;)
      ;
  }
  // print your local IP address:
  Serial.print("My IP address: ");
  for (byte thisByte = 0; thisByte < 4; thisByte++) {
    // print the value of each byte of the IP address:
    Serial.print(Ethernet.localIP()[thisByte], DEC);
  }
  Serial.println();
}
 
 
void loop()
{
  // check for a reading no more than once a second.
  if (millis() - lastReadingTime > 2500){
 
    //
    // Le chat rentre
    //
    if(digitalRead(capteurInterieurPin) == 0 && digitalRead(capteurExterieurPin) == 1 && trappeOuverteInterieur == false){
       trappeOuverteInterieur = true;
       Serial.println("Le chat est rentre"); 
       sendToPushingBox(DEVID1);
    }
    //La trappe se referme derrière le chat (annule les effets de rebond)
    if(digitalRead(capteurInterieurPin) == 1 && trappeOuverteInterieur == true){
       Serial.println("La trappe est refermee");
       delay(3000);  //Attente en cas de bascule de la trappe
       trappeOuverteInterieur = false;
    }
 
    //
    // Le chat sort
    //
    if(digitalRead(capteurExterieurPin) == 0 && digitalRead(capteurInterieurPin) == 1 && trappeOuverteExterieur == false && trappeOuverteInterieur == false){
       trappeOuverteExterieur = true;
       Serial.println("Le chat est sorti"); 
       sendToPushingBox(DEVID2);
    }
    //La trappe se referme derrière le chat (annule les effets de rebond)
     if(digitalRead(capteurExterieurPin) == 1 && trappeOuverteExterieur == true){
       Serial.println("La trappe est refermee");
       delay(3000);   //Attente en cas de bascule de la trappe
       trappeOuverteExterieur = false;
    }  
    lastReadingTime = millis();
  }   
}
 
 
//Function for sending the request to PushingBox
void sendToPushingBox(String devid){
    if(DEBUG){Serial.println("connecting...");}
 
  if (client.connect(serverName, 80)) {
    if(DEBUG){Serial.println("connected");}
 
    if(DEBUG){Serial.println("sendind request");}
    client.print("GET /pushingbox?devid=");
    client.print(devid);
    client.println(" HTTP/1.1");
    client.print("Host: ");
    client.println(serverName);
    client.println("User-Agent: Arduino");
    client.println();
  } 
  else {
    if(DEBUG){Serial.println("connection failed");}
  }
 
  // if there are incoming bytes available 
  // from the server, read them and print them:
  if(DEBUG){
    if (client.available()) {
    char c = client.read();
    Serial.print(c);
    }
  }
 
    if(DEBUG){Serial.println();}
    if(DEBUG){Serial.println("disconnecting.");}
    client.stop();
}

Pépito pris en flagrant délit :D