質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
Firebase

Firebaseは、Googleが提供するBasSサービスの一つ。リアルタイム通知可能、並びにアクセス制御ができるオブジェクトデータベース機能を備えます。さらに認証機能、アプリケーションのログ解析機能などの利用も可能です。

M5Stack

M5Stackは、小型のマイコンモジュールです。拡張モジュールが豊富に用意されており、センサと組み合わせることで測定機能を自由に追加することができます。

Arduino

Arduinoは、AVRマイコン、単純なI/O(入出力)ポートを備えた基板、C言語を元としたArduinoのプログラム言語と、それを実装した統合開発環境から構成されたシステムです。

Q&A

解決済

1回答

1998閲覧

FirebaseのRealtimeDBに置いてある複数(2つ以上)のデータをM5stackにて取得しようとするとM5側でエラーが出る

ISO130

総合スコア8

Firebase

Firebaseは、Googleが提供するBasSサービスの一つ。リアルタイム通知可能、並びにアクセス制御ができるオブジェクトデータベース機能を備えます。さらに認証機能、アプリケーションのログ解析機能などの利用も可能です。

M5Stack

M5Stackは、小型のマイコンモジュールです。拡張モジュールが豊富に用意されており、センサと組み合わせることで測定機能を自由に追加することができます。

Arduino

Arduinoは、AVRマイコン、単純なI/O(入出力)ポートを備えた基板、C言語を元としたArduinoのプログラム言語と、それを実装した統合開発環境から構成されたシステムです。

0グッド

0クリップ

投稿2021/09/13 02:00

編集2021/09/14 14:02

状況概要(発生している問題)と実現したいこと

FirebaseのRealtimeDBに2つの更新データ(下記が構成、データはkidsとadultsに2秒おきに入る)を置いています。

___
DatabaseName

raspi

kids:(整数データ1)
adults:(整数データ2)

___

M5stackからfirebaseのRealtimeDBにアクセスし、kidsとadultsの値を取りに行くコードを作成し、実行しましたが、ArduinoIDEのシリアルモニタからエラーが出て2つの値を取得できません。

M5stackにてFirebaseのRealtimeDBの2つのデータを取得するための方法をお伺いしたいです。

発生している問題・エラーメッセージ

M5stack実行時のArduinoIDEのシリアルモニタ出力(エラー画面)は以下

M5Stack initializing...OK 09:53:41.319 -> connecting............ 09:53:47.337 -> 09:53:47.337 -> WiFi Connected. 09:53:47.337 -> 192.+++.+++.+++ 09:53:54.234 -> put 09:53:54.234 -> data=41 09:53:58.452 -> put 09:53:58.452 -> data2=41 09:53:58.590 -> CORRUPT HEAP: Bad head at 0x3ffdf798. Expected 0xabba1234 got 0x3ffdf9e4 09:53:58.590 -> abort() was called at PC 0x40086afd on core 1 09:53:58.590 -> 09:53:58.590 -> ELF file SHA256: 0000000000000000 09:53:58.590 -> 09:53:58.590 -> Backtrace: 0x400886b4:0x3ffd3c00 0x40088931:0x3ffd3c20 0x40086afd:0x3ffd3c40 0x40086c29:0x3ffd3c70 0x400fb307:0x3ffd3c90 0x400f6e75:0x3ffd3f50 0x400f6d88:0x3ffd3fa0 0x4008d00d:0x3ffd3fd0 0x40081d4a:0x3ffd3ff0 0x40081eb9:0x3ffd4010 0x4012843a:0x3ffd4030 0x40123db3:0x3ffd4050 0x401241a1:0x3ffd4110 0x40120b1d:0x3ffd4140 0x40120c82:0x3ffd4170 0x40120d0a:0x3ffd4190 0x40120ec5:0x3ffd41b0 0x4012eaf1:0x3ffd41e0 0x4012f093:0x3ffd4210 0x4011b61d:0x3ffd4230 0x4011b65d:0x3ffd4250 0x400d9509:0x3ffd4270 0x400d8f03:0x3ffd44f0 0x400d9009:0x3ffd4520 0x4016c3a1:0x3ffd4540 0x400d877a:0x3ffd4560 0x400d87fd:0x3ffd4590 0x400d8977:0x3ffd45e0 0x400d61f7:0x3ffd4600 0x40089942:0x3ffd4690 09:53:58.636 -> 09:53:58.636 -> Rebooting... 09:53:58.683 -> ets Jul 29 2019 12:21:46 09:53:58.683 -> 09:53:58.683 -> rst:0xc (SW_CPU_RESET),boot:0x17 (SPI_FAST_FLASH_BOOT) 09:53:58.683 -> configsip: 0, SPIWP:0xee 09:53:58.683 -> clk_drv:0x00,q_drv:0x00,d_drv:0x00,cs0_drv:0x00,hd_drv:0x00,wp_drv:0x00 09:53:58.683 -> mode:DIO, clock div:1 09:53:58.683 -> load:0x3fff0018,len:4 09:53:58.683 -> load:0x3fff001c,len:1216 09:53:58.683 -> ho 0 tail 12 room 4 09:53:58.683 -> load:0x40078000,len:10944 09:53:58.683 -> load:0x40080400,len:6388 09:53:58.683 -> entry 0x400806b4 09:53:59.007 -> M5Stack initializing...OK 09:54:00.070 -> connecting........ (以下、上記を繰り返す)

該当のソースコード

M5fire.ino

1 2#include <M5Stack.h> 3#include <IOXhop_FirebaseStream.h> 4#include <IOXhop_FirebaseESP32.h> 5#include <WiFi.h> 6#include <ArduinoJson.h> 7 8#define WIFI_SSID "*******" 9#define WIFI_PASSWORD "******" 10 11// FirebaseのデータベースURL(ご自身のデータベースURLに変更してください) 12#define FIREBASE_DATABASE_URL "DatabaseName.firebaseio.com" 13 14String data; 15String data2; 16 17void setup() { 18 M5.begin(); 19 20 // Wi-Fi接続 21 WiFi.begin(WIFI_SSID, WIFI_PASSWORD); 22 Serial.print("connecting"); 23 while (WiFi.status() != WL_CONNECTED) { 24 Serial.print("."); 25 delay(500); 26 } 27 Serial.println(); 28 29 // Firebase初期化 30 Firebase.begin(FIREBASE_DATABASE_URL); 31 32 // WiFi Connected 33 Serial.println("\nWiFi Connected."); 34 Serial.println(WiFi.localIP()); 35 36 37 // M5Stackから更新された値を監視する No1 38 delay(5000); 39 Firebase.stream("/raspi/kids", [](FirebaseStream stream) { 40 String eventType = stream.getEvent(); 41 eventType.toLowerCase(); 42 Serial.println(eventType); 43 44 if (eventType == "put") { 45 String path = stream.getPath(); 46 data = stream.getDataString(); 47 Serial.print("data="); 48 Serial.println(data); 49 // ディスプレイ表示 50 M5.Lcd.setCursor(10, 30); 51 M5.Lcd.fillScreen(BLACK); 52 M5.Lcd.setTextColor(WHITE); 53 M5.Lcd.printf("kids: %s", data); 54 } 55 }); 56 57 58 // M5Stackから更新された値を監視する No2 59 delay(5000); 60 Firebase.stream("/raspi/adults", [](FirebaseStream stream2) { 61 String eventType2 = stream2.getEvent(); 62 eventType2.toLowerCase(); 63 Serial.println(eventType2); 64 65 if (eventType2 == "put") { 66 String path2 = stream2.getPath(); 67 data2 = stream2.getDataString(); 68 Serial.print("data2="); 69 Serial.println(data2); 70 // ディスプレイ表示 71 M5.Lcd.setCursor(10, 60); 72 M5.Lcd.fillScreen(BLACK); 73 M5.Lcd.setTextColor(WHITE); 74 M5.Lcd.printf("adults: %s", data2); 75 } 76 }); 77 78 79} 80 81void loop() { 82 // ディスプレイ表示 83// M5.Lcd.setCursor(10, 30); 84// M5.Lcd.fillScreen(BLACK); 85// M5.Lcd.setTextColor(WHITE); 86// M5.Lcd.printf("KIDS: %s", data); 87// M5.Lcd.setCursor(10, 60); 88// M5.Lcd.printf("ADULTS: %s", data2); 89}

集めた情報

いろいろ調べた結果、以下の情報が見つかりました。
firebaseを使う場合、マイコンのメモリが専有されるため複数のデータを取得することができない。複数データの取得のためにはマイコン種類を変える必要があると読めます。
ですが、これが正しいのかどうか、正しいのであれば不可避なのか他に手段がないのかも伺えるとありがたいです。

https://githubmemory.com/repo/mobizt/Firebase-Arduino-WiFiNINA/issues/15

補足情報(FW/ツールのバージョンなど)

使用しているM5stack: M5stackGray (https://www.switch-science.com/catalog/3648/)

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

自己解決

結果的には別手段で複数データを取得することとし、この問題を回避しました。

DatabaseName

raspi

の構成にして、raspiに複数のデータを1データとして入れるようにしました。
(例えば、20と33の2データを使いたい場合は、2033にして入れ、後解析で2データに分離した)

firebase-arduinoのライブラリより、stream関数はcallbackを呼ぶものと理解しましたが、
2つ以上callbackを設定するとマルチタスクの扱いになり、
どちらかがマイコン内の処理をしている最中に他のcallbackの処理が入ってエラーになるようです。

これを防ぐためにはcallbackが入っている際は他のcallbackが入らないように条件処理を追加するなどで対応する必要があるようですが、前述のやり方のほうが簡単であるため、このやり方は検証はしていません。

投稿2021/09/27 06:19

ISO130

総合スコア8

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問