1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143
|
#include <WiFi.h>
#include <TFT_eSPI.h>
#include <FS.h>
#include <SPI.h>
#include <SD.h>
TFT_eSPI tft = TFT_eSPI();
// Paramètres SD
#define SD_MOSI 23
#define SD_MISO 19
#define SD_SCK 18
#define SD_CS 5
SPIClass SD_SPI;
void setup() {
Serial.begin(115200);
SD_SPI.begin(SD_SCK, SD_MISO, SD_MOSI);
// Initialisation écran
tft.init();
tft.setRotation(1);
tft.fillScreen(TFT_BLACK);
if (!SD.begin(SD_CS, SD_SPI, 40000000))
{
Serial.println("Montage carte échoué");
return ;
}
uint64_t cardSize = SD.cardSize() / (1024 * 1024);
Serial.printf("Taille de la carte SD : %lluMB\n", cardSize);
listDir(SD, "/", 0);
showBMP("plan.bmp", 0, 0);
delay(3000);
}
void loop() {
}
void listDir(fs::FS &fs, const char * dirname, uint8_t levels){
Serial.printf("Contenu du répertoire : %s\n", dirname);
File root = fs.open(dirname);
if(!root){
Serial.println("Impossible d'ouvrir le répertoire");
return;
}
if(!root.isDirectory()){
Serial.println("Ce n'est pas un répertoire");
return;
}
File file = root.openNextFile();
while(file){
if(file.isDirectory()){
Serial.print(" DIR : ");
Serial.println(file.name());
if(levels){
listDir(fs, file.name(), levels -1);
}
} else {
Serial.print(" FICHIER: ");
Serial.print(file.name());
Serial.print(" TAILLE: ");
Serial.println(file.size());
}
file = root.openNextFile();
}
}
void showBMP(const char *filename, int16_t x, int16_t y) {
File bmpFile;
int16_t w, h;
uint8_t r, g, b;
if ((x >= tft.width()) || (y >= tft.height())) return;
bmpFile = SD.open(filename);
if (!bmpFile) {
Serial.println("Erreur ouverture BMP !");
return;
}
// Lire len-tête du BMP
if (read16(bmpFile) == 0x4D42) {
read32(bmpFile); // taille fichier
read32(bmpFile); // réservé
uint32_t offset = read32(bmpFile);
read32(bmpFile); // taille header
w = read32(bmpFile);
h = read32(bmpFile);
read16(bmpFile); // plans
uint16_t depth = read16(bmpFile);
read32(bmpFile); // compression
if (depth == 24) {
bmpFile.seek(offset);
uint8_t sdbuffer[3 * 20];
for (int row = 0; row < h; row++) {
bmpFile.read(sdbuffer, 3 * w);
for (int col = 0; col < w; col++) {
b = sdbuffer[col * 3];
g = sdbuffer[col * 3 + 1];
r = sdbuffer[col * 3 + 2];
tft.drawPixel(x + col, y + (h - row - 1), tft.color565(r, g, b));
}
}
}
}
bmpFile.close();
}
// Fonctions utilitaires BMP
uint16_t read16(File &f) {
uint16_t result;
((uint8_t *)&result)[0] = f.read();
((uint8_t *)&result)[1] = f.read();
return result;
}
uint32_t read32(File &f) {
uint32_t result;
((uint8_t *)&result)[0] = f.read();
((uint8_t *)&result)[1] = f.read();
((uint8_t *)&result)[2] = f.read();
((uint8_t *)&result)[3] = f.read();
return result;
} |
Partager