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); |     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() { | void ppm_demo() { | ||||||
|     display_big("demo!"); |     display_big("demo!"); | ||||||
|     delay(3000); |     delay(3000); | ||||||
|     display_logo(); |     display_logo(); | ||||||
|     delay(1000); |     delay(1000); | ||||||
|  |     int buttoncounter = 0; | ||||||
|     for (int p = 400; p < 1200; p++) { |     for (int p = 400; p < 1200; p++) { | ||||||
|         display_ppm(p); |         display_ppm(p); | ||||||
|         if (button(pin_demobutton)) { |         if (button(pin_demobutton)) { | ||||||
| @ -125,6 +145,18 @@ void ppm_demo() { | |||||||
|             delay(500); |             delay(500); | ||||||
|             return; |             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); |         delay(30); | ||||||
|     } |     } | ||||||
|     display_logo(); |     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() { | int aqc_get_co2() { | ||||||
|     static bool initialized = false; |     static bool initialized = false; | ||||||
| 
 | 
 | ||||||
| @ -192,12 +231,10 @@ int aqc_get_co2() { | |||||||
|     int co2 = -1; |     int co2 = -1; | ||||||
| 
 | 
 | ||||||
|     for (int attempt = 0; attempt < 3; attempt++) { |     for (int attempt = 0; attempt < 3; attempt++) { | ||||||
|         hwserial1.flush(); |         flush(hwserial1); | ||||||
|         int limit = 20;  // .available() sometimes stays true
 |  | ||||||
|         while(hwserial1.available() && --limit) hwserial1.read(); |  | ||||||
| 
 |  | ||||||
|         hwserial1.write(command, sizeof(command)); |         hwserial1.write(command, sizeof(command)); | ||||||
|         delay(50); |         delay(50); | ||||||
|  | 
 | ||||||
|         size_t c = hwserial1.readBytes(response, sizeof(response)); |         size_t c = hwserial1.readBytes(response, sizeof(response)); | ||||||
|         if (c != sizeof(response) || response[0] != 0xff || response[1] != 0x86) { |         if (c != sizeof(response) || response[0] != 0xff || response[1] != 0x86) { | ||||||
|             continue; |             continue; | ||||||
| @ -223,6 +260,11 @@ int aqc_get_co2() { | |||||||
|     return 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() { | void mhz_setup() { | ||||||
|     mhz.begin(hwserial1); |     mhz.begin(hwserial1); | ||||||
|     // mhz.setFilter(true, true);  Library filter doesn't handle 0436
 |     // mhz.setFilter(true, true);  Library filter doesn't handle 0436
 | ||||||
| @ -253,6 +295,10 @@ int mhz_get_co2() { | |||||||
|     return co2; |     return co2; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | void mhz_set_zero() { | ||||||
|  |     mhz.calibrate(); | ||||||
|  | } | ||||||
|  | 
 | ||||||
| int get_co2() { | int get_co2() { | ||||||
|     // <0 means read error, 0 means still initializing, >0 is PPM value
 |     // <0 means read error, 0 means still initializing, >0 is PPM value
 | ||||||
| 
 | 
 | ||||||
| @ -264,6 +310,14 @@ int get_co2() { | |||||||
|     return -1;  // suppress warning
 |     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() { | void setup() { | ||||||
|     Serial.begin(115200); |     Serial.begin(115200); | ||||||
|     Serial.println("Operame start"); |     Serial.println("Operame start"); | ||||||
|  | |||||||
| @ -31,6 +31,8 @@ struct Texts { | |||||||
|     ; |     ; | ||||||
|     std::vector<std::list<String>> portal_instructions; |     std::vector<std::list<String>> portal_instructions; | ||||||
|     std::list<String> first_run; |     std::list<String> first_run; | ||||||
|  |     std::list<String> calibration; | ||||||
|  |     std::list<String> calibrating; | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
| std::map<const String, const String> languages { | std::map<const String, const String> languages { | ||||||
| @ -101,6 +103,17 @@ bool select(Texts& T, String language) { | |||||||
|             "Initializing", |             "Initializing", | ||||||
|             "flash memory.", |             "flash memory.", | ||||||
|         }; |         }; | ||||||
|  |         T.calibration = { | ||||||
|  |             "Manual calibration!", | ||||||
|  |             "Press button", | ||||||
|  |             "to cancel.", | ||||||
|  |             "" | ||||||
|  |         }; | ||||||
|  |         T.calibrating = { | ||||||
|  |             "Assuming current", | ||||||
|  |             "CO2 level to be", | ||||||
|  |             "400 PPM." | ||||||
|  |         }; | ||||||
|         return true; |         return true; | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
| @ -157,6 +170,18 @@ bool select(Texts& T, String language) { | |||||||
|             "Flashgeheugen", |             "Flashgeheugen", | ||||||
|             "wordt voorbereid." |             "wordt voorbereid." | ||||||
|         }; |         }; | ||||||
|  |         T.calibration = { | ||||||
|  |             "Handmatige", | ||||||
|  |             "calibratie!", | ||||||
|  |             "knop = stop", | ||||||
|  |             "" | ||||||
|  |         }; | ||||||
|  |         T.calibrating = { | ||||||
|  |             "Het huidige CO2-", | ||||||
|  |             "niveau wordt", | ||||||
|  |             "aangenomen", | ||||||
|  |             "400 PPM te zijn." | ||||||
|  |         }; | ||||||
|         return true; |         return true; | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|  | |||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user