Created
April 3, 2017 12:52
-
-
Save mikrobitti-rakentelija/48fa64a0335c67a27a9c35cd4b2c3160 to your computer and use it in GitHub Desktop.
Mikrobitin automaattinen parkkikiekko - Parkkikiekon koodi
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/* | |
* MikroBitin automaattinen parkkikiekko | |
* | |
* Tunnistaa auton liikkeen yhdellä kiihtyvyysanturin | |
* akselilla ja näyttää pysähtymisajan ledirenkaan | |
* kellotaulussa. Ajan säilyttämiseen käytössä on | |
* RTC-kello. | |
* | |
* Tarvikkeet: | |
* ADXL335-kiihtyvyysanturi | |
* Arduino Nano | |
* DS1307 RTC-kello | |
* Ledirengas (WS2812B) | |
* | |
*/ | |
// Tarvittavat kirjastot | |
#include <FastLED.h> | |
#include <TimeLib.h> | |
#include <DS1307RTC.h> | |
// Ledirenkaan tarvitsemat vakiot | |
#define NUM_LEDS 24 // Ledien määrä | |
#define LED_DATA_PIN 2 // Datapinni | |
#define BRIGHTNESS 8 // Kirkkaus (maksimi 255) | |
#define LED_OFFSET 0 // Kello 12:n paikka | |
// Kiihtyvyysanturin tarvitsemat vakiot | |
#define xpin A0 | |
// Lista ledirenkaan väreille | |
CRGB leds[NUM_LEDS]; | |
// Muuttujat tilan ja pysähtymisajan ilmaisemiseen | |
int driving = 0; // Ajossa | |
int parking_hour = 0; // Pysähtymistunti | |
int parking_minute = 0; // Pysähtymisminuutti | |
/* | |
* Kiihtyvyysmittaus on kohinaista, joten auton liikettä | |
* ei voi tunnistaa suoraan mittauksesta. Keskiarvon | |
* perusteella muutoksen voi tunnistaa luotettavasti. | |
* Lasketaan keskiarvo 2000 mittauksen välein ja verrataan | |
* peräkkäisiä keskiarvoja. | |
*/ | |
long sum = 0; // Mittausten summa | |
int count = 0; // Mittausten lukumäärä | |
float average = 0; // Nykyinen keskiarvo | |
float average_prev = 0; // Edellinen keskiarvo | |
float average_diff = 0; // Nykyisen ja edellisen keskiarvon erotus | |
void setup() | |
{ | |
/** | |
* Alustetaan ledirengas. Parametrit ovat: | |
* WS2812B - Ledipiirin tyyppi | |
* LED_DATA_PIN - Ledien ohjauspinni | |
* GRB - Ledien valojärjestys, korjaa väärät värit | |
* leds - Lista, joka sisältää ledien värit | |
* NUM_LEDS - Ledien määrä | |
* BRIGHTNESS - Kirkkaus | |
*/ | |
FastLED.addLeds<WS2812B, LED_DATA_PIN, GRB>(leds, NUM_LEDS); | |
FastLED.setBrightness(BRIGHTNESS ); | |
/* | |
* Alustetaan kiihtyvyysanturin tarvitsevat analogiset pinnit | |
* sisääntuloiksi. Testiajojen perusteella mittauksen voi tunnistaa | |
* vaakasuuntaisista X- ja Y-akseleista, mutta ei pystysuuntaisesta | |
* Z-akselista | |
*/ | |
pinMode(xpin, INPUT); | |
/* | |
* Käsketään Arduinoa ottamaan kellonaika RTC-kellosta. Muista asettaa | |
* kello oikeaan aikaan Arduinon DS1307RTC-kirjaston SetTime-esimerkillä | |
*/ | |
setSyncProvider(RTC.get); | |
if (timeStatus() != timeSet) | |
Serial.println("Unable to sync with the RTC"); | |
else | |
Serial.println("RTC has set the system time"); | |
} | |
void loop() | |
{ | |
/* Luetaan X-akselin suuntainen kiihtyvyys ja lasketaan keskiarvoa | |
*/ | |
int x = analogRead(xpin); | |
sum = sum + x; | |
count = count + 1; | |
average = sum / count; | |
/* | |
* Tarkistetaan 2000 mittauksen (noin 20 sekunnin) välein | |
* onko ajoneuvo ajossa. | |
* | |
* Pysähtyminen tunnistetaan vertaamalla erosuuretta (average_diff) | |
* kokeilemalla löydettyyn vertailulukuun (3). | |
* | |
* Pysähtyessä talletetaan kellonaika ajan näyttämistä varten | |
*/ | |
if (count > 2000) { | |
average_diff = average - average_prev; | |
if (average_diff * average_diff > 3) | |
driving = 1; | |
else if (driving == 1) { | |
parking_hour = hour(); | |
parking_minute = minute(); | |
driving = 0; | |
} | |
// Talletetaan keskiarvo seuraavaa vertailua varten | |
average_prev = average; | |
// Nollataan keskiarvon laskemiseen tarvittavat muuttujat | |
count = 0; | |
sum = 0; | |
} | |
/* Ledejä ohjataan täyttämällä leds-lista halutuilla väreillä | |
* ja lähettämällä värit ledirenkaalle komennolla FastLED.show(); | |
* | |
* 1. Täytetään lista mustalla | |
* 2. Valaistaan halututut ledi ajan perusteella | |
* 3. Lähetetään ledirenkaalle | |
*/ | |
fill_solid(leds, NUM_LEDS, CRGB::Black); | |
if (driving) | |
show_current_time(hour(), minute()); | |
else | |
show_parking_time(parking_hour, parking_minute); | |
FastLED.show(); | |
/* | |
* Silmukka pyörii nopeasti, jotta lyhyetkin kiihtyvyyden | |
* muutokset saadaan talteen. | |
*/ | |
delay(10); | |
} | |
/* | |
* Lasketaan kellonaikaa vastaavat ledit ja asetetaan | |
* ledeille väri. Ajon aikana parkkikiekko toimii kellona | |
* näyttäen tuntia ja minuuttia. Pysähtyessä kiekko | |
* näyttää pysähtymisajasta seuraavan puolituntisen. | |
*/ | |
void show_current_time(int hour, int minute) { | |
int hour_led = (hour * 2 + LED_OFFSET) % NUM_LEDS; | |
int minute_led = int(NUM_LEDS * minute / 60) + LED_OFFSET % NUM_LEDS; | |
leds[minute_led] += CRGB::Green; | |
leds[hour_led] += CRGB::Red; | |
} | |
void show_parking_time(int hour, int minute){ | |
int parking_time_led = int(hour * 2 + minute / 30 + LED_OFFSET + 1) % NUM_LEDS; | |
leds[parking_time_led] += CRGB::Blue; | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment