雨轩 发表于 2015-11-2 13:09:57

OLED手表3

在坛友叶斌的帮助下,第一版OLED的软件算是出来了,下面贴图先{:soso_e113:}

软件是参考http://www.instructables.com/id/Arduino-Watch-With-Altitude-Temperature-Compass-An/修改的。

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

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

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

                         5.不能调时间;

                         6.开机反应慢


下面放代码出来,本人不会编程,代码全是叶斌帮忙写的,他目前很忙,所有大家有空的话最好能帮忙改一下,谢谢!#include "Wire.h"
#include "I2Cdev.h"
#include "MPU6050.h"
#include "U8glib.h"
#include "Time.h"
#include "HMC5883L.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);

#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
#define BOTAO 2
#define KcalWalk 0.0392 // == (0,7 m/step) * (56kcal/km) / (1000 m)
#define KcalRun 0.0544 // == (0,8 m/step) * (68kcal/km) / (1000 m)

//BOTOES
int BOTAO_01 = 0;
int BOTAO_02 = 0;
int BOTAO_03 = 0;
int BOTAO_04 = 0;
int BOTAO_05 = 0;
long int timer_botao = 0;

//BUSSOLA
MPU6050 accelgyro;
Adafruit_BMP085 bmp;
HMC5883L compass;
double error;
int Z = -30;
int k = 0;
int y = 0;
int16_t ax, ay, az;
int16_t gx, gy, gz;
int16_t mx, my, mz;
unsigned long int PdXYZ;
unsigned long int PdXYZant;
unsigned long int PdXYZat;
unsigned long int PdXYZmax;
unsigned long int PdXYZmed;
unsigned long int timerpasso = 0;
unsigned long int passo = 0;
unsigned long int activestep = 0;
unsigned long int actstep = 0;
boolean andando = false;
boolean correndo = false;
double calorie = 0;
unsigned int KcalD;
unsigned int KcalMed;
unsigned long int KcalT = 0;
unsigned int stepD;
unsigned int stepMed;
unsigned long int stepT = 0;
boolean dayrefresh = false;
boolean meiopasso = false;
boolean active = false;
unsigned long int timer_var1;
unsigned long int timer_var2;
unsigned long int timer_disp;
unsigned long int timer_step;

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;//declaring string

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_PULLUP);
Wire.begin();
setTime(18, 28, 0, 21, 06, 2015);
accelgyro.initialize();
Wire.beginTransmission(0x68);
Wire.write(0x37);
Wire.write(0x02);
Wire.endTransmission();

Wire.beginTransmission(0x68);
Wire.write(0x6A);
Wire.write(0x00);
Wire.endTransmission();

//Disable Sleep Mode
Wire.beginTransmission(0x68);
Wire.write(0x6B);
Wire.write(0x00);
Wire.endTransmission();
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);
str12 = String((int)calorie);
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) {
      BOTAO_02++;
    } else {
      if (BOTAO_02 > 0) {
      switch (BOTAO_02) {
          case 4:
            setTime(hour(), minute(), second(), day() + 1, month(), year());
            break;
          case 5:
            setTime(hour(), minute(), second(), day(), month() + 1, year());
            break;
          case 6:
            if (year() < 2020) setTime(hour(), minute(), second(), day(), month(), year() + 1);
            else setTime(hour(), minute(), second(), day(), month(), 2015);
            break;
          case 3:
            setTime(hour() + 1, minute(), second(), day(), month(), year());
            break;
          case 2:
            setTime(hour(), minute() + 1, second(), day(), month(), year());
            break;
          case 1:
            setTime(hour(), minute(), second() + 1, day(), month(), year());
            break;
          case 7:
            BOTAO_02 = 0;
            break;
      }
      } else {
      BOTAO_01++;
      }
    }
}

switch (BOTAO_01) {
    case 0:
      BOTAO_02 = 0;
      break;
    case 1:
      if ((millis() - timer_var1) > 500) {
      str1 = String(hour()); //converting integer into a string
      str2 = String(minute()); //converting integer into a string
      str3 = String(second()); //converting integer into a string
      if (second() < 10) str3 = "0" + str3;
      if (minute() < 10) str2 = "0" + str2;
      if (hour() < 10) str1 = "0" + str1;
      str4 = str1 + ":" + str2 + ":" + str3;

      str1 = String(day());
      str2 = String(month());
      str3 = String(year());
      if (day() < 10) str1 = "0" + str1;
      if (month() < 10) str2 = "0" + str2;
      str5 = str1 + "/" + str2 + "/" + str3;
      timer_var1 = millis();
      if (BOTAO_02 >= NUMCOUNTB1) BOTAO_02 = 0;
      }
    case 2:
      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:
      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) {
      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;
}

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

pedometer();
delay(20);
}

void leitura()
{
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);
}


void draw(void) {
char b;

switch (BOTAO_01) {
    case 0:
      BOTAO_02 = 0;
      break;
    case 1:
      u8g.drawLine(0, 0, 127, 0);
      u8g.drawLine(0, 23, 127, 23);
      u8g.drawLine(127, 0, 127, 63);
      u8g.drawLine(127, 63, 0, 63);
      u8g.drawLine(0, 63, 0, 0);
      u8g.setFont(u8g_font_fub11r);
      str5.toCharArray(b, 11);
      u8g.drawStr( 11, 20, b);
      str4.toCharArray(b, 11);
      u8g.drawStr( 24, 50, 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:
      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, "Pres:");
      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:
      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, "Step:");
      u8g.drawStr( 2, 40, "Kcal:");
      u8g.drawStr( 2, 60, "Mts:");
      str11.toCharArray(b, 11);
      u8g.drawStr(65, 18, b);
      str12.toCharArray(b, 11);
      u8g.drawStr(65, 40, b);
      str13.toCharArray(b, 11);
      u8g.drawStr(65, 60, b);
      break;
}
}

void pedometer() {
int m = 0;

PdXYZ = abs((signed long int) (ax)) + abs((signed long int) (ay)) + abs((signed long int) (az));
PdXYZant = PdXYZat;
PdXYZat = PdXYZ;

if (k == (NUM3 - 1)) {
    PdXYZmax = 0;
    for (m = 0; m < NUM3; m++) {
      if (PdXYZmax < PdXYZ) {
      PdXYZmax = PdXYZ;
      }
    }
}
if (y == (NUM4 - 1)) {
    PdXYZmed = 0;
    for (m = 0; m < NUM4; m++) {
      PdXYZmed = PdXYZmed + PdXYZmax / NUM4;
    }
}

if (PdXYZmed > NUM5) {
    if (PdXYZmed > NUM6) {
      correndo = true;
      andando = false;
    } else {
      correndo = false;
      andando = true;
    }
    if ((PdXYZat > (PdXYZant + NUM7)) && (!meiopasso)) {
      meiopasso = true;
      timerpasso = millis();
    }
    if ((PdXYZat < (PdXYZant - NUM7)) && (meiopasso)) {
      activestep++;
      if ((millis() - timer_step) >= 10000) {
      if ((activestep - actstep) >= 10) {
          if (!active) {
            active = true;
            passo = passo + (activestep - actstep);
            calorie = calorie + (correndo * KcalRun + andando * KcalWalk) * (activestep - actstep);
          }
          active = true;
      }
      else {
          active = false;
      }
      actstep = activestep;
      timer_step = millis();
      }
      if (active) {
      passo++;
      calorie = calorie + correndo * KcalRun + andando * KcalWalk;
      }
      meiopasso = false;
    }
} else {
    correndo = false;
    andando = false;
}

if ((millis() - timerpasso) >= 1000) {
    meiopasso = false;
    correndo = false;
    andando = false;
}

k++;
if (k >= NUM3) k = 0;
y++;
if (y >= NUM4) y = 0;
}

void steps() {
int m = 0;

if (hour() > 1) dayrefresh = true;
if ((hour() == 0) && (minute() == 0) && (dayrefresh)) {
    for (m = 0; m < (NUM2 - 1); m++) {
      KcalD = KcalD;
      stepD = stepD;
    }
    KcalD = calorie;
    KcalMed = 0;
    stepMed = 0;
    for (m = 0; m < NUM2; m++) {
      KcalMed = KcalMed + KcalD / NUM2;
      stepMed = stepMed + stepD / NUM2;
    }
    stepT = stepT + passo;
    KcalT = KcalT + calorie;
    calorie = 0;
    stepD = passo;
    passo = 0;
    dayrefresh = false;
}
}

这个是原版的代码


下面是叶斌修改之后的代码:
/*
reference URL:
oled Watch1: http://geek-workshop.com/forum.php?mod=viewthread&tid=24990&highlight=oled
oled watch2: http://geek-workshop.com/forum.php?mod=viewthread&tid=25003&highlight=oled
original code: http://geek-workshop.com/home.php?mod=space&do=pm&subop=view&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;

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, "Pres:");
      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);
}

gthrtg 发表于 2015-11-2 14:14:32

这么好的帖怎么没人赞呢

wetnt 发表于 2015-11-2 15:54:43

很棒的帖子,鼓励下!

suoma 发表于 2015-11-2 16:24:49

秒数总是2秒钟跳一次,可能延时有问题

suoma 发表于 2015-11-2 16:35:58

你的指南针用的是陀螺仪还是?

雨轩 发表于 2015-11-2 20:32:36

suoma 发表于 2015-11-2 16:35 static/image/common/back.gif
你的指南针用的是陀螺仪还是?

用的是hmc5883l

lzl12399 发表于 2015-12-1 19:29:59

我怎么 编译不过去啊求指教

羊羊羊111 发表于 2016-9-6 19:09:26

time.h是什么啊
页: [1]
查看完整版本: OLED手表3