//======================================================== // Example7_BMP_Buff8 // SDからひと画像読み込んで表示し、またSDから読み込むという仕様に変更 //======================================================== // v08 SDからひと画像読み込んで表示し、またSDから読み込むという仕様に変更する。 // 成功。表示はやや遅くなる。 // SD_CLKやOLED_CLKを16MHzにしても目視上大差なし。 // // // // // // //======================================================================== // SPIのESP32PIN接続(*印ピンは任意で設定可能) //           VSPI      HSPI // OLED SD // CS 5 15 // *RESET 33 32 'NoUse' // *DC 27 33 'NoUse' // MOSI 23 13 // MISO 19 'NoUse 12 // CLK 18 14 // // //======================================================================== //---------------------------- // SD関連セットアップ //---------------------------- #include #include File myFile; //---------------------------- // OLEDをVSPIに接続 //---------------------------- #include "SparkFun_RGB_OLED_64x64.h" // Click here to get the library: http://librarymanager/All#SparkFun_RGB_OLED_64x64 #define DRIVER_SPI SPI #define CS_PIN 5 #define DC_PIN 27 #define RST_PIN 33 RGB_OLED_64x64 myOLED; // Declare OLED object #define WORKING_BUFFER_LENGTH 2*64 uint8_t working_buffer[WORKING_BUFFER_LENGTH]; uint8_t Image_Buff[5][64 * 64 * 2] = {0}; // 64x64ドットのイメージバッファ10枚分初期化 String File_Name[5] = {"Boy.bmp", "Flower.bmp", "", "", ""};// 読み込むBMPファイル名のエリアを初期化 //------------------------ // SD をHSPIに設定 //------------------------ #define SD_SS 15 #define SD_CLK 14 #define SD_MISO 12 #define SD_MOSI 13 SPIClass spiSD(HSPI); //----------------- // Global変数 //----------------- int i, j; //int Max_F_No = 0; uint16_t I_size = 4096 * 2; //========================================================= // セットアップ処理 //========================================================= void setup() { //------------------- // ESP32起動確認 //------------------- delay(3000);// 起動まで3秒待つ //---- Boot Up Check ---- pinMode(0, OUTPUT);// Monitor LED点滅 for ( i = 0 ; i < 5 ; i ++) { delay(200); digitalWrite(0, HIGH);// delay(100); digitalWrite(0, LOW); } //------------------------ // Serial設定 //------------------------ Serial.begin(115200); // Choose the fastest serial connection you can! while (!Serial) {}; //----------------------------------------- //以下OLEDの初期化 //----------------------------------------- DRIVER_SPI.begin(); myOLED.begin(DC_PIN, RST_PIN, CS_PIN, DRIVER_SPI, 25000000); // Use 8 MHz SPI on Arduino Uno instead of the default/maximum (10 MHz) myOLED.clearDisplay(); myOLED.setCursor(0, 0); myOLED.println("BMP Display"); myOLED.println("Ver 06"); //-------------------------- // SDの初期設定とFileオープン //-------------------------- //---- 初期化メッセージ --------- Serial.println(); Serial.println("------ Ex7 BMP v06 ------"); Serial.println("Serial Ready"); Serial.print("Initializing SD card..."); spiSD.begin(SD_CLK, SD_MISO, SD_MOSI, SD_SS); if (!SD.begin(SD_SS, spiSD, 16000000)) { //CSピン状態確認 Serial.println("initialization failed!");// SD開始できなければERR while (1); } Serial.println("SD Card Ready to read"); } //================================================================ // LOOP処理 //================================================================ void loop() { //----------------------- // Fine名の配列から読み出す //----------------------- for ( i = 0 ; i < 10 ; i ++ ) { if ( File_Name[i] == "") { break; } myFile = SD.open("/" + File_Name[i]); // 画像のテキストデータ if (myFile) { Serial.println(File_Name[i]); Serial.println("File is opened"); } else { // if the file didn't open, print an error: Serial.println(File_Name[i]); Serial.println("error opening file"); while (1) { // ERRなら中断 } } //-------------------------------------------------- // BMPファイルを読み出しOLEDへ転送 //-------------------------------------------------- Read_BMP_File(i);// 読み出すFileの配列番号を引数としてSDのBMPデータを読み出して配列へセット //------------------- // 現ファイルをCLose //------------------- myFile.close(); //=========================================================== // 配列のBMPデータを繰り返しOLEDに表示する //=========================================================== //---------------------------- // OLEDディスプレイ設定 //---------------------------- myOLED.clearDisplay(); myOLED.setRowAddress(OLED_64x64_START_ROW, OLED_64x64_START_ROW + 0x40 - 1); myOLED.setColumnAddress(OLED_64x64_START_COL, OLED_64x64_START_COL + 0x40 - 1); myOLED.enableWriteRAM(); //------------------------- // 配列データをOLEDへ転送 //------------------------- myOLED.setCSlow(); myOLED.write_bytes(Image_Buff[i], true, I_size); myOLED.setCShigh(); //------------------------ // 1画面ディスプレイ表示終了 //------------------------ } } //========================================================================================== // 以下、追加関数 //========================================================================================== //--------------------------------------------- // 指定された配列File_NameにあるBMPファイルを開き // 配列Image_Buffにセットする //--------------------------------------------- void Read_BMP_File(int F_No) { #define Dot_No 4096 // 64x64 int Dot_Cnt = 0;// BMPファイルのドット用バイト(H、L)数カウント(64x64x2) int Image_Cnt = 0;// BMP画像ファイルの番号 int BMP_Ptr = 0;// BMPファイルのReadPointer char Read_B; int Start_Add = 0; int Ret = 0; int x; //---- 読み込んだRGBの3バイトを2バイトに圧縮する為の仮変数 ---- uint16_t RGB24[3]; uint8_t RGB16[2]; uint16_t Temp = 0; //-------------------------------- // 指定されたBMPファイルを配列に読み込む //-------------------------------- //---- データ先頭アドレス取得(4 bytes) ---- myFile.seek(0x000a); Read_B = myFile.read(); Start_Add = Read_B;// データ開始アドレスをセット myFile.seek(Start_Add);// データ開始アドレスまで進む while (myFile.available()) { RGB24[0] = myFile.read();// 3バイト読み込む RGB24[1] = myFile.read(); RGB24[2] = myFile.read(); //Temp = ((RGB24[0] & 0xF8) << 8) | ((RGB24[1] & 0xFC) << 3) | (RGB24[2] >> 3); //Temp = ((RGB24[0] & 0xF8) << 8) | ((RGB24[2] & 0xFC) << 3) | (RGB24[1] >> 3); //Temp = ((RGB24[1] & 0xF8) << 8) | ((RGB24[0] & 0xFC) << 3) | (RGB24[2] >> 3); //Temp = ((RGB24[1] & 0xF8) << 8) | ((RGB24[2] & 0xFC) << 3) | (RGB24[0] >> 3); //Temp = ((RGB24[2] & 0xF8) << 8) | ((RGB24[0] & 0xFC) << 3) | (RGB24[1] >> 3); Temp = ((RGB24[2] & 0xF8) << 8) | ((RGB24[1] & 0xFC) << 3) | (RGB24[0] >> 3); RGB16[0] = Temp >> 8;// 上位8ビット Image_Buff[F_No][Dot_Cnt] = RGB16[0]; // 64x64ドットのイメージバッファ Dot_Cnt ++; RGB16[1] = Temp & 0x00ff;// 下位8ビット Image_Buff[F_No][Dot_Cnt] = RGB16[1]; // 64x64ドットのイメージバッファ Dot_Cnt ++; } }