mirror of
				https://github.com/revspace/operame
				synced 2025-10-31 03:25:37 +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…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user