frenchy22
Published © GPL3+

Presence simulator

Protect your home against robbers with this presence simulator

IntermediateFull instructions provided646
Presence simulator

Things used in this project

Hardware components

Arduino Nano Every
Arduino Nano Every
×1
Resistor 10k ohm
Resistor 10k ohm
×1
LDR, 5 Mohm
LDR, 5 Mohm
One inside the box, the other one remote and not mandatory
×2
Relay Module
×2
Breadboard 170 pins
×1
Female mains plug
×2
Jack socket mono 3.5 mm
For remote LDR if necessary
×1
Jack plug mono 3.5 mm
For remote LDR if necessary
×1
USB charger
×1
Micro-USB to USB Cable (Generic)
Micro-USB to USB Cable (Generic)
×1

Story

Read more

Schematics

presence simulator drawing

Code

Presence simulator code

C/C++
/*** Presence simulator ***/

#define numberOfLamps 2
#define LDRPin A5
int relayPin[numberOfLamps]={2, 3};
#define threshold 200
#define hysteresis 150

int eveningLatency[numberOfLamps];
int eveningDuration[numberOfLamps];
int morningDuration[numberOfLamps];
int morningAnticipation[numberOfLamps];
int morningMaxOverflow=30;
int nightMinDuration=240;
int nightMaxDuration=1200;
int nightDuration=720; // Assume the first night duration 
                       // is 12 hours
  //All values in minutes
    
enum {night, day} nightDay=day;

/*
Many things depend on the time, so we
need a chronometer.
 */
class chronometer
{
  unsigned long lastTime, actualTime;
  public :
  unsigned long elapsed;
  void init(); // start the chronometer
  void now();  // measure elapsed time since init
  chronometer();
};

void chronometer::init()
{
  actualTime=millis();
  lastTime=actualTime;
}

void chronometer::now()
{
  actualTime=millis();
  if (actualTime<lastTime) // Overflow of the millis couter
    elapsed=(0xFFFFFFFFul-lastTime+actualTime);
  else
    elapsed=(actualTime-lastTime);
}

chronometer::chronometer()
{
  actualTime=millis();
  lastTime=actualTime;
}

/* LDR and relay functions
*/

chronometer lampChrono;

void lampManagement(void)
{
  int limit1, limit2, limit3, limit4, limit5, elapsedMinutes;

  if(analogRead(LDRPin)>threshold)
  {
    for(int i=0; i<numberOfLamps; i++)
      digitalWrite(relayPin[i],LOW);
    if(nightDay==night) // The day has just began
    {
      nightDay=day;
  /* Measure the duration of the previous night */
      lampChrono.now();
      if(lampChrono.elapsed>
           ((unsigned long)nightMinDuration*60000ul) &&
         lampChrono.elapsed<
           ((unsigned long)nightMaxDuration*60000ul))
         nightDuration=
           (int)(lampChrono.elapsed/60000ul);
    }
  }
  else if(analogRead(LDRPin)<threshold-hysteresis) 
  {
    if(nightDay==day) // The night has just began
    {
      nightDay=night;
      lampChrono.init();
      for (int relayNumber=0; relayNumber<numberOfLamps;
               relayNumber++)
      {
        eveningDuration[relayNumber]=random(30, 120);
        eveningLatency[relayNumber]=random(30);
        morningDuration[relayNumber]=random(30,120);
        morningAnticipation[relayNumber]=random(30);
      }
    }
  }
  if(nightDay==night)
  {
    lampChrono.now();
    for(int relayNumber=0; relayNumber<numberOfLamps;
            relayNumber++)
    {
      limit1=eveningLatency[relayNumber];
      limit2=limit1+
             eveningDuration[relayNumber];
      limit3=nightDuration-
             morningAnticipation[relayNumber]-
             morningDuration[relayNumber];
      limit4=limit3+
             morningDuration[relayNumber];
      limit5=nightDuration+morningMaxOverflow;
      elapsedMinutes=(int)(lampChrono.elapsed/60000);
      if((elapsedMinutes>=limit1 &&
          elapsedMinutes<limit2)||
         (elapsedMinutes>=limit3 &&
          elapsedMinutes<limit4 &&
          elapsedMinutes<limit5))
         digitalWrite(relayPin[relayNumber],HIGH);
       else
         digitalWrite(relayPin[relayNumber],LOW);
    }
  }  
}

void functionalTest(void)
{
  while(millis()<10000)
  {
    if(analogRead(LDRPin)>threshold)
    {
      digitalWrite(relayPin[0], LOW);
      digitalWrite(relayPin[1], HIGH);
    }
    else if(analogRead(LDRPin)<threshold-hysteresis)
    {
      digitalWrite(relayPin[0], HIGH);
      digitalWrite(relayPin[1], LOW);
    }
  }
  digitalWrite(relayPin[0], LOW);
  digitalWrite(relayPin[1], LOW);
}

void setup()
{
  for (int i=0; i<numberOfLamps; i++)
  {
    pinMode(relayPin[i], OUTPUT);
    digitalWrite(relayPin[i], LOW);
  }
  analogReference(INTERNAL4V3);
  functionalTest();
}

void loop()
{
    lampManagement();
}

Credits

frenchy22
6 projects • 3 followers

Comments