/* Ξ“Ξ•ΞΞ™ΞšΞ•Ξ£ ΞŸΞ”Ξ—Ξ“Ξ™Ξ•Ξ£

    Ο ΞΊΟŽΞ΄ΞΉΞΊΞ±Ο‚ δΡν Ρίναι πλΞ�ρης :) Ξ₯πάρχουν κΡνά τα οποία ΟƒΟ…ΞΌΟ€Ξ»Ξ·ΟΟŽΞ½Ξ΅Ο„Ξ΅
    ΞΌΞ΅ κριτΞ�ριο το τι θέλΡτΡ Ξ½Ξ± κάνΡι Ξ· Ξ”Ξ™ΞšΞ— ΣΑΣ ΡφαρμογΞ�.
    Διαβά΢ΡτΡ τις οδηγίΡς που υπάρχουν μέσα στον κώδικα, κάνουν καλό :)

*/

// Ο αισθητΞ�ρας κλίσης Ρίναι λίγο παράξΡνος :)
// Κανονικά ΞΈΞ± αρκούσΡ Ξ­Ξ½Ξ±Ο‚ ΞΊΟŽΞ΄ΞΉΞΊΞ±Ο‚ του τύπου "ΔιάβασΡ τιμΞ� αισθητΞ�ρα,
// Ξ±Ξ½ Ρίναι high Ο„ΟŒΟ„Ξ΅ υπάρχΡι κινηση, Ξ±Ξ½ Ρίναι low Ο„ΟŒΟ„Ξ΅ δΡν υπάρχΡι κίνηση."
// ΞšΞ¬Ο„ΞΉ δηλ. πολύ Ο€Ξ±ΟΟŒΞΌΞΏΞΉΞΏ ΞΌΞ΅ Ξ­Ξ½Ξ± ΟˆΞ·Ο†ΞΉΞ±ΞΊΟŒ button - ΔΡίτΡ τον αντίστοιχο κώδικα.

// Ξ©ΟƒΟ„ΟŒΟƒΞΏ, Ξ»ΟŒΞ³Ο‰ του φαινομένου "bounce-Ξ±Ξ½Ξ±Ο€Ξ�δησης" ΞΏ αισθητΞ�ρας δΡν Ρίναι Ο„ΟŒΟƒΞΏ Ξ±ΞΎΞΉΟŒΟ€ΞΉΟƒΟ„ΞΏΟ‚.
// Άρα δΡίτΡ τον κώδικα που υπάρχΡι πιο κάτω ΞΊΞ±ΞΉ τις ΡξηγΞ�σΡις που δίνονται.
// Και ΞΈΞ± Ο€ΟΟŒΟ„Ξ΅ΞΉΞ½Ξ± Ξ½Ξ± τον δοκιμάσΡτΡ.

// Αν σας φαίνΡται τρομΡρά πολύπλοκο, Ο„ΟŒΟ„Ξ΅ Ξ½Ξ± χρησιμποιΞ�σΡτΡ την λογικΞ� του button,
// Ξ±Ο€ΞΏΞ΄Ξ΅Ο‡ΟŒΞΌΞ΅Ξ½ΞΏΞΉ το Ξ³Ξ΅Ξ³ΞΏΞ½ΟŒΟ‚ ΟŒΟ„ΞΉ ΞΏ σένσορας δΡν ΞΈΞ± λΡιτουργΡί ΞΊΞ±ΞΉ Ο„ΟŒΞΏΞΏΞΏΞΏΟƒΞΏ καλά.


// Θα χρησιμοποιηθΡί το led 13 Ξ³ΞΉΞ± τη δοκιμΞ�
int ledPin = 13;

// Ο tilt sensor συνδέΡται σΡ ΟˆΞ·Ο†ΞΉΞ±ΞΊΟŒ pin
int tiltPin = 8;

int tiltValue;           // the current reading from the input pin
int prevTiltValue = LOW;    // the previous reading from the input pin


long timer = 0;         // the last time the output pin was toggled
long debounce = 50;    // the debounce time, increase if the output flickers


void setup()
{
  // To tilt pin ΞΈΞ± λΡιτουργΞ�σΡι ως Ρίσοδος
  pinMode(tiltPin, INPUT);

  digitalWrite(tiltPin, HIGH);   // turn on the built in pull-up resistor

  // ΀ο led pin ΞΈΞ± λΡιτουγΞ�σΡι ως έξοδος
  pinMode(ledPin, OUTPUT);

  // Έναρξη σΡιριακΞ�Ο‚ Ρπικοινωνίας ΞΌΞ΅ το PC Ξ³ΞΉΞ± Ξ½Ξ± μπορούμΡ Ξ½Ξ±
  // βλέπουμΡ τιμές αισθητΞ�ρων, αλλά ΞΊΞ±ΞΉ Ξ½Ξ± δίνουμΡ τιμές Ξ±Ο€ΟŒ το Ο€Ξ»Ξ·ΞΊΟ„ΟΞΏΞ»ΟŒΞ³ΞΉΞΏ.
  // ΞœΟ€ΞΏΟΞ΅Ξ― ΞΊΞ±ΞΉ Ξ½Ξ± ΞΌΞ·Ξ½ χρΡιαστΡί, αλλά Ξ±Ο‚ το έχουμΡ ως ρύθμιση.

  Serial.begin(9600);

}



void loop()
{

  tiltValue = digitalRead(tiltPin);

  // Αν Ξ· κατάσταση του tilt sensor άλλαξΡ (δηλ. Ξ· κλίση) Ο„ΟŒΟ„Ξ΅ αρχί΢ουμΡ
  // Ξ½Ξ± μΡτράμΡ τον Ο‡ΟΟŒΞ½ΞΏ, δηλ. στη μΡταβλητΞ� timer αποθηκΡύουμΡ τη
  // συγκΡκριμένη χρονικΞ� στιγμΞ� ΟŒΟ€ΞΏΟ… καταλάβαμΡ ΟŒΟ„ΞΉ άλλαξΡ Ξ· κατάσταση του tilt
  if (tiltValue != prevTiltValue)
  {
    // reset the debouncing timer
    timer = millis();
  }

  // Αν Ξ· διαφορά της τωρινΞ�Ο‚ χρονικΞ�Ο‚ στιγμΞ�Ο‚ (που ΞΌΞ±Ο‚ δίνΡι Ξ· ΡντολΞ� millis())
  // Ξ±Ο€ΟŒ τη χρονικΞ� στιγμΞ� που άλλαξΡ Ξ· κατάσταση του tilt (την οποία έχουμΡ φυλάξΡ
  // στη μΡταβλητΞ� timer), Ρίναι μΡγαλύτΡρη Ξ±Ο€ΟŒ το debounce διάστημα (το οποίο αρχικά
  // έχουμΡ ορίσΡι Ξ½Ξ± Ριναι 50 ms), Ο„ΟŒΟ„Ξ΅ μπορούμΡ Ξ½Ξ± υποθέσουμΡ ΟŒΟ„ΞΉ ΟŒΞ½Ο„Ο‰Ο‚ Ξ· κλίση του
  // tilt sensor άλλαξΡ.
  if ((millis() - timer) > debounce)
  {
    // Ανάλογα ΞΌΞ΅ την τιμΞ� της μΡταβλητΞ�Ο‚ tiltValue, ανάβουμΡ Ξ� σβΞ�Ξ½ΞΏΟ…ΞΌΞ΅
    // το led 13.
    
    if (tiltValue == HIGH)
    {
      digitalWrite(ledPin, LOW);
      Serial.println("tilt low");
    }
    else
    {
      digitalWrite(ledPin, HIGH);
      Serial.println("tilt high");
    }
  }

  // H τωρινΞ� τιμΞ� του tilt sensor φυλάσσΡται στη μΡταβλητΞ� prevTitlValue
  // Ξ΄ΞΉΟŒΟ„ΞΉ Ξ³ΞΉΞ± την Ξ΅Ο€ΟŒΞΌΞ΅Ξ½Ξ· χρονικΞ� στιγμΞ� (που ΞΈΞ± τρέξΡι ΞΎΞ±Ξ½Ξ¬ ΞΏ ΞΊΟŽΞ΄ΞΉΞΊΞ±Ο‚ της loop)
  // ΞΈΞ± διαβάσουμΡ την νΡα κατάσταση του tilt sensor. Άρα, Ξ· τωρινΞ� τιμΞ� ΞΈΞ± δΡίχνΡι
  // την προηγούμΡνη κατάσταση του σένσορα.
  prevTiltValue = tiltValue;
}




// Για τον tilt sensor
// https://learn.adafruit.com/tilt-sensor/using-a-tilt-sensor
// ΀ο Ξ­Ξ½Ξ± pin του tilt sensor το συνδέουμΡ στο ground ΞΊΞ±ΞΉ το άλλο στο pin 2.
// To pin που συνδέΡται στο pin 2, συνδέΡται Ρπίσης μέσω αντίστασης 10K στα 5 Volt.