Plutonium skrev:Flowstatus är jag intresserad av, hur har du fått fram den? Kan du posta koden?
Absolut!
Jisses vad svårt de var att bifoga en c-fil... ingen av dessa ändelser/typer accepterades: .c, .c.txt, .txt, .c.Z men .c.gz (gzip) accepterades???. Hoppas min version som jag packade med min Mac går att packa upp med gunzip hos dig. Hör av dig i annat fall!
Kommentarer:
Jag har anpassat en del till min kameramontering och ljusförhållanden. T.ex. filtrerar jag bort röd färg för att förbättra kontrasten i jämförelsen.
Men om vi håller oss till din fråga: flödesindikering så räcker det om vi tittar på funktionen updateValues() som anropas för varje bild som analyserats, dvs ibland oftare än 20 ggr/sekund (jag hade över 25 bilder i sekunden ett tag). Koden här får alltså inte sega ned exekveringen alltförmycket (har man inga problem med CPU last så är det väl bara att gödsla på med kod...)
Jag har ersatt "new_time = time(0);" med clock_gettime() för att få nanosekundupplösning. Dessutom har jag adderat millisekunder till utskrifterna.
Jag skjuter in minut, tim och dygnsvärden i MySQL genom att skicka ett MQTT telegram till en MySQL slavprocess som gör databasjobbet (INSERT...).
Jag har tagit bort logutskrifterna vid flöde och skriver sparsamt ut när jag skjuter in tim och dygnsvärden. Minutvärdena skjuts in utan kommentar.
Om någon region "hoppats över" t.ex. pga. dåliga kontrast- eller ljusförhållanden eller att kameran hamnat snett skrivs en rad ut om "Skipped x regions".
Med min RPi model B och kamera fick jag över 25 bilder per sekund och mer än 50% i last. Jag har därför adderat kod som "bromsar" antalet bilder till 10 per sekund. Koden för detta är lite i ett experimentstadium! I mitt fall krävs en fördröjning om c:a 85 ms för att komma ned till 10 fps. Med 10 fps drar water-meter c:a 8% CPU.
Variablerna "flowon" samt "last_flow_state" används för att räkna fram FLOWSTATE.
I funktionen som detekterar om en ny zon detekteras har jag lagt till kod för att sätta FLOWSTATE till "ON".
last_flow_time = new_time;
flowon = true;
Om ingen ny zon detekteras ställer jag tillbaka FLOWSTATE till "OFF" efter 5 sekunder (dvs det tar c:a 5 sekunder från avstängning till att "OFF" erhålls). Detta för att undvika att signalen studsar "ON"->"OFF"->"ON" för ofta
else if ( last_flow_time+5 < new_time ) {
flowon = false;
}
Mot slutet av updateValues() finns så själva MQTT publiceringen
// Publish changes to flow state (ON/OFF)
if (mosq && last_flow_state != flowon) {
snprintf(payload, 50, "%s", flowon?"ON":"OFF");
doPublish( "/WATER_METER/FLOWSTATUS", payload);
mosquitto_loop(mosq, 0, 1);
last_flow_state = flowon;
}
Så här ser det ut i min logfil just nu:
Read total value from /home/pi/water/meter-total.db: 987457.06
2015-12-26 14:48:00.006 - Framerate 15. Increasing sleep to 10 millieseconds.
2015-12-26 14:49:00.025 - Framerate 19. Increasing sleep to 40 millieseconds.
2015-12-26 14:50:00.096 - Framerate 19. Increasing sleep to 70 millieseconds.
2015-12-26 14:51:00.046 - Framerate 12. Increasing sleep to 73 millieseconds.
2015-12-26 14:52:00.039 - Framerate 12. Increasing sleep to 76 millieseconds.
2015-12-26 14:53:00.056 - Framerate 11. Increasing sleep to 79 millieseconds.
2015-12-26 14:54:00.083 - Framerate 11. Increasing sleep to 82 millieseconds.
2015-12-26 14:55:00.042 - Framerate 11. Increasing sleep to 85 millieseconds.
2015-12-26 15:00:00.070 - Publishing hourly value, 0.9
2015-12-26 16:00:00.047 - Publishing hourly value, 13.8
2015-12-26 17:00:00.035 - Publishing hourly value, 64.4
2015-12-26 18:00:00.061 - Publishing hourly value, 12.0
2015-12-26 19:00:00.028 - Publishing hourly value, 21.2
2015-12-26 20:00:00.025 - Publishing hourly value, 11.2
2015-12-26 21:00:00.024 - Publishing hourly value, 2.8
2015-12-26 22:00:00.054 - Publishing hourly value, 2.6
2015-12-26 23:00:00.011 - Publishing hourly value, 2.9
2015-12-27 00:00:00.021 - Publishing hourly value, 2.0
2015-12-27 00:00:00.021 - Publishing daily ackumulated value, 987590.8
2015-12-27 01:00:00.070 - Publishing hourly value, 9.2
2015-12-27 02:00:00.056 - Publishing hourly value, 0.0
2015-12-27 03:00:00.055 - Publishing hourly value, 0.0
2015-12-27 04:00:00.070 - Publishing hourly value, 0.0
2015-12-27 05:00:00.081 - Publishing hourly value, 0.0
2015-12-27 06:00:00.058 - Publishing hourly value, 0.0
2015-12-27 07:00:00.087 - Publishing hourly value, 0.0
2015-12-27 08:00:00.030 - Publishing hourly value, 0.0
2015-12-27 09:00:00.057 - Publishing hourly value, 13.2
2015-12-27 10:00:00.063 - Publishing hourly value, 15.5
2015-12-27 10:10:54.734 - Skipped 2 regions (last 4, this 6) [ +0.250 l ]
2015-12-27 11:00:00.091 - Publishing hourly value, 23.4
2015-12-27 12:00:00.018 - Publishing hourly value, 30.8
2015-12-27 13:00:00.021 - Publishing hourly value, 2.8
2015-12-27 14:00:00.034 - Publishing hourly value, 0.0
2015-12-27 15:00:00.030 - Publishing hourly value, 0.0
2015-12-27 15:57:47.388 - Skipped 2 regions (last 4, this 6) [ +0.250 l ]
2015-12-27 15:57:51.307 - Skipped 2 regions (last 4, this 6) [ +0.250 l ]
2015-12-27 16:00:00.002 - Publishing hourly value, 22.9