Vol.943 29.May.2026

Fitbitでスマホ同期ができない Lorem ipsum M5A)カラーOLED(SSD1331)接続

F Fitbitでスマホとの同期ができない

by fjk

 手持ちの鞄のベルトがFitbit_Versa4にぶつかり、保護カバーが外れたので、カバーを付け直したのだが、その時から僅かだがVersaの時刻が遅れてきた。
 そこで、正しい時刻に合わせるため、スマホのFitbitアプリを起動しようとしたところ、スマホの全画面が真っ暗になり、アプリが起動しなくなった。
 対策をネットで調べて見ると、「アプリを停止」、「キャッシュも削除」、「スマホを再起動」をする。それでもダメなら、再インストールするようとある(参考)。
 仰せの手順を実行する前に、とりあえず「スマホの再起動」を行ってみたところ、Fitbiitアプリが正常に立ち上がるようになり、正しい時刻に合わせることができた。
 おそらく、カバーが外れた時に、Versaのボタンも押されて、Versaがリセットされ、その時BT通信中だったため、通信エラーとなり、アプリがロックされていたものと思われる。
 スマホの不具合は、アプリを含め、やはり「スマホの再起動」が一番かな。

★ 5月19日から「FItbitアプリ」が「GoogleHealthアプリ」に移行しました。
  多くのデータは引き継がれますが、7月15日以降に、一部の古い機能のデータが削除されます。


L Lorem ipsum   〜ダミーテキスト

by fjk

 Lorem ipsum(ローレムイプサム) は、出版、ウェブデザイン、デザインなどの文分野で使用されているダミーテキスト(仮の文章)で、 レイアウトやフォントの見栄えを確認に、本文の代わりに配置する仮の文章として、利用されます。主な特徴は、

【Lorem ipsumの例】
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
【参 考】
ウィキペディア
Lorem ipsumの真実と活用法
Lorem Ipsumとは?
ローレムイプサムとは


M M5_Atomシリーズ(9) 〜カラーOLED(SSD1331)接続

by fjk

 表示機能が無いM5_AtomS3_LiteにSPI接続のカラーOLED(SSD1331)を接続した。
テストには「ゆるく楽しむプログラミング&電子工作」さんのページと、ライブラリ追加後のプロジェクトで、
  .pio/libdefs/m5stack-atoms3/Adafruite SSD1331・・/exsamples/test/test.ino
スケッチを参考にした。
 OLEDはabc912で紹介したQT095Bで、その時にC言語で作成した自作関数を用いてもよいが、フォントも別途準備する必要があるので、M5Atomで使えるAdafruit SSD1331ライブラリーを使ってみた。
 スケッチは、AtomS3用にピン番号と、5ピン使用でソフト動作のAdafruit_SSD1331()を使用するように変更しただけで、ほぼ動作した(Serialは115200bpsに、ダミー文章は長いので短くした)。
 なお、関数のプロトタイプ宣言をしていないので、setup()とloop()関数を後に移動させる必要がある。

<SSD1331初期化関数(以下の2種類が選択できる)>
ソフト動作: Adafruit_SSD1331(int8_t cs, int8_t dc, int8_t mosi, int8_t sclk, int8_t rst);
ハード動作: Adafruit_SSD1331(&SPI, int8_t cs, int8_t dc, int8_t rst);

【ハード】

★Resetもソフト制御する場合はG38を使用


【ソフト】 使用ライブラリーは
  ・M5Unified、 ・Adafruit-SSD1331
  ・Adafruit GFX、・Adafruit BusIO

      Platformio.ini

文字表示例

グラフィック表示例

  赤字部はオリジナルから変更、追加したところ
AtomS3-SSD1331.cpp(zip)

/*************************************(AtomS3-SSD1331.cpp)*****
 *	AtomS3 + SSD1331_OLED
 ***************************************************************/
#include <M5Unified.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1331.h>
#include <SPI.h>

// You can use any (4 or) 5 pins
#define sclk    7      //         ! 13
#define mosi    8      //         ! 11
#define cs      5      //         ! 10
#define rst    -1      // or 38   !  9
#define dc      6      //         !  8

// Color definitions
#define BLACK       0x0000
#define BLUE        0x001F
#define RED         0xF800
#define GREEN       0x07E0
#define CYAN        0x07FF
#define MAGENTA     0xF81F
#define YELLOW      0xFFE0
#define WHITE       0xFFFF

//-------------------------------------
// Option 1: use any pins but a little slower
Adafruit_SSD1331 display = Adafruit_SSD1331(cs, dc, mosi, sclk, rst);

// Option 2: must use the hardware SPI pins
//Adafruit_SSD1331 display = Adafruit_SSD1331(&SPI, cs, dc, rst);


float p = 3.1415926;

//------------------------------------

void testlines(uint16_t color) {
   display.fillScreen(BLACK);
   for (int16_t x=0; x < display.width()-1; x+=6) {
     display.drawLine(0, 0, x, display.height()-1, color);
   }
   for (int16_t y=0; y < display.height()-1; y+=6) {
     display.drawLine(0, 0, display.width()-1, y, color);
   }

   display.fillScreen(BLACK);
   for (int16_t x=0; x < display.width()-1; x+=6) {
     display.drawLine(display.width()-1, 0, x, display.height()-1, color);
   }
   for (int16_t y=0; y < display.height()-1; y+=6) {
     display.drawLine(display.width()-1, 0, 0, y, color);
   }

   // To avoid ESP8266 watchdog timer resets
   delay(0);

   display.fillScreen(BLACK);
   for (int16_t x=0; x < display.width()-1; x+=6) {
     display.drawLine(0, display.height()-1, x, 0, color);
   }
   for (int16_t y=0; y < display.height()-1; y+=6) {
     display.drawLine(0, display.height()-1, display.width()-1, y, color);
   }

   display.fillScreen(BLACK);
   for (int16_t x=0; x < display.width()-1; x+=6) {
     display.drawLine(display.width()-1, display.height()-1, x, 0, color);
   }
   for (int16_t y=0; y < display.height()-1; y+=6) {
     display.drawLine(display.width()-1, display.height()-1, 0, y, color);
   }
}


void testdrawtext(char *text, uint16_t color) {
  display.setTextSize(1);
  display.setTextColor(WHITE);
  display.setCursor(0,0);

  for (uint8_t i=0; i < 168; i++) {
    if (i == '\n') continue;
    display.write(i);
    if ((i > 0) && (i % 21 == 0))
      display.println();
  }
}


void testfastlines(uint16_t color1, uint16_t color2) {
   display.fillScreen(BLACK);
   for (int16_t y=0; y < display.height()-1; y+=5) {
     display.drawFastHLine(0, y, display.width()-1, color1);
   }
   for (int16_t x=0; x < display.width()-1; x+=5) {
     display.drawFastVLine(x, 0, display.height()-1, color2);
   }
}


void testdrawrects(uint16_t color) {
 display.fillScreen(BLACK);
 for (int16_t x=0; x < display.height()-1; x+=6) {
   display.drawRect((display.width()-1)/2 -x/2, (display.height()-1)/2 -x/2 , x, x, color);
 }
}


void testfillrects(uint16_t color1, uint16_t color2) {
 display.fillScreen(BLACK);
 for (int16_t x=display.height()-1; x > 6; x-=6) {
   display.fillRect((display.width()-1)/2 -x/2, (display.height()-1)/2 -x/2 , x, x, color1);
   display.drawRect((display.width()-1)/2 -x/2, (display.height()-1)/2 -x/2 , x, x, color2);
 }
}


void testfillcircles(uint8_t radius, uint16_t color) {
  for (uint8_t x=radius; x < display.width()-1; x+=radius*2) {
    for (uint8_t y=radius; y < display.height()-1; y+=radius*2) {
      display.fillCircle(x, y, radius, color);
    }
  }
}


void testdrawcircles(uint8_t radius, uint16_t color) {
  for (int16_t x=0; x < display.width()-1+radius; x+=radius*2) {
    for (int16_t y=0; y < display.height()-1+radius; y+=radius*2) {
      display.drawCircle(x, y, radius, color);
    }
  }
}

void testtriangles() {
  display.fillScreen(BLACK);
  int color = 0xF800;
  int t;
  int w = display.width()/2;
  int x = display.height();
  int y = 0;
  int z = display.width();
  for (t = 0 ; t <= 15; t+=1) {
    display.drawTriangle(w, y, y, x, z, x, color);
    x-=4;
    y+=4;
    z-=4;
    color+=100;
  }
}


void testroundrects() {
  display.fillScreen(BLACK);
  int color = 100;
  int i;
  int t;
  for(t = 0 ; t <= 4; t+=1) {
    int x = 0;
    int y = 0;
    int w = display.width();
    int h = display.height();
    for(i = 0 ; i <= 8; i+=1) {
      display.drawRoundRect(x, y, w, h, 5, color);
      x+=2;
      y+=3;
      w-=4;
      h-=6;
      color+=1100;
    }
    color+=100;
  }
}


void tftPrintTest() {
  display.fillScreen(BLACK);
  display.setCursor(0, 5);
  display.setTextColor(RED);
  display.setTextSize(1);
  display.println("Hello World!");
  display.setTextColor(YELLOW, GREEN);
  display.setTextSize(2);
  display.print("Hello Wo");
  display.setTextColor(BLUE);
  display.setTextSize(3);
  display.print(1234.567);
  delay(1500);
  display.setCursor(0, 5);
  display.fillScreen(BLACK);
  display.setTextColor(WHITE);
  display.setTextSize(0);
  display.println("Hello World!");
  display.setTextSize(1);
  display.setTextColor(GREEN);
  display.print(p, 5);
  display.println(" Want pi?");
  display.print(8675309, HEX); // print 8,675,309 out in HEX!
  display.print(" Print HEX");
  display.setTextColor(WHITE);
  display.println("Sketch has been");
  display.println("running for: ");
  display.setTextColor(MAGENTA);
  display.print(millis() / 1000);
  display.setTextColor(WHITE);
  display.print(" seconds.");
}


void lcdTestPattern(void){
  uint8_t w,h;
  display.setAddrWindow(0, 0, 96, 64);

  for (h = 0; h < 64; h++) {
    for (w = 0; w < 96; w++) {
      if (w > 83) {
        display.writePixel(w, h, WHITE);
      } else if (w > 71) {
        display.writePixel(w, h, BLUE);
      } else if (w > 59) {
        display.writePixel(w, h, GREEN);
      } else if (w > 47) {
        display.writePixel(w, h, CYAN);
      } else if (w > 35) {
        display.writePixel(w, h, RED);
      } else if (w > 23) {
        display.writePixel(w, h, MAGENTA);
      } else if (w > 11) {
        display.writePixel(w, h, YELLOW);
      } else {
        display.writePixel(w, h, BLACK);
      }
    }
  }
  display.endWrite();
}

/*===========================================*/
void setup(void) {
  delay(2000); 		    // 書込後SerialTerminal応答準備用
  Serial.begin(115200);
  Serial.println("hello!");
  display.begin();

  Serial.println("init");
  uint16_t time = millis();
  display.fillScreen(BLACK);
  time = millis() - time;
  Serial.println(time, DEC);
  delay(500);

  lcdTestPattern();
  delay(1000);

  display.fillScreen(BLACK);
  display.setCursor(0,0);
  display.print("-- SSD1331 --");
  delay(1000);

  // tft print function!
  tftPrintTest();
  delay(2000);

  //a single pixel
  display.drawPixel(display.width()/2, display.height()/2, GREEN);
  delay(500);

  // line draw test
  testlines(YELLOW);
  delay(500);

  // optimized lines
  testfastlines(RED, BLUE);
  delay(500);

  testdrawrects(GREEN);
  delay(1000);

  testfillrects(YELLOW, MAGENTA);
  delay(1000);

  display.fillScreen(BLACK);
  testfillcircles(10, BLUE);
  testdrawcircles(10, WHITE);
  delay(1000);

  testroundrects();
  delay(500);

  testtriangles();
  delay(500);

  mediabuttons();
  delay(1000);

  Serial.println("done");
  delay(1000);
}


/*==========================================*/
void loop() {
}
/*==========================================*/


※プログラムのリストをハイライト付きのスタイルで見る場合はここをクリック


※ 本レポートの参考・利用は、あくまでも自己責任でお願いします。


Fitbitでスマホ同期ができない Lorem ipsum M5A)カラーOLED(SSD1331)接続