LOCODUINO

Affichage publicitaire avec Arduino (2)

Affichage publicitaire vertical

. Par : catplus, Christian

Si vous n’avez pas encore lu l’article Affichage publicitaire avec Arduino (1), c’est le moment de le faire car nous y ferons souvent référence, histoire de ne pas répéter ce que nous avons déjà dit. Vous y trouverez ce qui caractérise un écran et comment celui-ci doit être connecté à une carte Arduino. Pour réaliser notre affichage vertical, (…)

Retourner à l'article

Vous répondez à :

Affichage publicitaire avec Arduino (2) 21 mars 2023 09:48, par Christian

C’est exact, dans le premier article, nous n’avons simplement dit que "le montage utilise un lecteur de carte SD relié également au bus SPI" mais nous n’avons donné aucune référence. Vous pouvez utiliser n’importe quelle carte lecteur de SD ou de micro-SD. Pour en trouver une, il suffit de taper dans le moteur de recherche de votre navigateur carte micro-SD SPI Arduino : tout ce qui compte, c’est de pouvoir la relier à la carte Arduino via le bus SPI.

Qui êtes-vous ?
Votre message

Pour créer des paragraphes, laissez simplement des lignes vides.

Lien hypertexte

(Si votre message se réfère à un article publié sur le Web, ou à une page fournissant plus d’informations, vous pouvez indiquer ci-après le titre de la page et son adresse.)

15 Messages

  • Affichage publicitaire avec Arduino (2) 1er octobre 2022 16:07, par Jean-claude

    Bonjour
    J’utilise un raspberry pi pico, ce qui permet de se passer du lecteur SD.
    Avec un Teensy4.0 l’affichage est instantané (mais c est plus cher)

    Merci à locoduino qui m’a fait découvrir de DIY pour le DCC

    Voir en ligne : Letraindejc

    Répondre

    • Affichage publicitaire avec Arduino (2) 1er octobre 2022 16:31, par Christian

      Merci Jean-Claude pour ce partage : j’incite les lecteurs à aller voir ton site en ligne et à récupérer les fichiers STL du socle car c’est un peu ce qui manque à LOCODUINO : l’intégration d’un montage dans un décor à l’échelle pour que ce soit beau. Et ton socle est vraiment super.
      Oui, l’utilisation d’un PI pico, ou bien de l’écran Adafruit, permet d’avoir le lecteur SD incorporé : au final, le prix ne doit pas être très supérieur au matériel asiatique pour une qualité bien supérieure. A méditer si on doit acheter tous les composants pour réaliser ce montage.

      Répondre

      • Affichage publicitaire avec Arduino (2) 1er octobre 2022 19:55, par Jean-Claude

        Le Pi PICO a beaucoup de mémoire et les images peuvent être stockées en variable.
        Il faut cependant convertir en JPG en string... des logiciels le font.

        Avec un Teensy 4.0 (qui est très rapide) on peut même faire des "transitions"

        Quand j’ai fait ma maquette je ne connaissais pas l’arduino.. encore merci à votre site que se soient les projets que la vulgarisation.

        ps j’ai découvert le pico dans une de vos rubriques.
        Jean-Claude

        Répondre

  • Affichage publicitaire avec Arduino (2) 7 mars 2023 12:15, par Besseyre Guy

    bonjour à tous

    je possède un écran ips TFT de 1.14 " de marque Greatzt, ré
    solution 135X240 controleur ST 7789
    puis-je l’utiliser dans cette appli ?
    merci

    Répondre

    • Affichage publicitaire avec Arduino (2) 7 mars 2023 14:02, par Christian

      Cet article est écrit pour un écran qui fait 80 x 160 et qui utilise un contrôleur ST7785. Il risque d’y avoir pas mal d’adaptation à faire si vous utilisez un écran qui a une résolution différente et un contrôleur différent. Mais tout est possible pour quelqu’un qui a déjà un peu d’expérience et qui est capable de chercher des solutions sur le net.
      Vous ne dites rien de votre niveau d’expertise : si vous êtes débutant, je vous déconseille d’utiliser un autre écran, surtout au prix où on trouve l’écran cité dans l’article.

      Répondre

  • Affichage publicitaire avec Arduino (2) 20 mars 2023 21:41, par Besseyre Guy

    bonsoir

    je ne trouve pas la référence de la carte lecteur de micro SD
    utilisée dans l’application (dans aliexpress)
    merci pour l’info
    bonne soirée

    Répondre

    • Affichage publicitaire avec Arduino (2) 21 mars 2023 09:48, par Christian

      C’est exact, dans le premier article, nous n’avons simplement dit que "le montage utilise un lecteur de carte SD relié également au bus SPI" mais nous n’avons donné aucune référence. Vous pouvez utiliser n’importe quelle carte lecteur de SD ou de micro-SD. Pour en trouver une, il suffit de taper dans le moteur de recherche de votre navigateur carte micro-SD SPI Arduino : tout ce qui compte, c’est de pouvoir la relier à la carte Arduino via le bus SPI.

      Répondre

  • Affichage publicitaire avec Arduino (2) 28 avril 2023 18:50, par Besseyre guy

    bonjour Christian
    J’ai réalisé l’application décrite dans l’article (figure 7), après avoir approvisionné l’écran chez
    Aliexpress ,conforme a la photo n°5, ainsi que le lecteur de micro-sd, pilotage par Arduino Nano ;
    l’écran s’allume mais aucune image n’apparait ; essai sur un deuxième montage ,même chose
    je ne vois pas ou est l’erreur, ci-joint le sketch ;
    bon week-end
    // Diaporama_demo_80x160.ino
    // -------------------------

    #include <Adafruit_GFX.h> // Bibliotheque graphique - Core graphics library
    #include <Adafruit_ST7735.h> // Bibliotheque specifique ST7735 - Hardware-specific library for ST7735
    #include <SPI.h>
    #include <SD.h>

    #define dureeAffichage 7500 // Duree d’affichage
    #define TFT_RST 9 // Ligne de Reset - Reset line for TFT
    #define TFT_CS 10 // Selection de l’ecran - Chip select line for TFT display
    #define TFT_DC 8 // Commande donnees pour ecran - Data/command line for TFT
    #define SD_CS 4 // Selection du lecteur carte SD - Chip select line for SD card
    //D11 -> MOSI SD + SDA TFT
    //D12 -> MISO SD
    //D13 -> SCK SD + SCL TFT

    // Ecran 0.96" controleur ST7735 - For 0.96" TFT with ST7735 use
    Adafruit_ST7735 tft = Adafruit_ST7735(TFT_CS, TFT_DC, TFT_RST) ;

    void setup(void)
    Serial.begin(9600) ;

    while (!Serial)
    delay(10) ; // wait for serial console

    pinMode(TFT_CS, OUTPUT) ;
    digitalWrite(TFT_CS, HIGH) ;
    pinMode(SD_CS, OUTPUT) ;
    digitalWrite(SD_CS, HIGH) ;

    // Initialisation de l’ecran 0.96" 160x80 TFT
    tft.initR(INITR_MINI160x80) ;

    tft.fillScreen(ST77XX_RED) ; // En fait, affichera jaune
    delay(3000) ;

    Serial.print("Initializing SD card...") ;
    if (!SD.begin(SD_CS))
    Serial.println("failed !") ;
    return ;

    Serial.println("OK !") ;

    File root = SD.open("/") ;
    printDirectory(root, 0) ;
    root.close() ;

    void loop()
    // Affichage
    // Changer les noms des fichiers - change the names here !
    bmpDraw("RN80x160.BMP", 0, 0) ;
    delay(dureeAffichage) ;
    bmpDraw("Defense.BMP", 0, 0) ;
    delay(dureeAffichage) ;
    bmpDraw("AirFranc.BMP", 0, 0) ;
    delay(dureeAffichage) ;
    bmpDraw("Locoduin.BMP", 0, 0) ;
    delay(dureeAffichage) ;

    // This function opens a Windows Bitmap (BMP) file and
    // displays it at the given coordinates. It’s sped up
    // by reading many pixels worth of data at a time
    // (rather than pixel by pixel). Increasing the buffer
    // size takes more of the Arduino’s precious RAM but
    // makes loading a little faster. 20 pixels seems a
    // good balance.

    #define BUFFPIXEL 20

    void bmpDraw(char *filename, uint8_t x, uint16_t y)

    File bmpFile ;
    int bmpWidth, bmpHeight ; // W+H in pixels
    uint8_t bmpDepth ; // Bit depth (currently must be 24)
    uint32_t bmpImageoffset ; // Start of image data in file
    uint32_t rowSize ; // Not always = bmpWidth ; may have padding
    uint8_t sdbuffer[3*BUFFPIXEL] ; // pixel buffer (R+G+B per pixel)
    uint8_t buffidx = sizeof(sdbuffer) ; // Current position in sdbuffer
    boolean goodBmp = false ; // Set to true on valid header parse
    boolean flip = true ; // BMP is stored bottom-to-top
    int w, h, row, col ;
    uint8_t r, g, b ;
    uint32_t pos = 0, startTime = millis() ;

    if((x >= tft.width()) || (y >= tft.height())) return ;

    Serial.println() ;
    Serial.print(F("Loading image ’")) ;
    Serial.print(filename) ;
    Serial.println(’\’’) ;

    // Open requested file on SD card
    if ((bmpFile = SD.open(filename)) == NULL)
    Serial.print(F("File not found")) ;
    return ;

    // Parse BMP header
    if(read16(bmpFile) == 0x4D42) // BMP signature
    Serial.print(F("File size : ")) ; Serial.println(read32(bmpFile)) ;
    (void)read32(bmpFile) ; // Read & ignore creator bytes
    bmpImageoffset = read32(bmpFile) ; // Start of image data
    Serial.print(F("Image Offset : ")) ; Serial.println(bmpImageoffset, DEC) ;
    // Read DIB header
    Serial.print(F("Header size : ")) ; Serial.println(read32(bmpFile)) ;
    bmpWidth = read32(bmpFile) ;
    bmpHeight = read32(bmpFile) ;
    if(read16(bmpFile) == 1) // # planes — must be ’1’
    bmpDepth = read16(bmpFile) ; // bits per pixel
    Serial.print(F("Bit Depth : ")) ; Serial.println(bmpDepth) ;
    if((bmpDepth == 24) && (read32(bmpFile) == 0)) // 0 = uncompressed

    goodBmp = true ; // Supported BMP format — proceed !
    Serial.print(F("Image size : ")) ;
    Serial.print(bmpWidth) ;
    Serial.print(’x’) ;
    Serial.println(bmpHeight) ;

    // BMP rows are padded (if needed) to 4-byte boundary
    rowSize = (bmpWidth * 3 + 3) & 3 ;

    // If bmpHeight is negative, image is in top-down order.
    // This is not canon but has been observed in the wild.
    if(bmpHeight < 0)
    bmpHeight = -bmpHeight ;
    flip = false ;

    // Crop area to be loaded
    w = bmpWidth ;
    h = bmpHeight ;
    if((x+w-1) >= tft.width()) w = tft.width() - x ;
    if((y+h-1) >= tft.height()) h = tft.height() - y ;

    // Set TFT address window to clipped image bounds
    tft.setAddrWindow(x, y, x+w-1, y+h-1) ;

    for (row=0 ; row<h ; row++) // For each scanline...

    // Seek to start of scan line. It might seem labor-
    // intensive to be doing this on every line, but this
    // method covers a lot of gritty details like cropping
    // and scanline padding. Also, the seek only takes
    // place if the file position actually needs to change
    // (avoids a lot of cluster math in SD library).
    if(flip) // Bitmap is stored bottom-to-top order (normal BMP)
    pos = bmpImageoffset + (bmpHeight - 1 - row) * rowSize ;
    else // Bitmap is stored top-to-bottom
    pos = bmpImageoffset + row * rowSize ;
    if(bmpFile.position() != pos) // Need seek ?
    bmpFile.seek(pos) ;
    buffidx = sizeof(sdbuffer) ; // Force buffer reload

    for (col=0 ; col<w; col++) { // For each pixel...
    // Time to read more pixel data?
    if (buffidx >= sizeof(sdbuffer)) // Indeed
    bmpFile.read(sdbuffer, sizeof(sdbuffer)) ;
    buffidx = 0 ; // Set index to beginning

    // Convert pixel from BMP to TFT format, push to display
    b = sdbuffer[buffidx++] ;
    g = sdbuffer[buffidx++] ;
    r = sdbuffer[buffidx++] ;
    // La ligne suivante a ete modifiee car probleme affichage de couleurs.
    // (A l’origine, la ligne etait : tft.pushColor(tft.color565(r,g,b)) ;)
    tft.pushColor(tft.color565( b, g, r)) ;
    // end pixel
    // end scanline
    Serial.print(F("Loaded in ")) ;
    Serial.print(millis() - startTime) ;
    Serial.println(" ms") ;
    // end goodBmp

    bmpFile.close() ;
    if(!goodBmp) Serial.println(F("BMP format not recognized.")) ;

    // These read 16- and 32-bit types from the SD card file.
    // BMP data is stored little-endian, Arduino is little-endian too.
    // May need to reverse subscript order if porting elsewhere.

    uint16_t read16(File f)
    uint16_t result ;
    ((uint8_t *)&result)[0] = f.read() ; // LSB
    ((uint8_t *)&result)[1] = f.read() ; // MSB
    return result ;

    uint32_t read32(File f)
    uint32_t result ;
    ((uint8_t *)&result)[0] = f.read() ; // LSB
    ((uint8_t *)&result)[1] = f.read() ;
    ((uint8_t *)&result)[2] = f.read() ;
    ((uint8_t *)&result)[3] = f.read() ; // MSB
    return result ;

    void printDirectory(File dir, int numTabs)
    while (true)

    File entry = dir.openNextFile() ;
    if (! entry)
    // no more files
    break ;

    for (uint8_t i = 0 ; i < numTabs ; i++)
    Serial.print(’\t’) ;

    Serial.print(entry.name()) ;
    if (entry.isDirectory())
    Serial.println("/") ;
    printDirectory(entry, numTabs + 1) ;
    else
    // files have sizes, directories do not
    Serial.print("\t\t") ;
    Serial.println(entry.size(), DEC) ;

    entry.close() ;

    Répondre

    • Affichage publicitaire avec Arduino (2) 1er mai 2023 17:24, par Christian

      Inutile de remettre un programme si vous ne l’avez pas modifié et dans ce cas, ne mettez que ce que vous avez modifié !
      Je constate tout de même qu’il manque deux accolades fermantes en fin de programme.
      La première question est donc : êtes-vous certain que votre carte Nano soit bien programmée ?
      La deuxième question est : êtes-vous certain que votre écran comporte un contrôleur ST7735 ? En effet, il y a pléthore d’écrans vendus sur le marché asiatique et ce n’est pas parce qu’il ressemble à la photo 5 que c’est le même. Sa résolution est-elle bien 80 x 160 ?
      Enfin, êtes-vous certain d’avoir enregistré les fichiers images sur votre carte SD ? Et d’avoir bien installé la carte SD dans le lecteur ?
      Bref, trop peu d’informations pour que je puisse vous répondre alors que vous mettez un programme qui ne me sert à rien (et qui est difficilement exploitable vu le format d’édition).
      Avez-vous observé quelque chose qui soit écrit dans le moniteur de l’IDE ? Ce serait déjà une indication intéressante pour savoir ce qu’il se passe.
      Dernière question : avez-vous modifié la bibliothèque comme nous l’avons préconisé dans l’article ? Si oui, êtes-vous certain de ne rien avoir modifié d’autre que ce qui est écrit ?
      Une fois de plus, il n’y a aucune raison que cela marche chez le ou les auteurs, et pas chez vous : vous avez sans doute oublié une étape. Recommencez tout en prenant votre temps et en vérifiant les points que je viens de mentionner.
      Enfin, l’aide sur un montage se fait via le forum : relisez l’article https://www.locoduino.org/spip.php?...
      Cdlt.

      Répondre

      • Affichage publicitaire avec Arduino (2) 4 mai 2023 08:43, par Besseyre Guy

        bonjour Christian
        bien reçu le message pour le forum, je vais donc aller y voir.
        désolé pour les informations incomplètes ,j’y veillerais a l’avenir.
        donc :

        • le programme "diaporama publicitaire " a bien été chargé sur le NANO (et sur un UNO), sans modif
        • l’écran est bien strictement celui de la photo, avec ST7735

        les diapos ont été chargées sur carte micro SD et c’est là OU EST LE PROBLEME ! selon la marque des
        cartes , ça fonctionne ou pas !exemple : transcend OK Sandisk NON
        merci pour l’aide

        Répondre

        • Affichage publicitaire avec Arduino (2) 4 mai 2023 15:28, par Christian

          Peut-être essayer de changer le lecteur de carte SD.
          Est-ce que les fichiers sur la carte SD peuvent être relus avec un ordinateur ?
          Sinon, l’aide du forum permettra sans doute de trouver une solution.
          Cdlt.

          Répondre

  • Affichage publicitaire avec Arduino (2) 22 janvier 23:45, par skrzypek frederic

    bonjour, merci pour votre programme, fonctionne super bien.
    ma question et donc, peut ton mettre plusieurs écrans a la suite avec un décalage des images (ex affichage 1 er image, puis la seconde arrive et la premiere s’affiche sur l’écran suivant, je fait une maquette de science fiction (poste de commande star trek) et j’aimerai incorporé plusieurs écrans.
    je suis débutant en Arduino, pour les jeux de lumière ca va, mais la j’avoue que ca, dépasse mes competences.

    merci

    Répondre

    • Affichage publicitaire avec Arduino (2) 23 janvier 09:57, par Christian

      Tout est possible avec Arduino. Reste à trouver une méthode pour le faire, puis à écrire le programme.
      Vous pouvez vous inspirer des programmes donnés pour élaborer le vôtre. Mais il faut que vous ayez bien compris ce que font nos programmes.
      Comme vous vous définissez comme débutant en Arduino, il y aura beaucoup de travail pour bien comprendre (et maitriser) le fonctionnement d’un bus SPI ou d’un bus I2C. Ensuite, tout est possible et cela peut constituer un beau projet.
      Bon développement.

      Répondre

  • Bonjour,

    Pour inverser les couleurs, il suffit de remplacer à la ligne 142 du fichier Adafruit_ST7735.cpp :


    ST77XX_INVOFF, 0, // 13 : Don’t invert display, no args

    par

    ST77XX_INVON, 0, // 13 : Don’t invert display, no args

    Répondre

    • Affichage publicitaire avec Arduino (2) 28 février 17:28, par Christian

      Merci pour cette information que je ne connaissais pas.
      Lorsque j’ai vu que les couleurs étaient inversées, j’ai mis cela sur le compte du matériel chinois (stupide a priori) et je n’ai pas pensé du tout à aller voir la bibliothèque.
      Moralité, ne jamais suivre son idée ou se poser la question "Existe-t-il déjà une solution ?"
      Cette information servira à d’autres lecteurs.

      Répondre

Rubrique Projets

Les derniers articles

Les articles les plus lus