IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Arduino Discussion :

Traitement des fichiers BMP sur le NANO


Sujet :

Arduino

  1. #1
    Membre actif
    Inscrit en
    Juillet 2004
    Messages
    762
    Détails du profil
    Informations forums :
    Inscription : Juillet 2004
    Messages : 762
    Points : 230
    Points
    230
    Par défaut Traitement des fichiers BMP sur le NANO
    Bonjour à tous,

    J'essaie de faire un petit jeu pour enfant
    à partir d'un Arduino Nano et d'un écran OLED 128x64 SSH1306
    trop petit pour la lecture , il me faut donc créer les menus à l'aide d’icônes
    or ces icônes, donc des fichiers BMP convertis, utilisent beaucoup de mémoires

    Ma question est la suivante :
    Y aurait-il une autre solution me permettant d'appeler dans le programme ces fichiers "bruts" directement en BMP
    stockés préalablement en mémoire plutôt que devoir les convertir ?


    Si vous avez des solutions je suis preneur
    merci bien par avance

  2. #2
    Expert confirmé

    Homme Profil pro
    mad scientist :)
    Inscrit en
    Septembre 2019
    Messages
    2 714
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : mad scientist :)

    Informations forums :
    Inscription : Septembre 2019
    Messages : 2 714
    Points : 5 393
    Points
    5 393
    Par défaut
    Vous utilisez quelle bibliothèque?

  3. #3
    Membre actif
    Inscrit en
    Juillet 2004
    Messages
    762
    Détails du profil
    Informations forums :
    Inscription : Juillet 2004
    Messages : 762
    Points : 230
    Points
    230
    Par défaut
    Celles-ci

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    #include <SPI.h>
    #include <Wire.h>
    #include <Adafruit_GFX.h>
    #include <Adafruit_SH1106.h>

  4. #4
    Expert confirmé

    Homme Profil pro
    mad scientist :)
    Inscrit en
    Septembre 2019
    Messages
    2 714
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : mad scientist :)

    Informations forums :
    Inscription : Septembre 2019
    Messages : 2 714
    Points : 5 393
    Points
    5 393
    Par défaut
    les bitmaps sont en PROGMEM (mémoire flash) - ils ne devraient pas occuper de SRAM

    est-ce que le souci est là?

  5. #5
    Membre actif
    Inscrit en
    Juillet 2004
    Messages
    762
    Détails du profil
    Informations forums :
    Inscription : Juillet 2004
    Messages : 762
    Points : 230
    Points
    230
    Par défaut
    le souci est que j'arrive au maximum de la mémoire de l'arduino nano avec les bipmaps
    déjà existants donc je ne peux pas en mettre plus, l'idée serait donc de les stocker en mémoire
    comme l'on fait avec un ESP8266 par exemple mais je n'ai pas besoin ici de wifi ni de bluetooth
    existe-t-il d'autres solutions ?

    voici le message que j'ai à la compilation
    Le croquis utilise 30038 octets (97%) de l'espace de stockage de programmes. Le maximum est de 30720 octets.
    Les variables globales utilisent 1537 octets (75%) de mémoire dynamique, ce qui laisse 511 octets pour les variables locales. Le maximum est de 2048 octets.
    La mémoire disponible faible, des problèmes de stabilité pourraient survenir.

  6. #6
    Expert confirmé

    Homme Profil pro
    mad scientist :)
    Inscrit en
    Septembre 2019
    Messages
    2 714
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : mad scientist :)

    Informations forums :
    Inscription : Septembre 2019
    Messages : 2 714
    Points : 5 393
    Points
    5 393
    Par défaut
    Quelle taille font ces bitmaps?
    Ils sont en 1 bit (noir et blancs)?

  7. #7
    Membre actif
    Inscrit en
    Juillet 2004
    Messages
    762
    Détails du profil
    Informations forums :
    Inscription : Juillet 2004
    Messages : 762
    Points : 230
    Points
    230
    Par défaut
    Citation Envoyé par Jay M Voir le message
    Quelle taille font ces bitmaps?
    Ils sont en 1 bit (noir et blancs)?

    Pour la taille , il s'agit de plusieurs images comprises entre 1 et 8 k et une de 33k
    en noir et blanc de 1 bit, oui, traité comme par ex :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
     
    //splash dino 80x40
    const unsigned char splash2 [] PROGMEM = {
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
    0x00, 0x1f, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x39, 0xff, 0xe0, 0x00, 0x00, 
    0x00, 0x00, 0x00, 0x00, 0x00, 0x3b, 0xff, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 
    0xe1, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 0xfe, 0x3e, 0x00, 0x00, 0x00, 0x00, 
    0x00, 0x00, 0x00, 0x5e, 0xc1, 0xde, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7d, 0x80, 0x2f, 
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3a, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
    0x00, 0x00, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x00, 
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
    0x00, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfe, 0x00, 0x00, 0x00, 0x00, 
    0x00, 0x00, 0x00, 0x00, 0x01, 0xfa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x80, 0x07, 0xf4, 
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf5, 0xe0, 0x1f, 0xe8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 
    0xaa, 0xbc, 0x7f, 0xd0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3d, 0x55, 0x5f, 0xff, 0xa0, 0x00, 0x00, 
    0x00, 0x00, 0x00, 0xea, 0xaa, 0xaf, 0xff, 0x40, 0x00, 0x00, 0x00, 0x00, 0x03, 0xd5, 0x55, 0xff, 
    0xfe, 0x80, 0x00, 0x00, 0x00, 0x00, 0x07, 0xab, 0xae, 0xbf, 0xfd, 0x00, 0x00, 0x00, 0x00, 0x00, 
    0x1f, 0x5f, 0xdf, 0xff, 0xfa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0xee, 0xfb, 0x6f, 0xf4, 0x00, 
    0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xe8, 0x00, 0x00, 0x00, 0x00, 0x01, 0xff, 0xf7, 
    0xff, 0xff, 0xd0, 0x00, 0x00, 0x00, 0x00, 0x07, 0xff, 0xff, 0xff, 0xff, 0xa0, 0x00, 0x00, 0x00, 
    0x00, 0x1f, 0xff, 0xff, 0xff, 0xfd, 0xc0, 0x00, 0x00, 0x00, 0x00, 0xff, 0xdf, 0xff, 0xfe, 0xfe, 
    0x80, 0x00, 0x00, 0x00, 0x1f, 0xff, 0xef, 0xef, 0xff, 0x7f, 0x00, 0x00, 0x00, 0x03, 0xff, 0xff, 
    0x9f, 0xdf, 0xff, 0xbf, 0x00, 0x00, 0x00, 0xff, 0xff, 0xfc, 0x1f, 0xa1, 0xfc, 0x7f, 0x80, 0x00, 
    0x0f, 0xff, 0xff, 0xe0, 0x1f, 0xb0, 0x03, 0xbf, 0x80, 0x00, 0x1f, 0xff, 0x80, 0x00, 0x0f, 0xc0, 
    0x00, 0x00, 0x00, 0x00, 0x7e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x70, 0x00, 
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
    0x00, 0x00, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc8, 0x00, 0x00, 0x00, 
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
    };

  8. #8
    Rédacteur/Modérateur

    Avatar de Jerome Briot
    Homme Profil pro
    Freelance mécatronique - Conseil, conception et formation
    Inscrit en
    Novembre 2006
    Messages
    20 302
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Freelance mécatronique - Conseil, conception et formation

    Informations forums :
    Inscription : Novembre 2006
    Messages : 20 302
    Points : 52 882
    Points
    52 882
    Par défaut
    Mis à part diminuer la taille des images, il n'y a que deux solutions : utiliser un microcontrôleur avec plus de mémoire flash, ou stocker les images dans une mémoire externe (flash, carte SD…)

    Dans ton cas, tu peux essayer en passant de la Nano classique à une Nano Every (32Ko => 48Ko de flash). Le brochage est le même entre les deux cartes, tu n'aurais donc pas à modifier le code.
    Ingénieur indépendant en mécatronique - Conseil, conception et formation
    • Conception mécanique (Autodesk Fusion 360)
    • Impression 3D (Ultimaker)
    • Développement informatique (Python, MATLAB, C)
    • Programmation de microcontrôleur (Microchip PIC, ESP32, Raspberry Pi, Arduino…)

    « J'étais le meilleur ami que le vieux Jim avait au monde. Il fallait choisir. J'ai réfléchi un moment, puis je me suis dit : "Tant pis ! J'irai en enfer" » (Saint Huck)

  9. #9
    Membre actif
    Inscrit en
    Juillet 2004
    Messages
    762
    Détails du profil
    Informations forums :
    Inscription : Juillet 2004
    Messages : 762
    Points : 230
    Points
    230
    Par défaut
    Merci pour ta réponse Jerome

    Je ne connaissais pas le Nano Every merci pour l'info
    en // je regarde aussi pour pouvoir transférer le programme sur Wemos R1 D1 avec semble-t-il plus de mémoire à disposition

  10. #10
    Expert confirmé

    Homme Profil pro
    mad scientist :)
    Inscrit en
    Septembre 2019
    Messages
    2 714
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : mad scientist :)

    Informations forums :
    Inscription : Septembre 2019
    Messages : 2 714
    Points : 5 393
    Points
    5 393
    Par défaut
    Pas de magie, une image 80x40 fait 2400 pixels. même avec 1 bit par pixel il faut 300 octets

    Une carte avec plus de stockage sera effectivement sans doute nécessaire à moins de réduire significativement la taille des icônes

  11. #11
    Membre actif
    Inscrit en
    Juillet 2004
    Messages
    762
    Détails du profil
    Informations forums :
    Inscription : Juillet 2004
    Messages : 762
    Points : 230
    Points
    230
    Par défaut
    Bonjour Jay M

    Comme je l'ai précisé à Jerome Briot je transfère tout sur Wemos avec je l'espère plus de chance dasn la gestion de mémoire
    car j'ai du en plus augmenter la taille de l'écran pour passer en 128x128 via un SSD1327 SPI ( le SSD1306 était en I2C)

    bref la totale en matière d'adaptation ...

  12. #12
    Membre actif
    Inscrit en
    Juillet 2004
    Messages
    762
    Détails du profil
    Informations forums :
    Inscription : Juillet 2004
    Messages : 762
    Points : 230
    Points
    230
    Par défaut
    Bonjour à tous ,

    J'ai transféré tout le programme sous Wemos et j'essaie actuellement d'y incorporer mes nouvelles icônes
    en lieu est place du menu actuel

    à titre d'exemple le menu actuel est :

    Menu     Sous-menu
    "stats"  |- "hunger"
             |-"happiness"
             |-"health"
             |-"discipline"
             |-"weight"
             |-"age"
    Je veux remplacer "stats" par une icone apellée : bitmap_home
    dans le programme ci -dessous
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    #define MENUSIZE 8
    #define STRING_SIZE 11
     
    const char mainMenu[MENUSIZE][8][STRING_SIZE] PROGMEM = {
        {"food","apple","steak","water",NULL},
        {"game",NULL},
        {"sleep",NULL},
        {"clean",NULL},
        {"doctor",NULL},
        {"discipline",NULL},
        {"stats","hunger","happiness","health","discipline","weight","age",NULL},
        {"settings","sound",
        //"something",
        NULL
        },
    };
     
    --------//---------------
     
     
    /* ------- MENUS AND ACTIONS ------- */
            //render menu
            if(menuOpened and !game){
     
                display.fillRect(0,0,display.width(),30,SSD1327_BLACK);
                display.drawRect(0,0,display.width(),29,SSD1327_WHITE);
                display.fillRect(1,1,display.width()-2,27,SSD1327_BLACK);
                display.drawRect(0,0,display.width(),12,SSD1327_WHITE);
                display.setCursor(8,2);
                display.setTextSize(1);
     
                if(menuDepth){
                    display.fillRect(0,0,display.width(),12,SSD1327_WHITE);
                    display.fillRect(1,18,1,5,SSD1327_WHITE);
                    display.fillRect(2,19,1,3,SSD1327_WHITE);
                    display.fillRect(3,20,1,1,SSD1327_WHITE);
                    display.setTextColor(SSD1327_BLACK,SSD1327_WHITE);
                }else{
                    display.fillRect(1,3,1,5,SSD1327_WHITE);
                    display.fillRect(2,4,1,3,SSD1327_WHITE);
                    display.fillRect(3,5,1,1,SSD1327_WHITE);
                    display.setTextColor(SSD1327_WHITE);
                }
                char oneItem [STRING_SIZE];
                memcpy_P (&oneItem, &mainMenu[menu][0], sizeof oneItem);
                //display.println(getItem(menu,0));
                Serial.println(oneItem);
                if (oneItem=="stats") {
                   display.drawBitmap(02,02,bitmap_home,80,80,SSD1327_WHITE); // <=========
                }else{     
                   display.println(oneItem);
                }
                if(subMenu){
                    display.setTextColor(SSD1327_WHITE);
                    display.setCursor(8,16);
                    char subItem [STRING_SIZE];
                    memcpy_P (&subItem, &mainMenu[menu][subMenu], sizeof subItem);
                    //display.println(getItem(menu,subMenu));
                    display.println(subItem);
                }
            }
    Mais il ignore le test oneItem=="stats", et je ne comprends pas pourquoi

  13. #13
    Membre actif
    Inscrit en
    Juillet 2004
    Messages
    762
    Détails du profil
    Informations forums :
    Inscription : Juillet 2004
    Messages : 762
    Points : 230
    Points
    230
    Par défaut
    Bonjour à tous ,

    J'ai modifié la ligne comme suit mais je ne suis pas sûr que ce soit la bonne méthode

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
     
    /* ------- MENUS AND ACTIONS ------- */
            //render menu
            if(menuOpened and !game){
     
                display.fillRect(0,0,display.width(),30,SSD1327_BLACK);
                display.drawRect(0,0,display.width(),29,SSD1327_WHITE);
                display.fillRect(1,1,display.width()-2,27,SSD1327_BLACK);
                display.drawRect(0,0,display.width(),12,SSD1327_WHITE);
                display.setCursor(8,2);
                display.setTextSize(1);
     
                if(menuDepth){
                    display.fillRect(0,0,display.width(),12,SSD1327_WHITE);
                    display.fillRect(1,18,1,5,SSD1327_WHITE);
                    display.fillRect(2,19,1,3,SSD1327_WHITE);
                    display.fillRect(3,20,1,1,SSD1327_WHITE);
                    display.setTextColor(SSD1327_BLACK,SSD1327_WHITE);
                }else{
                    display.fillRect(1,3,1,5,SSD1327_WHITE);
                    display.fillRect(2,4,1,3,SSD1327_WHITE);
                    display.fillRect(3,5,1,1,SSD1327_WHITE);
                    display.setTextColor(SSD1327_WHITE);
                }
                char oneItem [STRING_SIZE];
                memcpy_P (&oneItem, &mainMenu[menu][0], sizeof oneItem);
                //display.println(getItem(menu,0));
                Serial.println(oneItem);
                String (voneItem) = oneItem ;  // <=========
                if (voneItem=="stats") {
                   display.drawBitmap(02,02,bitmap_home,80,80,SSD1327_WHITE); 
                }else{     
                   display.println(oneItem);
                }
                if(subMenu){
                    display.setTextColor(SSD1327_WHITE);
                    display.setCursor(8,16);
                    char subItem [STRING_SIZE];
                    memcpy_P (&subItem, &mainMenu[menu][subMenu], sizeof subItem);
                    //display.println(getItem(menu,subMenu));
                    display.println(subItem);
                }
            }

  14. #14
    Expert confirmé

    Homme Profil pro
    mad scientist :)
    Inscrit en
    Septembre 2019
    Messages
    2 714
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : mad scientist :)

    Informations forums :
    Inscription : Septembre 2019
    Messages : 2 714
    Points : 5 393
    Points
    5 393
    Par défaut
    Vous ne pouvez pas comparer des cStrings avec ==

    Il faut appeler strcmp() et voir si le résultat est 0 alors elles sont égales

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    if (strcmp(oneItem,"stats") == 0) {// égalité 
    }
    oneItem doit être un pointeur sur une cString bien sûr

    Évitez si vous pouvez la classe Strung qui est coûteuse en mémoire

  15. #15
    Membre actif
    Inscrit en
    Juillet 2004
    Messages
    762
    Détails du profil
    Informations forums :
    Inscription : Juillet 2004
    Messages : 762
    Points : 230
    Points
    230
    Par défaut
    Grand merci Jay M

    vous me sauvez là

    je continue ...

  16. #16
    Membre actif
    Inscrit en
    Juillet 2004
    Messages
    762
    Détails du profil
    Informations forums :
    Inscription : Juillet 2004
    Messages : 762
    Points : 230
    Points
    230
    Par défaut
    Bonjour à tous,

    Je reviens vers vous car après avoir transféré l'ensemble du programme sous Wemos , j'y ai adjoint un écran + grand de type
    SSD 1327 128 x128 pour mieux définir les icônes

    par contre j'ai un petit souci pratique pour la gestion des Menu et Sous-menu
    associés à ces icônes

    le principe est le suivant avec 3 boutons :

    éteint => appui sur le BTN2 |=> ouvre le Menu et aussi le sous-Menu (s'il existe) puis on navigue toujours avec BTN2 => appui sur le BTN3 => on éteint le Menu
    éteint => appui sur le BTN2 |=> si Menu + Sous-Menu => appui sur le BTN1 => on rentre dans le sous-Menu sinon "action" du Menu => appui sur le BTN3 => on sort du sous-Menu puis on navigue à l'aide de BTN2

    le problème que je rencontre :
    C'est principalement que le Menu + Sous-Menu s'affichent tous les deux et il est difficile alors de distinguer si l'on se trouve dans le Menu ou Sous-Menu
    l'idéal serait de ne faire apparaitre le Sous-Menu que lors de l'appui sur BTN1 et simultanément inversé l'icône Menu pour indiquer que l'on se trouve dans un Sous-Menu
    j'ai tenté de le faire mais sans succès , d'où ma demande d'aide sur ce point

    vous trouverez ci-joint un croquis test + le fichier icônes

    Merci par avance pour l'aide
    Images attachées Images attachées
    Fichiers attachés Fichiers attachés

Discussions similaires

  1. Code source pour rechercher des fichiers Mp3 sur le disque
    Par specta61 dans le forum VB 6 et antérieur
    Réponses: 3
    Dernier message: 28/02/2007, 19h49
  2. Réponses: 7
    Dernier message: 09/08/2006, 20h45
  3. [.sqm] des fichier sqm sur la racine de mon disque C:
    Par aityahia dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 19/07/2006, 18h24
  4. [JMS] Transporter des fichiers xml sur jms
    Par snetechen dans le forum Java EE
    Réponses: 5
    Dernier message: 16/06/2006, 11h47
  5. Réponses: 1
    Dernier message: 24/07/2005, 22h25

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo