Go Down

Topic: [RESOLU]importer un CHAR depuis une micro SD pour afficher une image sur un OLED (Read 1 time) previous topic - next topic

steve59

bonsoir,
je crée un nouveau post car l'autre est parti dans le calcul matriciel (en cours) et j'ai trouvé ma réponse a la deuxième question.si sa dérange n'hésitez pas a fusionner  :)

pour l'heure je suis bien embêté car j'arrive a afficher niquel des images bitmap stockées en PROGMEM sous forme de char. mais vu que j'en ai beaucoup a charger pour un projet j'ai fait une tentative avec une micro SD (avec un adaptateur de chez CATALEX).
pour le texte c'est niquel mais pour les images c'est autre chose  :smiley-sad-blue:
avec :

Code: [Select]

display.drawBitmap(0,0,(fichier_ouvert_SDcard),128,64,WHITE);


j'ai soit un point en haut a gauche soit rien. j'avais essayé d'afficher directement le contenu du tableau de char sous forme de valeurs et en gros il m'a fait une lecture des 1024 éléments 1 par 1  ???
est-on obligé (et comment??) de mettre le tableau dans une mémoire tampon (buffer?) ?

la librairie TFT semble gérer le problème mais pas celle de adafruit pour SSD1306 que j'utilise pour mon oled 0.96"


J-M-L

Oui il faut lire le fichier et fabriquer un tableau

Le comment est tout simple si le fichier contient les bons octets

Ouvrir fichier en lecture
index = 0
Tant que fichier non lu entièrement
   Lire le prochain caracteer
   Le stoker à la position index dans un tableau
   Augmenter index en s'assurant de ne pas déborder

Voilà bien sûr se souvenir que votre ARDUINO à peu de memoire
Hello - Please do not PM me for help,  others will benefit as well if you post your question publicly on the forums.
Bonjour Pas de messages privés SVP, postez dans le forum directement pour que ça profite à tous

steve59

semaine chargée mais me revoila^^
donc j'ai procédé comme tu as dit je fait une lecture (boucle while) 4 octets par 4 octets en évitant les
virgules espaces, retour de ligne... donc jusque la niquel avec un Serial.write(buffer) j'ai tout mon tableau qui s'affiche niquel avec le bon indice a coté. par contre rien a faire mon tableau "a remplir" ne se rempli pas :o il reste toujours vide...
voila le code pour le lecture du fichier (bibliothéques SD.h)
Code: [Select]

// Ouverture du fichier source
File tab = SD.open("testX.txt");

// Tant que des données sont disponible
while(tab.available() > 4) { // >= pour ne pas "oublier" la dernière valeur

//sauter les " " / "," / "\n" / "\r"
if (tab.peek()== ' '|| tab.peek() == ',' || tab.peek() == '\n' || tab.peek() == '\r'){tab.read();}

// Remplissage du buffer avec 4 octets si OK
else {tab.read(buffer, 4);

// Cloture de la chaine ASCIIZ
buffer[5]='\0';

//mise en place de la valeur dans le tableau avec indice [i]
import[i] = strtol(buffer, NULL, 10);

//indice suivant
i++;}

//remise a zero de "i" a la fin de la lecture
  if(tab.available() == 0) {i=0;}

}
tab.close();


et l'image en stockée sur la SD dans le fichier texte "testX.txt"
Code: [Select]

0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0x7F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0x7F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0x7F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0x7F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0x7F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F,
0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F,
0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F,
0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F,
0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F,
0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F,
0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F,
0x7C, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x80, 0x00, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F,
0x7C, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x80, 0x00, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F,
0x7C, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x80, 0x00, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F,
0x7C, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x80, 0x00, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F,
0x7C, 0xFB, 0xC0, 0x7E, 0x0F, 0x71, 0xEF, 0x83, 0xF0, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F,
0x7C, 0xFF, 0xE0, 0xFF, 0x0F, 0xF3, 0xFF, 0x87, 0xFC, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F,
0x7C, 0xFF, 0xF1, 0xFF, 0x8F, 0xE3, 0xFF, 0x8F, 0xFC, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F,
0x7C, 0xF9, 0xF3, 0xE7, 0xCF, 0xC7, 0xCF, 0x9F, 0x3E, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F,
0x7C, 0xF9, 0xF3, 0xE7, 0xCF, 0x87, 0xCF, 0x9F, 0xFE, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F,
0x7C, 0xF9, 0xF3, 0xE7, 0xCF, 0x87, 0xCF, 0x9F, 0xFE, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F,
0x7C, 0xF9, 0xF3, 0xE7, 0xCF, 0x87, 0xCF, 0x9F, 0x00, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F,
0x7C, 0xF9, 0xF3, 0xE7, 0xCF, 0x87, 0xCF, 0x9F, 0x3E, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F,
0x7C, 0xFF, 0xE1, 0xFF, 0x8F, 0x83, 0xFF, 0x8F, 0xFC, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F,
0x7C, 0xFF, 0xE0, 0xFF, 0x0F, 0x83, 0xFF, 0x87, 0xF8, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F,
0x7C, 0xFB, 0xC0, 0x7E, 0x0F, 0x81, 0xEF, 0x83, 0xF0, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F,
0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F,
0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F,
0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F,
0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F,
0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F,
0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F,
0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F,
0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F,
0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F,
0x7C, 0x00, 0x00, 0x02, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F,
0x7C, 0x00, 0x00, 0x07, 0x73, 0x70, 0x00, 0x00, 0x00, 0x20, 0x4C, 0x00, 0x00, 0x00, 0x00, 0x1F,
0x7C, 0x00, 0x00, 0x02, 0xD6, 0x20, 0x00, 0x00, 0x00, 0x3D, 0x64, 0x00, 0x00, 0x00, 0x00, 0x1F,
0x7C, 0x00, 0x00, 0x02, 0xF3, 0xA0, 0x00, 0x00, 0x00, 0x3D, 0xEC, 0x00, 0x00, 0x00, 0x00, 0x1F,
0x7C, 0x00, 0x00, 0x03, 0x77, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F,
0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F,
0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F,
0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F,
0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F,
0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F,
0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F,
0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F,
0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F,
0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F,
0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F,
0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F,
0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F,
0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F,
0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F,
0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F,
0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00


donc la lecture c'est niquel, le buffer reçoit tout bien comme il faut mais le tableau "import[1024]" reste vide.
on dirait que la fonction strtol soit ne renvoie rien , soit renvoie un truc pas bon .
la je bloque totalement , je doit passer par autre chose qu'un "long INT" ou j'ai fait une erreur?

J-M-L

Comment savez vous que la lecture est ok, que buffer fonctionne bien mais pas import[]?
i est initialisé à combien? Pourquoi la remise de i à zéro dans le while si le fichier est vide?
C'est quoi les 0x dans le fichier?? (je Le sais moi mais pensez vous que strtol() Le sache si le dernier paramètre est 10?)

(Postez un code complet, pas des bouts de code)
Hello - Please do not PM me for help,  others will benefit as well if you post your question publicly on the forums.
Bonjour Pas de messages privés SVP, postez dans le forum directement pour que ça profite à tous

steve59

voila le code complet, c'est vrai que sa va étre un peu plus compréhensible désolé.
le fichier testX.txt est une image 8bits pour mon OLED monochrome.
pour la fonction strtol() j'avoue ne pas savoir grand chose sur elle car trés peu d'informations détaillées sur le net.
surtout sur le dernier paramètre car jamais commenté dans les exemples  :smiley-sad:

Code: [Select]

#include <SPI.h>
#include <SD.h>

#include <Adafruit_SSD1306.h>
#define OLED_RESET 4
Adafruit_SSD1306 display(OLED_RESET);

const int chipSelect = 4;
char buffer[5]; // Buffer 0x?? + \0
unsigned char import[1024]; // 1024 indices pour l'image
int i = 0; // compteur indice import/SD
int B = 0; // compteur indice import/lecture


void setup() {
 
// demarrage des ports de COM
Serial.begin(9600);
display.begin(SSD1306_SWITCHCAPVCC, 0x3C);
display.display();

// initialisation de la SD avec debog
 if (!SD.begin(chipSelect)) {
display.clearDisplay();
display.setTextColor(WHITE); //selection couleur du texte
display.setTextSize(1); // selection taille du texte
display.setCursor(0,0); // selection position  écriture
display.print("erreur carte SD"); display.display();}

else{
display.clearDisplay();
display.setTextColor(WHITE); //selection couleur du texte
display.setTextSize(1); // selection taille du texte
display.setCursor(0,0); // selection position  écriture
display.print("carte SD OK"); display.display();}   
delay(1000);

// Ouverture du fichier source
File tab = SD.open("testX.txt");

// Tant que des données sont disponible
while(tab.available() > 4) { // >= pour ne pas "oublier" la dernière valeur

//sauter les " " / "," / "\n" / "\r"
if (tab.peek()== ' '|| tab.peek() == ',' || tab.peek() == '\n' || tab.peek() == '\r'){tab.read();}

// Remplissage du buffer avec 4 octets si OK
else {tab.read(buffer, 4);

// Cloture de la chaine ASCIIZ
buffer[5]='\0';

//mise en place de la valeur dans le tableau avec indice [i]
import[i] = strtol(buffer, NULL, 10);
//Serial.write(buffer); // avec cette lecture jai bien tout mon tableau qui s'affiche
                        // dans le moniteur.
//indice suivant
i++;}

//remise a zero de "i" a la fin de la lecture
  if(tab.available() == 0) {i=0;}

}
tab.close();
// annonce lecture OK
display.clearDisplay();
display.setTextColor(WHITE); //selection couleur du texte
display.setTextSize(1); // selection taille du texte
display.setCursor(0,0); // selection position  écriture
display.print("lecture tableau OK ");
display.display();
delay(1000);


}

void loop() {
if(B <= 1023){B++;;

Serial.println(import[B]);
Serial.print("  ");
Serial.print(B);
Serial.println();}
else{
  Serial.println("on recommence");
  B = 0;}
}

J-M-L

Quote
pour la fonction strtol() j'avoue ne pas savoir grand chose sur elle car trés peu d'informations détaillées sur le net.
Euh.... j'ai pris le temps de vous mettre un lien sur la définition de cette fonction ci dessus... vous l'avez lue?

sinon en voilà une version en français... (vous n'avez pas dû chercher bcp)

je vous aide un peu..

Quote
La chaîne peut commencer par un nombre quelconque d'espaces ou de caractères interprétés comme tels par isspace(3). Un signe éventuel « + » ou « - » peut suivre. Si base vaut 0 ou 16, la chaîne peut inclure un préfixe « 0x » et le nombre sera interprété en base 16. Sinon, une base valant zéro est interprétée comme 10 (décimale) sauf si le caractère suivant est « 0 », auquel cas la base est 8 (octale).

Le reste de la chaîne est converti en une valeur long int, en s'arrêtant au premier caractère qui ne soit pas un chiffre valide dans cette base. Dans les bases supérieures à 10, la lettre « A » (majuscule ou minuscule) représente 10, « B » représente 11, et ainsi de suite jusqu'à « Z » représentant 35.

Hello - Please do not PM me for help,  others will benefit as well if you post your question publicly on the forums.
Bonjour Pas de messages privés SVP, postez dans le forum directement pour que ça profite à tous

steve59

toutes mes excuses, avec la fatigue j'ai même pas cherché a cliquer dessus je me suis juste demandé comment mettre les fonctions en bleu dans les post  :smiley-sweat:
j'ai corrigé mon  erreur:
Code: [Select]

import[i] = strtol(buffer, NULL, 10);


par
Code: [Select]

import[i] = strtol(buffer, NULL, 16);


et sa fonctionne a merveille. un grand merci  :D
je change le titre pour résolu

J-M-L

La magie de la lecture de la doc :)

sinon
Code: [Select]
unsigned char import[1024]; // 1024 indices pour l'imageça c'est vraiment bcp de mémoire... vous n'avez que 2k dans un arduino "normal"...


Hello - Please do not PM me for help,  others will benefit as well if you post your question publicly on the forums.
Bonjour Pas de messages privés SVP, postez dans le forum directement pour que ça profite à tous

Go Up