hardware:controllers:bk-g4m_lesekopf
Unterschiede
Hier werden die Unterschiede zwischen zwei Versionen angezeigt.
Beide Seiten der vorigen RevisionVorhergehende ÜberarbeitungNächste Überarbeitung | Vorhergehende Überarbeitung | ||
hardware:controllers:bk-g4m_lesekopf [2022/10/12 00:30] – istler | hardware:controllers:bk-g4m_lesekopf [2022/11/12 11:54] (aktuell) – [Binary] tilman | ||
---|---|---|---|
Zeile 4: | Zeile 4: | ||
[[https:// | [[https:// | ||
- | Typischer Weise wird dieses mit einem Reed-Kontakt realisiert. Dieser schließt, wenn der Magnet auf der Walze in die Nähe des Kontaktes kommt. Bei manchen Gaszählern ist das Magnetfeld zu schwach, um einen Reedkontakt zu schließen oder einen Hallsensor auszulösen. Der vorliegender Ansatz verwenden einen elektronischen Kompass, der die fallende Flanke eines Magnetfelds zählt und dadurch auf das Gasvolumen | + | Typischer Weise wird dieses mit einem Reed-Kontakt realisiert. Dieser schließt, wenn der Magnet auf der Walze in die Nähe des Kontaktes kommt. Bei manchen Gaszählern ist das Magnetfeld zu schwach, um einen Reedkontakt zu schließen oder einen Hallsensor auszulösen. Der vorliegender Ansatz verwenden einen elektronischen Kompass, der die fallende Flanke eines Magnetfelds zählt und dadurch auf das Gasvolumen |
Als Magnetfeldsensor wird mit dem HSCDTD008A ein Low-Cost-Sensor verwendet, der für die Anwendung völlig ausreicht. Der HSCDTD008A vermisst die Stärke des Magnetfelds in den 3 Raumrichtungen. Für die Anwendung interessiert lediglich die Stärke des Gesamtfeldes. Die Richtung ist nicht wesentlich. | Als Magnetfeldsensor wird mit dem HSCDTD008A ein Low-Cost-Sensor verwendet, der für die Anwendung völlig ausreicht. Der HSCDTD008A vermisst die Stärke des Magnetfelds in den 3 Raumrichtungen. Für die Anwendung interessiert lediglich die Stärke des Gesamtfeldes. Die Richtung ist nicht wesentlich. | ||
- | Gegenwärtig die Software | + | Gegenwärtig |
- | Das Programm misst alle 500 ms die 3 Komponenten des Magnetfeldes und errechnet den Betrag des gemessenen Magnetfeldes. Zusammen mit dem vorherigen Messwert kann man dann ermitteln, ob eine fallende Flanke vorliegt: Wenn der alte Messwerte einen Triggerlevel überschreitet, | + | Das Programm misst alle 500ms die 3 Komponenten des Magnetfeldes und errechnet den Betrag des gemessenen Magnetfeldes. Zusammen mit dem vorherigen Messwert kann man dann ermitteln, ob eine fallende Flanke vorliegt: Wenn der alte Messwerte einen Triggerlevel überschreitet, |
- | __ | + | =====Benötigte Komponenten===== |
- | Benötigte Komponenten__ | + | * HSCDTD008A mit BreakoutBox |
- | ===================== | + | * Halterung ([[https:// |
- | * HSCDTD008A mit BreakoutBox | + | * HSCDTD008A Library ([[https:// |
+ | * Binary (PoC) zum Zählen der Impulse | ||
+ | * Python Script zum Vorbreiten der gezählten Impulse für [[software/ | ||
+ | * Linux Kleinrechner (z.B. Raspberry PI) | ||
- | * Halterung als 3D-Druckdatei ([[https:// | + | =====Aufbau===== |
+ | - 3D-Druck der Halterung | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
- | * HSCDTD008A Library ([[https://github.com/ | + | {{:hardware: |
- | * Programm / PoC zum Zählen der Impulse | + | {{: |
- | * Python Script zum Transport der gezählten Impulse in die vzlogger-Datenbank | + | =====Software===== |
+ | Ein Proof of Concept (PoC). | ||
- | * Raspberry PI | + | ====Binary==== |
- | + | < | |
- | __Aufbau__ | + | |
- | ====== | + | |
- | * 3D-Druck der Halterung | + | |
- | + | ||
- | * Nach dem Drucken der Halterung habe ich, in Ermangelung der Fähigkeit, STL-Files zu editieren, eine Öffnung in die Halterung für die Platine des Sensors hineingeschnitten | + | |
- | + | ||
- | * Entfernen der I2C-Widerstände auf der Platine des Sensors, da diese bereits im Raspberry Pi einbaut sind | + | |
- | + | ||
- | * Anlöten eines Kabels an den Sensors | + | |
- | + | ||
- | * Die Platine des Sensors ist lediglich in die Halterung gesteckt. Das Kabel ist mit Kabelbindern an der Halterung befestigt. Das ist stabil genug. Man könnte den Sensor sicherlich zusätzlich in die Öffnung der Halterung einkleben, um ihn vor Umwelteinflüssen zu schützen | + | |
- | + | ||
- | {{: | + | |
- | + | ||
- | {{: | + | |
- | + | ||
- | {{: | + | |
- | + | ||
- | {{: | + | |
- | + | ||
- | __Das Programm / Der Proof of Concept (PoC)__ | + | |
- | + | ||
- | < | + | |
/ | / | ||
* Example5_Basics.cpp | * Example5_Basics.cpp | ||
* HSCDTD008A Library Demo | * HSCDTD008A Library Demo | ||
- | | + | * Tilman Glötzner |
* Original Creation Date: 2022-09-03 | * Original Creation Date: 2022-09-03 | ||
* | * | ||
Zeile 73: | Zeile 59: | ||
#include < | #include < | ||
#include < | #include < | ||
+ | |||
+ | #define NUMBABSENTRIES 3 | ||
// Create an instance of the sensor. | // Create an instance of the sensor. | ||
Zeile 81: | Zeile 69: | ||
hscdtd_status_t status; | hscdtd_status_t status; | ||
| | ||
+ | // | ||
// If you know the I2C address is different than in the provided | // If you know the I2C address is different than in the provided | ||
// data sheet. Uncomment the line below, and configure the address. | // data sheet. Uncomment the line below, and configure the address. | ||
Zeile 103: | Zeile 91: | ||
hscdtd_status_t status; | hscdtd_status_t status; | ||
sem_t mutex; | sem_t mutex; | ||
- | float bAbs = 0; | + | float bAbs[NUMBABSENTRIES]; |
- | float bAbsOld | + | int bAbsLastEntryIndex |
float lowLimit = 50; | float lowLimit = 50; | ||
float highLimit = 200; | float highLimit = 200; | ||
Zeile 110: | Zeile 98: | ||
unsigned long totalCounter = 0; | unsigned long totalCounter = 0; | ||
int stopFlag = 0; | int stopFlag = 0; | ||
+ | int daemonized = 0; | ||
+ | int verbose = 2; | ||
void* loop(void *ptr) | void* loop(void *ptr) | ||
{ | { | ||
- | // Explicitly start a reading. | + | int k; |
- | while (stopFlag == 0) | + | |
- | { | + | |
- | | + | |
- | for (i = 0; i < 2;i++) | + | memset(bAbs, 0, sizeof(float)); |
- | { | + | // Explicitly start a reading. |
- | status = geomag.startMeasurement(); | + | while (stopFlag |
- | | + | { |
- | if (status | + | |
- | { | + | |
- | bAbs = sqrt(pow(geomag.mag.mag_x, | + | |
- | pow(geomag.mag.mag_y, | + | |
- | pow(geomag.mag.mag_z, | + | |
- | + | ||
- | if (( bAbs < highLimit) && (abs(bAbsOld - bAbs)>0.001)) | + | |
- | | + | |
- | printf(" | + | |
- | geomag.mag.mag_x, | + | |
- | printf("; | + | |
- | } | + | |
- | // trigger on falling flank | + | |
- | if (((bAbs < lowLimit) && (bAbsOld > highLimit)) ) | + | |
- | { | + | |
- | sem_wait(& | + | |
- | counter++; | + | |
- | sem_post(& | + | |
- | totalCounter++; | + | status = geomag.startMeasurement(); |
+ | // If the status is OK then we can print the result. | ||
+ | if (status == HSCDTD_STAT_OK) | ||
+ | { | ||
+ | bAbs[bAbsLastEntryIndex] = sqrt(pow(geomag.mag.mag_x, | ||
+ | pow(geomag.mag.mag_y, | ||
+ | pow(geomag.mag.mag_z, | ||
- | printf(" | + | // weed out erroneous readings bAbs = 0 |
- | printf("; | + | if (bAbs[bAbsLastEntryIndex] == 0) |
+ | { | ||
+ | // | ||
- | | + | if (verbose >=2) |
- | bAbsOld | + | { |
- | | + | char c; |
- | | + | printf(" |
- | | + | printf(" |
- | + | geomag.mag.mag_x, | |
- | | + | for (k = 0 ; k < NUMBABSENTRIES; |
- | | + | { |
- | | + | |
+ | if (k == bAbsLastEntryIndex) | ||
+ | c = ' | ||
+ | else | ||
+ | c = ' '; | ||
+ | printf(" | ||
+ | } | ||
+ | printf("; | ||
+ | } | ||
+ | continue; | ||
+ | |||
+ | } | ||
+ | // trigger on falling flank. | ||
+ | // To prevent occassional missreadings (i.e. bAbs = 0) several measurements are used | ||
+ | // all new entries but the oldest need to be under the lower limit | ||
+ | // while the oldest entriey needs to be above the high limit | ||
+ | int trigger = 0; | ||
+ | int index = 0; | ||
+ | int mod = 0; | ||
+ | for (k=0; k < NUMBABSENTRIES; | ||
+ | { | ||
+ | mod = ((bAbsLastEntryIndex-k) % NUMBABSENTRIES); | ||
+ | index = mod >= 0 ? mod : NUMBABSENTRIES + mod ; | ||
+ | if (k< | ||
+ | { | ||
+ | if (bAbs[index] < lowLimit) | ||
+ | trigger++; | ||
+ | } | ||
+ | else | ||
+ | { | ||
+ | if (bAbs[index] > highLimit) | ||
+ | trigger++; | ||
+ | } | ||
+ | if (verbose >=3 ) | ||
+ | { | ||
+ | printf(" | ||
+ | } | ||
+ | } | ||
+ | |||
+ | |||
+ | if (trigger == NUMBABSENTRIES) | ||
+ | { | ||
+ | sem_wait(& | ||
+ | counter++; | ||
+ | sem_post(& | ||
+ | |||
+ | totalCounter++; | ||
+ | |||
+ | if (verbose >= 2) | ||
+ | { | ||
+ | printf(" | ||
+ | printf("; | ||
+ | |||
+ | char c; | ||
+ | for (k = 0 ; k < NUMBABSENTRIES; | ||
+ | { | ||
+ | if (k == bAbsLastEntryIndex) | ||
+ | c = ' | ||
+ | else | ||
+ | c = ' '; | ||
+ | printf(" | ||
+ | } | ||
+ | printf(" | ||
+ | } | ||
+ | } | ||
+ | bAbsLastEntryIndex = (bAbsLastEntryIndex + 1) % NUMBABSENTRIES; | ||
+ | } | ||
+ | else | ||
+ | { | ||
+ | if (verbose >= 1) | ||
+ | { | ||
+ | printf(" | ||
+ | } | ||
+ | stopFlag = 1; | ||
+ | // | ||
+ | } | ||
+ | |||
+ | // Wait 500ms before reading the next sample. | ||
+ | usleep(500000); | ||
- | // Wait 500ms before reading the next sample. | ||
- | usleep(500000); | ||
- | } | ||
} | } | ||
return NULL; | return NULL; | ||
} | } | ||
- | |||
int main(int argc, char** argv) | int main(int argc, char** argv) | ||
{ | { | ||
+ | |||
| | ||
Zeile 222: | Zeile 273: | ||
- | </ | ||
- | __Das Python Skript__ | ||
- | < | ||
+ | |||
+ | |||
+ | </ | ||
+ | |||
+ | ====Pythonscript==== | ||
+ | <code Python> | ||
# | # | ||
import datetime | import datetime | ||
Zeile 252: | Zeile 306: | ||
</ | </ | ||
- | __ | ||
- | Die vzlogger-Config__ | ||
- | < | + | ====vzlogger.conf==== |
+ | |||
+ | < | ||
.... | .... | ||
{ | { |
hardware/controllers/bk-g4m_lesekopf.1665527412.txt.gz · Zuletzt geändert: 2022/10/12 00:30 von istler