diff --git a/SampleSrc/TestBuild/TestBuild.ino b/SampleSrc/TestBuild/TestBuild.ino index 9d99309..208ca33 100644 --- a/SampleSrc/TestBuild/TestBuild.ino +++ b/SampleSrc/TestBuild/TestBuild.ino @@ -1,69 +1,14 @@ -#include - -void setup() { - Serial.begin(115200); - M5.begin(); - M5.Lcd.setRotation(3); - Serial.println("整数 または 6文字の16進数(RRGGBB)を入力してください。"); -} - -String str = ""; // String: 可変長の文字列クラス -void loop() { - char buf[100] = {0}; - int pos = 0; - while (Serial.available()) { //PCから送信された文字があるあいだ、くりかえす - char c = Serial.read(); // 1バイト読み取る - buf[pos] = c; // 配列buf に格納 - pos++; // 格納位置をひとつ右へ - } - if (pos > 0) { - buf[pos] = 0; - String sbuf = buf; - sbuf.trim(); //文字列の前と後の空白と改行を取り除く(破壊的メソッド) - str.concat(sbuf); // 文字列の連結 (意味としては、str = str + sbuf) - Serial.println(str); - if (isDigit(sbuf)) { - int num = sbuf.toInt(); - Serial.println( num * num ); - } - if (sbuf.length() == 6) { // RRGGBBとして、LCD画面の背景を塗りつぶす - sbuf.toLowerCase(); - uint8_t r = hexToDec( sbuf.substring(0, 2) ); - uint8_t g = hexToDec( sbuf.substring(2, 4) ); - uint8_t b = hexToDec( sbuf.substring(4, 6) ); - M5.Lcd.fillScreen( getColorUInt16( r , g , b ) ); - M5.Lcd.setCursor(0, 70, 4); - M5.Lcd.printf(" %02x %02x %02x \n", r, g, b); - M5.Lcd.printf(" %d %d %d ", r, g, b); - } - } - delay(50); -} -//全ての文字が0〜9なら、1(true)を返す -bool isDigit(String s) { - bool isAllDigit = true; - const char *p = s.c_str(); // String.c_str() は、NULLで終端されたchar配列の先頭アドレスを返す - while ( *p != 0 ) { - if (*p < '0' || '9' < *p) isAllDigit = false; - p++; - } - return isAllDigit; -} -// M5 用の、16ビットカラー値に変換 引用:https://qiita.com/nnn112358/items/ea6b5e81623ba690343c -uint16_t getColorUInt16(uint8_t red, uint8_t green, uint8_t blue) { - return ((red >> 3) << 11) | ((green >> 2) << 5) | (blue >> 3); -} -// 引数hex が16進表記の文字列だと仮定して、10進の値を返す -uint8_t hexToDec(String hex) { - int dec = 0; - int tmp = 0; - for (int p = 0; p < hex.length(); p++) { - tmp = int(hex.charAt(p)); - if ( '0' <= tmp && tmp <= '9' ) tmp = tmp - '0'; - if ( 'a' <= tmp && tmp <= 'f' ) tmp = tmp - 'a' + 10; - if ( 'A' <= tmp && tmp <= 'F' ) tmp = tmp - 'A' + 10; - tmp = constrain(tmp, 0, 15); //例外処理 - dec = (dec * 16) + tmp; - } - return dec; -} \ No newline at end of file +int num = 0; +void setup() { + Serial.begin(115200); // 通信速度をbpsで設定 +} +void loop() { + Serial.printf("日本語 %d \n" , num); + num++; + delay(500); // 500ミリ秒待つ +} + + + + + diff --git a/SampleSrc/Upload.sh b/SampleSrc/Upload.sh index d30bc49..8dcc956 100755 --- a/SampleSrc/Upload.sh +++ b/SampleSrc/Upload.sh @@ -6,7 +6,7 @@ echo "compile ${file}" cp ${file} TestBuild/TestBuild.ino cd TestBuild - ./compile.sh && ./upload.sh #&& ./monitor.sh + ./compile.sh 2>&1 && ./upload.sh 2>&1 cd .. exit fi @@ -43,3 +43,5 @@ + + diff --git a/SampleSrc/espnow03.ino b/SampleSrc/espnow03.ino new file mode 100644 index 0000000..62f392c --- /dev/null +++ b/SampleSrc/espnow03.ino @@ -0,0 +1,111 @@ +#include "M5StickCPlus.h" +#include +#include + +esp_now_peer_info_t peerInfo; +int line = 0; + +void Init_ESPNOW() +{ // ESPNowの初期化 + // 引用: https://101010.fun/iot/esp32-m5stickc-plus-esp-now.html + WiFi.mode(WIFI_STA); + WiFi.disconnect(); + if (esp_now_init() == ESP_OK) + { + M5.Lcd.println("ESP-Now Init Success"); + } + else + { + M5.Lcd.println("ESP-Now Init failed"); + ESP.restart(); + } + // マルチキャスト用Slave登録 + memset(&peerInfo, 0, sizeof(peerInfo)); + for (int i = 0; i < 6; ++i) + { + peerInfo.peer_addr[i] = (uint8_t)0xff; + } + esp_err_t addStatus = esp_now_add_peer(&peerInfo); + if (addStatus == ESP_OK) + { + // Pair success + M5.Lcd.println("ESP add peer success"); + esp_now_register_send_cb(onESPNOWSent); //送信後のコールバック関数を指定する + esp_now_register_recv_cb(onESPNOWReceive); ///受信時のコールバック関数を指定する + } +} +// データを送信した後に実行されるコールバック関数 +// 引用: https://101010.fun/iot/esp32-m5stickc-plus-esp-now.html +void onESPNOWSent(const uint8_t *mac_addr, esp_now_send_status_t status) +{ + // char macStr[18]; + // snprintf(macStr, sizeof(macStr), "%02X:%02X:%02X:%02X:%02X:%02X", + // mac_addr[0], mac_addr[1], mac_addr[2], mac_addr[3], mac_addr[4], mac_addr[5]); + line++; + if (line > 3) + { + M5.Lcd.fillScreen(YELLOW); + M5.Lcd.setCursor(0, 0, 1); + line = 0; + M5.Beep.tone(2000, 500); + } + else + { + M5.Beep.tone(1000, 500); + } + M5.Lcd.setTextColor(BLACK, GREEN); + + M5.Lcd.println(status == ESP_NOW_SEND_SUCCESS ? "Delivery Success" : "Delivery Fail"); +} + +void setup() +{ + M5.begin(); + M5.Lcd.setRotation(3); + M5.Lcd.fillScreen(YELLOW); + + M5.Lcd.setTextColor(BLACK, YELLOW); + M5.Lcd.setCursor(0, 0, 1); + M5.Lcd.setTextSize(2); + + Init_ESPNOW(); +} +void loop() +{ + M5.update(); + M5.Beep.update(); + if (M5.BtnA.wasReleased()) + { + uint8_t data[100] = {100}; // Data to be sent uint8_tは0〜255の数値(1Byte) + float pi = 3.14159265f; + double dpi = 3.14159265358979323; + const void* ppi = π + const void* pdpi = &dpi; + memcpy(data+1, ppi, sizeof(pi)); + memcpy(data+5, pdpi, sizeof(dpi)); + sprintf((char *)data+13,"ABCDEFG_abcdefg"); // Store string (Line86) + // for (int i = 1; i < 80; i += 10) + // { + // sprintf((char *)data + i, "ABCDEFGHIJ"); + // } + esp_err_t result = esp_now_send(peerInfo.peer_addr, data, sizeof(data)); // Really send + } + delay(20); +} +// データを受け取った時に実行されるコールバック関数 +void onESPNOWReceive(const uint8_t *mac_addr, const uint8_t *data, int data_len) +{ + if (data[0] == 100) // 100に深い意味はない。uint8_tは0〜255の数値 + { + M5.Beep.tone(2000, 1000); + M5.Lcd.fillScreen(YELLOW); + M5.Lcd.setCursor(0, 0, 1); + M5.Lcd.setTextColor(BLACK, CYAN); + + float *ppi = (float*)&data[1]; + double *dppi = (double*)&data[5]; + M5.Lcd.printf("%.8f\n", *ppi); + M5.Lcd.printf("%.16f\n", *dppi); + // M5.Lcd.printf("%s\n", ?????[??] ); // Print string stored at Line86 + } +}