|
|
Regel 1: |
Regel 1: |
− | [[Categorie:Project]][[Categorie:Docs]] {{OldPage|Moet dit niet naar Github verplaats worden, en daar na (daar na pas) (dus niet nu gelijk!) (dus eerst naar github verplaatsen) hier weg?}} | + | [[Categorie:Project]][[Categorie:Docs]] |
− | <pre>
| |
− | /*
| |
− | * Demo program for the non-blocking:
| |
− | *
| |
− | * gas_Meter_Reader(float gasMeter, int interval)
| |
− | *
| |
− | * Reads an analog pulse from a reflection sensor on an input. Adds 0,1 M3 to gasMeter per pulse
| |
− | * Interval sets the time betweet readings, should be set to about 500 ms for the Makerspace meter
| |
− | * Tested on a ESP8266 but should run on almost anything
| |
− | *
| |
− | * Aart 03-2017 V 0.2
| |
− | */
| |
| | | |
− | #define SENSOR_PIN A0 // Gas meter reflection sensor pin (analog)
| + | The gasmeter is a ESP8266 Nodemcu with an optical infrared sensor that detects the mirror on the last red digit. Also there is a DS18B20 temperature sensor. |
− | #define DETECT 500 // Analog value "definately a mirror"
| |
− | #define RELEASE 700 // Analog value "definately no mirror"
| |
− | #define INTERVAL 500 // Time between readings in ms
| |
| | | |
− | #define LOAD_PIN 2 // PWM output for CPU load. 2 = onboard led on the Wemos D1. High = no load = led off
| + | The calculated gasmeter information and measured temperature is posted in MQTT (makerspace/gasmeter & makerspace/temp/CV) |
− | #define SEND_INTERVAL 2000 // Time between output messages in ms
| |
− | // #define debug_gas // gasmeter routine debug messages | |
| | | |
− | void setup() {
| + | See https://github.com/MakerSpaceLeiden/gasmeter for the current source. |
− | 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, INTERVAL); // The actual function is called
| |
− | | |
− | if (millis() < last_send) last_send = millis(); // Roll over
| |
− | 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);
| |
− | if (millis () < start_time) start_time = millis(); // roll over
| |
− | while (millis() - start_time < 100) {
| |
− | delay(1); // Do nosePicking();
| |
− | }
| |
− | digitalWrite (LOAD_PIN,LOW);
| |
− | start_time = millis();
| |
− | }
| |
− | | |
− | float gas_Meter_Reader(float gasMeter, int interval) {
| |
− | /*
| |
− | * 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) last_run = millis(); // roll over
| |
− | if (millis() - last_run < interval) 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;
| |
− | }
| |
− | </pre>
| |