Situatie Hoe mooi zou het zijn als je alles in je eigen huis onder controle hebt op afstand. Even het rolluik laten zakken als de zon schijnt, de tv uitzetten die je bent vergeten uit te doen en zelfs een kijkje nemen in je eigen huis. Wat is hiervan het belangrijkste: veiligheid. Op afstand kunnen zien of er daadwerkelijk brand is of dat het alarm is afgegaan bij een inbreker of een kat.
Oplossing / Concept Een beveiligingssysteem voor thuis die via het internet te besturen is. Het concept is groots opgezet waarin we in deze module een gedeelte uitwerken. Namelijk het op afstand kunnen besturen van een beveiligingscamera. Geinspireerd door de e-thermostaat die je op afstand hoger of lager kunt zetten. Infographic De infographic geeft in grove lijnen het overkoepelend concept weer “Your home remotely controlled” Zie de infographic hier naast. Arduino opstelling Ons beveiligingssysteem bestaat uit twee delen. Het gedeelte op locatie en het gedeelte op afstand. Het gedeelte op afstand is een computer/laptop Het gedeelte op locatie bestaat uit: - Een Arduino met een ethernet shield - Een Arduino bewegingssensor - Twee Arduino servo’s - Een webcam - Een computer/laptop De bewegingssensor is aangesloten op de Arduino De servo is aangesloten op de Arduino. De webcam is geplaatst op de servo. De webcam is aangesloten op een computer/laptop. De Arduino is aangesloten op dezelfde computer/laptop.
De werking Stel er loopt iemand door je huis die daar niet hoort. De bewegingssensor detecteert de ‘indringer’ en geeft het signaal door aan de Arduino. De Arduino zal een pushbericht sturen naar de mobiele telefoon via het ethernet shield. Dit is voor de gebruiker het teken om even te gaan kijken wat er precies aan de hand is. Deze
maakt contact met de website die draait op de Arduino. Op de website kun je een webcam inschakelen die via USB is aangesloten op de computer/ laptop met daar aan de Arduino. De webcam staat op een servo die is aangesloten op de Arduino. Vervolgens kun je op de website via de Arduino de servo onder de webcam besturen en daarmee rond kijken. Scenario 1: het is een indringer --> Bel 112 en stuur ze naar het adres Scenario 2: het is geen indringer --> niks aan de hand, verbreek de verbinding met de website
Toekomst/toevoeging - Naast een bewegingssensor is er ook gezichtsherkenning, zodat het systeem niet af gaat bij ‘bekenden’. - Snelle bewegingen worden genegeerd i.v.m. huisdieren - Een rookmelder die op afstand uit te schakelen is - Een thermostaat die op afstand te bedienen is - Computers in huis op afstand aan en uitzetten - De lichten in elke kamer van het huis op afstand kunnen bedienen.
De Code /* Secure your home */ // Benodigde libraries voor Ethernet, servo en Avviso (push notification) #include <SPI.h> #include <Ethernet.h> #include <Servo.h> #include
#include <Ethernet.h> #include // Webserver opzetten op een vast ip-adres byte mac[] = { 0x90, 0xA2, 0xDA, 0x00, 0x6E, 0x95 }; IPAddress ip(192,168,1,55); EthernetServer server(80); boolean reading = false; /* instellingen voor pir sensor */ // De sensor krijgt de tijd om te calibreren (10 - 60 secs volgens datasheet) int calibrationTime = 30; // Tijdstip waarop de sensor een lage puls geeft long unsigned int lowIn; // Aantal ms dat de sensor laag moet blijven long unsigned int pause = 5000; boolean lockLow = true; boolean takeLowTime; // De digitale pin 7 wordt gebruikt voor de PIR sensor int pirPin = 7; // Op pin 8 zit een LED die activeit van de sensor aangeeft int ledPin = 8; // Servos initaliseren Servo myservo1; Servo myservo2; // default positie van servos int xpos = 60; int ypos = 60; // waarde op 1 zetten om te zorgen dat er een push-bericht verstuurd wordt bij beweging. // Bij beweging wordt deze waarde op 0 gezet om dubbel meldingen te voorkomen. int push_message = 1;
void setup(){ // starten van de webserver Serial.begin(115200); Ethernet.begin(mac, ip); if (DEBUG) { // Wat informatie op het console schrijven ter controle Serial.print("My IP address: "); Ethernet.localIP().printTo(Serial); Serial.println(); Serial.print("Gateway IP address is "); Ethernet.gatewayIP().printTo(Serial); Serial.println(); Serial.print("DNS IP address is "); Ethernet.dnsServerIP().printTo(Serial); Serial.println(); } // Hier wordt de push notification gestart. // Er wordt bij activiteit een bericht verstuurd naar de mobiele telefoon // Avviso.begin(); // Avviso.setApiKey("638a16302b8fc52986eed1e2f4d4a33044147bc2"); // Avviso.setApplicationName("Arduino Red Phone"); // Settings voor PIR en LED pinMode(pirPin, INPUT); pinMode(ledPin, OUTPUT); digitalWrite(pirPin, LOW); // De sensor laten calibreren en op console laten zien Serial.print("calibrating sensor "); for(int i = 0; i < calibrationTime; i++){ Serial.print("."); delay(1000); } Serial.println(" done"); Serial.println("SENSOR ACTIVE"); delay(50); // Digital pin 3 en 4 instellen voor output naar servo myservo1.attach(3); myservo2.attach(4); // 60 is de horizontale middenpositie myservo1.write(xpos); // 60 is de vertikale middenpositie myservo2.write(ypos); server.begin();
Serial.println(Ethernet.localIP()); } void loop(){ // Luister naar inkomende clients checkForClient(); if(digitalRead(pirPin) == HIGH){ // Push-bericht versturen if (push_message == 1) { delay(1000); Avviso.push("Security Message", "Movement has been detected in your home!", 0); // op 0 zetten en pas weer push bericht sturen als waarde op 1 gezet is push_message = 0; } // De LED gaat branden bij activiteit digitalWrite(ledPin, HIGH); if(lockLow){ lockLow = false; Serial.println("---"); Serial.print("motion detected at "); Serial.print(millis()/1000); Serial.println(" sec"); delay(50); } takeLowTime = true; } // LED weer uitzetten if(digitalRead(pirPin) == LOW){ digitalWrite(ledPin, LOW); if(takeLowTime){ lowIn = millis(); takeLowTime = false; } if(!lockLow && millis() - lowIn > pause){ // Deze code wordt uitgevoerd als er nieuwe activiteit gedetecteerd is. lockLow = true; Serial.print("motion ended at "); Serial.print((millis() - pause) / 1000); Serial.println(" sec"); delay(50); } } }
void checkForClient(){ EthernetClient client = server.available(); if (client) { // Dit is om de commandos via http af te handelen boolean currentLineIsBlank = true; boolean sentHeader = false; while (client.connected()) { if (client.available()) { if(!sentHeader){ client.println("HTTP/1.1 200 OK"); client.println("Content-Type: text/html"); client.println(); sentHeader = true; } char c = client.read(); if(reading && c == ' ') reading = false; // als ? gevonden is begin de info te lezen if(c == '?') reading = true; if(reading){ Serial.print(c); // Hier wordt de besturing van de servos geregeld switch (c) { case '1': // 1 is 1 stap naar links if (xpos < 120) { xpos = xpos + 5; myservo1.write(xpos); client.println("Xpos = "); client.println(xpos); } break; case '2': // 2 is 1 stap naar rechts if (xpos > 0) { xpos = xpos - 5; myservo1.write(xpos); client.println("Xpos = "); client.println(xpos); } break; case '3':
// 3 is 1 stap naar beneden if (ypos < 100) { ypos = ypos + 5; myservo2.write(ypos); client.println("Ypos = "); client.println(ypos); } break; case '4': // 4 is 1 stap naar boven if (ypos > 45) { ypos = ypos - 5; myservo2.write(ypos); client.println("Ypos = "); client.println(ypos); } break; case '5': // 5 is beide servos naar de beginstand zetten xpos = 60; ypos = 60; myservo1.write(xpos); myservo2.write(ypos); break; case '6': // 6 is push-berichten weer activeren push_message = 0; break; } } if (c == '\n' && currentLineIsBlank) break; if (c == '\n') { currentLineIsBlank = true; }else if (c != '\r') { currentLineIsBlank = false; } } } // de browser even de tijd geven om de data te ontvangen delay(1); // sluit de verbinding client.stop(); } }
Foto’s Arduino opstelling
Taakverdeling Stefan (0235938): Conceptontwikkeling, de Arduino opstelling en werking Stein (0828633): Conceptontwikkeling, Infographic, testen Koen (0781134): Conceptontwikkeling, verslaggeving, testen