Plus c'est complexe , plus s'est réaliste 
J'ai modifié Bordure en bordureGauche et BordureDroit
Un pb détecté dans bordure*; Avec un angle saillant, on perd le contact avec le bord et du coup plus d'info . J'ai pensé à forcer pendant 3 sec ( à voir le temps avec vitesse bateau) la rotatio pourrecoller au bord
/*
levinegabriella.com/teaching
It includes an parallax ultrasonic rangefinder : see data sheet
http://www.arduino.cc/en/Tutorial/Ping
created 2011 by gabriella levine
*/
/*
En C/C++ un ET logique se note &&. Un OU logique se note ||. La négation se note !. Donc cela ressemblera à :
if( (buttonState==HIGH) && (cm<=15) ) ... // contact ET ultrason
if( (buttonState==HIGH) && !(cm<=15) ) ... // contact sans ultrason
Remarque : pour le dernier cas on peut écrire if( (buttonState==HIGHT) && (cm>15) ) ... // contact sans ultrason
*/
// constants
// set pin numbers:
const int pingPin = 7;
const int DetecteurPin1 = 2; // the number of the pushbutton pin Le numéro de l'épingle à commande automatique(presse-bouton)
const int DetecteurPin2 = 4;
const int moteur1 = 3; // the number of the motor pin le (numéro l'épingle du moteur
const int moteur2 = 11;
const int pompe = 10; // declaration pompe au pin 10
// variables
int BtnContact1 = 0; // variable for reading the pushbutton status variable pour lire le statut du 1er bouton de contact
int BtnContact2 = 0; //
// Variable globale pour faire le décompte du temps
unsigned long startMillis; // à 0 par défaut pour le chrono de MouvementPleineEaux() suivi de bordureGauche/BordureDroite
long cm = 0;
unsigned long startMillisPause; // à 0 par défaut pour le chrono des 60 mn
//variable pour lire le statut du 2 ieme bouton de contact
void setup() {
//begin serial
Serial.begin(9600);
// initialise les pin moteurs à OUTPUT, soit éteint
pinMode(moteur1, OUTPUT);
pinMode(moteur2, OUTPUT);
// initialise les boutons contact pins à INPUT, soit actif:
pinMode(DetecteurPin1, INPUT);
pinMode(DetecteurPin2, INPUT);
// initialize the pump pins as output: au démarrage la pompe ne marche pas ***********************
pinMode(pompe, OUTPUT);
}
void loop() { //deux temporisations distinctes, donc deux chronos différents :
long tempsEcoule = millis() - startMillis;
long tempsEcouleAvantPause = millis() - startMillis;
if (tempsEcoule < 10000) MouvementPleineEaux();
else if (tempsEcoule < 20000) bordureGauche();
else if (tempsEcoule < 30000) MouvementPleineEaux();
else if (tempsEcoule < 40000) bordureDroite();
else if (tempsEcouleAvantPause < 60000) pause(); // après 60 mn de fonctionnement mise en pause
else startMillis = millis();
delay (100);
}
//******
//Les fonctions appelées
//******
void button() {
// moteur et Btncontact sont opposes
// vérifie si les boutoncontact sont actifs(HIGH), si oui le moteur passe à actif(HIGH) ou éteint(LOW) selon le programme
// Assignation des pin es détecteur à leur contact
BtnContact1 = digitalRead(DetecteurPin1); // bouton contact à gauche
BtnContact2 = digitalRead(DetecteurPin2); // bouton contact à droite
if (BtnContact1 == HIGH) {
// turn LED on:
digitalWrite(moteur1, LOW);
// si le bouton touche le bord la pompe fonctionne
digitalWrite(pompe, HIGH);
}
else {
// turn LED off:
digitalWrite(moteur1, HIGH);
// sinon pas de contact la pompe stoppe
digitalWrite(pompe, LOW);
}
if (BtnContact2 == HIGH) {
// turn LED on:
digitalWrite(moteur2, LOW);
// si le bouton touche le bord la pompe fonctionne
digitalWrite(pompe, HIGH);
}
else {
// turn LED off:
digitalWrite(moteur2, HIGH);
// sinon pas de contact la pompe stoppe
digitalWrite(pompe, LOW);
}
}
void ultrasons() {
// establish variables for duration of the ping,
// and the distance result in inches and centimeters:
long duration;
// The PING))) is triggered by a HIGH pulse of 2 or more microseconds.
// Give a short LOW pulse beforehand to ensure a clean HIGH pulse.
//Le PING))) est déclenché par un contact de 2 ou plusieurs micro-secondes.
//Donnez une impulsion ETEINT courte à l'avance pour assurer une impulsion MARCHE propre
pinMode(pingPin, OUTPUT);
digitalWrite(pingPin, LOW);
delayMicroseconds(2);
digitalWrite(pingPin, HIGH);
delayMicroseconds(5);
digitalWrite(pingPin, LOW);
/*
le même pin est utilisé pour lire le signal du PING))) : impulsion
dont la durée est le temps (en micro-secondes) de l'émission
du Ping à la réception de son écho sur un objet.
*/
pinMode(pingPin, INPUT);
duration = pulseIn(pingPin, HIGH);
cm = microsecondsToCentimeters(duration);
}
void MouvementPleineEaux() { // pas de pompe au milieu de l eau!
button(); // initialise les états des contacts
if (!(BtnContact1) && !(BtnContact2) && !(cm)) { // bateau en pleine eau , il va tout droit
digitalWrite(moteur1, HIGH);
digitalWrite(moteur2, HIGH);
}
else if (cm <= 15) { // si 1er contact ultrason, on tourne à droite
digitalWrite(moteur1, LOW);
digitalWrite(moteur2, HIGH);
}
if (BtnContact1 == HIGH) {
digitalWrite(moteur1, LOW);
digitalWrite(moteur2, HIGH);
delay (5000); // tourne encore pendant 5ec pour s'axer vers le miieu de la piscine
digitalWrite(moteur1, HIGH);// va tout droit
digitalWrite(moteur2, HIGH);
}
if (cm <= 15) { // si 2er contact ultrason, on tourne à gauche
digitalWrite(moteur1, HIGH);
digitalWrite(moteur2, LOW);
}
if (BtnContact2 == HIGH) {
digitalWrite(moteur1, HIGH);
digitalWrite(moteur2, LOW);
delay (5000); // tourne encore pendant 5ec pour s'axer vers le miieu de la piscine
digitalWrite(moteur1, HIGH);
digitalWrite(moteur2, HIGH);
}
}
void pause () { // utilisation du second chrono pour arrété au bout de 60 mn
delay (900000); // 15 mn soit 15 *60*1000(milli secondes)
startMillisPause = millis(); // <-- second chrono ici
}
void bordureGauche() { // BtnContact1
// le bateau se dirige vers une parois.
digitalWrite(moteur2, HIGH);
digitalWrite(moteur1, HIGH);
if (cm <= 5){ // parois détectée par ultrason, le bateau pivote à droite pour coller sur la parois gauche
digitalWrite(moteur2, HIGH);
digitalWrite(moteur1, LOW);
// la pompe fonctionne
digitalWrite(pompe, HIGH);
}
if ( (BtnContact1) && (cm <= 5)) { // contact ET ultrason : le bateau est dans un angle ou arrondi détecté par ultrasons
digitalWrite(moteur2, LOW);
digitalWrite(moteur1, HIGH);
// la pompe fonctionne
digitalWrite(pompe, HIGH);
}
if ( (BtnContact1) && !(cm <= 5)) { //contact SANS ultrason : le bateau est collé à un bord et le suit
digitalWrite(moteur2, LOW);
digitalWrite(moteur1, HIGH);
// la pompe fonctionne
digitalWrite(pompe, HIGH);
delay (3000); // le bateau va dépasser l'angle saillant de la piscine
// on le force à continuer à tourner encore pendant 3 sec
// pour le recoller au bord
}
button();
}
void bordureDroite() { // BtnContact2
// le bateau se dirige vers une parois.
digitalWrite(moteur2, HIGH);
digitalWrite(moteur1, HIGH);
if (cm <= 5){ // parois détectée par ultrason, le bateau pivote à gauche pour coller sur la parois droite
digitalWrite(moteur2, LOW);
digitalWrite(moteur1, HIGH);
// la pompe fonctionne
digitalWrite(pompe, HIGH);
}
if ( (BtnContact2) && (cm <= 5)) { // contact ET ultrason : le bateau est dans un angle ou arrondi détecté par ultrasons
digitalWrite(moteur2, HIGH);
digitalWrite(moteur1, LOW);
// la pompe fonctionne
digitalWrite(pompe, HIGH);
}
if ( (BtnContact2) && !(cm <= 5)) { //contact SANS ultrason : le bateau est collé à un bord et le suit
digitalWrite(moteur2, HIGH);
digitalWrite(moteur1, LOW);
// la pompe fonctionne
digitalWrite(pompe, HIGH);
delay (3000); // le bateau va dépasser l'angle saillant de la piscine
// on le force à continuer à tourner encore pendant 3 sec
// pour le recoller au bord
}
button();
}
long microsecondsToCentimeters(long microseconds)
{
/*
La vitesse du son est 340 m/s ou 29 micro-secondes par centimètre.
Le tintement voyage d'et en arrière, ainsi trouver la distance de le
L'objet nous prenons la moitié de la distance a voyagé.
*/
return microseconds / 29 / 2;
}