Presence simulator
Protect your home against robbers with this presence simulator
Components and supplies
1
Breadboard 170 pins
2
Relay Module
1
Resistor 10k ohm
1
Jack plug mono 3.5 mm
1
Jack socket mono 3.5 mm
1
USB charger
1
Arduino Nano Every
1
Micro-USB to USB Cable (Generic)
2
Female mains plug
2
LDR, 5 Mohm
Project description
Code
Presence simulator code
c_cpp
1/*** Presence simulator ***/ 2 3#define numberOfLamps 2 4#define LDRPin A5 5int relayPin[numberOfLamps]={2, 3}; 6#define threshold 200 7#define hysteresis 150 8 9int eveningLatency[numberOfLamps]; 10int eveningDuration[numberOfLamps]; 11int morningDuration[numberOfLamps]; 12int morningAnticipation[numberOfLamps]; 13int morningMaxOverflow=30; 14int nightMinDuration=240; 15int nightMaxDuration=1200; 16int nightDuration=720; // Assume the first night duration 17 // is 12 hours 18 //All values in minutes 19 20enum {night, day} nightDay=day; 21 22/* 23Many things depend on the time, so we 24need a chronometer. 25 */ 26class chronometer 27{ 28 unsigned long lastTime, actualTime; 29 public : 30 unsigned long elapsed; 31 void init(); // start the chronometer 32 void now(); // measure elapsed time since init 33 chronometer(); 34}; 35 36void chronometer::init() 37{ 38 actualTime=millis(); 39 lastTime=actualTime; 40} 41 42void chronometer::now() 43{ 44 actualTime=millis(); 45 if (actualTime<lastTime) // Overflow of the millis couter 46 elapsed=(0xFFFFFFFFul-lastTime+actualTime); 47 else 48 elapsed=(actualTime-lastTime); 49} 50 51chronometer::chronometer() 52{ 53 actualTime=millis(); 54 lastTime=actualTime; 55} 56 57/* LDR and relay functions 58*/ 59 60chronometer lampChrono; 61 62void lampManagement(void) 63{ 64 int limit1, limit2, limit3, limit4, limit5, elapsedMinutes; 65 66 if(analogRead(LDRPin)>threshold) 67 { 68 for(int i=0; i<numberOfLamps; i++) 69 digitalWrite(relayPin[i],LOW); 70 if(nightDay==night) // The day has just began 71 { 72 nightDay=day; 73 /* Measure the duration of the previous night */ 74 lampChrono.now(); 75 if(lampChrono.elapsed> 76 ((unsigned long)nightMinDuration*60000ul) && 77 lampChrono.elapsed< 78 ((unsigned long)nightMaxDuration*60000ul)) 79 nightDuration= 80 (int)(lampChrono.elapsed/60000ul); 81 } 82 } 83 else if(analogRead(LDRPin)<threshold-hysteresis) 84 { 85 if(nightDay==day) // The night has just began 86 { 87 nightDay=night; 88 lampChrono.init(); 89 for (int relayNumber=0; relayNumber<numberOfLamps; 90 relayNumber++) 91 { 92 eveningDuration[relayNumber]=random(30, 120); 93 eveningLatency[relayNumber]=random(30); 94 morningDuration[relayNumber]=random(30,120); 95 morningAnticipation[relayNumber]=random(30); 96 } 97 } 98 } 99 if(nightDay==night) 100 { 101 lampChrono.now(); 102 for(int relayNumber=0; relayNumber<numberOfLamps; 103 relayNumber++) 104 { 105 limit1=eveningLatency[relayNumber]; 106 limit2=limit1+ 107 eveningDuration[relayNumber]; 108 limit3=nightDuration- 109 morningAnticipation[relayNumber]- 110 morningDuration[relayNumber]; 111 limit4=limit3+ 112 morningDuration[relayNumber]; 113 limit5=nightDuration+morningMaxOverflow; 114 elapsedMinutes=(int)(lampChrono.elapsed/60000); 115 if((elapsedMinutes>=limit1 && 116 elapsedMinutes<limit2)|| 117 (elapsedMinutes>=limit3 && 118 elapsedMinutes<limit4 && 119 elapsedMinutes<limit5)) 120 digitalWrite(relayPin[relayNumber],HIGH); 121 else 122 digitalWrite(relayPin[relayNumber],LOW); 123 } 124 } 125} 126 127void functionalTest(void) 128{ 129 while(millis()<10000) 130 { 131 if(analogRead(LDRPin)>threshold) 132 { 133 digitalWrite(relayPin[0], LOW); 134 digitalWrite(relayPin[1], HIGH); 135 } 136 else if(analogRead(LDRPin)<threshold-hysteresis) 137 { 138 digitalWrite(relayPin[0], HIGH); 139 digitalWrite(relayPin[1], LOW); 140 } 141 } 142 digitalWrite(relayPin[0], LOW); 143 digitalWrite(relayPin[1], LOW); 144} 145 146void setup() 147{ 148 for (int i=0; i<numberOfLamps; i++) 149 { 150 pinMode(relayPin[i], OUTPUT); 151 digitalWrite(relayPin[i], LOW); 152 } 153 analogReference(INTERNAL4V3); 154 functionalTest(); 155} 156 157void loop() 158{ 159 lampManagement(); 160} 161
Downloadable files
presence simulator drawing
presence simulator drawing

presence simulator drawing
presence simulator drawing

Comments
Only logged in users can leave comments