Flora SmartWatch (2 / 3 steg)
Steg 2: Låt oss få smutsiga - The Code
Tack vare Adafruit kan vi bygga upp våra smart Watch-klocka mycket snabbt.
Btw. om du är osäker på om din i2C komponenter är rätt upp, använda i2C skannern hittar du det här:
http://Playground.Arduino.cc/main/I2cScanner
Jag genomfört olika vyer som en klocka (naturligtvis ;)) rörelse, acceleration, rulla & pitch en breakout spel, stegräknare (här jag kommer tillbaka senare)
Enkel start
Så låt oss börja, först ta med några huvud, du hittar dem i Arduino biblioteket.
#include SPI.h
#include Wire.h
#include Adafruit_GFX.h
#include Adafruit_SSD1306.h
#include L3G4200D.h
#include Adafruit_Sensor.h
#include Adafruit_ADXL345_U.h
#include Adafruit_BMP085.h
Definiera obj använder vi senare.
Adafruit_SSD1306 display(4);
Adafruit_ADXL345_Unified accel = Adafruit_ADXL345_Unified(12345);
Adafruit_BMP085 bmp;
L3G4200D gyro;
Init allt vi behöver
void setup() {
display.BEGIN (SSD1306_SWITCHCAPVCC, 0x3C); Adress
display.clearDisplay(); CLS, tydlig skärm
Serial.BEGIN(9600); Console output
Serial1.BEGIN(9600); seriella bluetooth-utgång
display.setTextSize(2); definiera vissa vyformat
display.setTextColor(WHITE);
Wire.BEGIN();
gyro.enableDefault();
Accel.BEGIN();
accel.setRange(ADXL345_RANGE_16_G);
}
Den svåra biten, tid räknar
I våra loop kommer vi behandla allt. Att få meddelanden från Serail1 (bluetooth) räknar tid, Visa olika vyer etc.
Därför brukar vi fördröja en sekund och sedan öka tiden. Vi måste reagera ganska snabbt, om det finns ett meddelande väntar i serail1 kön eller drift tid som beräkningen roll & pitch, visning av information eller köra breakout spelet.
Detta leder till en dynamisk fördröjning att minska felet (varje beräkning kostnader cpu-tid)
void loop() {
int mydelay = 100;
få aktuella milli sekunder
lång mimi_start = millis();
lång v = 0;
bt_settings(); bluetooth kö
clockTick(); uppdatera periodontally
om (counter == 0) {/ / uppdatera dessa fungerar varje sekund
växel (show_screen) {
i mål klockan: renderClock(); bryta;
fallet TEMP: show_temp(); bryta;
fall ACCEL: show_accel(); bryta;
fall GYRO: show_gyro(); bryta;
}
}
denna funktion kommer att uppdateras oftare
om (show_screen == PEDO) {
show_pedo();
}
spelet blir också mer ofta uppdateras
om (show_screen == GAME1) {
play_game_1();
}
v = millis() - mimi_start;
dynamiska dröjsmål beräkning
vänta const. 100 mikro sekunder
Millis() kommer att återställas efter 50 dagar! så vi kommer att få en fördröjning
om (v < 0) {
mydelay = 100;
}
annars om (v > 100) {
mydelay = 0;
count_error += v - 100.
samtidigt (count_error > 100) {
count_error-= 100.
räknaren ++;
}
}
annat {
mydelay = 100-v;
}
Delay(mydelay);
räknaren ++;
}
Det är faktiskt det.
Funktionen bt_settings kan också kosta mycket tid så vi måste hantera detta. I mitt fall göra jag några strängoperationer för att ange olika skärmar eller ställa in tiden.
void bt_settings() {
om (Serial1.available()) {/ / om det finns något i kön, låt oss börja
långa v1 = millis(); beräknar vi vår tid fel senare
långa v2;
BT_Text = Serial1.readString();
vissa strängåtgärder
v2 = (millis() - v1);
medan (v2 > = 100) {
v2-= 100.
räknaren ++; rätta tiden om nödvändigt
}
}
}
Och slutligen klockan
void renderClock() {
display.setTextSize(2);
display.clearDisplay();
display.setCursor(12,10);
display.Print (formatValue(std_) + ":" + formatValue(min_) + ":" + formatValue(sec_));
display.display();
}
En hjälpare funktion
Sträng formatValue (int v) {
Sträng s = "";
om (v < 10) s = "0";
s += String(v);
returnera s;
}
Slutet? -