{"id":135761,"date":"2018-10-27T10:32:00","date_gmt":"2018-10-27T07:32:00","guid":{"rendered":"https:\/\/ruuvi.com\/ruuvi-firmware-teil-14-beschleunigungssensor-interrupt\/"},"modified":"2026-06-11T07:39:46","modified_gmt":"2026-06-11T04:39:46","slug":"ruuvi-firmware-teil-14-beschleunigungssensor-interrupt","status":"publish","type":"post","link":"https:\/\/ruuvi.com\/de\/ruuvi-firmware-teil-14-beschleunigungssensor-interrupt\/","title":{"rendered":"Ruuvi Firmware \u2013 Teil 14: Beschleunigungssensor-Interrupt"},"content":{"rendered":"\n<div class=\"wp-block-image\"><figure class=\"aligncenter size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"535\" src=\"https:\/\/ruuvi.com\/i\/u\/ruuvi-firmware-series-part-14-1024x535.jpeg\" alt=\"Einleitungsbild zu Ruuvi Firmware Serie Teil 14\" class=\"wp-image-3903\" srcset=\"https:\/\/ruuvi.com\/i\/u\/ruuvi-firmware-series-part-14-1024x535.jpeg 1024w, https:\/\/ruuvi.com\/i\/u\/ruuvi-firmware-series-part-14-450x235.jpeg 450w, https:\/\/ruuvi.com\/i\/u\/ruuvi-firmware-series-part-14-768x401.jpeg 768w, https:\/\/ruuvi.com\/i\/u\/ruuvi-firmware-series-part-14-600x314.jpeg 600w, https:\/\/ruuvi.com\/i\/u\/ruuvi-firmware-series-part-14.jpeg 1280w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure><\/div>\n\n<p class=\"wp-block-paragraph\">In diesem Teil des Tutorials verwenden wir Interrupts, um Bewegungen des Tags zu erkennen und gepufferte Samples vom Beschleunigungssensor zu lesen. Den fertigen Code dieses Blog-Beitrags kannst du bei <a href=\"https:\/\/github.com\/ruuvi\/ruuvi.firmware.c\">Ruuvi GitHub<\/a> im <em>ruuviblog<\/em>-Branch unter dem Tag <em>3.14.0-alpha<\/em> herunterladen. <\/p>\n\n<p class=\"wp-block-paragraph\">Bitte folge <a href=\"https:\/\/ruuvi.com\/ruuvi-firmware-part-1-sleep\/\">Teil 1 der Serie<\/a> f\u00fcr Details zum Klonen des Repositories und Kompilieren des Codes. Die finale Hex-Datei dieses Tutorials kann vom <a href=\"http:\/\/jenkins.ruuvi.com\/job\/ruuvi.firmware.c\/38\/\">Ruuvi Jenkins<\/a> heruntergeladen werden. <\/p>\n\n<h2 class=\"wp-block-heading\">Bewegungserkennung<\/h2>\n\n<p class=\"wp-block-paragraph\">Es gibt viele F\u00e4lle, in denen wir erkennen wollen, ob sich der RuuviTag bewegt. Vielleicht betreiben wir eine Asset-Tracking-Anwendung und m\u00f6chten Daten schneller senden, w\u00e4hrend sich der Tag bewegt, oder wir m\u00f6chten Ereignisse wie das Einschalten einer Maschine oder das \u00d6ffnen einer T\u00fcr erkennen. <\/p>\n\n<p class=\"wp-block-paragraph\">Diese Erkennung k\u00f6nnte softwareseitig gel\u00f6st werden, aber unser Beschleunigungssensor <a href=\"https:\/\/www.st.com\/resource\/en\/datasheet\/lis2dh12.pdf\"><strong>LIS2DH12<\/strong><\/a> verf\u00fcgt bereits \u00fcber die erforderliche Interrupt-Generierung, daher entscheiden wir uns f\u00fcr deren Nutzung.<\/p>\n\n<p class=\"wp-block-paragraph\">Unser Tag erf\u00e4hrt eine konstante Beschleunigung von 1 <em>G<\/em> in Richtung Erdmittelpunkt, also die Schwerkraft. Diese Beschleunigungskomponente wird durch den im <strong>LIS2DH12<\/strong> integrierten Hochpassfilter entfernt. <\/p>\n\n<h2 class=\"wp-block-heading\">Datenpufferung<\/h2>\n\n<p class=\"wp-block-paragraph\">Ein weiterer Anwendungsfall f\u00fcr Interrupts ergibt sich bei Anwendungen, bei denen wir den Beschleunigungssensor in kurzen Intervallen abfragen wollen \u2013 zum Beispiel bei der Vibrationsmessung. Das Aufwecken der <strong>CPU<\/strong> f\u00fcr jeden Datenpunkt bei hoher Frequenz w\u00fcrde viel Strom verbrauchen. Wir k\u00f6nnen jedoch den integrierten First-in-First-out-Puffer (<strong>FIFO<\/strong>) im <strong>LIS2DH12<\/strong> nutzen, um bis zu 32 Samples zu speichern und sie alle auf einmal auszulesen. Wir k\u00f6nnen einen Interrupt verwenden, um einen <strong>FIFO<\/strong>-Lesevorgang auszul\u00f6sen, wenn der <strong>FIFO<\/strong> voll ist.  <\/p>\n\n<h2 class=\"wp-block-heading\">Schnittstelle<\/h2>\n\n<p class=\"wp-block-paragraph\">Unsere Sensor-<em>Schnittstelle<\/em> unterst\u00fctzt keine Konfiguration generischer Interrupts, und wir m\u00f6chten die <em>Schnittstelle<\/em> einfach halten. Daher werden wir nicht die Sensor<em>schnittstelle<\/em> selbst erweitern, sondern stattdessen unsere <strong>LIS2DH12<\/strong>&#8211;<em>Schnittstelle<\/em>. Das hat nat\u00fcrlich den Nachteil, dass die Anwendung an den <strong>LIS2DH12<\/strong> gebunden ist, anstatt einen generischen Beschleunigungssensor-Treiber zu verwenden, aber andererseits k\u00f6nnen wir die Beschleunigungssensor-<em>Schnittstelle<\/em> jederzeit erweitern, falls Bedarf besteht.  <\/p>\n\n<p class=\"wp-block-paragraph\">Wir f\u00fcgen der <strong>LIS2DH12<\/strong>-Schnittstelle 4 Funktionen hinzu:<\/p>\n\n<pre class=\"wp-block-code\"><code>\/**\n * Enable 32-level FIFO in LIS2DH12\n * If FIFO is enabled, values are stored on LIS2DH12 FIFO and oldest element is returned on data read.\n *\n * parameter enable: true to enable FIFO, false to disable or reset FIFO.\n * return: RUUVI_DRIVER_SUCCESS on success, error code from stack on error.\n *\/\nruuvi_driver_status_t ruuvi_interface_lis2dh12_fifo_use(const bool enable);\n\n\/**\n * Read FIFO\n * Reads up to num_elements data points from FIFO and populates pointer data with them\n *\n * parameter num_elements: Input: number of elements in data. Output: Number of elements placed in data\n * parameter data: array of ruuvi_interface_acceleration_data_t with num_elements slots.\n * return: RUUVI_DRIVER_SUCCESS on success\n * return: RUUVI_DRIVER_ERROR_NULL if either parameter is NULL\n * return: RUUVI_DRIVER_ERROR_INVALID_STATE if FIFO is not in use\n * return: error code from stack on error.\n *\/\nruuvi_driver_status_t ruuvi_interface_lis2dh12_fifo_read(size_t* num_elements, ruuvi_interface_acceleration_data_t* data);\n\n\/**\n * Enable FIFO full interrupt on LIS2DH12.\n * Triggers as ACTIVE HIGH interrupt once FIFO has 32 elements.\n *\n * parameter enable: True to enable interrupt, false to disable interrupt\n * return: RUUVI_DRIVER_SUCCESS on success, error code from stack otherwise.\n **\/\nruuvi_driver_status_t ruuvi_interface_lis2dh12_fifo_interrupt_use(const bool enable);\n\n\/**\n * Enable activity interrupt on LIS2DH12\n * Triggers as ACTIVE HIGH interrupt while detected movement is above threshold limit_g\n * Axes are high-passed for this interrupt, i.e. gravity won't trigger the interrupt\n * Axes are examined individually, compound acceleration won't trigger the interrupt.\n *\n * parameter enable:  True to enable interrupt, false to disable interrupt\n * parameter limit_g: Desired acceleration to trigger the interrupt.\n *                    Is considered as \"at least\", the acceleration is rounded up to next value.\n *                    Is written with value that was set to interrupt\n * returns: RUUVI_DRIVER_SUCCESS on success\n * returns: RUUVI_DRIVER_INVALID_STATE if acceleration limit is higher than maximum scale\n * returns: error code from stack on error.\n *\n *\/\nruuvi_driver_status_t ruuvi_interface_lis2dh12_activity_interrupt_use(const bool enable, float* limit_g);<\/code><\/pre>\n\n<p class=\"wp-block-paragraph\"><a href=\"https:\/\/gist.githubusercontent.com\/ojousima\/f2c14da3696f2e52b248bc6c61112605\/raw\/4e9f128da3742824bab1cc5c176fec744ba125c5\/ruuvi_interface_lis2dh12_3.14.h\">Rohdaten anzeigen<\/a><\/p>\n\n<p class=\"wp-block-paragraph\">Die erste Funktion aktiviert den <strong>FIFO<\/strong>-Puffer, die zweite dient zum Auslesen der Daten aus dem <strong>FIFO<\/strong>, die dritte aktiviert den Interrupt bei vollem <strong>FIFO<\/strong> und die vierte aktiviert den Aktivit\u00e4ts-Interrupt. Diese Funktionen sind stark vereinfachte Versionen der Funktionen, die der <strong>LIS2DH12<\/strong> eigentlich erm\u00f6glichen w\u00fcrde, aber Einfachheit ist gut. <\/p>\n\n<h2 class=\"wp-block-heading\">Treiber<\/h2>\n\n<p class=\"wp-block-paragraph\">Unser Treiber besteht im Wesentlichen aus fest programmierten Entscheidungen: Wir w\u00e4hlen den <strong>LIS2DH12<\/strong>-Interrupt 1 als unseren <strong>FIFO<\/strong>-Interrupt und Interrupt 2 als Aktivit\u00e4ts-Interrupt. Obwohl der <strong>LIS2DH12<\/strong> einen konfigurierbaren Interrupt-Level f\u00fcr den <strong>FIFO<\/strong> unterst\u00fctzen w\u00fcrde, belassen wir den Interrupt bei einem festen Level von 32 Samples. <\/p>\n\n<p class=\"wp-block-paragraph\">Dasselbe gilt f\u00fcr den Aktivit\u00e4ts-Interrupt: Wir legen den Interrupt auf <em>\u201eWenn die hochpassgefilterte Bewegung auf einer beliebigen Achse den Schwellenwert \u00fcberschreitet\u201c<\/em> fest. Der Schwellenwert ist konfigurierbar und wird vom Treiber automatisch von mg in Counts umgerechnet. <\/p>\n\n<h2 class=\"wp-block-heading\">Testen<\/h2>\n\n<p class=\"wp-block-paragraph\">W\u00e4hrend wir an den Sensoren arbeiten, f\u00fcgen wir den Sensortreibern noch ein paar weitere Tests hinzu. Diesmal f\u00fcgen wir Tests hinzu, um zu verifizieren, dass die Sensormodi wie erwartet funktionieren: <\/p>\n\n<ul class=\"wp-block-list\"><li>Der Sensor muss nach der Initialisierung im <strong>SLEEP<\/strong>-Modus sein<\/li><li>Der Sensor muss alle Werte als <strong>INVALID<\/strong> zur\u00fcckgeben, wenn er vor dem ersten Sample ausgelesen wird<\/li><li>Der Sensor muss in den <strong>SLEEP<\/strong>-Modus zur\u00fcckkehren, nachdem der Modus auf <strong>SINGLE<\/strong> gesetzt wurde<\/li><li>Der Sensor muss neue Daten haben, nachdem das Setzen des Modus auf <strong>SINGLE<\/strong> abgeschlossen ist<\/li><li>Der Sensor muss bei aufeinanderfolgenden Aufrufen von <strong>DATA_GET<\/strong> nach einem <strong>SINGLE<\/strong>-Sample dieselben Werte einschlie\u00dflich Zeitstempel liefern<\/li><li>Der Sensor muss im <strong>CONTINUOUS<\/strong>-Modus bleiben, nachdem er auf kontinuierlich gesetzt wurde<\/li><li>Der Sensor muss <strong>RUUVI_DRIVER_ERROR_INVALID_STATE<\/strong> zur\u00fcckgeben, wenn er im kontinuierlichen Modus auf SINGLE gesetzt wird, und im kontinuierlichen Modus bleiben<\/li><li>Der Sensor muss <strong>RUUVI_DRIVER_ERROR_NULL<\/strong> zur\u00fcckgeben, wenn ein Null-Modus als Parameter \u00fcbergeben wird<\/li><li>Der Sensor muss im <strong>CONTINUOUS<\/strong>-Modus aktualisierte Daten zur\u00fcckgeben<\/li><\/ul>\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"808\" height=\"630\" src=\"https:\/\/ruuvi.com\/i\/u\/debug-terminal-test-sensor.png\" alt=\"Eine Testabdeckung im Debug-Terminal\" class=\"wp-image-3904\" srcset=\"https:\/\/ruuvi.com\/i\/u\/debug-terminal-test-sensor.png 808w, https:\/\/ruuvi.com\/i\/u\/debug-terminal-test-sensor-450x351.png 450w, https:\/\/ruuvi.com\/i\/u\/debug-terminal-test-sensor-768x599.png 768w, https:\/\/ruuvi.com\/i\/u\/debug-terminal-test-sensor-600x468.png 600w\" sizes=\"auto, (max-width: 808px) 100vw, 808px\" \/><figcaption>Unsere Testabdeckung w\u00e4chst, Zeit, ein paar Bugs zu beseitigen<\/figcaption><\/figure><\/div>\n\n<p class=\"wp-block-paragraph\">Wieder einmal stellen wir fest, dass es zahlreiche Grenzf\u00e4lle gibt, die unsere Treiber noch nicht handhaben \u2013 zum Beispiel geben unsere Treiber nach dem <em>init<\/em> vor Beginn der Messung keine explizit ung\u00fcltigen Werte zur\u00fcck. Diese Probleme zu beheben ist einfach; wir sp\u00fcren die einzelnen Fehler auf, wie wir es in <a href=\"https:\/\/ruuvi.com\/ruuvi-firmware-part-8-real-time-clock\/\">Teil 8<\/a> getan haben. <\/p>\n\n<h2 class=\"wp-block-heading\">Aufgaben<\/h2>\n\n<p class=\"wp-block-paragraph\">Diesmal m\u00fcssen wir <em>task_acceleration<\/em> und <em>task_advertisement<\/em> anpassen. Konkret f\u00fcgen wir Interrupt-Funktionen zu unserem <em>task_accelerometer<\/em> hinzu und aktivieren die <strong>LIS2DH12<\/strong>-Interrupts. <\/p>\n\n<p class=\"wp-block-paragraph\">Unser <strong>FIFO<\/strong>-Task gibt den Puffer aus und unser Bewegungs-Task erh\u00f6ht den Bewegungsz\u00e4hler. Wir f\u00fcgen au\u00dferdem eine Funktion hinzu, um den Bewegungsz\u00e4hler abzurufen. Der folgende Ausschnitt enth\u00e4lt die Erg\u00e4nzungen.  <\/p>\n\n<pre class=\"wp-block-code\"><code>static void task_acceleration_fifo_full_task(void *p_event_data, uint16_t event_size)\n{\n  ruuvi_driver_status_t err_code = RUUVI_DRIVER_SUCCESS;\n  ruuvi_interface_acceleration_data_t data&#091;32];\n  size_t data_len = sizeof(data);\n  err_code |= ruuvi_interface_lis2dh12_fifo_read(&amp;data_len, data);\n  char msg&#091;APPLICATION_LOG_BUFFER_SIZE] = { 0 };\n  snprintf(msg, sizeof(msg), \"%u: Read %u data points\\r\\n\", (uint32_t)ruuvi_platform_rtc_millis(), data_len);\n  ruuvi_platform_log(RUUVI_INTERFACE_LOG_INFO, msg);\n  \/*for(int ii = 0; ii &lt; data_len; ii++)\n  {\n    memset(msg, 0, sizeof(msg));\n    snprintf(msg, sizeof(msg), \"T: %lu; X: %.3f; Y: %.3f; Z: %.3f;\\r\\n\", (uint32_t)(data&#091;ii].timestamp_ms&amp;0xFFFFFFFF), data&#091;ii].x_g, data&#091;ii].y_g, data&#091;ii].z_g);\n    ruuvi_platform_log(RUUVI_INTERFACE_LOG_DEBUG, msg);\n    ruuvi_platform_delay_ms(1);\n  }\n  *\/\n  RUUVI_DRIVER_ERROR_CHECK(err_code, RUUVI_DRIVER_SUCCESS);\n}\n\nstatic void on_fifo (ruuvi_interface_gpio_evt_t event)\n{\n  ruuvi_platform_scheduler_event_put(NULL, 0, task_acceleration_fifo_full_task);\n}\n\nstatic void on_movement (ruuvi_interface_gpio_evt_t event)\n{\n  ruuvi_platform_log(RUUVI_INTERFACE_LOG_DEBUG, \"Activity\\r\\n\");\n  m_nbr_movements++;\n}\n\n#if RUUVI_BOARD_ACCELEROMETER_LIS2DH12_PRESENT\n    err_code = RUUVI_DRIVER_SUCCESS;\n    \/\/ Only SPI supported for now\n    bus = RUUVI_DRIVER_BUS_SPI;\n    handle = RUUVI_BOARD_SPI_SS_ACCELEROMETER_PIN;\n    err_code |= ruuvi_interface_lis2dh12_init(&amp;acceleration_sensor, bus, handle);\n    RUUVI_DRIVER_ERROR_CHECK(err_code, RUUVI_DRIVER_ERROR_NOT_FOUND);\n\n    if(RUUVI_DRIVER_SUCCESS == err_code)\n    {\n      err_code |= task_acceleration_configure();\n\n      err_code |= ruuvi_interface_lis2dh12_fifo_use(true);\n      err_code |= ruuvi_interface_lis2dh12_fifo_interrupt_use(true);\n      float ths = APPLICATION_ACCELEROMETER_ACTIVITY_THRESHOLD;\n      err_code |= ruuvi_interface_lis2dh12_activity_interrupt_use(true, &amp;ths);\n\n      \/\/ Let pins settle\n      ruuvi_platform_delay_ms(10);\n      \/\/ Setup FIFO and activity interrupts\n      err_code |= ruuvi_platform_gpio_interrupt_enable(RUUVI_BOARD_INT_ACC1_PIN, RUUVI_INTERFACE_GPIO_SLOPE_LOTOHI, RUUVI_INTERFACE_GPIO_MODE_INPUT_NOPULL, on_fifo);\n      err_code |= ruuvi_platform_gpio_interrupt_enable(RUUVI_BOARD_INT_ACC2_PIN, RUUVI_INTERFACE_GPIO_SLOPE_LOTOHI, RUUVI_INTERFACE_GPIO_MODE_INPUT_NOPULL, on_movement);\n      char msg&#091;APPLICATION_LOG_BUFFER_SIZE] = { 0 };\n      snprintf(msg, sizeof(msg), \"Configured interrupt threshold at %.3f mg\\r\\n\", ths);\n      ruuvi_platform_log(RUUVI_INTERFACE_LOG_INFO, msg);\n\n      return err_code;\n    }\n\n\nruuvi_driver_status_t task_acceleration_movement_count_get(uint8_t * const count)\n{\n  *count = m_nbr_movements;\n  return RUUVI_DRIVER_SUCCESS;\n}\n\n  #endif<\/code><\/pre>\n\n<p class=\"wp-block-paragraph\"><a href=\"https:\/\/gist.githubusercontent.com\/ojousima\/cfdc9e8dace46114223f1899fb670c77\/raw\/b767d85e6a30428994b055684043cf9bef1b8a1f\/ruuvi_firmware_task_accelerometer_interrupts.c\">Rohdaten anzeigen<\/a><\/p>\n\n<p class=\"wp-block-paragraph\">Beachte die unterschiedliche Handhabung der Ereignisse: Das Erh\u00f6hen eines Z\u00e4hlers im Aktivit\u00e4ts-Interrupt ist ein schnelles Ereignis, das wir im Interrupt-Kontext ausf\u00fchren k\u00f6nnen. Das Auslesen und Ausgeben des <strong>FIFO<\/strong> nimmt jedoch Zeit in Anspruch, daher werden wir (<a href=\"https:\/\/ruuvi.com\/ruuvi-firmware-part-11-scheduler\/\"><em>schedule<\/em><\/a>) die Aktion f\u00fcr einen sp\u00e4teren Zeitpunkt planen. <\/p>\n\n<p class=\"wp-block-paragraph\">Jetzt bestehen unsere Tests und der <strong>FIFO<\/strong> wird im Terminal ausgegeben. Wenn du den fertigen Code ausf\u00fchrst, beachte bitte, dass die <strong>FIFO<\/strong>-Ausgabe auf dem Level <strong>DEBUG<\/strong> erfolgt, und passe deinen Log-Level entsprechend an. <\/p>\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"494\" height=\"960\" src=\"https:\/\/ruuvi.com\/i\/u\/debug-terminal-fifo-print.png\" alt=\"Die FIFO-Ausgabe erfolgt auf dem DEBUG-Level\" class=\"wp-image-3905\" srcset=\"https:\/\/ruuvi.com\/i\/u\/debug-terminal-fifo-print.png 494w, https:\/\/ruuvi.com\/i\/u\/debug-terminal-fifo-print-232x450.png 232w\" sizes=\"auto, (max-width: 494px) 100vw, 494px\" \/><\/figure><\/div>\n\n<h2 class=\"wp-block-heading\">Datenformat 5<\/h2>\n\n<p class=\"wp-block-paragraph\">Der fehlende Teil f\u00fcr das <a href=\"http:\/\/github.com\/ruuvi\/ruuvi-sensor-protocols\">Datenformat 5<\/a> war die Bewegungserkennung. Wir f\u00fcgen <em>ruuvi_endpoint_5<\/em> hinzu, das die erforderlichen Daten als Input-Struct entgegennimmt und die Daten in den angegebenen Puffer kodiert. <\/p>\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"440\" src=\"https:\/\/ruuvi.com\/i\/u\/ruuvi-graphs-1024x440.png\" alt=\"Diagramme mit hinzugef&#xFC;gter Spannungsauslesung\" class=\"wp-image-3906\" srcset=\"https:\/\/ruuvi.com\/i\/u\/ruuvi-graphs-1024x440.png 1024w, https:\/\/ruuvi.com\/i\/u\/ruuvi-graphs-450x193.png 450w, https:\/\/ruuvi.com\/i\/u\/ruuvi-graphs-768x330.png 768w, https:\/\/ruuvi.com\/i\/u\/ruuvi-graphs-1536x660.png 1536w, https:\/\/ruuvi.com\/i\/u\/ruuvi-graphs-2048x880.png 2048w, https:\/\/ruuvi.com\/i\/u\/ruuvi-graphs-600x258.png 600w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><figcaption>Fast geschafft \u2013 Zeit, die Spannungsauslesung zu debuggen<\/figcaption><\/figure><\/div>\n\n<p class=\"wp-block-paragraph\">Das Problem mit der Spannungsauslesung stellte sich als einfaches Vers\u00e4umnis bei der Kodierung heraus. Ein weiterer Punkt f\u00fcr die Tests: \u00dcberpr\u00fcfen, ob die Kodierungsfunktionen die erwarteten Ergebnisse liefern. <\/p>\n\n<h2 class=\"wp-block-heading\">Stromverbrauchsprofil<\/h2>\n\n<p class=\"wp-block-paragraph\">Wir k\u00f6nnen einen deutlich erh\u00f6hten Stromverbrauch erwarten, da wir den Beschleunigungssensor mit 10 <em>Hz<\/em> statt der bisherigen 1 <em>Hz<\/em> betreiben und zudem <strong>FIFO<\/strong>-Auslesungen durchf\u00fchren. Schauen wir es uns an. <\/p>\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"607\" src=\"https:\/\/ruuvi.com\/i\/u\/power-profile-fifo-readable-1024x607.png\" alt=\"Stromverbrauchsprofil, das sich nicht viel ver&#xE4;ndert hat\" class=\"wp-image-3907\" srcset=\"https:\/\/ruuvi.com\/i\/u\/power-profile-fifo-readable-1024x607.png 1024w, https:\/\/ruuvi.com\/i\/u\/power-profile-fifo-readable-450x267.png 450w, https:\/\/ruuvi.com\/i\/u\/power-profile-fifo-readable-768x455.png 768w, https:\/\/ruuvi.com\/i\/u\/power-profile-fifo-readable-1536x911.png 1536w, https:\/\/ruuvi.com\/i\/u\/power-profile-fifo-readable-2048x1214.png 2048w, https:\/\/ruuvi.com\/i\/u\/power-profile-fifo-readable-600x356.png 600w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><figcaption>Unser Stromverbrauchsprofil hat sich nicht viel ver\u00e4ndert \u2013 aber die FIFO-Auslesung ist deutlich sichtbar<\/figcaption><\/figure><\/div>\n\n<p class=\"wp-block-paragraph\">Unser letztes Ergebnis lag etwas unter 23 <em>\u03bcA<\/em>, jetzt haben wir unseren Verbrauchswert um etwa 7,5 <em>\u03bcA<\/em> erh\u00f6ht. Eine Erh\u00f6hung des Stromverbrauchs um 33 % f\u00fcr eine <strong>FIFO<\/strong>-Auslesung, die f\u00fcr nichts weiter verwendet wird, ist nicht wirklich sinnvoll, daher werden wir ein Compiler-Flag hinzuf\u00fcgen, um den <strong>FIFO<\/strong> in Zukunft optional zu machen. <\/p>\n\n<h2 class=\"wp-block-heading\" id=\"1ce7\">Fazit<\/h2>\n\n<p class=\"wp-block-paragraph\">Wir haben nun die Grundlagen f\u00fcr Anwendungen mit dem Beschleunigungssensor geschaffen. Wir haben jedoch erst an der Oberfl\u00e4che der M\u00f6glichkeiten gekratzt, die Beschleunigungsdaten bieten. Einer der wichtigsten fehlenden Bausteine ist das schnelle und zuverl\u00e4ssige Auslesen der Daten. Dies wird bald mit dem <a href=\"https:\/\/learn.adafruit.com\/introduction-to-bluetooth-low-energy\/gatt\"><strong>GATT<\/strong><\/a>-Profil m\u00f6glich sein.   <\/p>\n\n<p class=\"wp-block-paragraph\"><strong>Bleib dran und folge <\/strong><a href=\"https:\/\/twitter.com\/ojousima\"><strong>@ojousima<\/strong><\/a><strong> und <\/strong><a href=\"https:\/\/twitter.com\/ruuvicom\"><strong>@ruuvicom<\/strong><\/a><strong> auf Twitter f\u00fcr #FirmwareFriday-Beitr\u00e4ge!<\/strong><\/p>\n","protected":false},"excerpt":{"rendered":"<p>In diesem Teil des Tutorials verwenden wir Interrupts, um Bewegungen des Tags zu erkennen und gepufferte Samples vom Beschleunigungssensor zu lesen. Den fertigen Code dieses Blog-Beitrags kannst du bei Ruuvi GitHub im ruuviblog-Branch unter dem Tag 3.14.0-alpha herunterladen. Bitte folge Teil 1 der Serie f\u00fcr Details zum Klonen des Repositories und Kompilieren des Codes. Die [&hellip;]<\/p>\n","protected":false},"author":6,"featured_media":135762,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"footnotes":""},"categories":[324],"tags":[],"class_list":["post-135761","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-ruuvi-software-artikel"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.8 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Ruuvi Firmware \u2013 Teil 14: Beschleunigungssensor-Interrupt \u2013 Ruuvi<\/title>\n<meta name=\"description\" content=\"Erfahre, wie Bewegungen des RuuviTag dank des Beschleunigungssensor-Interrupts und der Datenpufferung im Firmware-Code erkannt werden.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/ruuvi.com\/de\/ruuvi-firmware-teil-14-beschleunigungssensor-interrupt\/\" \/>\n<meta property=\"og:locale\" content=\"de_DE\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Ruuvi Firmware \u2013 Teil 14: Beschleunigungssensor-Interrupt \u2013 Ruuvi\" \/>\n<meta property=\"og:description\" content=\"Erfahre, wie Bewegungen des RuuviTag dank des Beschleunigungssensor-Interrupts und der Datenpufferung im Firmware-Code erkannt werden.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/ruuvi.com\/de\/ruuvi-firmware-teil-14-beschleunigungssensor-interrupt\/\" \/>\n<meta property=\"og:site_name\" content=\"Ruuvi\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/ruuvi.cc\" \/>\n<meta property=\"article:published_time\" content=\"2018-10-27T07:32:00+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2026-06-11T04:39:46+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/ruuvi.com\/i\/u\/ruuvi-firmware-series-part-14.jpeg\" \/>\n\t<meta property=\"og:image:width\" content=\"1280\" \/>\n\t<meta property=\"og:image:height\" content=\"669\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\n<meta name=\"author\" content=\"Otso Jousimaa\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@ruuvicom\" \/>\n<meta name=\"twitter:site\" content=\"@ruuvicom\" \/>\n<meta name=\"twitter:label1\" content=\"Verfasst von\" \/>\n\t<meta name=\"twitter:data1\" content=\"Otso Jousimaa\" \/>\n\t<meta name=\"twitter:label2\" content=\"Gesch\u00e4tzte Lesezeit\" \/>\n\t<meta name=\"twitter:data2\" content=\"9\u00a0Minute\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/ruuvi.com\\\/de\\\/ruuvi-firmware-teil-14-beschleunigungssensor-interrupt\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/ruuvi.com\\\/de\\\/ruuvi-firmware-teil-14-beschleunigungssensor-interrupt\\\/\"},\"author\":{\"name\":\"Otso Jousimaa\",\"@id\":\"https:\\\/\\\/ruuvi.com\\\/de\\\/#\\\/schema\\\/person\\\/143b8e2a095f1e6484b9186673c9ec00\"},\"headline\":\"Ruuvi Firmware \u2013 Teil 14: Beschleunigungssensor-Interrupt\",\"datePublished\":\"2018-10-27T07:32:00+00:00\",\"dateModified\":\"2026-06-11T04:39:46+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/ruuvi.com\\\/de\\\/ruuvi-firmware-teil-14-beschleunigungssensor-interrupt\\\/\"},\"wordCount\":1087,\"image\":{\"@id\":\"https:\\\/\\\/ruuvi.com\\\/de\\\/ruuvi-firmware-teil-14-beschleunigungssensor-interrupt\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/ruuvi.com\\\/i\\\/u\\\/ruuvi-firmware-series-part-14.jpeg\",\"articleSection\":[\"Ruuvi-Software-Artikel\"],\"inLanguage\":\"de\"},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/ruuvi.com\\\/de\\\/ruuvi-firmware-teil-14-beschleunigungssensor-interrupt\\\/\",\"url\":\"https:\\\/\\\/ruuvi.com\\\/de\\\/ruuvi-firmware-teil-14-beschleunigungssensor-interrupt\\\/\",\"name\":\"Ruuvi Firmware \u2013 Teil 14: Beschleunigungssensor-Interrupt \u2013 Ruuvi\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/ruuvi.com\\\/de\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/ruuvi.com\\\/de\\\/ruuvi-firmware-teil-14-beschleunigungssensor-interrupt\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/ruuvi.com\\\/de\\\/ruuvi-firmware-teil-14-beschleunigungssensor-interrupt\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/ruuvi.com\\\/i\\\/u\\\/ruuvi-firmware-series-part-14.jpeg\",\"datePublished\":\"2018-10-27T07:32:00+00:00\",\"dateModified\":\"2026-06-11T04:39:46+00:00\",\"author\":{\"@id\":\"https:\\\/\\\/ruuvi.com\\\/de\\\/#\\\/schema\\\/person\\\/143b8e2a095f1e6484b9186673c9ec00\"},\"description\":\"Erfahre, wie Bewegungen des RuuviTag dank des Beschleunigungssensor-Interrupts und der Datenpufferung im Firmware-Code erkannt werden.\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/ruuvi.com\\\/de\\\/ruuvi-firmware-teil-14-beschleunigungssensor-interrupt\\\/#breadcrumb\"},\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/ruuvi.com\\\/de\\\/ruuvi-firmware-teil-14-beschleunigungssensor-interrupt\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\\\/\\\/ruuvi.com\\\/de\\\/ruuvi-firmware-teil-14-beschleunigungssensor-interrupt\\\/#primaryimage\",\"url\":\"https:\\\/\\\/ruuvi.com\\\/i\\\/u\\\/ruuvi-firmware-series-part-14.jpeg\",\"contentUrl\":\"https:\\\/\\\/ruuvi.com\\\/i\\\/u\\\/ruuvi-firmware-series-part-14.jpeg\",\"width\":1280,\"height\":669,\"caption\":\"Einleitungsbild zu Ruuvi Firmware Serie Teil 14\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/ruuvi.com\\\/de\\\/ruuvi-firmware-teil-14-beschleunigungssensor-interrupt\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/ruuvi.com\\\/de\\\/front\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Ruuvi Firmware \u2013 Teil 14: Beschleunigungssensor-Interrupt\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/ruuvi.com\\\/de\\\/#website\",\"url\":\"https:\\\/\\\/ruuvi.com\\\/de\\\/\",\"name\":\"Ruuvi\",\"description\":\"Measure Your World\",\"potentialAction\":[],\"inLanguage\":\"de\"},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/ruuvi.com\\\/de\\\/#\\\/schema\\\/person\\\/143b8e2a095f1e6484b9186673c9ec00\",\"name\":\"Otso Jousimaa\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/fd52303e35b8b23c01cfeec7bb2636768de567cd33604f794ae86dd971e61645?s=96&d=mm&r=g\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/fd52303e35b8b23c01cfeec7bb2636768de567cd33604f794ae86dd971e61645?s=96&d=mm&r=g\",\"contentUrl\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/fd52303e35b8b23c01cfeec7bb2636768de567cd33604f794ae86dd971e61645?s=96&d=mm&r=g\",\"caption\":\"Otso Jousimaa\"},\"url\":\"https:\\\/\\\/ruuvi.com\\\/de\\\/author\\\/ojousima\\\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Ruuvi Firmware \u2013 Teil 14: Beschleunigungssensor-Interrupt \u2013 Ruuvi","description":"Erfahre, wie Bewegungen des RuuviTag dank des Beschleunigungssensor-Interrupts und der Datenpufferung im Firmware-Code erkannt werden.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/ruuvi.com\/de\/ruuvi-firmware-teil-14-beschleunigungssensor-interrupt\/","og_locale":"de_DE","og_type":"article","og_title":"Ruuvi Firmware \u2013 Teil 14: Beschleunigungssensor-Interrupt \u2013 Ruuvi","og_description":"Erfahre, wie Bewegungen des RuuviTag dank des Beschleunigungssensor-Interrupts und der Datenpufferung im Firmware-Code erkannt werden.","og_url":"https:\/\/ruuvi.com\/de\/ruuvi-firmware-teil-14-beschleunigungssensor-interrupt\/","og_site_name":"Ruuvi","article_publisher":"https:\/\/www.facebook.com\/ruuvi.cc","article_published_time":"2018-10-27T07:32:00+00:00","article_modified_time":"2026-06-11T04:39:46+00:00","og_image":[{"width":1280,"height":669,"url":"https:\/\/ruuvi.com\/i\/u\/ruuvi-firmware-series-part-14.jpeg","type":"image\/jpeg"}],"author":"Otso Jousimaa","twitter_card":"summary_large_image","twitter_creator":"@ruuvicom","twitter_site":"@ruuvicom","twitter_misc":{"Verfasst von":"Otso Jousimaa","Gesch\u00e4tzte Lesezeit":"9\u00a0Minute"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/ruuvi.com\/de\/ruuvi-firmware-teil-14-beschleunigungssensor-interrupt\/#article","isPartOf":{"@id":"https:\/\/ruuvi.com\/de\/ruuvi-firmware-teil-14-beschleunigungssensor-interrupt\/"},"author":{"name":"Otso Jousimaa","@id":"https:\/\/ruuvi.com\/de\/#\/schema\/person\/143b8e2a095f1e6484b9186673c9ec00"},"headline":"Ruuvi Firmware \u2013 Teil 14: Beschleunigungssensor-Interrupt","datePublished":"2018-10-27T07:32:00+00:00","dateModified":"2026-06-11T04:39:46+00:00","mainEntityOfPage":{"@id":"https:\/\/ruuvi.com\/de\/ruuvi-firmware-teil-14-beschleunigungssensor-interrupt\/"},"wordCount":1087,"image":{"@id":"https:\/\/ruuvi.com\/de\/ruuvi-firmware-teil-14-beschleunigungssensor-interrupt\/#primaryimage"},"thumbnailUrl":"https:\/\/ruuvi.com\/i\/u\/ruuvi-firmware-series-part-14.jpeg","articleSection":["Ruuvi-Software-Artikel"],"inLanguage":"de"},{"@type":"WebPage","@id":"https:\/\/ruuvi.com\/de\/ruuvi-firmware-teil-14-beschleunigungssensor-interrupt\/","url":"https:\/\/ruuvi.com\/de\/ruuvi-firmware-teil-14-beschleunigungssensor-interrupt\/","name":"Ruuvi Firmware \u2013 Teil 14: Beschleunigungssensor-Interrupt \u2013 Ruuvi","isPartOf":{"@id":"https:\/\/ruuvi.com\/de\/#website"},"primaryImageOfPage":{"@id":"https:\/\/ruuvi.com\/de\/ruuvi-firmware-teil-14-beschleunigungssensor-interrupt\/#primaryimage"},"image":{"@id":"https:\/\/ruuvi.com\/de\/ruuvi-firmware-teil-14-beschleunigungssensor-interrupt\/#primaryimage"},"thumbnailUrl":"https:\/\/ruuvi.com\/i\/u\/ruuvi-firmware-series-part-14.jpeg","datePublished":"2018-10-27T07:32:00+00:00","dateModified":"2026-06-11T04:39:46+00:00","author":{"@id":"https:\/\/ruuvi.com\/de\/#\/schema\/person\/143b8e2a095f1e6484b9186673c9ec00"},"description":"Erfahre, wie Bewegungen des RuuviTag dank des Beschleunigungssensor-Interrupts und der Datenpufferung im Firmware-Code erkannt werden.","breadcrumb":{"@id":"https:\/\/ruuvi.com\/de\/ruuvi-firmware-teil-14-beschleunigungssensor-interrupt\/#breadcrumb"},"inLanguage":"de","potentialAction":[{"@type":"ReadAction","target":["https:\/\/ruuvi.com\/de\/ruuvi-firmware-teil-14-beschleunigungssensor-interrupt\/"]}]},{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/ruuvi.com\/de\/ruuvi-firmware-teil-14-beschleunigungssensor-interrupt\/#primaryimage","url":"https:\/\/ruuvi.com\/i\/u\/ruuvi-firmware-series-part-14.jpeg","contentUrl":"https:\/\/ruuvi.com\/i\/u\/ruuvi-firmware-series-part-14.jpeg","width":1280,"height":669,"caption":"Einleitungsbild zu Ruuvi Firmware Serie Teil 14"},{"@type":"BreadcrumbList","@id":"https:\/\/ruuvi.com\/de\/ruuvi-firmware-teil-14-beschleunigungssensor-interrupt\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/ruuvi.com\/de\/front\/"},{"@type":"ListItem","position":2,"name":"Ruuvi Firmware \u2013 Teil 14: Beschleunigungssensor-Interrupt"}]},{"@type":"WebSite","@id":"https:\/\/ruuvi.com\/de\/#website","url":"https:\/\/ruuvi.com\/de\/","name":"Ruuvi","description":"Measure Your World","potentialAction":[],"inLanguage":"de"},{"@type":"Person","@id":"https:\/\/ruuvi.com\/de\/#\/schema\/person\/143b8e2a095f1e6484b9186673c9ec00","name":"Otso Jousimaa","image":{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/secure.gravatar.com\/avatar\/fd52303e35b8b23c01cfeec7bb2636768de567cd33604f794ae86dd971e61645?s=96&d=mm&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/fd52303e35b8b23c01cfeec7bb2636768de567cd33604f794ae86dd971e61645?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/fd52303e35b8b23c01cfeec7bb2636768de567cd33604f794ae86dd971e61645?s=96&d=mm&r=g","caption":"Otso Jousimaa"},"url":"https:\/\/ruuvi.com\/de\/author\/ojousima\/"}]}},"_links":{"self":[{"href":"https:\/\/ruuvi.com\/de\/wp-json\/wp\/v2\/posts\/135761","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/ruuvi.com\/de\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/ruuvi.com\/de\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/ruuvi.com\/de\/wp-json\/wp\/v2\/users\/6"}],"replies":[{"embeddable":true,"href":"https:\/\/ruuvi.com\/de\/wp-json\/wp\/v2\/comments?post=135761"}],"version-history":[{"count":1,"href":"https:\/\/ruuvi.com\/de\/wp-json\/wp\/v2\/posts\/135761\/revisions"}],"predecessor-version":[{"id":135765,"href":"https:\/\/ruuvi.com\/de\/wp-json\/wp\/v2\/posts\/135761\/revisions\/135765"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/ruuvi.com\/de\/wp-json\/wp\/v2\/media\/135762"}],"wp:attachment":[{"href":"https:\/\/ruuvi.com\/de\/wp-json\/wp\/v2\/media?parent=135761"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/ruuvi.com\/de\/wp-json\/wp\/v2\/categories?post=135761"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/ruuvi.com\/de\/wp-json\/wp\/v2\/tags?post=135761"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}