Étape 2: Let's get dirty - le Code
Grâce à Adafruit, nous pouvons bâtir notre montre intelligente très rapide.
Btw. Si vous ne savez pas si votre i2C composants conviennent adressée, utiliser l’analyseur i2C vous le trouverez ici :
http://Playground.Arduino.cc/main/I2cScanner
J’ai mis en place différents points de vue comme une horloge (bien sûr;)) mouvement, acceleration, roll & pitch un podomètre de jeu, de petits groupes (ici je reviendrai plus tard)
Démarrage simple
Commençons donc, tout d’abord inclure certains en-tête, vous les trouverez dans la bibliothèque de l’Arduino.
#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
Définir l’obj que nous utilisons plus tard.
Adafruit_SSD1306 display(4);Adafruit_ADXL345_Unified accel = Adafruit_ADXL345_Unified(12345); Adafruit_BMP085 bmp; L3G4200D gyro;
Init tout ce dont nous avons besoin
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); }
La partie la plus délicate, comptage de temps
Dans notre boucle, nous traiterons tout. Recevoir des messages de Serail1 (bluetooth) compter le temps, afficher différentes vues etc.
Pour cette raison, nous ne sera pas retarder une seconde et puis augmenter le temps. Nous devons réagir assez rapidement, s’il y a un message en attente dans la file d’attente de serail1 ou de durée de fonctionnement comme calcul rouleau & pitch, affichage d’informations ou de lancer le jeu breakout.
Cela conduit à un temps de retard dynamique afin de réduire l’erreur (chaque calcul coûts cpu fois)
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++; }
En fait, c’est tout.
La fonction bt_settings peut aussi coûter beaucoup de temps alors que nous devons gérer cela. Dans mon cas, je fais quelques opérations de chaîne pour définir différents affichages ou régler l’heure.
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 } } }
Et enfin l’horloge
void renderClock(){ display.setTextSize(2); display.clearDisplay(); display.setCursor(12,10); display.print( formatValue(std_) + ":" + formatValue(min_) + ":"+ formatValue(sec_) ); display.display(); }
Une fonction d’assistance
String formatValue( int v ){ String s = ""; if( v <10) s = "0"; s += String(v); return s; }
Fin ? -