/*=================Sketch pour sous-marin compilant un interrupteur bistable à aimant et un fail-safe pour un ATtiny85  ========================

/*=================La fonction interrupteur reed bistable ATtiny85  ========================
   Un interrupteur reed ils (magnétique) est cablé sur la Pin2 ainsi qu'une résistance de 10k (voir schéma).
   Un relais est cablé sur le Pin3 .
   Une présentation d'un aimant près de l'ils fait coller le relais (mise sous tension circuit RC) qui reste allumée en éloignant l'aimant.
   Une deuxième présentation de l'aimant fait retomber le relais.
================================================================================================*/
/*==============================La fonction FAIL-SAFE ====================================================
Permet en cas de coupure du signal radio de mettre le servo dans une position définie par l’utilisateur.
La voie du récepteur concernée est relié au (pin 0).
La valeur de réglage de la position de secours est valp, à définir selon vos besoin.
Le servo au (pin 1).
Une LED est cablée sur le pin 4, Led fixe= circuit RC sous tension, LED clignotante= perte de signal RC  (fail-safe).
le sketch d'origine est sur le site de Mr Alain CLLAVERIE : http://bateaux.trucs.free.fr/fail_safe.html
    
 ==============================================================================================*/
 #include <SoftwareServo.h> // Appel de la librairie servo
SoftwareServo monservo;    // Déclare le servo monservo
#define signal   0         // Déclare la variable ( signal ) 
int val = 0;               // Déclare la variable (val)
int valp = 2000;              // Déclare la variable (valp) à modifier suivant la position désirée du servo en cas de perte de signal(entre 1000 et 2000).

int neutre = 1500;         // valeur du neutre à modifier suivant la radio utilisée

int relpin3=3;              // Relais
int ledpin4 =4;             // Led
int inter=2;               // interrupteur reed
int etat=1;
int mem=0;
//============================================================================================
void setup(){
 pinMode(relpin3,OUTPUT);
 pinMode(ledpin4,OUTPUT);
 pinMode(inter,INPUT);
 pinMode(signal, INPUT);  // Déclare la variable (signal)en entrée
  monservo.attach(1);      // Attache le servo (monservo) au pin 1 
}
//============================================================================================
void loop(){
  noInterrupts();                        //Désactive les interruptions
  val = pulseIn(signal, HIGH,30000);     // Donne à la variable (val) la valeur de (signal) lue sur le pin4
  interrupts();                          //Réactive les interruptions
  
  int val1=digitalRead(inter);
  if((val1==HIGH) && (mem==LOW)){etat= 1 - etat;  }
 
  mem=val1;
 
  if(etat==0){  digitalWrite(relpin3,HIGH);  } else {digitalWrite(relpin3,LOW); }
  
  if(etat==0){  digitalWrite(ledpin4,HIGH);  } else {digitalWrite(ledpin4,LOW); }
  
  if ((val < 10)&&(etat==0)){val = valp;}       // Si le signal est inferieur à 10 alors le signal sera egale à la valeur de valp.
  val = map(val, neutre-500, neutre+450, 45, 135);  val=constrain(val, 45, 135);  // Calibre des valeurs de (val) pour le servo sur 90°    
  if (etat==0)  monservo.write(val);                   // Positionne le servo 
  delay(15);                           //  delai pour positionner le servo
  if(relpin3 == LOW && (val < 10)){  digitalWrite(ledpin4,HIGH);  } else {digitalWrite(ledpin4,LOW); }
                               
  if(relpin3 == LOW && (val < 10)){  digitalWrite(ledpin4,LOW);  } 
   
  SoftwareServo::refresh();              // Rafraîchissement bibliothèque servo 
 
}