GasMeter: verschil tussen versies
(Nieuwe pagina aangemaakt met ' /* * Demo program for the non-blocking: * * float gas_Meter_Reader(float gasMeter) * * Reads an analog pulse from a reflection sensor on an input. Adds 0,1...') |
|||
Regel 1: | Regel 1: | ||
− | + | <pre> | |
/* | /* | ||
* Demo program for the non-blocking: | * Demo program for the non-blocking: | ||
Regel 111: | Regel 111: | ||
return gasMeter; | return gasMeter; | ||
} | } | ||
+ | </pre> |
Versie van 10 mrt 2017 om 07:02
/* * Demo program for the non-blocking: * * float gas_Meter_Reader(float gasMeter) * * Reads an analog pulse from a reflection sensor on an input. Adds 0,1 M3 to gasMeter per pulse * Tested on a ESP8266 but should run on almost anything * * Aart 03-2017 */ #define SENSOR_PIN A0 // Gas meter reflection sensor pin (analog) #define DETECT 500 // Analog value "definately a mirror" #define RELEASE 700 // Analog value "definately no mirror" #define LOAD_PIN 2 // PWM output for CPU load. 2 = onboard led on the Wemos D1. High = no load = led off #define SEND_INTERVAL 2000 // Time between output messages in ms // #define debug_gas // gasmeter routine debug messages void setup() { Serial.begin(115200); delay(10); Serial.println(F("Hello. This is the gasMeter Non blocking routine demo")); pinMode(LOAD_PIN, OUTPUT); digitalWrite (LOAD_PIN,LOW); } void loop() { static float gasMeter; // current value of gas meter static long start_time; // ms. Start time of last 100 ms system tick static long last_send; // ms. Time since last message gasMeter = gas_Meter_Reader(gasMeter); // The actual function is called if ((millis() - last_send) > SEND_INTERVAL) { // once in a while.. last_send = millis(); Serial.print("gasMeter: "); Serial.println(gasMeter); } // Wait up to 100 ms in this idle & load measurement routine digitalWrite (LOAD_PIN,HIGH); while (millis() - start_time < 100) { delay(1); // Do nosePicking(); } digitalWrite (LOAD_PIN,LOW); start_time = millis(); } float gas_Meter_Reader(float gasMeter) { /* * Reading the input and adding 0.1 m3 per detected pulse. * Non-blocking */ static long last_run; // Time of last run of this routine in ms int sensor; // sensor value enum states { // States of the input state machine wait_for_start, doublecheck, count, wait_for_end, }; static int state = wait_for_start; if (millis() - last_run < 500) return gasMeter; last_run = millis(); // Run once every 500 ms sensor = analogRead(SENSOR_PIN); #ifdef debug_gas Serial.print ("Sensor: "); Serial.println (sensor); #endif switch (state) { case wait_for_start: { if (sensor < DETECT) state = doublecheck; #ifdef debug_gas Serial.println("State: Wait for start"); #endif } break; case doublecheck: { if (sensor < DETECT) state = count; if (sensor > DETECT) state = wait_for_start; #ifdef debug_gas Serial.println("State: Doublecheck"); #endif } break; case count: { gasMeter += 0.1; // 0,1 m3 per omwenteling #ifdef debug_gas Serial.print("State: count; gasMeterValue: "); Serial.println(gasMeter); #endif state = wait_for_end; } break; case wait_for_end: { if (sensor > RELEASE) state = wait_for_start; #ifdef debug_gas Serial.println("State: Wait for end"); #endif } break; break; } return gasMeter; }