iOSアプリとESP32で遠隔散水-Arduinoコード-

遠隔散水するためのESP32側のコードです。
制御するバルブは4つの設定で書いています。

まずは全体コード。

#include <FirebaseESP32.h>
#include <WiFi.h>

// Firebase プロジェクトの設定
#define WIFI_SSID "******"
#define WIFI_PASSWORD "******"
// 電磁弁を制御するピン
#define VALVE1_PIN 14  
#define VALVE2_PIN 27
#define VALVE3_PIN 26
#define VALVE4_PIN 25

FirebaseData firebaseData;
FirebaseConfig config;
FirebaseAuth auth;

// Firebase Realtime Database のパスを定義
const String userId = "△△△△△";
const String deviceId = "△△△△△";
const String valvePath1 = "/devices/" + userId + "/" + deviceId + "/valves/valve1/isOn";
const String valvePath2 = "/devices/" + userId + "/" + deviceId + "/valves/valve2/isOn";
const String valvePath3 = "/devices/" + userId + "/" + deviceId + "/valves/valve3/isOn";
const String valvePath4 = "/devices/" + userId + "/" + deviceId + "/valves/valve4/isOn";

void setup() {
  Serial.begin(115200);
  Serial.println("Setup started");

  // ピンのモードを設定
  pinMode(VALVE1_PIN, OUTPUT);
  pinMode(VALVE2_PIN, OUTPUT);
  pinMode(VALVE3_PIN, OUTPUT);
  pinMode(VALVE4_PIN, OUTPUT);

  // Wi-Fi 接続
  WiFi.begin(WIFI_SSID, WIFI_PASSWORD);
  Serial.print("Connecting to Wi-Fi");
  while (WiFi.status() != WL_CONNECTED) {
    Serial.print(".");
    delay(500);
  }
  Serial.println("Connected");

  // Firebase 設定
  config.host = "controlingwatersupply-default-rtdb.asia-southeast1.firebasedatabase.app";
  config.api_key = "△△△△△";
  // Firebase Authentication で登録したユーザーのメールアドレス
  auth.user.email = "sample@lunchtown.com"; 
  // ユーザーのパスワード
  auth.user.password = "123456";

  Firebase.begin(&config, &auth);
  Firebase.reconnectWiFi(true);
  
  if (Firebase.beginStream(firebaseData, ("/devices/" + userId + "/" + deviceId + "/valves").c_str())) {
    Serial.println("Stream started successfully");
  } else {
    Serial.println("Could not start stream");
    Serial.println("REASON: " + firebaseData.errorReason());
  }

  Firebase.setStreamCallback(firebaseData, streamCallback, streamTimeoutCallback);
}

void loop() {
  // メインループでは特に何もしない
}

  void streamCallback(StreamData data) {
  Serial.println("Stream callback");
  Serial.print("Data path: ");
  Serial.println(data.dataPath());
  Serial.print("Data type: ");
  Serial.println(data.dataType());
  Serial.print("Event type: ");
  Serial.println(data.eventType());
  
  String path = data.dataPath();
    
  if (data.dataType() == "json") {
    FirebaseJson& json = data.jsonObject();
    FirebaseJsonData jsonData;
    json.toString(Serial, true);

    if (path == "/valve1") {
      if (json.get (jsonData, "isOn")) {
      bool valveState = jsonData.boolValue;
      digitalWrite(VALVE1_PIN, valveState ? HIGH : LOW);
      Serial.println("Valve 1 state changed.");
      Serial.println(valveState ? "ON" : "OFF");
      } else {
                Serial.println("Failed to get 'isON' for valve1");
      }
    } else if (path == "/valve2") {
      if (json.get(jsonData, "isOn")) {
      bool valveState = jsonData.boolValue;
      digitalWrite(VALVE2_PIN, valveState ? HIGH : LOW);
      Serial.println("Valve 2 state changed.");
      Serial.println(valveState ? "ON" : "OFF");
      } else {
                Serial.println("Failed to get 'isON' for valve2");
      }
    } else if (path == "/valve3") {
      if (json.get(jsonData, "isOn")) {
      bool valveState = jsonData.boolValue;
      digitalWrite(VALVE3_PIN, valveState ? HIGH : LOW);
      Serial.println("Valve 3 state changed.");
      Serial.println(valveState ? "ON" : "OFF");
      } else {
                Serial.println("Failed to get 'isON' for valve3");
      }
    } else if (path == "/valve4") {
      if (json.get(jsonData, "isOn")) {
      bool valveState = jsonData.boolValue;
      digitalWrite(VALVE4_PIN, valveState ? HIGH : LOW);
      Serial.println("Valve 4 state changed.");
      Serial.println(valveState ? "ON" : "OFF");
      } else {
                Serial.println("Failed to get 'isON' for valve4");
      }
    }
  }
}

void streamTimeoutCallback(bool timeout) {
  if (timeout) {
    Serial.println("Stream timeout, reconnecting...");
    Firebase.beginStream(firebaseData, ("/devices/" + userId + "/" + deviceId + "/valves").c_str());//(firebaseData, "devices/userId/deviceId/valves");
  }
}



ライブラリとピンの宣言

#include <FirebaseESP32.h>
#include <WiFi.h>

// Firebase プロジェクトの設定
#define WIFI_SSID "******"
#define WIFI_PASSWORD "******"
// 電磁弁を制御するピン
#define VALVE1_PIN 14  
#define VALVE2_PIN 27
#define VALVE3_PIN 26
#define VALVE4_PIN 25

FirebaseData firebaseData;
FirebaseConfig config;
FirebaseAuth auth;

ライブラリ、使用ピン、Firebase機能の宣言

ライブラリは、Firebase_ESP_Client.h ではなく FirebaseESP32を使用しています。

Wi-FiとESPで使用するピン番号を#defineで宣言しています。
ピンは汎用的に使える14 , 27, 26 , 25をピン穴の並び順に使用。

FirebaseData firebaseDataなどのFirebase機能を宣言して使えるようにします。

サーバー上でのパスの宣言

サーバー上のパスを宣言します。

実財のサーバーURLはこちらです。

/devices/xxxxx/△△△△△/valves/valve1/isOn


今回は複数ユーザーを対象にすることを想定しているのでユーザーIDを設定しています。
また、同様に各ユーザーが複数のESPデバイスを使用することも想定してデバイスIDも設定し、
それぞれのユーザーID、デバイスIDをパス上に組み込んでいます。

const String userId = "xxxxxx";
const String deviceId = "△△△△△";
const String valvePath1 = "/devices/" + userId + "/" + deviceId + "/valves/valve1/isOn";
const String valvePath2 = "/devices/" + userId + "/" + deviceId + "/valves/valve2/isOn";
const String valvePath3 = "/devices/" + userId + "/" + deviceId + "/valves/valve3/isOn";
const String valvePath4 = "/devices/" + userId + "/" + deviceId + "/valves/valve4/isOn";

最後の isOn(true / false) でバルブの開閉をコントロールします。