Stap 2: Laten we vies - The Code
Dankzij Adafruit kunnen we onze slimme horloge erg snel opbouwen.
Btw. Als u niet zeker bent als uw i2C onderdelen kloppen aangepakt, gebruikt de i2C scanner, u vindt het hier:
http://Playground.Arduino.CC/Main/I2cScanner
Ik uitgevoerd verschillende weergaven als een klok (natuurlijk ;)) verkeer, versnelling, roll & toonhoogte van een breakout-spel, stappenteller (hier ik zal later terugkomen)
Eenvoudige start
Laten we beginnen, eerst inclusief sommige kop, je vindt ze in de Arduino library.
#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
Definieer de obj die we later gebruiken.
Adafruit_SSD1306 display(4);Adafruit_ADXL345_Unified accel = Adafruit_ADXL345_Unified(12345); Adafruit_BMP085 bmp; L3G4200D gyro;
Init alles wat we nodig
void setup() { display.begin(SSD1306_SWITCHCAPVCC, 0x3C); // adress display.clearDisplay(); // cls, clear screen Serial.begin(9600); // console output Serial1.begin(9600); // serial bluetooth output display.setTextSize(2); // define some display styles display.setTextColor(WHITE); Wire.begin(); gyro.enableDefault(); accel.begin(); accel.setRange(ADXL345_RANGE_16_G); }
Het netelige deel, het tellen van de tijd
Wij zullen alles verwerken in onze lus. Om berichten uit Serail1 (bluetooth) tellen van de tijd, het tonen van verschillende weergaven enz.
Vanwege dit, niet wij vertraging van een seconde en dan het verhogen van de tijd. We moeten reageren heel snel, als er een bericht weergegeven in afwachting van in de wachtrij van de serail1 of van de bewerkingstijd als berekening roll & toonhoogte, informatie weer te geven of het uitvoeren van de breakout-spel.
Dit leidt tot een dynamische vertragingstijd te verminderen de fout (elke berekening kosten cpu-tijd)
void loop() { int mydelay = 100; // get current milli seconds long mimi_start = millis(); long v = 0; bt_settings(); // check bluetooth queue clockTick(); // update periodontally if( counter == 0){ // update these function every second switch( show_screen ){ case CLOCK : renderClock(); break; case TEMP : show_temp(); break; case ACCEL : show_accel(); break; case GYRO : show_gyro(); break; } } // this function will be updated more often if( show_screen == PEDO ){ show_pedo(); } // the game will also be more often be updated if( show_screen == GAME1 ){ play_game_1(); } v = millis() - mimi_start; // dynamical delay calculation // wait const. 100 micro seconds // millis() will be reset after 50 days ! so we will get a delay if( v < 0 ){ mydelay = 100; } else if( v > 100 ){ mydelay = 0; count_error += v - 100; while( count_error > 100 ){ count_error -= 100; counter++; } } else{ mydelay = 100-v; } delay(mydelay); counter++; }
In feite, dat is het.
De bt_settings functie kan ook veel tijd kosten, dus we moeten behandelen die. In mijn geval ik sommige bewerkingen van de tekenreeks wilt instellen van de verschillende beeldschermen of de tijd instellen.
void bt_settings(){ if ( Serial1.available() ) { // if there is something in the queue, let's start long v1 = millis(); // we calculate our time error later long v2; BT_Text = Serial1.readString(); // some string operations v2 = (millis() - v1); while( v2 >= 100 ){ v2 -= 100; counter ++; // correct the time if necessary } } }
En tot slot de klok
void renderClock(){ display.setTextSize(2); display.clearDisplay(); display.setCursor(12,10); display.print( formatValue(std_) + ":" + formatValue(min_) + ":"+ formatValue(sec_) ); display.display(); }
Een helper functie
String formatValue( int v ){ String s = ""; if( v <10) s = "0"; s += String(v); return s; }
Einde? -