Special AlarmClock

by Nathanhoh in Living > Health

203 Views, 0 Favorites, 0 Comments

Special AlarmClock

BovenAanzicht1.png

Intro

Ik heb voor een school project een speciale wekker gemaakt. Wat deze wekker zo speciaal maakt is dat het een sensor heeft die meet of de deur van jouw kamer is geopend of niet. De ideale werking van deze werkt zo: de wekker gaat af, jij staat op doet de wekker uit(de wekker hangt naast de deur). Daarna start er een timer(die instelbaar is in de code), tijdens dat deze timer aftelt meet de bewegingssensor of de deur open is gegaan. Als de sensor beweging meet wordt deze true en betekent het dus dat je uit je kamer bent gegaan. als de sensor geen beweging opmeet voordat de timer is afgegaan, dan gaat de wekker weer af. Want Dat betekent hoogstwaarschijnlijk dat je weer in bed bent gaan liggen.


waarom

Ik heb zelf voor dit concept gekozen omdat ik zelf vaak wakker wordt van mijn wekker, maar hem daarna ook gelijk weer uit doe en door ga slapen. Wat het effect op mij als gebruiker heeft is dat ik uiteindelijk denk: ”Oke, laat ik maar gelijk gaan douchen nu ik er toch al uit ben.” Voor mij werkt dit concept, dus ik hoop dat het ook voor jou werkt. als jij het zelfde probleem heb.


Wat kan de wekker

De wekker heeft 6 knoppen met elk zijn eigen functie:

-         SELECT = uitzetten 1e wekker

-         LEFT = Wekker min aanpassen & het uitzetten van de 2e wekker

-         UP = klok min aanpassen

-         DOWN = klok uren aanpassen

-         RIGHT = wekker uren aanpassen

-         RST(restart) = dan reset je de UNO weer naar zijn originele staat.


Verder kan je ook eigen functionaliteit toevoegen aan de knoppen als je dat graag zou willen.

Supplies

Elektronische componenten

1x Arduino UNO

1x DFRobot Gravity 1602 LCD Keypad Shield - voor Arduino

1x IR Pyroelectrische Infrarood PIR Motion Sensor Detector Module

1x pin header 6 breed

3x Female to Female wire

2x Male to Female wire


Materialen voor de behuizing

-         Karton


Gereedschap

-         Lijmpistool

-         Schaar

-         Stanleymes

-         Snijplank

-         Geodriehoek

-         liniaal

De Circuitry

constructie.png

LCD Keypad Shield

Eerst wil je de lcd keypad op de arduino plaatsten, dat doe je door de meest rechter pin van de shield in de meest rechter header van de arduino te plaatsen. Daardoor gaan alle andere pinnen van de LCD ook in de goede headers van de Arduino.


Speaker

Daarna wil je de speaker connecten, dat doe je door een male to female draad in de zwarte draad van de speaker te stoppen en Dan zet je de female kant op de GND pin(rechtsboven). Voor de tweede draad wil je weer een male to female draad gebruiken. De male kant stop je in de rode draad van de speaker en de female kant zet je op de DIGITAL 2 pin(rechtsboven).

 

Motion Sensor

Om de Sensor te connecten met de rest van je LCD shield heb je een tussen stap nodig. Eerst moet je de “pin header 6 breed” op de LCD Shield solderen met de headers aan de bovenkant. Zo kan je draden makkelijker via de onderkant verbergen. Als je dat hebt gedaan kan je de female to female gebruiken. Je wil de GND van de Sensor Connecten met de GND van de shield(midden onder), het maakt niet uit in welke GND je het doet onderin, ik zelf heb hem in de meest rechter. Daarna wil je de VCC van de Sensor connecten met 5V pin die je net hebt gesoldeerd. Als laatst wil je de OUT pin van de Sensor met de DIGITAL 3 pin connecten, Die is rechtsboven te vinden.


Als je al deze stappen hebt gevolgd ben je klaar met je Circuitry en kan je beginnen met het implementeren van de code.

Installeren Library

library.png

Download de LCDKepad.zip folder(https://github.com/Blade412wild/Alarm-Clock.git) . Om dit te installeren ga naar Sketch>Include Library>Add .zip Library. Vergeet niet eerst de Zip uit te pakken voordat je hem toevoegt.

Code

#include <LiquidCrystal.h>
#include <LCDKeypad.h>

byte Bell[8] = {
  B00000,
  B00100,
  B01110,
  B01110,
  B01110,
  B11111,
  B00000,
  B00100
};

// klok / wekker
int starttime;
int activetime;
int prevoustime = 0;
int hours = 00;
int mins = 00;
int secs = 0;
int AlarmHours = 00;
int AlarmMinutes = 02;
LCDKeypad lcd;

// geluid
bool PlaySound;
int noteDuration = 0;

// tijd
unsigned long startTime;
unsigned long currentTime;
unsigned long previousTime = 0;

// timer
const long timerDuration = 10; // in seconden
bool DeactivatedAlarm;

// sensor
int SensorThreshold;
int pirPin = 3;  // pin voor de HC-S501 sensor
int pirValue;    // uitgelezen sensor waarde'
bool Movemend;

void setup() {
  PlaySound = true;
  DeactivatedAlarm = false;

  lcd.begin(16, 2);
  lcd.clear();

  Serial.begin(9600);
  pinMode(A0, INPUT);
  pinMode(A1, OUTPUT);
  Movemend = false;

  // hier bepaal ik de begin tijd van de arduino
  starttime = millis() / 1000;
  lcd.createChar(1, Bell);
}

void loop() {


  int A0 = analogRead(A0);
  lcd.setCursor(5, 0);
  lcd.write(byte(1));
  lcd.setCursor(11, 0);
  lcd.write(byte(1));
  lcd.setCursor(3, 1);
  lcd.print((String) "Alarm: ");

  // hier check hij voor Input van de gebruiker
  CheckInput();

  lcd.setCursor(5, 0);
  lcd.write(byte(1));
  lcd.setCursor(11, 0);
  lcd.write(byte(1));
  lcd.setCursor(3, 1);
  lcd.print((String) "Alarm: ");

  // hier update hij de klok
  UpdateKlok();

  // hier wordt gecheckt of het alarm af moet gaan;
  CheckOfWekkerAfMagGaan();

  //hier wordt gecheckt of de de sensor bewegiging heeft gedetecteerd en zo nee speel het geluid af
  CheckSensor();
  lcd.clear();
}

void CheckOfWekkerAfMagGaan() {
  if (AlarmHours == hours && AlarmMinutes == mins && PlaySound == true)
  {
    CheckInput();
    SpeelGeluidAf();
  } else {
    noTone(2);
    delay(300);
  }
}

void SpeelGeluidAf() {
  tone(2, 1000, noteDuration * 0.9);
}

void UpdateKlok() {
  if (AlarmMinutes > 59) {
    AlarmHours++;
    AlarmMinutes = 0;
  }
  if (AlarmHours > 23) {
    AlarmHours = 0;
  }
  lcd.setCursor(9, 1);
  if (AlarmHours < 10) {
    lcd.print("0");
    lcd.print(AlarmHours);
  } else {
    lcd.print(AlarmHours);
  }

  lcd.print(":");

  if (AlarmMinutes < 10) {
    lcd.print("0");
    lcd.print(AlarmMinutes);
  } else {
    lcd.print(AlarmMinutes);
  }
  lcd.setCursor(15, 1);
  lcd.print(" ");


  activetime = (millis() / 1000) - starttime;
  if (secs < 59) {
    secs++;
  }

  if (secs > 59) {
    mins++;
    secs = 0;
  }

  if (prevoustime < (activetime - 59)) {
    mins++;
    PlaySound = true;
    prevoustime = activetime;
  }

  if (mins > 59) {
    hours++;
    mins = 0;
  }

  if (hours > 23) {
    hours = 0;
  }


  lcd.setCursor(6, 0);

  if (hours < 10) {
    lcd.print("0");
    lcd.print(hours);
  } else {
    lcd.print(hours);
  }

  lcd.print(":");

  if (mins < 10) {
    lcd.print("0");
    lcd.print(mins);
  } else {
    lcd.print(mins);
  }

  lcd.print("");
}

void CheckInput() {
  int button = lcd.button();
  switch (button) {
    case KEYPAD_UP:
      lcd.clear();
      lcd.setCursor(5, 1);
      lcd.print("Set Time");
      lcd.setCursor(6, 0);
      mins++;
      break;
    case KEYPAD_DOWN:
      lcd.clear();
      lcd.setCursor(5, 1);
      lcd.print("Set Time");
      lcd.setCursor(6, 0);
      hours++;
      break;
    case KEYPAD_LEFT:
      lcd.clear();
      lcd.setCursor(5, 1);
      lcd.print("Set Time");
      lcd.setCursor(6, 0);
      if (DeactivatedAlarm == true) {
        SensorThreshold = 0;
        DeactivatedAlarm = false;
        Movemend = false;        

        noTone(2);
      } else {
        AlarmMinutes++;
      }
      break;
    case KEYPAD_RIGHT:
      lcd.clear();
      lcd.setCursor(5, 1);
      lcd.print("Set Time");
      lcd.setCursor(6, 0);
      AlarmHours++;
      break;
    case KEYPAD_SELECT:
      if (AlarmHours == hours && AlarmMinutes == mins && PlaySound == true) {
        PlaySound = false;
        DeactivatedAlarm = true;
        previousTime = currentTime;
        noTone(2);
      }
      noTone(2);
  }
}

void CheckSensor() {
  currentTime = (millis() / 1000UL) - startTime;
  pirValue = digitalRead(pirPin);
  Serial.println(pirValue);

  // Checkt of er beweging is gedetecteerd door de sensor
  if (currentTime - previousTime >= timerDuration && Movemend == false && DeactivatedAlarm == true) {
    SpeelGeluidAf();
  }

  // Hier wordt er alleen gecheckt op bweging wanneer de timer loopt
  if (pirValue == 1 && DeactivatedAlarm == true) {
    // de threshold bestaat zodat de sensor niet gelijk true wordt bij de kleinste beweging
    SensorThreshold = SensorThreshold + pirValue;
    if (SensorThreshold == 5) {
      Movemend = true;
    }
  }
}

Kopieer de code hierboven of download de Final Alarm Clock file en kopieer die naar je eigenproject. De code spreekt al heel erg voorzichzelf. Ik heb comments toegevoegd waar nodig is om de code te begrijpen.


Mijn Maak Proces

Probeersel 0

Hier probeerde ik alle componenten bij elkaar te pakken om te kijken hoe de wekker eruit kon zien.

handframe.png

Nu ben ik in de eerste fase van mijn framework. Ik heb er ook voor gekozen om het frame vanaf mijn arduino naar buiten te werken. In deze fase heb ik er toch voor gekozen om de speaker hoger te plaatsen zodat de dieveel stabieler zou staan en er meer ruimte zou zijn voor de draden.

FrameWork fase 2

In deze video ben ik in de 2e fase van mijn framework. Zoals je hier kan zien ben ik al begonnen met het frame van de sensor en staat de speaker nu vast aan het framework. Tijdens deze fase is het allemaal nog wel heel breekbaar.

FrameWork fase 3
derd .png

Nu zijn we bij de derde fase van mijn framework. Tijdens deze fase heb ik me vooral gefocust op het stabiliseren van de gehele wekker. Karton is van zichzelf niet heel sterk, daarom moest ik slimme keuzes maken in het design. Ik heb er uiteindelijk voor gekozen om kruis systemen te gebruiken.

EindWerk

BovenAanzicht1.png
rechts aanzicht.png
RechtsAanzicht.png

Zo ziet nu het eind werk eruit. Het is een donker grijze wekker met een gat aan de linker kant voor stroom en een gat aan de rechterkant waar de sensor waarde kant meten.

Extra

F41TM1CLHUKNA2V.png
BovenAanzicht2.png
BovenAanzicht3.png

Verder heb ik nog wat customizability toegevoegd bij de wekker, je kan namelijk de sensor waardes aanpassen. Dat doe je door ten eerste de voorkant er af te schuiven. Daarna zie je deen karton klepje(foto 2) die kan je eruit te wippen. Dan kan je als laatst met een schroeven draaier de sensor waardes aanpassen(foto 3). Uiteindelijk is alles met karton en lijm gemaakt.

De Wekker in Actie

geen beweging
wel beweging

in de eerste video kan je zien wat er gebeurt als er geen beweging is. bij de tweede is er wel beweging.

Geleerd

Hetgene wat mij het meest bij staat van dit project is het idee dat je in een loop aan het programmeren bent. Dat heb ik hiervoor niet gedaan, ik moest daardoor veel meer stil staan bij het bedenken van functionaliteit dat de rest van de code niet laat vertragen. Ik had bijvoorbeeld last van dat een functie vast bleef hangen in een for loop waardoor al het andere gedeelte van de code niet werkte.


Ook heb ik geleerd dat ik me nog beter moet verdiepen op welke componenten er bestaan. Ik ben er pas later achter gekomen dat een laser sensor veel beter werkte voor deze bouw. Die keuze zou me hoogstwaarschijnlijk heel wat tijd gekost.


En het laatste wat mij het meeste is bijgebleven is dat ik mijn bureau / mijn componenten beter opgeruimd moest hebben. Ik heb echt veel te veel tijd besteed aan het zoeken naar draden of verschillende componenten