-
Notifications
You must be signed in to change notification settings - Fork 0
/
vindriktning-oled.ino
80 lines (60 loc) · 1.61 KB
/
vindriktning-oled.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
#include <Wire.h>
#include "SSD1306Wire.h"
SSD1306Wire display(0x3c, SDA, SCL);
#define BAUD 9600
#define RXPIN 4
#define TXPIN 5
uint8_t serialRxBuf[80];
uint8_t rxBufIdx = 0;
int pm1 = 0;
int pm2 = 0;
int pm9 = 0;
unsigned long timepast = millis();
const int sendinterval = 500;
void setup() {
display.init();
display.flipScreenVertically();
Serial1.begin(BAUD, SERIAL_8N1, RXPIN, TXPIN);
}
void loop() {
getSensorData();
delay(500);
display.clear();
display.setFont(ArialMT_Plain_10);
display.setTextAlignment(TEXT_ALIGN_LEFT);
display.drawString(0, 0, "Particulate Matter");
display.drawString(0, 16, "PM 1.0 ");
display.drawString(0, 32, "PM 2.5 ");
display.drawString(0, 48, "PM 10 ");
display.setTextAlignment(TEXT_ALIGN_RIGHT);
display.drawString(128, 0, "ug/m3");
display.drawString(128, 16, String(pm1));
display.drawString(128, 32, String(pm2));
display.drawString(128, 48, String(pm9));
display.display();
delay(250);
}
int getSensorData() {
uint8_t rxBufIdx = 0;
uint8_t checksum = 0;
// Sensor Serial aushorchen
while ((Serial1.available() && rxBufIdx < 127) || rxBufIdx < 20)
{
serialRxBuf[rxBufIdx++] = Serial1.read();
}
for (uint8_t i = 0; i < 20; i++)
{
checksum += serialRxBuf[i];
}
// Header und Prüfsumme checken
if (serialRxBuf[0] == 0x16 && serialRxBuf[1] == 0x11 && serialRxBuf[2] == 0x0B && checksum == 0)
{
pm2 = (serialRxBuf[5] << 8 | serialRxBuf[6]);
pm1 = (serialRxBuf[9] << 8 | serialRxBuf[10]);
pm9 = (serialRxBuf[13] << 8 | serialRxBuf[14]);
}
else
{
return (-1);
}
}