-
Notifications
You must be signed in to change notification settings - Fork 0
/
OLED_BME280.ino
195 lines (167 loc) · 7.83 KB
/
OLED_BME280.ino
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
#include <EnvironmentCalculations.h>
#include <BME280I2C.h>
#include <Wire.h>
#include <stdio.h>
#include "U8glib.h"
float referencePressure = 1013.25; // hPa local QFF (official meteor-station reading)
float outdoorTemp = 4.7; // °C measured local outdoor temp.
float barometerAltitude = 1650.3; // meters ... map readings + barometer position
BME280I2C::Settings settings(
BME280::OSR_X1,
BME280::OSR_X1,
BME280::OSR_X1,
BME280::Mode_Forced,
BME280::StandbyTime_1000ms,
BME280::Filter_16,
BME280::SpiEnable_False,
BME280I2C::I2CAddr_0x76
);
BME280I2C bme(settings);
U8GLIB_SSD1306_128X64 u8g(U8G_I2C_OPT_NONE); // I2C / TWI
unsigned long delayTime;
char str_temp[32];
char str_humi[32];
char str_pres[32];
char str_alti[32];
int cnt=0;
//////////////////////////////////////////////////////////////////////////
const uint8_t bitmap_s [] U8G_PROGMEM ={0x00,0x00,0x00,0x00,0xFD,0xFC,0x04,0x84,0x44,0x84,0x44,0x84,0x28,0x88,0x28,0x88,
0x10,0x50,0x10,0x50,0x28,0x20,0x28,0x20,0x44,0x50,0x44,0x88,0x81,0x04,0x02,0x02};/*"双",0*/
const uint8_t bitmap_y [] U8G_PROGMEM ={0x00,0x00,0x27,0xFE,0x14,0x20,0x14,0x40,0x85,0xFC,0x45,0x04,0x45,0xFC,0x15,0x04,
0x15,0xFC,0x25,0x24,0xE4,0x20,0x24,0xA8,0x29,0x24,0x2A,0x22,0x30,0xA0,0x00,0x40};/*"源",1*/
const uint8_t bitmap_d [] U8G_PROGMEM ={0x01,0x00,0x01,0x00,0x01,0x00,0x3F,0xF8,0x21,0x08,0x21,0x08,0x21,0x08,0x3F,0xF8,
0x21,0x08,0x21,0x08,0x21,0x08,0x3F,0xF8,0x21,0x0A,0x01,0x02,0x01,0x02,0x00,0xFE};/*"电",2*/
const uint8_t bitmap_z[] U8G_PROGMEM ={0x00,0x00,0x7F,0xF8,0x00,0x10,0x00,0x20,0x00,0x40,0x01,0x80,0x01,0x00,0xFF,0xFE,
0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x05,0x00,0x02,0x00};/*"子",3*/
const uint8_t bitmap_Wen[] U8G_PROGMEM ={0x00,0x00,0x23,0xF8,0x12,0x08,0x12,0x08,0x83,0xF8,0x42,0x08,0x42,0x08,0x13,0xF8,
0x10,0x00,0x27,0xFC,0xE4,0xA4,0x24,0xA4,0x24,0xA4,0x24,0xA4,0x2F,0xFE,0x00,0x00};/*"温",0*/
const uint8_t bitmap_Shi[] U8G_PROGMEM ={0x00,0x00,0x27,0xF8,0x14,0x08,0x14,0x08,0x87,0xF8,0x44,0x08,0x44,0x08,0x17,0xF8,
0x11,0x20,0x21,0x20,0xE9,0x24,0x25,0x28,0x23,0x30,0x21,0x20,0x2F,0xFE,0x00,0x00};/*"湿",0*/
const uint8_t bitmap_Du[] U8G_PROGMEM ={0x01,0x00,0x00,0x80,0x3F,0xFE,0x22,0x20,0x22,0x20,0x3F,0xFC,0x22,0x20,0x22,0x20,
0x23,0xE0,0x20,0x00,0x2F,0xF0,0x24,0x10,0x42,0x20,0x41,0xC0,0x86,0x30,0x38,0x0E};/*"度",1*/
const uint8_t bitmap_Qi[] U8G_PROGMEM ={0x10,0x00,0x10,0x00,0x3F,0xFC,0x20,0x00,0x4F,0xF0,0x80,0x00,0x3F,0xF0,0x00,0x10,
0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x0A,0x00,0x0A,0x00,0x06,0x00,0x02};/*"气",0*/
const uint8_t bitmap_Ya[] U8G_PROGMEM ={0x00,0x00,0x3F,0xFE,0x20,0x00,0x20,0x80,0x20,0x80,0x20,0x80,0x20,0x80,0x2F,0xFC,
0x20,0x80,0x20,0x80,0x20,0x90,0x20,0x88,0x20,0x88,0x40,0x80,0x5F,0xFE,0x80,0x00};/*"压",1*/
const uint8_t bitmap_Xia[] U8G_PROGMEM ={0x08,0x00,0x08,0xFC,0x08,0x84,0x08,0x84,0xFE,0x84,0x08,0xFC,0x18,0x84,0x1C,0x84,
0x2A,0x84,0x2A,0xFC,0x48,0x84,0x88,0x84,0x08,0x84,0x08,0x84,0x08,0xFC,0x08,0x84};/*"相",0*/
const uint8_t bitmap_Dui[] U8G_PROGMEM ={0x00,0x10,0x00,0x10,0x00,0x10,0x7E,0x10,0x02,0xFE,0x02,0x10,0x24,0x10,0x14,0x90,
0x08,0x50,0x08,0x50,0x14,0x10,0x12,0x10,0x22,0x10,0x40,0x10,0x00,0x50,0x00,0x20};/*"对",1*/
const uint8_t bitmap_Gao[] U8G_PROGMEM ={0x02,0x00,0x01,0x00,0xFF,0xFE,0x00,0x00,0x0F,0xE0,0x08,0x20,0x08,0x20,0x0F,0xE0,
0x00,0x00,0x7F,0xFC,0x40,0x04,0x4F,0xE4,0x48,0x24,0x48,0x24,0x4F,0xE4,0x40,0x0C};/*"高",2*/
const uint8_t bitmap_oC[] U8G_PROGMEM ={0x60,0x00,0x91,0xF4,0x96,0x0C,0x6C,0x04,0x08,0x04,0x18,0x00,0x18,0x00,0x18,0x00,
0x18,0x00,0x18,0x00,0x18,0x00,0x08,0x00,0x0C,0x04,0x06,0x08,0x01,0xF0,0x00,0x00};/*"℃",0*/
//////////////////////////////////////////////////////////////////////////
void draw(void) {
u8g.setFont(u8g_font_unifont);
// graphic commands to redraw the complete screen should be placed here
//u8g.drawBitmapP ( 32 , 0 , 2 , 16 , bitmap_s);
//u8g.drawBitmapP ( 49 , 0 , 2 , 16 , bitmap_y );
//u8g.drawBitmapP ( 66 , 0 , 2 , 16 , bitmap_d);
//u8g.drawBitmapP ( 83 , 0 , 2 , 16 , bitmap_z );
}
void setup() {
Serial.begin(9600);
while(!Serial) {} // Wait
Wire.begin();
while(!bme.begin())
{
Serial.println("Could not find BME280 sensor!");
delay(1000);
}
switch(bme.chipModel())
{
case BME280::ChipModel_BME280:
Serial.println("Found BME280 sensor! Success.");
break;
case BME280::ChipModel_BMP280:
Serial.println("Found BMP280 sensor! No Humidity available.");
break;
default:
Serial.println("Found UNKNOWN sensor! Error!");
}
Serial.print("Assumed outdoor temperature: "); Serial.print(outdoorTemp);
Serial.print("°C\nAssumed reduced sea level Pressure: "); Serial.print(referencePressure);
Serial.print("hPa\nAssumed barometer altitude: "); Serial.print(barometerAltitude);
Serial.println("m\n***************************************");
}
void loop() {
printValues();
delay(delayTime);
u8g.firstPage();
do {
draw();
if(cnt<4)
{
u8g.drawBitmapP ( 40 , 17 , 2 , 16 , bitmap_Wen);
u8g.drawBitmapP ( 57 , 17 , 2 , 16 , bitmap_Du);
u8g.drawBitmapP ( 74 , 17 , 2 , 16 , bitmap_oC);
u8g.setFont(u8g_font_fub17);
u8g.drawStr(50, 58,str_temp);
}else if(cnt<8){
u8g.drawBitmapP ( 40 , 17 , 2 , 16 , bitmap_Shi);
u8g.drawBitmapP ( 57 , 17 , 2 , 16 , bitmap_Du);
u8g.drawStr(74, 30,"%");
u8g.setFont(u8g_font_fub17);
u8g.drawStr(50, 58,str_humi);
}else if(cnt<12){
u8g.drawBitmapP ( 40 , 17 , 2 , 16 , bitmap_Qi);
u8g.drawBitmapP ( 57 , 17 , 2 , 16 , bitmap_Ya);
u8g.drawStr(74, 30,"hPa");
u8g.setFont(u8g_font_fub17);
u8g.drawStr(33, 58,str_pres);
}else if(cnt<16){
u8g.drawBitmapP ( 24 , 17 , 2 , 16 , bitmap_Xia);
u8g.drawBitmapP ( 41 , 17 , 2 , 16 , bitmap_Dui );
u8g.drawBitmapP ( 58 , 17 , 2 , 16 , bitmap_Gao);
u8g.drawBitmapP ( 77 , 17 , 2 , 16 , bitmap_Du );
u8g.drawStr(94, 30,"m");
u8g.setFont(u8g_font_fub17);
u8g.drawStr(33, 58,str_alti);
}
} while( u8g.nextPage() );
// rebuild the picture after some delay
delay(100);
cnt++;
if(cnt==16)
cnt=0;
}
void printValues() {
float temp,humi,pres,alti;
int ptv;
BME280::TempUnit tempUnit(BME280::TempUnit_Celsius);
BME280::PresUnit presUnit(BME280::PresUnit_hPa);
bme.read(pres, temp, humi, tempUnit, presUnit);
//temp = bme.readTemperature();
sprintf(str_temp,"%02d ",(int)temp);
Serial.print("Temperature = ");
Serial.print(temp);
Serial.println(" *C");
//pres = bme.readPressure() / 100.0F;
ptv = (int)(pres*10.0);
ptv = ptv%10;
sprintf(str_pres,"%d.%d ",(int)pres,ptv);
Serial.print("Pressure = ");
Serial.print(str_pres);
Serial.println(" hPa");
EnvironmentCalculations::AltitudeUnit envAltUnit = EnvironmentCalculations::AltitudeUnit_Meters;
EnvironmentCalculations::TempUnit envTempUnit = EnvironmentCalculations::TempUnit_Celsius;
/// To get correct local altitude/height (QNE) the reference Pressure
/// should be taken from meteorologic messages (QNH or QFF)
//float altitude = EnvironmentCalculations::Altitude(pres, envAltUnit, referencePressure, outdoorTemp, envTempUnit);
alti = EnvironmentCalculations::Altitude(pres, envAltUnit, referencePressure, temp, envTempUnit);
//alti = bme.readAltitude(SEALEVELPRESSURE_HPA);
ptv = (int)(alti*10.0);
ptv = ptv%10;
sprintf(str_alti,"%d.%d ",(int)alti,ptv);
Serial.print("Approx. Altitude = ");
Serial.print(str_alti);
Serial.println(" m");
//humi = bme.readHumidity();
sprintf(str_humi,"%02d ",(int)humi);
Serial.print("Humidity = ");
Serial.print(humi);
Serial.println(" %");
Serial.println();
delay(1000);
}