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);
} 这么好的帖怎么没人赞呢 很棒的帖子,鼓励下! 秒数总是2秒钟跳一次,可能延时有问题
你的指南针用的是陀螺仪还是? suoma 发表于 2015-11-2 16:35 static/image/common/back.gif
你的指南针用的是陀螺仪还是?
用的是hmc5883l 我怎么 编译不过去啊求指教 time.h是什么啊
页:
[1]