mirror of
https://github.com/revspace/operame
synced 2024-10-31 21:47:30 +00:00
Implement manual calibration (command 0x87)
This commit is contained in:
parent
8fa0ee91e7
commit
2807ee2647
62
operame.ino
62
operame.ino
@ -113,11 +113,31 @@ void display_ppm(int ppm) {
|
||||
display_big(String(ppm), fg, bg);
|
||||
}
|
||||
|
||||
void calibrate() {
|
||||
auto lines = T.calibration;
|
||||
for (int count = 60; count >= 0; count--) {
|
||||
lines.back() = String(count);
|
||||
display_lines(lines, TFT_RED);
|
||||
unsigned long start = millis();
|
||||
while (millis() - start < 1000) {
|
||||
if (button(pin_demobutton) || button(pin_portalbutton)) return;
|
||||
}
|
||||
}
|
||||
|
||||
lines = T.calibrating;
|
||||
if (driver == AQC) for (auto& line : lines) line.replace("400", "425");
|
||||
display_lines(lines, TFT_MAGENTA);
|
||||
|
||||
set_zero(); // actually instantaneous
|
||||
delay(15000); // give time to read long message
|
||||
}
|
||||
|
||||
void ppm_demo() {
|
||||
display_big("demo!");
|
||||
delay(3000);
|
||||
display_logo();
|
||||
delay(1000);
|
||||
int buttoncounter = 0;
|
||||
for (int p = 400; p < 1200; p++) {
|
||||
display_ppm(p);
|
||||
if (button(pin_demobutton)) {
|
||||
@ -125,6 +145,18 @@ void ppm_demo() {
|
||||
delay(500);
|
||||
return;
|
||||
}
|
||||
|
||||
// Hold portal button from 700 to 800 for manual calibration
|
||||
if (p >= 700 && p < 800 && !digitalRead(pin_portalbutton)) {
|
||||
buttoncounter++;
|
||||
}
|
||||
if (p == 800 && buttoncounter >= 85) {
|
||||
while (!digitalRead(pin_portalbutton)) delay(100);
|
||||
calibrate();
|
||||
display_logo();
|
||||
delay(500);
|
||||
return;
|
||||
}
|
||||
delay(30);
|
||||
}
|
||||
display_logo();
|
||||
@ -184,6 +216,13 @@ void connect_mqtt() {
|
||||
}
|
||||
}
|
||||
|
||||
void flush(Stream& s, int limit = 20) {
|
||||
// .available() sometimes stays true (why?), hence the limit
|
||||
|
||||
s.flush(); // flush output
|
||||
while(s.available() && --limit) s.read(); // flush input
|
||||
}
|
||||
|
||||
int aqc_get_co2() {
|
||||
static bool initialized = false;
|
||||
|
||||
@ -192,12 +231,10 @@ int aqc_get_co2() {
|
||||
int co2 = -1;
|
||||
|
||||
for (int attempt = 0; attempt < 3; attempt++) {
|
||||
hwserial1.flush();
|
||||
int limit = 20; // .available() sometimes stays true
|
||||
while(hwserial1.available() && --limit) hwserial1.read();
|
||||
|
||||
flush(hwserial1);
|
||||
hwserial1.write(command, sizeof(command));
|
||||
delay(50);
|
||||
|
||||
size_t c = hwserial1.readBytes(response, sizeof(response));
|
||||
if (c != sizeof(response) || response[0] != 0xff || response[1] != 0x86) {
|
||||
continue;
|
||||
@ -223,6 +260,11 @@ int aqc_get_co2() {
|
||||
return co2;
|
||||
}
|
||||
|
||||
void aqc_set_zero() {
|
||||
const uint8_t command[9] = { 0xff, 0x01, 0x87, 0, 0, 0, 0, 0, 0x78 };
|
||||
hwserial1.write(command, sizeof(command));
|
||||
}
|
||||
|
||||
void mhz_setup() {
|
||||
mhz.begin(hwserial1);
|
||||
// mhz.setFilter(true, true); Library filter doesn't handle 0436
|
||||
@ -253,6 +295,10 @@ int mhz_get_co2() {
|
||||
return co2;
|
||||
}
|
||||
|
||||
void mhz_set_zero() {
|
||||
mhz.calibrate();
|
||||
}
|
||||
|
||||
int get_co2() {
|
||||
// <0 means read error, 0 means still initializing, >0 is PPM value
|
||||
|
||||
@ -264,6 +310,14 @@ int get_co2() {
|
||||
return -1; // suppress warning
|
||||
}
|
||||
|
||||
void set_zero() {
|
||||
if (driver == AQC) { aqc_set_zero(); return; }
|
||||
if (driver == MHZ) { mhz_set_zero(); return; }
|
||||
|
||||
// Should be unreachable
|
||||
panic(T.error_driver);
|
||||
}
|
||||
|
||||
void setup() {
|
||||
Serial.begin(115200);
|
||||
Serial.println("Operame start");
|
||||
|
@ -31,6 +31,8 @@ struct Texts {
|
||||
;
|
||||
std::vector<std::list<String>> portal_instructions;
|
||||
std::list<String> first_run;
|
||||
std::list<String> calibration;
|
||||
std::list<String> calibrating;
|
||||
};
|
||||
|
||||
std::map<const String, const String> languages {
|
||||
@ -101,6 +103,17 @@ bool select(Texts& T, String language) {
|
||||
"Initializing",
|
||||
"flash memory.",
|
||||
};
|
||||
T.calibration = {
|
||||
"Manual calibration!",
|
||||
"Press button",
|
||||
"to cancel.",
|
||||
""
|
||||
};
|
||||
T.calibrating = {
|
||||
"Assuming current",
|
||||
"CO2 level to be",
|
||||
"400 PPM."
|
||||
};
|
||||
return true;
|
||||
}
|
||||
|
||||
@ -157,6 +170,18 @@ bool select(Texts& T, String language) {
|
||||
"Flashgeheugen",
|
||||
"wordt voorbereid."
|
||||
};
|
||||
T.calibration = {
|
||||
"Handmatige",
|
||||
"calibratie!",
|
||||
"knop = stop",
|
||||
""
|
||||
};
|
||||
T.calibrating = {
|
||||
"Het huidige CO2-",
|
||||
"niveau wordt",
|
||||
"aangenomen",
|
||||
"400 PPM te zijn."
|
||||
};
|
||||
return true;
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user