[DIY] Cat-Hunter, l’anti pisse


Quand on aime pas les chats il faut savoir s’en débarrasser ! Depuis mon déménagement (au rez de chaussée) un chat a déjà pissé plusieurs fois sur nos rideaux par la fenêtre !

Les répulsifs sous formes de granules odorantes (gerbantes !) n’ont pas l’air des plus efficaces, après moultes réflexions de plusieurs personnes l’idée d’un « psssshhhttt » automatisé fit son chemin.

Dans l’urgence, j’en ai acheté un sur Amazon, il s’agit basiquement d’une bombe d’air sec avec un déclencheur utilisant un PIR, dans le même temps j’ai commencé à fabriquer mon propre dispositif. L’idée de base est d’utiliser un désodorisant à chiotte automatique.

sense spray naked3

Plusieurs problèmes se posent, dans un premier temps le détecteur est au niveau du bouton (à la perpendiculaire du spray) et lors de déclenchements successifs il y a un temps d’attente de plusieurs minutes….

Commençons la charcuterie… On enlève toute l’électronique embarquée pour la remplacer et on gardera le moteur et la structure en plastique.

IMG_20160708_012235

La carte que j’ai prévu utilise un pic12f675 avec un mosfet 7n7002 et un PIR de Panasonic EKMB.

cat_hunter

IMG_20160712_005022

Le système marche correctement, reste plus qu’a voir son efficacité au prochain passage de cette saleté de chat !

IMG_20160713_004210

J’ai déporté le capteur PIR dans une boite de pellicule (oui oui j’utilise encore de la pellicule !) et je l’ai couvert avec un PAD de BMX qui trainait dans un coin. (il faut que je trouve un moyen de désactiver le système je n’ai pas mit de bouton et ça pu le jasmin Brise(r) chez moi !).

IMG_20160713_201524

#include <pic12f675.h>
#include <xc.h>
#include <stdint.h>

#define _XTAL_FREQ 4000000

#define MOTOR GPIObits.GP5
#define PIR GPIObits.GP2

#pragma config FOSC = INTRCIO
#pragma config WDTE = OFF
#pragma config PWRTE = OFF
#pragma config MCLRE = OFF
#pragma config BOREN = OFF
#pragma config CP = OFF
#pragma config CPD = OFF

uint8_t pir_detected = 0;

void main() {
TRISIObits.TRISIO5 = 0; // GP5 = Output for motor
TRISIObits.TRISIO2 = 1;
ANSEL = 0;
MOTOR = 0;

// Enable interrupt on change
INTCONbits.GIE = 1;
INTCONbits.GPIE = 1;
IOCbits.IOC2 = 1;

while(1) {
SLEEP();
if(pir_detected == 1) {
MOTOR = 1;
__delay_ms(500);
MOTOR = 0;
pir_detected = 0;
__delay_ms(1000);
__delay_ms(1000);
__delay_ms(1000);
}
}
}

void interrupt isr(void) {
uint8_t tmp = 0;
if(INTCONbits.GPIF == 1) {
pir_detected = 1;
tmp = GPIObits.GP2;
INTCONbits.GPIF = 0;
}
}

Laisser un commentaire

Entrez vos coordonnées ci-dessous ou cliquez sur une icône pour vous connecter:

Logo WordPress.com

Vous commentez à l'aide de votre compte WordPress.com. Déconnexion / Changer )

Image Twitter

Vous commentez à l'aide de votre compte Twitter. Déconnexion / Changer )

Photo Facebook

Vous commentez à l'aide de votre compte Facebook. Déconnexion / Changer )

Photo Google+

Vous commentez à l'aide de votre compte Google+. Déconnexion / Changer )

Connexion à %s