极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 7466|回复: 7

OLED手表3

[复制链接]
发表于 2015-11-2 13:09:57 | 显示全部楼层 |阅读模式
在坛友叶斌的帮助下,第一版OLED的软件算是出来了,下面贴图先{:soso_e113:}

软件是参考http://www.instructables.com/id/ ... erature-Compass-An/修改的。

目前的情况是:1.秒数隔两秒才跳动一次;
                           
                         2.温度一直显示:211℃;

                         3.高度一直显示-626m,气压一直显示109076;

                         4.有时按多次按键画面都不能切换;有时按按键会熄屏;

                         5.不能调时间;

                         6.开机反应慢


下面放代码出来,本人不会编程,代码全是叶斌帮忙写的,他目前很忙,所有大家有空的话最好能帮忙改一下,谢谢![pre lang="arduino" line="1" file="原版代码"]
  1. [code][code][code][code]#include "Wire.h"
  2. #include "I2Cdev.h"
  3. #include "MPU6050.h"
  4. #include "U8glib.h"
  5. #include "Time.h"
  6. #include "HMC5883L.h"
  7. #include "Adafruit_BMP085.h"
  8. #include "avr/sleep.h"
  9. #include "avr/power.h"
  10. #include "avr/wdt.h"
  11. U8GLIB_SSD1306_128X64 u8g(U8G_I2C_OPT_NONE);

  12. #define NUMCOUNTB1 7
  13. #define NUMCOUNTB2 3
  14. #define NUMCOUNTB3 3
  15. #define NUMCOUNTB4 3
  16. #define NUMBOT1 350 //miliseconds to activate button 2
  17. #define NUM2 7
  18. #define NUM3 10
  19. #define NUM4 7
  20. #define NUM5 33000 //acc. for wlaking
  21. #define NUM6 46000 //acc. for running
  22. #define NUM7 1300 //acc. for running
  23. #define BOTAO 2
  24. #define KcalWalk 0.0392 // == (0,7 m/step) * (56kcal/km) / (1000 m)
  25. #define KcalRun 0.0544 // == (0,8 m/step) * (68kcal/km) / (1000 m)

  26. //BOTOES
  27. int BOTAO_01 = 0;
  28. int BOTAO_02 = 0;
  29. int BOTAO_03 = 0;
  30. int BOTAO_04 = 0;
  31. int BOTAO_05 = 0;
  32. long int timer_botao = 0;

  33. //BUSSOLA
  34. MPU6050 accelgyro;
  35. Adafruit_BMP085 bmp;
  36. HMC5883L compass;
  37. double error;
  38. int Z = -30;
  39. int k = 0;
  40. int y = 0;
  41. int16_t ax, ay, az;
  42. int16_t gx, gy, gz;
  43. int16_t mx, my, mz;
  44. unsigned long int PdXYZ[NUM3];
  45. unsigned long int PdXYZant;
  46. unsigned long int PdXYZat;
  47. unsigned long int PdXYZmax[NUM4];
  48. unsigned long int PdXYZmed;
  49. unsigned long int timerpasso = 0;
  50. unsigned long int passo = 0;
  51. unsigned long int activestep = 0;
  52. unsigned long int actstep = 0;
  53. boolean andando = false;
  54. boolean correndo = false;
  55. double calorie = 0;
  56. unsigned int KcalD[NUM2];
  57. unsigned int KcalMed;
  58. unsigned long int KcalT = 0;
  59. unsigned int stepD[NUM2];
  60. unsigned int stepMed;
  61. unsigned long int stepT = 0;
  62. boolean dayrefresh = false;
  63. boolean meiopasso = false;
  64. boolean active = false;
  65. unsigned long int timer_var1;
  66. unsigned long int timer_var2;
  67. unsigned long int timer_disp;
  68. unsigned long int timer_step;

  69. String str1;  //declaring string
  70. String str2;  //declaring string
  71. String str3;  //declaring string
  72. String str4;  //declaring string
  73. String str5;  //declaring string
  74. String str6;  //declaring string
  75. String str7;  //declaring string
  76. String str8;  //declaring string
  77. String str9;  //declaring string
  78. String str10;  //declaring string
  79. String str11;  //declaring string
  80. String str12;  //declaring string
  81. String str13;  //declaring string

  82. ISR(WDT_vect)
  83. {
  84. }

  85. void enterSleep(void)
  86. {
  87.   set_sleep_mode(SLEEP_MODE_PWR_DOWN);   /* EDIT: could also use SLEEP_MODE_PWR_SAVE */
  88.   sleep_enable();
  89.   /* Now enter sleep mode. */
  90.   sleep_mode();
  91.   sleep_disable(); /* First thing to do is disable sleep. */
  92.   power_all_enable();
  93. }

  94. void setup(void) {
  95.   pinMode(BOTAO, INPUT_PULLUP);
  96.   Wire.begin();
  97.   setTime(18, 28, 0, 21, 06, 2015);
  98.   accelgyro.initialize();
  99.   Wire.beginTransmission(0x68);
  100.   Wire.write(0x37);
  101.   Wire.write(0x02);
  102.   Wire.endTransmission();

  103.   Wire.beginTransmission(0x68);
  104.   Wire.write(0x6A);
  105.   Wire.write(0x00);
  106.   Wire.endTransmission();

  107.   //Disable Sleep Mode
  108.   Wire.beginTransmission(0x68);
  109.   Wire.write(0x6B);
  110.   Wire.write(0x00);
  111.   Wire.endTransmission();
  112.   compass = HMC5883L();
  113.   compass.SetScale(1.3);
  114.   error = compass.SetMeasurementMode(Measurement_Continuous);
  115.   if (!bmp.begin()) {
  116.     while (1) {}
  117.   }

  118.   //watchdog on
  119.   MCUSR &= ~(1 << WDRF);
  120.   WDTCSR |= (1 << WDCE) | (1 << WDE);
  121.   WDTCSR = 1 << WDP1; /* 32ms sleep */
  122.   WDTCSR |= _BV(WDIE);


  123.   //first readstr1 = String(hour()); //converting integer into a string
  124.   str6 = String((int)(bmp.readTemperature() - 2));
  125.   str6 = str6 + "*C";
  126.   str7 = String((long int)(bmp.readAltitude()));
  127.   str7 = str7 + " m";
  128.   str8 = String((long int)(bmp.readPressure()));
  129.   str9 = String((int)error);
  130.   str9 = str9 + "'";
  131.   if ((error > -23) && (error < 23)) str10 = "NT";
  132.   if ((error < -157) || (error > 157)) str10 = "SL";
  133.   if ((error > -113) && (error < -67)) str10 = "OE";
  134.   if ((error > 67) && (error < 113)) str10 = "LE";
  135.   if ((error >= -67) && (error <= -23)) str10 = "NO";
  136.   if ((error >= 23) && (error <= 67)) str10 = "NE";
  137.   if ((error >= -157) && (error <= -113)) str10 = "SO";
  138.   if ((error >= 113) && (error <= 157)) str10 = "SE";
  139.   steps();
  140.   str11 = String(passo);
  141.   str12 = String((int)calorie);
  142.   str13 = String((int)(((double)passo) * 0.75));
  143. }

  144. void loop(void) {
  145.   enterSleep();
  146.   if (!digitalRead(BOTAO)) {
  147.     timer_botao =  millis();
  148.     while (!digitalRead(BOTAO)) {
  149.       //wait
  150.       delay(1);
  151.     }
  152.     if ((millis() - timer_botao) > NUMBOT1) {
  153.       BOTAO_02++;
  154.     } else {
  155.       if (BOTAO_02 > 0) {
  156.         switch (BOTAO_02) {
  157.           case 4:
  158.             setTime(hour(), minute(), second(), day() + 1, month(), year());
  159.             break;
  160.           case 5:
  161.             setTime(hour(), minute(), second(), day(), month() + 1, year());
  162.             break;
  163.           case 6:
  164.             if (year() < 2020) setTime(hour(), minute(), second(), day(), month(), year() + 1);
  165.             else setTime(hour(), minute(), second(), day(), month(), 2015);
  166.             break;
  167.           case 3:
  168.             setTime(hour() + 1, minute(), second(), day(), month(), year());
  169.             break;
  170.           case 2:
  171.             setTime(hour(), minute() + 1, second(), day(), month(), year());
  172.             break;
  173.           case 1:
  174.             setTime(hour(), minute(), second() + 1, day(), month(), year());
  175.             break;
  176.           case 7:
  177.             BOTAO_02 = 0;
  178.             break;
  179.         }
  180.       } else {
  181.         BOTAO_01++;
  182.       }
  183.     }
  184.   }

  185.   switch (BOTAO_01) {
  186.     case 0:
  187.       BOTAO_02 = 0;
  188.       break;
  189.     case 1:
  190.       if ((millis() - timer_var1) > 500) {
  191.         str1 = String(hour()); //converting integer into a string
  192.         str2 = String(minute()); //converting integer into a string
  193.         str3 = String(second()); //converting integer into a string
  194.         if (second() < 10) str3 = "0" + str3;
  195.         if (minute() < 10) str2 = "0" + str2;
  196.         if (hour() < 10) str1 = "0" + str1;
  197.         str4 = str1 + ":" + str2 + ":" + str3;

  198.         str1 = String(day());
  199.         str2 = String(month());
  200.         str3 = String(year());
  201.         if (day() < 10) str1 = "0" + str1;
  202.         if (month() < 10) str2 = "0" + str2;
  203.         str5 = str1 + "/" + str2 + "/" + str3;
  204.         timer_var1 = millis();
  205.         if (BOTAO_02 >= NUMCOUNTB1) BOTAO_02 = 0;
  206.       }
  207.     case 2:
  208.       if ((millis() - timer_var2) > 5000) {
  209.         str6 = String((int)(bmp.readTemperature() - 2));
  210.         str6 = str6 + "*C";
  211.         str7 = String((long int)(bmp.readAltitude()));
  212.         str7 = str7 + " m";
  213.         str8 = String((long int)(bmp.readPressure()));
  214.         timer_var2 = millis();
  215.       }
  216.       break;
  217.     case 3:
  218.       if ((millis() - timer_var2) > 100) {
  219.         leitura();
  220.         str9 = String((int)error);
  221.         str9 = str9 + "'";
  222.         if ((error > -23) && (error < 23)) str10 = "NT";
  223.         if ((error < -157) || (error > 157)) str10 = "SL";
  224.         if ((error > -113) && (error < -67)) str10 = "OE";
  225.         if ((error > 67) && (error < 113)) str10 = "LE";
  226.         if ((error >= -67) && (error <= -23)) str10 = "NO";
  227.         if ((error >= 23) && (error <= 67)) str10 = "NE";
  228.         if ((error >= -157) && (error <= -113)) str10 = "SO";
  229.         if ((error >= 113) && (error <= 157)) str10 = "SE";
  230.         timer_var2 = millis();
  231.       }
  232.       break;
  233.     case 4:
  234.       if ((millis() - timer_var2) > 1000) {
  235.         steps();
  236.         str11 = String(passo);
  237.         str12 = String((int)calorie);
  238.         str13 = String((int)(((double)passo) * 0.75));
  239.         timer_var2 = millis();
  240.       }
  241.       break;
  242.     case 5:
  243.       BOTAO_01 = 0;
  244.       break;
  245.   }

  246.   if ((millis() - timer_disp) > 500) {
  247.     u8g.firstPage();
  248.     do {
  249.       draw();
  250.       u8g.setColorIndex(1);
  251.     } while ( u8g.nextPage() );
  252.     timer_disp = millis();
  253.   }

  254.   pedometer();
  255.   delay(20);
  256. }

  257. void leitura()
  258. {
  259.   MagnetometerScaled scaled = compass.ReadScaledAxis();
  260.   error = atan2(scaled.YAxis, scaled.XAxis);
  261.   error = error - 2.094; //correction on error
  262.   error = error * 180 / M_PI;
  263.   if (error < -180) error = 360 + error; //correction again
  264.   accelgyro.getMotion6(&ax, &ay, &az, &gx, &gy, &gz);
  265.   ax = abs(ax);
  266.   ay = abs(ay);
  267.   az = abs(az);
  268. }


  269. void draw(void) {
  270.   char b[20];

  271.   switch (BOTAO_01) {
  272.     case 0:
  273.       BOTAO_02 = 0;
  274.       break;
  275.     case 1:
  276.       u8g.drawLine(0, 0, 127, 0);
  277.       u8g.drawLine(0, 23, 127, 23);
  278.       u8g.drawLine(127, 0, 127, 63);
  279.       u8g.drawLine(127, 63, 0, 63);
  280.       u8g.drawLine(0, 63, 0, 0);
  281.       u8g.setFont(u8g_font_fub11r);
  282.       str5.toCharArray(b, 11);
  283.       u8g.drawStr( 11, 20, b);
  284.       str4.toCharArray(b, 11);
  285.       u8g.drawStr( 24, 50, b);
  286.       switch (BOTAO_02) {
  287.         case 4: u8g.drawLine(10, 2, 35, 2);
  288.           break;
  289.         case 5: u8g.drawLine(40, 2, 67, 2);
  290.           break;
  291.         case 6: u8g.drawLine(75, 2, 116, 2);
  292.           break;
  293.         case 3: u8g.drawLine(25, 33, 48, 33);
  294.           break;
  295.         case 2: u8g.drawLine(53, 33, 77, 33);
  296.           break;
  297.         case 1: u8g.drawLine(80, 33, 105, 33);
  298.           break;
  299.       }
  300.       break;
  301.     case 2:
  302.       u8g.drawLine(0, 0, 127, 0);
  303.       u8g.drawLine(0, 22, 127, 22);
  304.       u8g.drawLine(0, 42, 127, 42);
  305.       u8g.drawLine(127, 0, 127, 63);
  306.       u8g.drawLine(127, 63, 0, 63);
  307.       u8g.drawLine(0, 63, 0, 0);
  308.       u8g.drawStr( 2, 18, "Temp:");
  309.       u8g.drawStr( 2, 40, "Altd:");
  310.       u8g.drawStr( 2, 60, "Pres:");
  311.       str6.toCharArray(b, 11);
  312.       u8g.drawStr(68, 18, b);
  313.       str7.toCharArray(b, 11);
  314.       u8g.drawStr(68, 40, b);
  315.       str8.toCharArray(b, 11);
  316.       u8g.drawStr(68, 60, b);
  317.       break;
  318.     case 3:
  319.       u8g.drawLine(0, 0, 127, 0);
  320.       u8g.drawLine(0, 32, 75, 32);
  321.       u8g.drawLine(127, 0, 127, 63);
  322.       u8g.drawLine(127, 63, 0, 63);
  323.       u8g.drawLine(0, 63, 0, 0);
  324.       u8g.drawLine(75, 0, 75, 63);
  325.       str10.toCharArray(b, 11);
  326.       u8g.drawStr( 24, 24, b);
  327.       str9.toCharArray(b, 11);
  328.       u8g.drawStr( 15, 56, b);
  329.       u8g.drawCircle(100, 32, 20);
  330.       u8g.drawLine(100, 32, 100 - (20 * sin(error * PI / 180)), 32 - (20 * cos(error * PI / 180)));
  331.       break;
  332.     case 4:
  333.       u8g.drawLine(0, 0, 127, 0);
  334.       u8g.drawLine(0, 22, 127, 22);
  335.       u8g.drawLine(0, 42, 127, 42);
  336.       u8g.drawLine(127, 0, 127, 63);
  337.       u8g.drawLine(127, 63, 0, 63);
  338.       u8g.drawLine(0, 63, 0, 0);
  339.       u8g.drawStr( 2, 18, "Step:");
  340.       u8g.drawStr( 2, 40, "Kcal:");
  341.       u8g.drawStr( 2, 60, "Mts:");
  342.       str11.toCharArray(b, 11);
  343.       u8g.drawStr(65, 18, b);
  344.       str12.toCharArray(b, 11);
  345.       u8g.drawStr(65, 40, b);
  346.       str13.toCharArray(b, 11);
  347.       u8g.drawStr(65, 60, b);
  348.       break;
  349.   }
  350. }

  351. void pedometer() {
  352.   int m = 0;

  353.   PdXYZ[k] = abs((signed long int) (ax)) + abs((signed long int) (ay)) + abs((signed long int) (az));
  354.   PdXYZant = PdXYZat;
  355.   PdXYZat = PdXYZ[k];

  356.   if (k == (NUM3 - 1)) {
  357.     PdXYZmax[y] = 0;
  358.     for (m = 0; m < NUM3; m++) {
  359.       if (PdXYZmax[y] < PdXYZ[m]) {
  360.         PdXYZmax[y] = PdXYZ[m];
  361.       }
  362.     }
  363.   }
  364.   if (y == (NUM4 - 1)) {
  365.     PdXYZmed = 0;
  366.     for (m = 0; m < NUM4; m++) {
  367.       PdXYZmed = PdXYZmed + PdXYZmax[m] / NUM4;
  368.     }
  369.   }

  370.   if (PdXYZmed > NUM5) {
  371.     if (PdXYZmed > NUM6) {
  372.       correndo = true;
  373.       andando = false;
  374.     } else {
  375.       correndo = false;
  376.       andando = true;
  377.     }
  378.     if ((PdXYZat > (PdXYZant + NUM7)) && (!meiopasso)) {
  379.       meiopasso = true;
  380.       timerpasso = millis();
  381.     }
  382.     if ((PdXYZat < (PdXYZant - NUM7)) && (meiopasso)) {
  383.       activestep++;
  384.       if ((millis() - timer_step) >= 10000) {
  385.         if ((activestep - actstep) >= 10) {
  386.           if (!active) {
  387.             active = true;
  388.             passo = passo + (activestep - actstep);
  389.             calorie = calorie + (correndo * KcalRun + andando * KcalWalk) * (activestep - actstep);
  390.           }
  391.           active = true;
  392.         }
  393.         else {
  394.           active = false;
  395.         }
  396.         actstep = activestep;
  397.         timer_step = millis();
  398.       }
  399.       if (active) {
  400.         passo++;
  401.         calorie = calorie + correndo * KcalRun + andando * KcalWalk;
  402.       }
  403.       meiopasso = false;
  404.     }
  405.   } else {
  406.     correndo = false;
  407.     andando = false;
  408.   }

  409.   if ((millis() - timerpasso) >= 1000) {
  410.     meiopasso = false;
  411.     correndo = false;
  412.     andando = false;
  413.   }

  414.   k++;
  415.   if (k >= NUM3) k = 0;
  416.   y++;
  417.   if (y >= NUM4) y = 0;
  418. }

  419. void steps() {
  420.   int m = 0;

  421.   if (hour() > 1) dayrefresh = true;
  422.   if ((hour() == 0) && (minute() == 0) && (dayrefresh)) {
  423.     for (m = 0; m < (NUM2 - 1); m++) {
  424.       KcalD[m] = KcalD[m + 1];
  425.       stepD[m] = stepD[m + 1];
  426.     }
  427.     KcalD[NUM2] = calorie;
  428.     KcalMed = 0;
  429.     stepMed = 0;
  430.     for (m = 0; m < NUM2; m++) {
  431.       KcalMed = KcalMed + KcalD[m] / NUM2;
  432.       stepMed = stepMed + stepD[m] / NUM2;
  433.     }
  434.     stepT = stepT + passo;
  435.     KcalT = KcalT + calorie;
  436.     calorie = 0;
  437.     stepD[NUM2] = passo;
  438.     passo = 0;
  439.     dayrefresh = false;
  440.   }
  441. }
复制代码
[/code][/code][/code][/code][/code]

这个是原版的代码


下面是叶斌修改之后的代码:
/*
reference URL:
oled Watch1: http://geek-workshop.com/forum.p ... &highlight=oled
oled watch2: http://geek-workshop.com/forum.p ... &highlight=oled
original code: http://geek-workshop.com/home.ph ... mp;touid=35816#last
how to Choose the u8glib font :https://code.google.com/p/u8glib/wiki/tstring
NOTE:
add DS3231
add DHT11 humidity
not use D218B20 because the DHT11 and DS3231, and BMP085 can also measure the tmeperature
important: NOTE: i think that i should add my DHT11's humaduty in Draw function's case 2
*/
#include "U8glib.h"
#include "DHT11.h"
#include "I2Cdev.h" // if you get the I2Cdev.h , you could use the BMP085 directly
#include "HMC5883L.h"
#include "DS3231.h"
#include "Wire.h"
#include "Adafruit_BMP085.h"
#include "avr/sleep.h"
#include "avr/power.h"
#include "avr/wdt.h"


U8GLIB_SSD1306_128X64 u8g(U8G_I2C_OPT_NONE);
int dhtPin = 10;
DHT11 dht11(dhtPin);
//========定义时钟需要的各种变量========
DS3231 Clock;
HMC5883L compass;
Adafruit_BMP085 bmp;

//-------set font Large、Middle、Small
#define setFont_L u8g.setFont(u8g_font_7x13)
#define setFont_M u8g.setFont(u8g_font_fixed_v0r)
#define setFont_S u8g.setFont(u8g_font_chikitar)

#define BOTAO 13  // digital Pin 2, maybe it is a wakeup button
#define DHT11PIN 10

#define NUMCOUNTB1 7
#define NUMCOUNTB2 3
#define NUMCOUNTB3 3
#define NUMCOUNTB4 3
#define NUMBOT1 350 //miliseconds to activate button 2
#define NUM2 7
#define NUM3 10
#define NUM4 7
#define NUM5 33000 //acc. for wlaking
#define NUM6 46000 //acc. for running
#define NUM7 1300 //acc. for running

//BOTOES BOTOES is a brazil word , which means button
int BOTAO_01 = 0;
int BOTAO_02 = 0; // this variable is for settup time, when BOTAO_02 is increase 7, it will be settup 0
int BOTAO_03 = 0;
int BOTAO_04 = 0;
int BOTAO_05 = 0;
int second, minute, hour, date, dow, month, year;
double error;
long int timer_botao = 0;

int err;
float temp, humi;

bool Century = false;
bool h12;
bool PM;

byte ADay, AHour, AMinute, ASecond, ABits;
bool ADy, A12h, Apm;

unsigned long int timer_var1;
unsigned long int timer_var2;
unsigned long int timer_disp;

String str1;  //declaring string
String str2;  //declaring string
String str3;  //declaring string
String str4;  //declaring string
String str5;  //declaring string
String str6;  //declaring string
String str7;  //declaring string
String str8;  //declaring string
String str9;  //declaring string
String str10;  //declaring string
String str11;  //declaring string
String str12;  //declaring string
String str13 = "YeBin";  //declaring string
String str14;
String str15;
String str16;

ISR(WDT_vect)
{
}

void enterSleep(void)
{
  set_sleep_mode(SLEEP_MODE_PWR_DOWN);   /* EDIT: could also use SLEEP_MODE_PWR_SAVE */
  sleep_enable();
  /* Now enter sleep mode. */
  sleep_mode();
  sleep_disable(); /* First thing to do is disable sleep. */
  power_all_enable();
}

void setup(void) {
  pinMode(BOTAO,INPUT);
  Wire.begin();
  Clock.setSecond(50);
  Clock.setMinute(05);
  Clock.setHour(11);
  Clock.setDoW(7);
  Clock.setDate(01);
  Clock.setMonth(11);
  Clock.setYear(15);
  Clock.setClockMode(true);

  compass = HMC5883L();
  compass.SetScale(1.3);
  error = compass.SetMeasurementMode(Measurement_Continuous);
  if (!bmp.begin()) {
    while (1) {}
  }

  //watchdog on
  MCUSR &= ~(1 << WDRF);
  WDTCSR |= (1 << WDCE) | (1 << WDE);
  WDTCSR = 1 << WDP1; /* 32ms sleep */
  WDTCSR |= _BV(WDIE);


  //first readstr1 = String(hour()); //converting integer into a string
  str6 = String((int)(bmp.readTemperature() - 2));
  str6 = str6 + "*C";
  str7 = String((long int)(bmp.readAltitude()));
  str7 = str7 + " m";
  str8 = String((long int)(bmp.readPressure()));
  str9 = String((int)error);
  str9 = str9 + "'";
  if ((error > -23) && (error < 23)) str10 = "NT";
  if ((error < -157) || (error > 157)) str10 = "SL";
  if ((error > -113) && (error < -67)) str10 = "OE";
  if ((error > 67) && (error < 113)) str10 = "LE";
  if ((error >= -67) && (error <= -23)) str10 = "NO";
  if ((error >= 23) && (error <= 67)) str10 = "NE";
  if ((error >= -157) && (error <= -113)) str10 = "SO";
  if ((error >= 113) && (error <= 157)) str10 = "SE";
  //steps();
  //str11 = String(passo); // passo means step
  //str12 = String((int)calorie); // calorie means
  //str13 = String((int)(((double)passo) * 0.75));

}

void loop(void) {
  enterSleep();
  if (digitalRead(BOTAO))
  {
    timer_botao = millis();
    while (!digitalRead(BOTAO))
    {
      //wait
      delay(1);
    }
  
  /************************************ if ((millis() - timer_botao) > NUMBOT1) ***************************************/
  if ((millis() - timer_botao) > NUMBOT1)  // NUMBOT1's value is 350 millisecond which mean you should press you button until 350 millisecond
  {
    BOTAO_02++;
  }
  else
  {
    if (BOTAO_02 > 0) { //BOTAO_02 variable is for setting time
      switch (BOTAO_02) {
        case 4:
          //setTime(hour(), minute(), second(), day() + 1, month(), year());
          Clock.setDate(Clock.getDate() + 1);
          break;
        case 5:
          //setTime(hour(), minute(), second(), day(), month() + 1, year());
          Clock.setMonth(Clock.getMonth(Century) + 1);
          break;
        case 6:
          if (Clock.getYear() < 2020)
            //setTime(hour(), minute(), second(), day(), month(), year() + 1);
            Clock.setYear(Clock.getYear() + 1);
          else
            //setTime(hour(), minute(), second(), day(), month(), 2015);
            Clock.setYear(2015);
          break;
        case 3:
          //setTime(hour() + 1, minute(), second(), day(), month(), year());
          Clock.setHour(Clock.getHour(h12, PM) + 1);
          break;
        case 2:
          //setTime(hour(), minute() + 1, second(), day(), month(), year());
          Clock.setMinute(Clock.getMinute() + 1);
          break;
        case 1:
          //setTime(hour(), minute(), second() + 1, day(), month(), year());
          Clock.setSecond(Clock.getSecond() + 1);
          break;
        case 7:
          BOTAO_02 = 0;
          break;
      }
    } else {
      BOTAO_01++;
    }
  }
  /************************************ if ((millis() - timer_botao) > NUMBOT1) ***************************************/
  }
  /************************************ if (!digitalRead(BOTAO)) ***************************************/

  /************************************ switch (BOTAO_01)  ***************************************/
  switch (BOTAO_01) {
    case 0:
      BOTAO_02 = 0;
      break;
    case 1: // here for time display setup
      if ((millis() - timer_var1) > 500) {
        str1 = String(Clock.getHour(h12, PM)); //converting integer into a string
        str2 = String(Clock.getMinute()); //converting integer into a string
        str15 = String(Clock.getSecond()); //converting integer into a string
        if (Clock.getSecond() < 10) str3 = "0" + str3;
        if (Clock.getMinute() < 10) str2 = "0" + str2;
        if (Clock.getHour(h12, PM) < 10) str1 = "0" + str1;
        str4 = str1 + ":" + str2;
        str16 = ":" + str15;

        str1 = String(Clock.getYear());
        str2 = String(Clock.getMonth(Century));
        str3 = String(Clock.getDate());
        str14 = String(Clock.getDoW());
        
        if (Clock.getDate() < 10) str1 = "0" + str1;
        if (Clock.getMonth(Century) < 10) str2 = "0" + str2;
        str5 ="2" + str1 + "." + str2 + "." + str3;
        timer_var1 = millis();
        if (BOTAO_02 >= NUMCOUNTB1) BOTAO_02 = 0;
      }
    case 2: // here for temperature altitude and pressure display setup
      if ((millis() - timer_var2) > 5000) {
        str6 = String((int)(bmp.readTemperature() - 2));
        str6 = str6 + "*C";
        str7 = String((long int)(bmp.readAltitude()));
        str7 = str7 + " m";
        str8 = String((long int)(bmp.readPressure()));
        timer_var2 = millis();
      }
      break;
    case 3: // here is for compass display setup
      if ((millis() - timer_var2) > 100) {
        leitura();
        str9 = String((int)error);
        str9 = str9 + "'";
        if ((error > -23) && (error < 23)) str10 = "NT";
        if ((error < -157) || (error > 157)) str10 = "SL";
        if ((error > -113) && (error < -67)) str10 = "OE";
        if ((error > 67) && (error < 113)) str10 = "LE";
        if ((error >= -67) && (error <= -23)) str10 = "NO";
        if ((error >= 23) && (error <= 67)) str10 = "NE";
        if ((error >= -157) && (error <= -113)) str10 = "SO";
        if ((error >= 113) && (error <= 157)) str10 = "SE";
        timer_var2 = millis();
      }
      break;

    case 4:
      if ((millis() - timer_var2) > 1000) {
        if ((err = dht11.read(humi, temp)) == 0)
        {
          str11 = String((int)temp);
          str11 = str11 + "*C";
          str12 = String((int)humi);
          str12 = str12 + "%";
        }
        else
        {
          str11 = "Error Read";
          str12 = "Error Read";
          str13 = "DTH11 Read";
        }

        /*
        steps();
        str11 = String(passo);
        str12 = String((int)calorie);
        str13 = String((int)(((double)passo) * 0.75));
        */
        timer_var2 = millis();
      }
      break;
    case 5:
      BOTAO_01 = 0;
      break;
  }

  /************************************ switch (BOTAO_01)  ***************************************/

  if ((millis() - timer_disp) > 500) {
    u8g.firstPage();
    do {
      draw();
      u8g.setColorIndex(1);
    } while ( u8g.nextPage() );
    timer_disp = millis();
  }

  delay(20);
}
/****************************** loop ********* loop ************** loop **************************/

//======definded Draw function======

void draw(void) {
  char b[20];

switch (BOTAO_01) {
    case 0:
      BOTAO_02 = 0;
      break;
    case 1:
      
      
      u8g.setFont(u8g_font_freedoomr25n);
      str4.toCharArray(b, 10);
      u8g.drawStr( 10, 60, b);
      
      u8g.setFont(u8g_font_gdr10);
      str16.toCharArray(b, 102);
      u8g.drawStr( 102, 58, b);
      
      str5.toCharArray(b, 10);
      u8g.drawStr( 10, 18, b);
      
      str14.toCharArray(b, 110);
      u8g.drawStr( 110, 18, b);
      
      switch (BOTAO_02) {
        case 4: u8g.drawLine(10, 2, 35, 2);
          break;
        case 5: u8g.drawLine(40, 2, 67, 2);
          break;
        case 6: u8g.drawLine(75, 2, 116, 2);
          break;
        case 3: u8g.drawLine(25, 33, 48, 33);
          break;
        case 2: u8g.drawLine(53, 33, 77, 33);
          break;
        case 1: u8g.drawLine(80, 33, 105, 33);
          break;
      }
      break;
    case 2: // NOTE: i think that i should add my DHT11's humaduty here
      u8g.drawLine(0, 0, 127, 0);
      u8g.drawLine(0, 22, 127, 22);
      u8g.drawLine(0, 42, 127, 42);
      u8g.drawLine(127, 0, 127, 63);
      u8g.drawLine(127, 63, 0, 63);
      u8g.drawLine(0, 63, 0, 0);
      u8g.drawStr( 2, 18, "Temp:");
      u8g.drawStr( 2, 40, "Altd:");
      u8g.drawStr( 2, 60, "res:");
      str6.toCharArray(b, 11);
      u8g.drawStr(68, 18, b);
      str7.toCharArray(b, 11);
      u8g.drawStr(68, 40, b);
      str8.toCharArray(b, 11);
      u8g.drawStr(68, 60, b);
      break;
    case 3:  //draw the HMC5883L information
      u8g.drawLine(0, 0, 127, 0);
      u8g.drawLine(0, 32, 75, 32);
      u8g.drawLine(127, 0, 127, 63);
      u8g.drawLine(127, 63, 0, 63);
      u8g.drawLine(0, 63, 0, 0);
      u8g.drawLine(75, 0, 75, 63);
      str10.toCharArray(b, 11);
      u8g.drawStr( 24, 24, b);
      str9.toCharArray(b, 11);
      u8g.drawStr( 15, 56, b);
      u8g.drawCircle(100, 32, 20);
      u8g.drawLine(100, 32, 100 - (20 * sin(error * PI / 180)), 32 - (20 * cos(error * PI / 180)));
      break;
    case 4:
      u8g.drawLine(0, 0, 127, 0);
      u8g.drawLine(0, 22, 127, 22);
      u8g.drawLine(0, 42, 127, 42);
      u8g.drawLine(127, 0, 127, 63);
      u8g.drawLine(127, 63, 0, 63);
      u8g.drawLine(0, 63, 0, 0);
      u8g.drawStr( 2, 18, "Temp:");
      u8g.drawStr( 2, 40, "Humi:");
      u8g.drawStr( 2, 60, "Info:");
      str6.toCharArray(b, 11);
      u8g.drawStr(68, 18, b);
      str12.toCharArray(b, 11);
      u8g.drawStr(65, 40, b);
      str13.toCharArray(b, 11);
      u8g.drawStr(65, 60, b);
      break;
  }
}


void leitura() //get the HMC5883L information
{
  MagnetometerScaled scaled = compass.ReadScaledAxis();
  error = atan2(scaled.YAxis, scaled.XAxis);
  error = error - 2.094; //correction on error
  error = error * 180 / M_PI;
  if (error < -180) error = 360 + error; //correction again
  //accelgyro.getMotion6(&ax, &ay, &az, &gx, &gy, &gz);
  //ax = abs(ax);
  //ay = abs(ay);
  //az = abs(az);
}

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回复

使用道具 举报

发表于 2015-11-2 14:14:32 | 显示全部楼层
这么好的帖怎么没人赞呢
回复 支持 反对

使用道具 举报

发表于 2015-11-2 15:54:43 | 显示全部楼层
很棒的帖子,鼓励下!
回复 支持 反对

使用道具 举报

发表于 2015-11-2 16:24:49 | 显示全部楼层
秒数总是2秒钟跳一次,可能延时有问题

回复 支持 反对

使用道具 举报

发表于 2015-11-2 16:35:58 | 显示全部楼层
你的指南针用的是陀螺仪还是?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-11-2 20:32:36 | 显示全部楼层
suoma 发表于 2015-11-2 16:35
你的指南针用的是陀螺仪还是?

用的是hmc5883l
回复 支持 反对

使用道具 举报

发表于 2015-12-1 19:29:59 | 显示全部楼层
我怎么 编译不过去啊  求指教  
回复 支持 反对

使用道具 举报

发表于 2016-9-6 19:09:26 | 显示全部楼层
time.h是什么啊
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则 需要先绑定手机号

Archiver|联系我们|极客工坊

GMT+8, 2024-3-29 18:54 , Processed in 0.045117 second(s), 24 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表