LoginSignup
0
0

More than 1 year has passed since last update.

【Arduino Library 第4弾】大体(?) 6STEPで書く tinyESPNow

Last updated at Posted at 2022-02-16

0.ライブラリ

1.はじめに

自社基板のFWに ESPNow の実装をするたびに
「これ長いなぁ」と毎回感じており
特に100個のクローンを製作する場合にIPアドレスの設定等ちょっと面倒な事になります
そこで 自前で MYID を設定し基本ブロードキャスト送信
受信するときに MYID で振り分けが出来るような
仕組みを実装し Arduino Library として登録しました

2.仕組み

_slave.peer_addr[i] = (uint8_t)0xff;
上記の設定により ブロードキャスト送信

tinyESPNow::begin 

uint16_t tinyESPNow::begin(uint8_t myId, uint32_t arySize) {
  __arySize = arySize;
  __transAry = new uint8_t[__arySize];

  WiFi.mode(WIFI_STA);
  WiFi.disconnect();
  if (esp_now_init() == ESP_OK) {
    Serial.print("ESPNow Init Success\n");
  } else {
    Serial.print("ESPNow Init Failed\n");
    ESP.restart();
  }
  memset(&_slave, 0x0, sizeof(_slave));
  for (int i = 0; i < sizeof(_slave.peer_addr); ++i) {
    _slave.peer_addr[i] = (uint8_t)0xff;
  }
  esp_err_t addStatus = esp_now_add_peer(&_slave);
  esp_now_register_send_cb(&OnDataSent);
  esp_now_register_recv_cb(&OnDataRecv);

  __myId = myId;
  return 0;
}

受信したときに呼ばれるコールバック関数
if (recv[0] == __myId) {
}

void OnDataRecv(const uint8_t *mac_addr, const uint8_t *recv, int recvCnt) {
  if (recv[0] == __myId) {
    memcpy(__transAry, recv, recvCnt);
    __recved = true;
  }
}

3.使い方

tEN.get で バッファのポインタを持ってきて
tEN.put で バッファ更新して
tEN.sendで バッファを送信します
ESPNow はサーバ/クライアントの概念がありまてんので
これを2個の ESP32系基板に入れ
最初に立ち上げた方が受信 後に立ち上げた方が送信となり
未来永劫送受信できます

#include "tinyESPNow.h"
static tinyESPNow tEN;

#define BUFSIZE (64)            // The size of the buffer
#define MYID    (0xFF)

void dataUpdate() {
  uint8_t *buf = tEN.get();     // Get a pointer to the buffer
  buf[0] = 0xFF;
  Serial.printf("%02X=>", buf[1]);
  buf[1] = (buf[1] + 1) % 256;  // Add One to the received data
  Serial.printf("%02X\n", buf[1]);
  tEN.put(buf, 2);              // Update the buffer
  tEN.send();                   // Send the buffer
}

void setup() {
  Serial.begin( 115200 ); while (!Serial);
  tEN.begin(MYID, BUFSIZE);
  dataUpdate();
}

void loop() {
  if (tEN.isRecv()) {           // Did the data arrive?
    dataUpdate();
  }
  tEN.update();                 // Update class
  delay(20);
}

4. 6STEP とは?

  • バッファのポインタを持ってくる
  • 更新する
  • 書き込む
  • 送る
  • 受信があれば何かする

この6STEPになります

5. 最後に

コードがすっきりちました

@chrmlinux03

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0