Cela faisait un petit moment que je n’avais pas bidouillé quelque chose à base d’Arduino…
Mais des bruits suspects en provenance du grenier m’ont donné l’occasion de ressortir mes cartes électroniques.
En effet, suspectant la présence de rongeurs, ne voulant pas utiliser de méthodes létales et ayant échoué avec les pièges de type « cage », j’ai entendu parlé de répulsifs à base d’ultrasons.
Mais voulant pas dépenser de l’argent dans un système dont j’ignore l’efficacité, j’ai pensé faire un prototype à base d’Arduino et de modules ultrasons hc-sr2.
Voici l’idée :
Et voici le code :
———————————- Code ———————————
#include « Ultrasonic.h »
//Optimisation de la consommation
#include <avr/power.h>
#include <avr/sleep.h>
#include <avr/power.h>
#include <avr/wdt.h>
volatile int f_wdt=1;
// variables du projet
Ultrasonic ultrasonic1(2);
Ultrasonic ultrasonic2(4);
long distanceMesuree;
double tempsMax = 180.00; //temps en secondes
double tempsMin = 60.00; // temps en secondes
double tempsDesire, tempsIntervalUltrasonic;
double tempsIntervalUltrasonicMax = 30; //temps en seconde
// Watchdog Interrupt Service est exécité lors d’un timeout du WDT
ISR(WDT_vect) {
if(f_wdt == 0) {
f_wdt = 1; // flag global
}
}
// paramètre : 0=16ms, 1=32ms, 2=64ms, 3=128ms, 4=250ms, 5=500ms, 6=1 sec,7=2 sec, 8=4 sec, 9=8 sec
void setup_watchdog(int ii) {
byte bb;
int ww;
if (ii > 9 ) ii=9;
bb=ii & 7;
if (ii > 7) bb|= (1<<5);
bb|= (1<<WDCE);
ww=bb;
// Clear the reset flag
MCUSR &= ~(1<<WDRF);
// start timed sequence
WDTCSR |= (1<<WDCE) | (1<<WDE);
// set new watchdog timeout value
WDTCSR = bb;
WDTCSR |= _BV(WDIE);
}
void enterSleep(void) {
set_sleep_mode(SLEEP_MODE_PWR_DOWN);
sleep_enable();
sleep_mode(); //Entre dans le mode veille choisi
// Le programme va reprendre ici après le timeout du WDT
sleep_disable(); // La 1ère chose à faire est de désactiver le mode veille
}
void setup() {
// put your setup code here, to run once:
Serial.begin(9600);
tempsMax = convertiSecondeToMilli(tempsMax);
tempsMin = convertiSecondeToMilli(tempsMin);
tempsIntervalUltrasonicMax = convertiSecondeToMilli(tempsIntervalUltrasonicMax);
//Optimisation de la consommation
//power_adc_disable(); // Convertisseur Analog / Digital pour les entrées analogiques
//power_spi_disable();
//power_twi_disable();
// Si pas besoin de communiquer par l’usb
//power_usart0_disable();
//Extinction des timers, attention timer0 utilisé par millis ou delay
//power_timer0_disable();
//power_timer1_disable();
//power_timer2_disable();
setup_watchdog(9);
}
void loop() {
// put your main code here, to run repeatedly:
if (f_wdt == 1) {
// Effectuer les mesures ici
f_wdt = 0; // Ne pas oublier d’initialiser le flag
Serial.println(« Sortie de veille »);
tempsDesire = random(tempsMin, tempsMax);
tempsIntervalUltrasonic = random(0, tempsIntervalUltrasonicMax);
Serial.print(« tempsDesiré : « );
Serial.println(tempsDesire);
Serial.print(« tempsIntervalUltrasonic : « );
Serial.println(tempsIntervalUltrasonic);
delay(tempsDesire);
emeteurOn();
Serial.println(« Mise en veille »);
enterSleep(); //Revenir en mode veille
} else {
/* Do nothing. */
}
}
void ultrasonicOn(int numUltrasonic) {
switch (numUltrasonic) {
case 1 :
ultrasonic1.MeasureInCentimeters();
Serial.println(« Ultrasonic1 On »);
delay(300);
break;
case 2 :
ultrasonic2.MeasureInCentimeters();
Serial.println(« Ultrasonic2 On »);
delay(300);
break;
default:
break;
}
}
void emeteurOn() {
ultrasonicOn(1);
delay(tempsIntervalUltrasonic);
ultrasonicOn(2);
}
double convertiSecondeToMilli(double valeur) {
double tempsMilli = valeur / 0.001;
return tempsMilli;
}
————————————- / code ———————————
L’idée est d’envoyer des impulsions ultrasoniques séparées par un laps de temps aléatoire. Pour cela, j’utilise le système Grove, avec 2 sonars ultrason et la librairie « Ultrasonic.h ».
Attention, le code est fourni tel quel, et fonctionne, à la date de la rédaction de cet article, sur la version 1.08 de l’ide Arduino. Pour faire fonctionner votre propre montage, il peut y avoir plus ou moins de modifications à réaliser.
Les plus attentif s’apercevront qu’il y des fonctions liées à un watchdog dans le code. Cela n’est absolument pas nécessaire, mais ce sont des essais d’optimisation énergétique de l’Arduino suite à la consultation de ce site : http://diy-duino.blogspot.fr Dés que j’aurai un peu avancé sur le sujet, je vous ferai un article.
Enfin, la question la plus importante : est-ce que cela marche ???
Et bien étonnamment, dans mon cas particulier, la réponse est pour le moment « Oui ». Le système est en fonction depuis 2 semaines maintenant, et, moyennant un changement de piles (il est alimenté par 6 piles LR06) tous les 3 jours environ, je n’entend plus de rongeurs dans mes combles… hasard ou non ???