Skip to content

Instantly share code, notes, and snippets.

@mikrobitti-rakentelija
Created April 3, 2017 12:52
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save mikrobitti-rakentelija/48fa64a0335c67a27a9c35cd4b2c3160 to your computer and use it in GitHub Desktop.
Save mikrobitti-rakentelija/48fa64a0335c67a27a9c35cd4b2c3160 to your computer and use it in GitHub Desktop.
Mikrobitin automaattinen parkkikiekko - Parkkikiekon koodi
/*
* 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