////////////////////////////////////////   PROJET SC: VEILLEUSE CONNECTEE   (IMA3)
//Claire Vandamme
//Justine Senellart
//Camille Saâd


//--------------------------------------------------------------------------------------------------------------- INITIALISATION CONSTANTES et paramètres

//INIT CAPTEUR PRESENCE

//temps donné pour calibrer le capteur de présence.(10-60 secs according to the datasheet)
int calibrationTime = 10;        
//the time when the sensor outputs a low impulse
long unsigned int lowIn;         
//the amount of milliseconds the sensor has to be low 
//before we assume all motion has stopped
long unsigned int pause = 500;  

boolean lockLow = true;
boolean takeLowTime;  
int pirPin = 3;    //the digital pin connected to the PIR sensor's output
int ledPin = 13;
//var meaning the parent receives a message
int MESSAGE=0;


//INIT NEOPIXEL LED RGB

//add the library
#include <Adafruit_NeoPixel.h>
//control pin
# define PININ 12
# define PINOUT 8
 
// Parameter 1 = number of pixels in strip
// Parameter 2 = pin number (most are valid)
// Parameter 3 = pixel type flags, add together as needed:
//   NEO_KHZ800  800 KHz bitstream (most NeoPixel products w/WS2812 LEDs)
//   NEO_KHZ400  400 KHz (classic 'v1' (not v2) FLORA pixels, WS2811 drivers)
//   NEO_GRB     Pixels are wired for GRB bitstream (most NeoPixel products)
//   NEO_RGB     Pixels are wired for RGB bitstream (v1 FLORA pixels, not v2)
Adafruit_NeoPixel strip = Adafruit_NeoPixel(60, PININ, NEO_RGB + NEO_KHZ800);


//INIT PHOTRESISTANCE (LUMINOSITE AMBIANTE)
#define CAPTEUR A0
int luminosite = 0; 
int seuil = 200; 

//INIT interrupteur
const int pinInter = 2 ; //9 ne marche pas chelou
int etatBouton;


//--------------------------------------------------------------------------------------------------------------------------------------SETUP ()


void setup() {
  //SETUP LIAISON SERIE 
  Serial.begin(9600);

  //SETUP INTER
  pinMode(pinInter, INPUT_PULLUP); //le bouton est une entrée
  //etatBouton = HIGH; //on initialise l'état du bouton comme "relaché"

  //SETUP LEDS
  //pour les RGB
  strip.begin();
  strip.show(); // Initialize all pixels to 'off'

  //Led en sortie
  pinMode(PININ, OUTPUT);

  
  //SETUP CAPTEUR PRESENCE ET LED ROUGE
  pinMode(pirPin, INPUT);
  pinMode(ledPin, OUTPUT);
  digitalWrite(pirPin, LOW);
  //give the sensor some time to calibrate
  Serial.print("calibrating sensor ");
  for(int i = 0; i < calibrationTime; i++){
      Serial.print(".");
      delay(1000);
      }
  Serial.println(" done");
  Serial.println("SENSOR ACTIVE");
    
    
  delay(50);
}


//------------------------------------------------------------------------------------------------------------------------FONCTIONS SECONDAIRES

void couleur(int R, int G, int B)
{
  strip.setPixelColor(0,R,G,B); 
  strip.show();
}


void eteindre()
{
  strip.setPixelColor(0,0,0,0); 
  strip.show();
  digitalWrite(pirPin, LOW);
  digitalWrite(ledPin, LOW);
  digitalWrite(PININ, LOW);
}


//-------------------------------------------------------------------------------------------------------------------------------------------FONCTIONS PRINCIPALES

//---------------------------------------------------------------------------------------------------------------------------------mainveilleuse()

//fonction du programme principal (à copier plus tard dans la LOOP()
//elle permet l'utilisation de la veilleuse de manière automatique selon la position de l'interrupteur, sinon c'est l'application qui gere le contrôle
//Elle est constituée de la fusion des fonctions secondaires: lumiere_auto(), mouvement() et automatique()
void mainVeilleuse_auto()
{
  etatBouton = digitalRead(pinInter); //Rappel :pinInter = 9

  //MODE AUTOMATIQUE
    //si la veilleuse est allumé et interrupteur = LOW on utilise le mode automatique. 
   while (etatBouton == HIGH) //test si le bouton a un niveau logique haut
    {    
        delay(1000);
        
        etatBouton = digitalRead(pinInter);

        if(etatBouton==HIGH)
        {
           //On récupère la valeur du seuil
          luminosite = analogRead(CAPTEUR);
          int i=0;
  
          //Monitoring
          Serial.print("Luminosite = ");
          Serial.print(luminosite);
          Serial.print(" / Seuil = ");
          Serial.print(seuil);

          // on l'éteint
          if (luminosite > seuil)
          {
            eteindre();
            Serial.println(" / LED OFF");
          }

          //Allumage de la led si la luminosité est inférieur au seuil (on l'allume dans la couleur blanche  la base)
          //enfant couché il doit dormir
          else
          {
            //Monitoring
            couleur(255,255,255);  
      
    
            while(i<=5 && etatBouton==HIGH)
            {
              luminosite = analogRead(CAPTEUR);

              if(luminosite < seuil)
              {
                couleur(255,255,255); 
        
                //DETECTION D'UN MOUVEMENT
                if(digitalRead(pirPin)==HIGH)
                {
                  digitalWrite(ledPin,HIGH);   // la led modélise la déection d'un mouvement selon l'etat du capteur
                  if (lockLow)
                  {
                    //être sûr d'attendre la transistion à l'état LOW du capteur pour continuer :
                    lockLow= false;
                    delay(50); 
                  }
                  takeLowTime = true;
                }

                //FIN DE LA DETECTION
                if(digitalRead(pirPin)==LOW)
                {
                  digitalWrite(ledPin, LOW);
                  if(takeLowTime)
                  {
                    lowIn= millis();      // enregistrement du temps qu'il faut pour passer de HIGH à LOW pour le capteur
                    takeLowTime = false;  // être sûr que cela se fait uniquement au debut du passage à LOW
                  }
                  // Ainsi si le capteur est LOW plus longtemps que la pause, on suppose qu'il n'y plus de mouvement
                  // if > être sûr que la suite s'execute seulement après un nouveau mouvement, donc nouvelle séquence de led allumée
                  if(!lockLow && millis()-lowIn > pause)
                  {
                    lockLow = true;
                    i++;
                    Serial.println(i);

                    //CHILD AWAKE
                    if(i==5)
                    {
                      Serial.println("Sommeil agite !!!");
                      MESSAGE = 1;
                      i=0;
                    }
                    delay(20);
                  }  
                }
       
                delay(500);
              }
            
              else
              {
                eteindre();
                i=0;
              }

              etatBouton = digitalRead(pinInter); //Rappel :pinInter = 9
      
            }
            delay(50);
          }
        }
        else
        {
          eteindre();
          Serial.println("UTILISATION APPLICATION");
        }
        
        etatBouton = digitalRead(pinInter); //Rappel :pinInter = 9
    }

    //MODE MANUEL (APPLICATION)   
    //on est eteint avec l'interrupteur manuel on peut tjrs utiliser l'application pour gerer la veilleuse
    eteindre(); //la LED reste éteinte
    Serial.println("UTILISATION APPLICATION");

    delay(1000);
    

}

//-------------------------------------------------------------------------------------------------------------------------------------------TESTS & LOOP == MAIN PROG


void loop() 
{
 
 mainVeilleuse_auto();
 delay(200);
}
