66 #define CHILD_ID 99 // Id of the sensor child
68 const byte eepromValid = 121;
71 const int programButton = 0;
73 const int knockSensor =
77 const int lockPin = 4;
82 const int rejectValue =
84 const int averageRejectValue =
86 const int knockFadeTime =
88 const int lockOperateTime =
90 const int maximumKnocks = 20;
91 const int knockComplete =
94 byte secretCode[maximumKnocks] = {50, 25, 25, 50, 100, 50, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
95 int knockReadings[maximumKnocks];
96 int knockSensorValue = 0;
97 bool programModeActive =
false;
101 MyMessage lockMsg(CHILD_ID, V_LOCK_STATUS);
106 pinMode(ledPin, OUTPUT);
107 pinMode(knockSensor, INPUT);
108 pinMode(lockPin, OUTPUT);
109 pinMode(programButton, INPUT);
110 digitalWrite(programButton,
HIGH);
114 digitalWrite(lockPin,
119 setLockState(lockStatus,
true);
133 knockSensorValue = digitalRead(knockSensor);
134 if (digitalRead(programButton) ==
LOW) {
136 if (digitalRead(programButton) ==
LOW) {
137 if (programModeActive ==
false) {
138 programModeActive =
true;
139 digitalWrite(ledPin,
HIGH);
143 programModeActive =
false;
144 digitalWrite(ledPin,
LOW);
149 while (digitalRead(programButton) ==
LOW) {
157 if (knockSensorValue == 0) {
158 if (programModeActive ==
true) {
159 digitalWrite(ledPin,
LOW);
161 digitalWrite(ledPin,
HIGH);
164 if (programModeActive ==
true) {
165 digitalWrite(ledPin,
HIGH);
167 digitalWrite(ledPin,
LOW);
169 listenToSecretKnock();
175 void listenToSecretKnock()
179 for (i=0; i < maximumKnocks; i++) {
180 knockReadings[i] = 0;
183 int currentKnockNumber = 0;
184 uint32_t startTime = millis();
188 knockSensorValue = digitalRead(knockSensor);
190 if (knockSensorValue == 0) {
191 Serial.println(
"knock");
194 knockReadings[currentKnockNumber] = now - startTime;
195 currentKnockNumber ++;
198 if (programModeActive==
true) {
199 digitalWrite(ledPin,
LOW);
201 digitalWrite(ledPin,
HIGH);
204 if (programModeActive ==
true) {
205 digitalWrite(ledPin,
HIGH);
207 digitalWrite(ledPin,
LOW);
214 }
while ((now-startTime < knockComplete) && (currentKnockNumber < maximumKnocks));
215 Serial.println(
"end");
218 if (programModeActive ==
false) {
219 if (validateKnock() ==
true) {
223 setLockState(!lockStatus,
true);
225 Serial.println(
"fail unlock");
228 for (i=0; i < 4; i++) {
229 digitalWrite(ledPin,
HIGH);
231 digitalWrite(ledPin,
LOW);
242 void setLockState(
bool state,
bool doSend)
245 Serial.println(
"open lock");
247 Serial.println(
"close lock");
253 digitalWrite(ledPin, state);
254 digitalWrite(lockPin, state);
266 int currentKnockCount = 0;
267 int secretKnockCount = 0;
268 int maxKnockInterval = 0;
270 for (i=0; i<maximumKnocks; i++) {
271 if (knockReadings[i] > 0) {
274 if (secretCode[i] > 0) {
278 if (knockReadings[i] > maxKnockInterval) {
279 maxKnockInterval = knockReadings[i];
284 if (programModeActive ==
true) {
285 for (i=0; i < maximumKnocks; i++) {
286 secretCode[i] = map(knockReadings[i], 0, maxKnockInterval, 0, 100);
289 programModeActive =
false;
290 playbackKnock(maxKnockInterval);
294 if (currentKnockCount !=
304 int totaltimeDifferences = 0;
305 for (
int timeDiff = 0, i=0; i < maximumKnocks; i++) {
306 knockReadings[i]= map(knockReadings[i], 0, maxKnockInterval, 0, 100);
307 timeDiff = abs(knockReadings[i] - secretCode[i]);
312 totaltimeDifferences += timeDiff;
315 if (totaltimeDifferences / secretKnockCount > averageRejectValue) {
324 void readSecretKnock()
328 if (reading == eepromValid) {
329 for (
int i=0; i < maximumKnocks ; i++) {
337 void saveSecretKnock()
341 for (
int i=0; i < maximumKnocks; i++) {
348 void playbackKnock(
int maxKnockInterval)
350 digitalWrite(ledPin,
LOW);
352 digitalWrite(ledPin,
HIGH);
354 for (
int i = 0; i < maximumKnocks ; i++) {
355 digitalWrite(ledPin,
LOW);
357 if (secretCode[i] > 0) {
358 delay(map(secretCode[i], 0, 100, 0,
360 digitalWrite(ledPin,
HIGH);
364 digitalWrite(ledPin,
LOW);
370 int itterations = (knockFadeTime /
372 for (
int i=0; i < itterations; i++) {
383 void chirp(
int playTime,
int delayTime)
385 long loopTime = (playTime * 1000L) / delayTime;
386 pinMode(audioOut, OUTPUT);
387 for(
int i=0; i < loopTime; i++) {
388 digitalWrite(audioOut,
HIGH);
389 delayMicroseconds(delayTime);
390 digitalWrite(audioOut,
LOW);
392 pinMode(audioOut, INPUT);
400 if (message.
getType()==V_LOCK_STATUS) {
402 setLockState(message.
getBool(),
false);
405 Serial.print(
"Incoming lock status:");
406 Serial.println(message.
getBool());