Fristående Arduino höjdmätare (2 / 3 steg)
Steg 2: Programmet
Koden förklaringar (full koden nedan):
#include "U8glib.h"
#include "BMP280.h"
De är 2-bibliotek måste du sätta inne Documents\Arduino\libraries\
#define P0 1021.97
Det är där du kalibrera höjdmätaren, ändra detta värde. När det är gjort, är det ganska exakt!
(som standard det var 1013.25, jag fick upp det till 1021.97 ha rätt höjd i min stad)
U8GLIB_SSD1306_128X64 u8g(U8G_I2C_OPT_NO_ACK);
Här du ange typ av Oled-skärm (128 x 64 etc...)
U8G.drawStr (5, 10, "Temp:");
U8G.drawStr (5, 30, "Bar:");
U8G.drawStr (5, 50, "Alt:");
U8G.drawStr (50, 10, sT);
U8G.drawStr (50, 30, sP);
U8G.drawStr (50, 50, sA);
Här information du vill visa på första skärmen och deras position (Y, X, värde)
dtostrf (A_MIN, 4, 2, sA_MIN);
dtostrf (A_MAX, 4, 2, sA_MAX);
U8G.drawStr (5, 20, "A Min:");
U8G.drawStr (60, 20, sA_MIN);
U8G.drawStr (5, 45, "A Max:");
U8G.drawStr (60, 45, sA_MAX);
Samma för andra skärmen
om (A > A_MAX) {
A_MAX = A;
}
om (A < A_MIN || A_MIN == 0) {
A_MIN = A;
}
Här uppdaterar vi den minsta och maximala höjd lagras
göra {
Rita (T, P, A);
} medan (u8g.nextPage());
U8G.firstPage();
Delay(1000);
Med försening värde (1000 i detta fall) bor du här, 1 sekund på den första skärmen innan du byter till det andra. Så ändra det om du vill anpassa visningstiden :)
göra {
draw2 (A_MIN, A_MAX);
} medan (u8g.nextPage());
U8G.firstPage();
Delay(1000);
Samma för andra skärmen!
Hoppas det är klart, gärna skicka en fråga i kommentarerna om det behövs!
Här är den fullständiga koden:
#include "U8glib.h"
#include "BMP280.h"
#include "Wire.h"
#define P0 1021.97 //1013.25
BMP280 bmp;
OLED typ
U8GLIB_SSD1306_128X64 u8g(U8G_I2C_OPT_NO_ACK);
char sT [20].
char sP [9].
char sA [9].
char sA_MIN [9].
char sA_MAX [9].
Double A_MIN = 0;
Double A_MAX = 0;
void Rita (dubbel T, dubbel P, dubbel A) {
U8G.setFont(u8g_font_unifont);
dtostrf T, 4, 2, sT,
dtostrf (P, 4, 2, sP);
dtostrf A, 4, 2, sA.
U8G.drawStr (5, 10, "Temp:");
U8G.drawStr (5, 30, "Bar:");
U8G.drawStr (5, 50, "Alt:");
U8G.drawStr (50, 10, sT);
U8G.drawStr (50, 30, sP);
U8G.drawStr (50, 50, sA);
}
void draw2 (dubbel A_MIN, dubbel A_MAX) {
U8G.setFont(u8g_font_unifont);
dtostrf (A_MIN, 4, 2, sA_MIN);
dtostrf (A_MAX, 4, 2, sA_MAX);
U8G.drawStr (5, 20, "A Min:");
U8G.drawStr (60, 20, sA_MIN);
U8G.drawStr (5, 45, "A Max:");
U8G.drawStr (60, 45, sA_MAX);
}
void setup() {
Serial.BEGIN(9600);
om (! bmp.begin()) {
Serial.println ("BMP init misslyckades!");
samtidigt (1).
}
annat Serial.println ("BMP init framgång!");
bmp.setOversampling(4);
U8G.setColorIndex(1);
U8G.setFont(u8g_font_unifont);
}
void loop(void) {
dubbel T, P;
char resultatet = bmp.startMeasurment();
om (resultatet! = 0) {
Delay(Result);
resultat = bmp.getTemperatureAndPressure (T, P);
om (resultatet! = 0) {
Double A = bmp.altitude (P, P0);
om (A > A_MAX) {
A_MAX = A;
}
om (A < A_MIN || A_MIN == 0) {
A_MIN = A;
}
Serial.Print ("T = \t"); Serial.Print (T, 2); Serial.Print ("degC\t");
Serial.Print ("P = \t"); Serial.Print (P, 2); Serial.Print ("mBar\t");
Serial.Print ("A = \t"); Serial.Print (A, 2). Serial.println ("m").
U8G.firstPage();
göra {
Rita (T, P, A);
} medan (u8g.nextPage());
U8G.firstPage();
Delay(1000);
göra {
draw2 (A_MIN, A_MAX);
} medan (u8g.nextPage());
U8G.firstPage();
Delay(1000);
}
annat {
Serial.println("Error.");
}
}
annat {
Serial.println("Error.");
}
Delay(100);
}