n_shinichi’s blog

日々の備忘録、 趣味のあれこれなど紹介 (すみません、メニュー、リンク、カテゴリー分けがうまくできてません、★記事一覧★で見てください...) NHK魔改造の夜ではDンソーのベテランアドバイザーってことで出ました♪

MENU

Arduinoスケッチのおぼえ。 スマホ(RemoteXY) ⇐BLE⇒ M5StickC ⇐ESPNOW⇒ ESP-01 

一応動かしてたスケッチのおぼえ。

他のスケッチの流用なのでゴミが入っててバグもあるかと思うけど・・・

/////////////////////////////////////////////////////////////////////////////

//
//  スマホにM5Stick電圧表示
//
#include "M5StickCPlus.h"
#define M5_LED    10

///// ESPNOW//////////////////////////////////////////////////////////////
#include <esp_now.h>
#include <WiFi.h>
uint8_t slaveAddress = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff};
#define CHANNEL 0
///////////////////////////////////////////////////////////////////////////


///// Remote_BLE ///////////////////////////////////////////////////////////
#define REMOTEXY_MODE__ESP32CORE_BLE
#include <BLEDevice.h>
#include <RemoteXY.h>
#define REMOTEXY_BLUETOOTH_NAME "RemoteXY"
#pragma pack(push, 1)
uint8_t RemoteXY_CONF =   // 55 bytes
  { 255,1,0,44,0,48,0,16,31,1,1,0,10,44,44,44,2,31,0,67,
  4,2,19,27,16,2,26,11,67,4,2,4,20,9,2,26,11,67,4,35,
  19,26,16,2,26,11,67,4,35,4,20,9,2,26,11 }; 
struct {
  uint8_t button_1; // =1 if button pressed, else =0 
  char M5_Stick_Batt[11]; 
  char M_sec[11];
  char ESP_01_Batt[11];
  char E_sec[11]; 
  uint8_t connect_flag;  // =1 if wire connected, else =0 
} RemoteXY;
#pragma pack(pop)
/////////////////////////////////////////////////////////////////////////////////

unsigned char recvData[100];
static int8_t sendData[100];

unsigned long ms100,ms1000;
float batt_M5stick,batt_ESP01;
int M5_sec,ESP_sec;
uint8_t LED_sw;

void setup() 
{
  M5.begin();
  setupESPNOW();
  pinMode(M5_LED, OUTPUT);
  RemoteXY_Init (); 

  M5.Lcd.setTextFont(4);
  M5.Lcd.setRotation(3);
  M5.Lcd.fillScreen(BLACK);
  M5.Lcd.setTextSize(1);
  M5.Lcd.setCursor(0, 0);
  M5.Lcd.println("RemoteXY_BLE_test");
  
ms100 = ms1000 = millis();
}

void loop() 

if (millis() >  ms100){

// RemoteXY /////////////////////////////////////////////////////////////////////
  RemoteXY_Handler ();
  LED_sw = RemoteXY.button_1;
  digitalWrite(M5_LED,(LED_sw == 1)?LOW:HIGH);
  dtostrf(M5_sec,       4, 0,  RemoteXY.M_sec);
  dtostrf(batt_M5stick, 3, 1,  RemoteXY.M5_Stick_Batt);
  dtostrf(ESP_sec,      4, 0,  RemoteXY.E_sec);
  dtostrf(batt_ESP01,   3, 1,  RemoteXY.ESP_01_Batt);

// ESPNOW /////////////////////////////////////////////////////////////////////
  sendData[0] = LED_sw;
  esp_now_send(slaveAddress, (uint8_t*)sendData, 100);       

////////////////////////////////////////////////////////////////////////////////////
 ms100+=100;
 }

if (millis() >  ms1000){
  M5_sec++;
  batt_M5stick = M5.Axp.GetVbatData() * 1.1 / 1000;   // 3.3-4.1V 
  ESP_sec = recvData[1];
  batt_ESP01 =(float)(recvData[2]*0.1)-0.1;   // 0.1およそ大きいので補正
  M5.Lcd.setCursor(0, 25);
  M5.Lcd.printf("M5_Count %3d",M5_sec); 
  M5.Lcd.setCursor(0, 50);
  M5.Lcd.printf("M5stick_Batt %3.1f v   ",batt_M5stick); 
  M5.Lcd.setCursor(0, 80);
  M5.Lcd.printf("ESP01_Count %3d",ESP_sec);   
  M5.Lcd.setCursor(0,105);
  M5.Lcd.printf("ESP-01_Batt %3.1f v   ",batt_ESP01); 
 ms1000+=1000;
 }
 
}


void setupESPNOW() {
  WiFi.mode(WIFI_STA);
  WiFi.disconnect();
  esp_now_init();
  esp_now_register_recv_cb(onRecv);
  esp_now_peer_info_t peerInfo={};
  memcpy(peerInfo.peer_addr, slaveAddress, 6);
  peerInfo.channel = CHANNEL;
  peerInfo.encrypt = false;
  esp_now_add_peer(&peerInfo);
}

void onRecv(const uint8_t * mac, const uint8_t *on_RecvData, int len) {
  for (int i=0; i<len; i++)    recvData[i]=on_RecvData[i];
}

 

ESP-01のスケッチはこんな感じ

/////////////////////////////////////////////////////////////////////////////////////////

#include <ESP8266WiFi.h>
#include <espnow.h>
#define CHANNEL 0
#define LED 2
uint8_t slaveAddress[] = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff}; 
unsigned char recvData[100];
static int8_t sendData[100];
ADC_MODE(ADC_VCC);

unsigned long ms10,ms100,ms200,ms500,ms1000,ms2000;
int8_t Batt,Batt_old,count;
int LED_sw;

 

void setup() {
 setupESPNOW();
 pinMode(2,OUTPUT);
 digitalWrite(2,LOW);
 delay(2000);
 digitalWrite(2,HIGH);
 ms10=ms100=ms200=ms500=ms1000=ms2000=millis();
 
}

void loop() {

    
    if (millis() >  ms100){
      LED_sw = recvData[0]; 

      if( LED_sw == 1 ){
         digitalWrite(LED,LOW);
      }
      else{
         digitalWrite(LED,HIGH);
      }
      
    ms100+=100;
    }

 

    if (millis() >  ms1000){ 
        Batt = ESP.getVcc()*0.01;//  受信側でx0.1する       
           sendData[2] = Batt;     
           esp_now_send(slaveAddress, (uint8_t*)sendData, 100);
        count++;
        sendData[1] = count;
    ms1000+=1000; 
    }

    
}

void setupESPNOW(){
    WiFi.mode(WIFI_STA);
    WiFi.disconnect();
    esp_now_init();
    esp_now_set_self_role(ESP_NOW_ROLE_COMBO);
    esp_now_register_recv_cb(onRecv);
}

void onRecv(uint8_t* mac_addr, uint8_t* on_RecvData, uint8_t len) {
    for (int i=0; i<len; i++) recvData[i] = on_RecvData[i];
}

 

貼り付けてから気付いた。

setupESPNOW() 同じのつもりだった...けど違う。。。

ろくにコメント入れないもんでちょっと時間経つと

なんでだっけ?になってしまう ちょっと確認しないと。

 

半年前のこと・・・すっかり忘れてる。

なんかいろいろやったんだけどな。。。

結局、M5StickCのスケッチを

ESP8266側のESPNOWと同じsetupESPNOW()にしたら・・・

 esp_・・・3行だけ。 だと

ESPNOWは

M5StickCからESP-01への送信ができない。

ESP-01からM5StickCへの送信はできてる。

ESP32とESP8266ではちょっと使い勝手が違ってたとこあった気もする。

そもそものトラップになるのが

M5StickCでは espnow.h だけど ESP-01ではesp_now.h じゃないといけない。

ArduinoIDEでのボード選定がうまくいってないから?なのかもだけど...

 

以前、M5StickC Plus では M5StickC Plus が選べてた気がするけど

今はメニューから消えてる M5StickC しか選べない。 よくわからん。

 

BLE,ESPNOWのプログラムはでかいみたい。両方使えるようにしようとすると、

標準設定ではメモリが足りないって怒られる。

なのでOTAを外してやらんといかん。