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 :

TFT tactile SPI et Ethernet Shield 2 SPI en même temps sur un Arduino UNO ?


Sujet :

Arduino

  1. #41
    Membre éprouvé Avatar de electroremy
    Homme Profil pro
    Ingénieur sécurité
    Inscrit en
    Juin 2007
    Messages
    934
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Doubs (Franche Comté)

    Informations professionnelles :
    Activité : Ingénieur sécurité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2007
    Messages : 934
    Points : 1 274
    Points
    1 274
    Par défaut
    Citation Envoyé par Jay M Voir le message
    Il y a des bibliothèques qui font du SPI en «*bit banging*» tout en logiciel - (un peu comme software serial émule port série matériel ils gèrent du SPI à la main)

    Bien sûr c’est plus lent que quand c’est en matériel !!
    Oui tout à fait !

    La comparaison avec software serial est pertinente, c'est le même principe.

    Cette gestion "tout logiciel" est tout de même pratique :
    - quand on ne peut pas faire autrement, par exemple avec ma carte Pretzel IOT qui est un Arduino NANO avec un chip ESP8266, il faut utiliser le software sérial pour communiquer entre le NANO et l'ESP car c'est câblé comme ça et ce n'est pas modifiable
    - quand on préfère réserver la gestion hardware rapide pour un ou plusieurs périphériques, et gérér en logiciel ce qui n'est pas critique ou "auxiliaire"

    A bientôt
    Quand deux personnes échangent un euro, chacun repart avec un euro.
    Quand deux personnes échangent une idée, chacun repart avec deux idées.

  2. #42
    Membre éprouvé Avatar de electroremy
    Homme Profil pro
    Ingénieur sécurité
    Inscrit en
    Juin 2007
    Messages
    934
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Doubs (Franche Comté)

    Informations professionnelles :
    Activité : Ingénieur sécurité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2007
    Messages : 934
    Points : 1 274
    Points
    1 274
    Par défaut
    Citation Envoyé par Jay M Voir le message
    Cela dit, gros bravo pour la persévérance et cette résolution de votre besoin !!
    Merci... je suis plutôt têtu en effet et cela peut être utile

    Citation Envoyé par Jay M Voir le message
    Hum, d’une part on est dans le logiciel libre, donc bien souvent la doc est dans le code source et ils sont très clair sur le Hardware SPI versus Software
    Je comprend, mais je ne suis pas trop d'accord avec ce concept pour les raisons suivantes :
    - l'écosystème Arduino a été conçu pour rendre la programmation de circuits embarqués facile ; Arduino vise un public "non spécialiste" comme des enfants, des "papy bricoleurs", des mécaniciens qui ont juste besoin d'un peut d'électronique pour faire fonctionne une création personnelle, ce public n'a pas la compétence pour éplucher des bibliothèques
    - si on respecte vraiment la programmation orienté objet et le modèle OSI l'utilisateur d'une bibliothèque ne doit pas avoir à fourrer son nez dedans ; la doc annexe doit suffire ; d'ailleurs quand je développe en VB5, en VB.NET ou en C#, quand on utilise une DLL on n'a pas (la plupart du temps) leur code source ; bricoler une DLL est une mauvaise idée car on perturbe les autres logiciels qui y auraient recours

    Après, il est vrai que je ne suis pas très habité à développer avec des outils totalement open source
    Ceux qui ont réussi dans un tel contexte à faire de LINUX un vrai système, ainsi que des logiciels comme Kicad, ont vraiment du mérite et une sacrée patience

    Avec Arduino on est un peu coincé entre deux mondes :
    - la programmation orienté objet et ses grands principes, qui règne en maître sur nos ordinateurs
    - l'embarqué où on a très peu de RAM et de ROM, où on pilote directement le matériel, où il faut vraiment optimiser son code et l'utilisation des ressources

    Ces deux mondes sont antagonistes... C'est ça qui me donne le plus de mal (au crâne ), devoir basculer entre l'écriture d'un code source qui utilise les règles de la POO apprises avec le C++, et devoir mettre les mains dans le cambious électronique au plus bas niveau.

    Le 100% assembleur comme je l'ai fait sur 8051 au moins c'est 100% bas niveau, aucune ambiguïté, on sait qu'il faut tout gérer dès le départ. Paradoxalement, cette approche est à la fois plus difficile et plus facile.

    Citation Envoyé par Jay M Voir le message
    Ensuite leur code fonctionne peut être avec leur écran... si vous avez un clone il se peut qu’il y ait des différences suffisantes pour créer des soucis...
    J'en doute, pour les raisons suivantes :
    - mon écran n'est pas un clone, c'est un écran "brut" (le shield Adafruit utilise un écran TFT qu'ils achète probablement auprès des mêmes fournisseurs)
    - étant donné que dans la bibliothèque le software SPI utilise le mode 3 et le hardware SPI le mode 0, ça m'étonnerais qu'un produit Adafruit officiel fonctionne correctement
    - enfin, étant donné que l'utilisation de la fonction hardware SPI ne compile pas ("call of overloaded 'Adafruit_ILI9341(int, int, int)' is ambiguous") cela me fait supposer que cette fonction de leur bibliothèque n'a pas été testé du tout ou bien pas testé lors des dernières évolutions de la bibliothèque.

    Un indice est que le tutorial que j'ai trouvé pour utilisé l'écran, qui arrive en premier dans les résultats Google, montre qu'on câble d'écran TFT sur les broches hardware SPI avec un exemple de code source qui utilise le software SPI. Ça marche mais c'est lent, mais comme ça marche beaucoup de gens n'essayent pas d'aller plus loin, et quelqu'un qui débute ne va pas instinctivement remettre en cause un tutoriel populaire.

    C'est ça qui m'énerve le plus, les tutoriels peuvent être à la fois populaires et mauvais.
    Le page rank de google créé un effet boule de neige, les contenus en eux-même ne sont pas évalués.

    J'ai vécu une situation similaire avec ma carte Pretzel : un joli coffret du commerce avec un lot de composants et un petit livret avec des exemples de codes sources, hé bien le code source "exemple" était mauvais :
    - utilisation de string pas du tout optimisée
    - mauvais code serveur web qui génère une réponse HTTP incorrecte
    Le truc c'est qu'un navigateur web tolère ces erreurs, et la mauvaise utilisation de string ne fait pas planter l'Arduino si on se contente d'un petit exemple qui laisse beaucoup de RAM disponible, donc ça marche même si c'est mauvais.
    Ensuite, quand on essayer de partir de exemple pour faire quelque chose de plus aboutit rien ne fonctionne plus et on galère longtemps avant de comprendre comment bien faire les choses.

    J'ai eu une petite galère similaire avec mon 1ier Raspberry Pi, utilisé comme lecteur MP3 et radio streaming avec un hat HiffiBerry et une distribution RuneAudio.
    Le tutoriel de base de RuneAudio est très succin, c'était frustrant l'appareil ne faisait pas ce que j'espérais.
    J'étais partit pour reprendre le code source et/ou développer un script pour ajouter les fonctions manquantes...
    J'ai passé du temps à éplucher les forums avant de trouver les 3 choses que j'avais besoin de savoir pour exploiter pleinement et facilement le matériel et son logiciel :
    - comment stocker les MP3 sur la carte SD, et dire à RuneAudio d'utiliser cet emplacement comme local storage
    - comment transférer les MP3 sur la carte SD via le réseau sans tout débrancher à chaque fois
    - comment trouver et mettre facilement les radios en streaming de son choix
    C'était très simple mais il fallait trouver comment faire.

    Il devient extrêmement important d'être doué pour trouver l'aiguille dans la meule de fois.
    Épluchage de forums en anglais obligatoire...

    Ce qui est difficile c'est que la bonne info n'est pas forcément là ou on la cherche... Cette histoire de SPI MODE 3 je l'ai pas trouvé sur les forums Arduino ni Adafruit, mais sur un forum de développeurs de ... SONY https://forum.developer.sony.com/top...-sw-spi-does/5


    A bientôt
    Quand deux personnes échangent un euro, chacun repart avec un euro.
    Quand deux personnes échangent une idée, chacun repart avec deux idées.

  3. #43
    Membre émérite
    Avatar de jpbbricole
    Homme Profil pro
    Retraité des réseaux informatiques
    Inscrit en
    Février 2013
    Messages
    1 012
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Retraité des réseaux informatiques
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Février 2013
    Messages : 1 012
    Points : 2 341
    Points
    2 341
    Par défaut
    Bonjour electroremy
    Citation Envoyé par electroremy Voir le message
    ... Je comprend, mais je ne suis pas trop d'accord avec ce concept pour les raisons suivantes :
    - l'écosystème Arduino a été conçu pour rendre la programmation de circuits embarqués facile ; Arduino vise un public "non spécialiste" comme des enfants, des "papy bricoleurs", des mécaniciens qui ont juste besoin d'un peut d'électronique pour faire fonctionne une création personnelle, ce public n'a pas la compétence pour éplucher des bibliothèques
    - si on respecte vraiment la programmation orienté objet et le modèle OSI l'utilisateur d'une bibliothèque ne doit pas avoir à fourrer son nez dedans ; la doc annexe doit suffire ; d'ailleurs quand je développe en VB5, en VB.NET ou en C#, quand on utilise une DLL on n'a pas (la plupart du temps) leur code source ; bricoler une DLL est une mauvaise idée car on perturbe les autres logiciels qui y auraient recours
    En tant que "papy bricoleur" je suis tout à fait d'accord avec ceci (entre autre, dans cet excellent post).

    Cordialement
    jpbbricole
    L'expérience est la seule chose qu'il ne faut acheter que d'occasion!

  4. #44
    Expert confirmé

    Homme Profil pro
    mad scientist :)
    Inscrit en
    Septembre 2019
    Messages
    2 711
    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 711
    Points : 5 390
    Points
    5 390
    Par défaut
    Citation Envoyé par electroremy Voir le message
    Je comprend, mais je ne suis pas trop d'accord avec ce concept pour les raisons suivantes...
    Oui je comprend et c’est en grande partie l’objectif et réalisable tant qu’on reste dans les librairies de bases et des produits de marque (cf votre expérience d’un module ethernet)

    Quand vous commencez à dépendre de librairies tierces c’est un peu plus compliqué. Les éditeurs les publient pour leurs produits, ne testent pas forcément en détail, voire parfois semblent prendre un malin plaisir à essayer de faire que leur bibliothèque ne fonctionne pas sur certains produits...
    par exemple vous avez mentionné utiliser URTouch, si vous allez voir sur la page de contact de Rinky Henning Karlsen est très clair sur ce qu’ils pense de certains vendeurs (qui ont refusé de lui payer des royalties je suppose)
    If you are using any SainSmart, MCUfriend, BuyDisplay or ElecFreak products at all; Do not bother contacting me. I refuse to help companies that are using my libraries commercially in violation of the free licenses.
    Pour certains écrans la librairie utft fonctionnera en rajoutant juste un ou deux NOP bien placés dans la phase de synchro SPI, laisser ces NOP n’était pas dramatique pour les autres mais il a préféré sans doute créer/laisser cette incompatibilité (qui lui a été signalée de nombreuses fois ).

    C’est pour cela que je vous disais que si vous avez un clone ça peut parfois conduire à des désillusions ou des heures de débug, le monde du libre c’est aussi parfois le far west...

  5. #45
    Membre éprouvé Avatar de electroremy
    Homme Profil pro
    Ingénieur sécurité
    Inscrit en
    Juin 2007
    Messages
    934
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Doubs (Franche Comté)

    Informations professionnelles :
    Activité : Ingénieur sécurité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2007
    Messages : 934
    Points : 1 274
    Points
    1 274
    Par défaut
    Citation Envoyé par Jay M Voir le message
    Pour certains écrans la librairie utft fonctionnera en rajoutant juste un ou deux NOP bien placés dans la phase de synchro SPI, laisser ces NOP n’était pas dramatique pour les autres mais il a préféré sans doute créer/laisser cette incompatibilité (qui lui a été signalée de nombreuses fois ).
    Oui j'ai entendu parler de cette histoire

    Citation Envoyé par Jay M Voir le message
    C’est pour cela que je vous disais que si vous avez un clone ça peut parfois conduire à des désillusions ou des heures de débug, le monde du libre c’est aussi parfois le far west...
    En effet !

    Après c'est juste humain, on retrouve les mêmes travers dans le monde du libre que dans le milieu associatif

    Il n'y a pas d'un côté les "méchants privateurs" et de l'autre les "gentils libristes", chaque univers a ses avantages et ses inconvénients, en pratique on a besoin des deux.
    Et chaque univers peut s'inspirer des bonnes pratiques de l'autre, c'est comme ça qu'on va progresser

    Par exemple si j'étais fâché contre Microsoft à l'époque de Windows 95, il faut reconnaître que VB5 a été un super environnement et il fonctionne encore aujourd'hui presque normalement. Excel et VBA ça a rendu des services à tout le monde, sans être compliqué à utiliser. VB et VBA on rendu la programmation accessible au plus grand nombre.
    Avec .NET, Microsoft a vraiment fait du bon boulot, sans trop brusquer les anciens du VB... ils ont accepté d'être plus ouverts, se sont inspirés de ce que les autres faisaient et ils ont eu raison.
    J'ai vraiment apprécié les versions XP et 7 de Windows (beaucoup moins Windows 10).

    Linux commence à bien marcher car ils ont fait l'effort de faire des distributions avec une interface "comme Windows" facile à utiliser et à installer - on n'est pas tout de suite obligé de jouer de la ligne de commande pour avoir un PC qui marche avec des applications de base (navigateur Internet, bureautique, explorateur de fichier, lecteur multimédia). Linux ne s'est pas pour autant renié et a tout ce qu'il faut comme supers outils d'administrations, et une possibilité de personnalisation et d'adaptation à tout type de hardware extrême. Linux fait des merveilles sur un Raspberry PI ou un PC obsolète.

    A contrario, il y a aussi des trucs auxquels tout le monde croyait et qui ont perdu de leur splendeur, par orgueil et manque d'ouverture...
    Apple est passé du statut de héro à celui de méchant GAFA ; même si le matériel est de bonne qualité la difficulté à le réparer, ces satanés connecteurs spécifiques et son prix sont rédhibitoires.
    Les alternatives à IBM/Microsoft (commodore avec son Amiga, une super machine) se sont plantées, victimes de mauvais gestionnaires d'entreprises et aussi d'un rapport prix/performance trop élevé. Si le duo compatible PC / Microsoft est si répandu, c'est d'abord parce que ce sont de bonnes solutions.

    La force du Visual Basic de Microsoft c'est :
    - une IHM bien faite et accessible
    - une durée de vie longue (un logiciel fait il y a plus de 23 ans fonctionne sur tous les PC, préhistoriques ou modernes)
    - et surtout la présence d'une documentation centrale très complète et traduite dans toutes les langues.

    Pour revenir au sujet, je pense que le monde de l'Open Source pourrait devenir plus efficace et attirer bien plus d'utilisateurs si un petit effort était fait au niveau de la doc.
    Il faudrait un moyen d'indexer les bonnes solutions perdues au milieu des forums pour les rendre plus facile à trouver, et un moyen pour l'usager lambda de mettre à jour la doc, un peu comme avec Wikipédia. Surtout pour les projets en pause ou abandonnés, dont le site officiel est figé tout en restant en tête des index Google, alors que le projet continue à vivre via GitHub et les forums. Pour la traduction, si le texte original en anglais est correctement écrit et pas trop alambiqué, les traductions automatiques donnent aujourd'hui de bon résultats.

    A bientôt
    Quand deux personnes échangent un euro, chacun repart avec un euro.
    Quand deux personnes échangent une idée, chacun repart avec deux idées.

  6. #46
    Membre éprouvé Avatar de electroremy
    Homme Profil pro
    Ingénieur sécurité
    Inscrit en
    Juin 2007
    Messages
    934
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Doubs (Franche Comté)

    Informations professionnelles :
    Activité : Ingénieur sécurité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2007
    Messages : 934
    Points : 1 274
    Points
    1 274
    Par défaut
    Bonjour,

    J'ai contacté Adafruit et la bonne nouvelle c'est qu'ils m'ont répondu tout de suite et accordent de l'attention à mes remarques.

    Ils vont mettre à jour la librairie.

    Ca, c'est du bon état d'esprit open source. Je n'ai pas acheté un de leurs produits mais je les ai aidé à améliorer leur logiciels. Cette mise à jour sera bien plus efficace que d'aiguiller les gens sur un forum pour qu'ils bidouillent la librairie. Tout le monde est content.

    A bientôt
    Quand deux personnes échangent un euro, chacun repart avec un euro.
    Quand deux personnes échangent une idée, chacun repart avec deux idées.

  7. #47
    Expert confirmé

    Homme Profil pro
    mad scientist :)
    Inscrit en
    Septembre 2019
    Messages
    2 711
    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 711
    Points : 5 390
    Points
    5 390
    Par défaut
    Cool Adafruit est assez réactif surtout si vous suggérez un pull request directement dans leur GitHub

    Pour ce qui est d’Apple ils ont de Très très loin ma préférence, unix avec une vraie interface de productivité grand public et une forte sécurité et protection des données personnelles. Donc je n’ai pas de soucis à payer un peu plus cher du matos de qualité. Quasi tout mon matos a une pomme

    Microsoft je ne supporte pas leur virage piquage de données perso dans w10 et qu’il vous pousse à fond à tout passer en cloud... VB est à mon sens dépassé comme langage et environnement (truffée de trous de sécurité, quand j’étais en activité c’était un premier point de fragilité des SI qui était regardé tant la surface d’attaque est large) mais je suis d’accord avec vous que sur Windows au final il rend bien service pour des petits développements perso.

    Linux je le garde pour mes serveurs web, ça fait bien le job car pour le quotidien je n’obtiens pas la productivité et simplicité de macOS ou iOS

    Mais bon tout ça c’est affaire de choix et priorités perso, chacun fait comme il veut et libre, ça n’empêche en rien de pouvoir bien faire bosser ses neurones

  8. #48
    Membre éprouvé Avatar de electroremy
    Homme Profil pro
    Ingénieur sécurité
    Inscrit en
    Juin 2007
    Messages
    934
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Doubs (Franche Comté)

    Informations professionnelles :
    Activité : Ingénieur sécurité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2007
    Messages : 934
    Points : 1 274
    Points
    1 274
    Par défaut
    Bonjour,

    Je viens de recevoir des convertisseurs de niveau à base de TXS0108E

    Je les ai relié à l'Arduino UNO et à l'écran TFT avec des câbles Dupont de 10cm :

    Nom : Dsc03614.jpg
Affichages : 178
Taille : 595,6 Ko

    La broche OE output enable doit être reliée au +5V avec une résistance (j'ai pris une 2,2K)

    Lorsque OE est relié à la masse, toutes les entrées sont en haute impédance... cela peut se montrer utile pour commuter des dispositifs récalcitrants

    Plus besoin de limiter la vitesse du bus SPI

    Bon après ça reste lent (une demi seconde pour remplir l'écran de texte) :
    - quand c'est possible, avoir une interface où on ne redessine qu'une partie de l'écran à chaque interaction - c'est pas l'idéal si vous avez un menu donnant accès à différentes "pages"
    - utiliser une bibliothèque plus optimisée (Adafruit fait du pixel par pixel )
    - utiliser une carte avec une vitesse SPI supérieure, mais ça restera du SPI

    A bientôt
    Quand deux personnes échangent un euro, chacun repart avec un euro.
    Quand deux personnes échangent une idée, chacun repart avec deux idées.

  9. #49
    Membre éprouvé Avatar de electroremy
    Homme Profil pro
    Ingénieur sécurité
    Inscrit en
    Juin 2007
    Messages
    934
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Doubs (Franche Comté)

    Informations professionnelles :
    Activité : Ingénieur sécurité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2007
    Messages : 934
    Points : 1 274
    Points
    1 274
    Par défaut
    Bonjour,

    voici le code avec ADAFRUIT

    (important : il faut avoir modifié Adafruit_ILI9341.cpp en remplaçant "initSPI(freq);" par "initSPI(freq, SPI_MODE3);")

    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
    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
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
    210
    211
    212
    213
    214
    215
    216
    217
    218
    219
    220
    221
    222
    223
    224
    225
    226
    227
    228
    229
    230
    231
    #include <SPI.h>
    #include <Ethernet.h>
     
    // Ethernet Shield 2 : communicates with both the W5500 and SD card using the SPI bus (through the ICSP header).
    // This is on digital pins 10, 11, 12, and 13 on the Uno and pins 50, 51, and 52 on the Mega.
    // On both boards, pin 10 is used to select the W5500 and pin 4 for the SD card. These pins cannot be used for general I/O.
    // On the Mega, the hardware SS pin, 53, is not used to select either the W5500 or the SD card, but it must be kept as an output or the SPI interface won't work.
     
    #include "Adafruit_GFX.h" // Trouvé et ajouté via le menu Outil / Gérer les bibliothèques    
    #include "Adafruit_ILI9341.h" // Trouvé et ajouté via le menu Outil / Gérer les bibliothèques
    #include "URTouch.h" // Ajouté au format ZIP      
     
      //On définit les broches pour la partie affichage
      #define TFT_CLK 13
      #define TFT_MISO 12
      #define TFT_MOSI 11
      //#define TFT_CS 10
      #define TFT_CS 0 // On change juste cette broche pour piloter aussi le module Ethernet avec le bus SPI
      #define TFT_DC 9
      #define TFT_RST 8
      //Adafruit_ILI9341 tft = Adafruit_ILI9341(TFT_CS, TFT_DC, TFT_MOSI, TFT_CLK, TFT_RST, TFT_MISO);
      Adafruit_ILI9341 tft = Adafruit_ILI9341(TFT_CS, TFT_DC, TFT_RST);
     
      #define TFT_PWM_LED 6 // Un transistor PNP permet de piloter le rétroéclairage 
      // Il est possible d'ajuster le niveau de rétroéclairage en fonction de la luminosité ambiante grâce à une photodiode sur une entrée analogique
      // On peut réduire et éteindre le rétroéclairage après une période d'inactivité de la dalle tactile
      // Et réactiver le rétroéclairage en cas de notification
     
      //On définit les broches pour la partie tactile
      #define t_IRQ 5
      //#define t_MISO 4
      #define t_MISO 7 // La broche 4 est utilisée pour le lecteur SD de l'ethernet Shield
      #define t_MOSI 3
      #define t_CS 2
      #define t_SCK 1
      URTouch ts(t_SCK, t_CS, t_MOSI, t_MISO, t_IRQ);
     
     
    // Enter a MAC address and IP address for your controller below.
    // The IP address will be dependent on your local network:
    byte mac[] = {
      0xA8, 0x61, 0x0A, 0xAE, 0x75, 0xCA
    };
    IPAddress ip(192, 168, 123, 177);
     
    // Initialize the Ethernet server library
    // with the IP address and port you want to use
    // (port 80 is default for HTTP):
    EthernetServer server(80);
     
        char Buffer_DispXY[15];
        int sensorReading;
        int dernierx;
        int derniery;
     
    void setup() {
      int radius = 4;
      dernierx=-1;
      derniery=-1;
     
      analogWrite(TFT_PWM_LED,128);
     
      tft.begin();
      tft.setRotation(0);
     
      ts.InitTouch(PORTRAIT);
      ts.setPrecision(PREC_EXTREME);
      tft.fillScreen(ILI9341_BLACK);
     
      tft.setTextColor(ILI9341_RED, ILI9341_BLACK);
      tft.setTextSize(2);
     
      tft.fillCircle(10, 10, radius, ILI9341_YELLOW);
      tft.fillCircle(10, 310, radius, ILI9341_YELLOW);
      tft.fillCircle(230, 310, radius, ILI9341_YELLOW);
      tft.fillCircle(230, 10, radius, ILI9341_YELLOW);
      tft.fillCircle(120, 160, radius, ILI9341_YELLOW);
     
      sensorReading = 555;
      snprintf_P(Buffer_DispXY, sizeof(Buffer_DispXY), PSTR("A = %d"), sensorReading);
      tft.setCursor(55, 5);
      tft.print(Buffer_DispXY);
     
    /*
      // Open serial communications and wait for port to open:
      Serial.begin(9600);
      while (!Serial) {
        ; // wait for serial port to connect. Needed for native USB port only
      }
      Serial.println("Ethernet WebServer Example");
    */
     
      // You can use Ethernet.init(pin) to configure the CS pin
      //Ethernet.init(10);  // Most Arduino shields
      //Ethernet.init(5);   // MKR ETH shield
      //Ethernet.init(0);   // Teensy 2.0
      //Ethernet.init(20);  // Teensy++ 2.0
      //Ethernet.init(15);  // ESP8266 with Adafruit Featherwing Ethernet
      //Ethernet.init(33);  // ESP32 with Adafruit Featherwing Ethernet
     
      // start the Ethernet connection and the server:
      Ethernet.begin(mac, ip);
     
      // Check for Ethernet hardware present
      if (Ethernet.hardwareStatus() == EthernetNoHardware) {
        //Serial.println("Ethernet shield was not found.  Sorry, can't run without hardware. :(");
        while (true) {
          delay(1); // do nothing, no point running without Ethernet hardware
        }
      }
      if (Ethernet.linkStatus() == LinkOFF) {
        //Serial.println("Ethernet cable is not connected.");
      }
     
      // start the server
      server.begin();
      //Serial.print("server is at ");
      //Serial.println(Ethernet.localIP());
    }
     
     
    void loop() {
        int retro;
        int x, y;
     
      // listen for incoming clients
      EthernetClient client = server.available();
      if (client) {
        //Serial.println("new client");
        // an http request ends with a blank line
        boolean currentLineIsBlank = true;
        while (client.connected()) {
          if (client.available()) {
            char c = client.read();
            //Serial.write(c);
            // if you've gotten to the end of the line (received a newline
            // character) and the line is blank, the http request has ended,
            // so you can send a reply
            if (c == '\n' && currentLineIsBlank) {
              // send a standard http response header
              client.println(F("HTTP/1.1 200 OK"));
              client.println(F("Content-Type: text/html"));
              client.println(F("Connection: close"));  // the connection will be closed after completion of the response
              client.println(F("Refresh: 5"));  // refresh the page automatically every 5 sec
              client.println();
              client.println(F("<!DOCTYPE HTML>"));
              client.println(F("<html>"));
              // output the value of each analog input pin
              for (int analogChannel = 0; analogChannel < 6; analogChannel++) {
                sensorReading = analogRead(analogChannel);
                client.print(F("analog input "));
                client.print(analogChannel);
                client.print(F(" is "));
                client.print(sensorReading);
                client.println(F("<br />"));
              }
              client.print(F("TFT X="));
              client.print(dernierx);
              client.print(F(" Y="));
              client.print(derniery);
              client.println(F("</html>"));
              break;
            }
            if (c == '\n') {
              // you're starting a new line
              currentLineIsBlank = true;
            } else if (c != '\r') {
              // you've gotten a character on the current line
              currentLineIsBlank = false;
            }
          }
        }
        // give the web browser time to receive the data
        delay(1);
        // close the connection:
        client.stop();
        //Serial.println("client disconnected");
      }
     
        while (ts.dataAvailable())
      {
        ts.read();
        x = ts.getX();
        y = ts.getY();
     
        if ((x != -1) && (y != -1))
        {
          dernierx=x;
          derniery=y;
          snprintf_P(Buffer_DispXY, sizeof(Buffer_DispXY), PSTR("X=%3d Y=%3d"), x, y);
          tft.setCursor(55, 5);
          tft.print(Buffer_DispXY);
          tft.setCursor(55, 25);
          tft.print(Buffer_DispXY);
          tft.setCursor(55, 45);
          tft.print(Buffer_DispXY);
          tft.setCursor(55, 65);
          tft.print(Buffer_DispXY);
          tft.setCursor(55, 85);
          tft.print(Buffer_DispXY);
          tft.setCursor(55, 105);
          tft.print(Buffer_DispXY);
          tft.setCursor(55, 125);
          tft.print(Buffer_DispXY);
          tft.setCursor(55, 145);
          tft.print(Buffer_DispXY);
          tft.setCursor(55, 165);
          tft.print(Buffer_DispXY);
          tft.setCursor(55, 185);
          tft.print(Buffer_DispXY);
          tft.setCursor(55, 205);
          tft.print(Buffer_DispXY);
          tft.setCursor(55, 225);
          tft.print(Buffer_DispXY);
          tft.setCursor(55, 245);
          tft.print(Buffer_DispXY);
          tft.setCursor(55, 265);
          tft.print(Buffer_DispXY);
          tft.setCursor(55, 285);
          tft.print(Buffer_DispXY);
          tft.setCursor(55, 305);
          tft.print(Buffer_DispXY);
          tft.setCursor(55, 325);
          tft.print(Buffer_DispXY);
          retro=y-10;
          if (retro<0) {retro=0;}
          if (retro>255) {retro=255;}
          analogWrite(TFT_PWM_LED,retro);
        }
      }
    }
    Le croquis utilise 25372 octets (78%) de l'espace de stockage de programmes. Le maximum est de 32256 octets.
    Les variables globales utilisent 559 octets (27%) de mémoire dynamique, ce qui laisse 1489 octets pour les variables locales. Le maximum est de 2048 octets.

    J'ai trouvé une autre bibliothèque qui est plus rapide (pas vraiment pour le texte, mais beaucoup plus pour les graphismes comme l'effacement de l'écran)

    Et il n'y a pas besoin de corriger des bugs dedans. Il faut l'utiliser avec un vrai convertisseur de niveau et pas des résistances.

    Elle s'appelle PDQ_GFX et PDQ_ILI9341

    Cerise sur le gâteau : elle utilise moins de mémoire :
    Le croquis utilise 20754 octets (64%) de l'espace de stockage de programmes. Le maximum est de 32256 octets.
    Les variables globales utilisent 370 octets (18%) de mémoire dynamique, ce qui laisse 1678 octets pour les variables locales. Le maximum est de 2048 octets.

    Voici le code :

    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
    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
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
    210
    211
    212
    213
    214
    215
    216
    217
    218
    219
    220
    221
    222
    223
    224
    225
    226
    227
    228
    229
    230
    231
    232
    233
    234
    235
    236
    237
    238
    239
    240
    241
    242
    243
    244
    245
    #include <SPI.h>
    #include <Ethernet.h>
     
    // Ethernet Shield 2 : communicates with both the W5500 and SD card using the SPI bus (through the ICSP header).
    // This is on digital pins 10, 11, 12, and 13 on the Uno and pins 50, 51, and 52 on the Mega.
    // On both boards, pin 10 is used to select the W5500 and pin 4 for the SD card. These pins cannot be used for general I/O.
    // On the Mega, the hardware SS pin, 53, is not used to select either the W5500 or the SD card, but it must be kept as an output or the SPI interface won't work.
     
    #include "URTouch.h" // Ajouté au format ZIP      
     
      //On définit les broches pour la partie affichage
    /*  
      #define TFT_CLK A0  //13
      #define TFT_MISO A1 //12
      #define TFT_MOSI A2 //11
      #define TFT_CS 0 // On change juste cette broche pour piloter aussi le module Ethernet avec le bus SPI
      #define TFT_DC 9
      #define TFT_RST 8
      Adafruit_ILI9341 tft = Adafruit_ILI9341(TFT_CS, TFT_DC, TFT_MOSI, TFT_CLK, TFT_RST, TFT_MISO);
    */
     
    #include <PDQ_GFX.h>        // PDQ: Core graphics library
     
    #include "PDQ_ILI9341_config.h"     // PDQ: ILI9341 pins and other setup for this sketch
    //C'est dans le fichier PDQ_ILI9341_config.h qu'on définit les broches CS, DC et RST :
    //#define  ILI9341_CS_PIN    0     // <= /CS pin (chip-select, LOW to get attention of ILI9341, HIGH and it ignores SPI bus)
    //#define ILI9341_DC_PIN    9     // <= DC pin (1=data or 0=command indicator line) also called RS
    //#define ILI9341_RST_PIN   8     // <= RST pin (optional)
     
    #include <PDQ_ILI9341.h>      // PDQ: Hardware-specific driver library
    PDQ_ILI9341 tft;      // PDQ: create LCD object (using pins in "PDQ_ILI9341_config.h")
     
     
      #define TFT_PWM_LED 6 // Un transistor PNP permet de piloter le rétroéclairage 
      // Il est possible d'ajuster le niveau de rétroéclairage en fonction de la luminosité ambiante grâce à une photodiode sur une entrée analogique
      // On peut réduire et éteindre le rétroéclairage après une période d'inactivité de la dalle tactile
      // Et réactiver le rétroéclairage en cas de notification
     
      //On définit les broches pour la partie tactile
      #define t_IRQ 5
      #define t_MISO 7 // La broche 4 est utilisée pour le lecteur SD de l'ethernet Shield
      #define t_MOSI 3
      #define t_CS 2
      #define t_SCK 1
      URTouch ts(t_SCK, t_CS, t_MOSI, t_MISO, t_IRQ);
     
     
    // Enter a MAC address and IP address for your controller below.
    // The IP address will be dependent on your local network:
    byte mac[] = {
      0xA8, 0x61, 0x0A, 0xAE, 0x75, 0xCA
    };
    IPAddress ip(192, 168, 123, 177);
     
    // Initialize the Ethernet server library
    // with the IP address and port you want to use
    // (port 80 is default for HTTP):
    EthernetServer server(80);
     
        char Buffer_DispXY[15];
        int sensorReading;
        int dernierx;
        int derniery;
     
    void setup() {
      pinMode(A0, OUTPUT);
      pinMode(A2, OUTPUT);
     
      int radius = 4;
      dernierx=-1;
      derniery=-1;
     
      analogWrite(TFT_PWM_LED,128);
     
      tft.begin();
      tft.setRotation(0);
     
      ts.InitTouch(PORTRAIT);
      ts.setPrecision(PREC_EXTREME);
      tft.fillScreen(ILI9341_BLACK);
     
      tft.setTextColor(ILI9341_RED, ILI9341_BLACK);
      tft.setTextSize(2);
     
      tft.fillCircle(10, 10, radius, ILI9341_YELLOW);
      tft.fillCircle(10, 310, radius, ILI9341_YELLOW);
      tft.fillCircle(230, 310, radius, ILI9341_YELLOW);
      tft.fillCircle(230, 10, radius, ILI9341_YELLOW);
      tft.fillCircle(120, 160, radius, ILI9341_YELLOW);
     
      sensorReading = 555;
      snprintf_P(Buffer_DispXY, sizeof(Buffer_DispXY), PSTR("A = %d"), sensorReading);
      tft.setCursor(55, 5);
      tft.print(Buffer_DispXY);
     
    /*
      // Open serial communications and wait for port to open:
      Serial.begin(9600);
      while (!Serial) {
        ; // wait for serial port to connect. Needed for native USB port only
      }
      Serial.println("Ethernet WebServer Example");
    */
     
      // You can use Ethernet.init(pin) to configure the CS pin
      //Ethernet.init(10);  // Most Arduino shields
      //Ethernet.init(5);   // MKR ETH shield
      //Ethernet.init(0);   // Teensy 2.0
      //Ethernet.init(20);  // Teensy++ 2.0
      //Ethernet.init(15);  // ESP8266 with Adafruit Featherwing Ethernet
      //Ethernet.init(33);  // ESP32 with Adafruit Featherwing Ethernet
     
      // start the Ethernet connection and the server:
      Ethernet.begin(mac, ip);
     
      // Check for Ethernet hardware present
      if (Ethernet.hardwareStatus() == EthernetNoHardware) {
        //Serial.println("Ethernet shield was not found.  Sorry, can't run without hardware. :(");
        while (true) {
          delay(1); // do nothing, no point running without Ethernet hardware
        }
      }
      if (Ethernet.linkStatus() == LinkOFF) {
        //Serial.println("Ethernet cable is not connected.");
      }
     
      // start the server
      server.begin();
      //Serial.print("server is at ");
      //Serial.println(Ethernet.localIP());
    }
     
     
    void loop() {
        int retro;
        int x, y;
     
      // listen for incoming clients
      EthernetClient client = server.available();
      if (client) {
        //Serial.println("new client");
        // an http request ends with a blank line
        boolean currentLineIsBlank = true;
        while (client.connected()) {
          if (client.available()) {
            char c = client.read();
            //Serial.write(c);
            // if you've gotten to the end of the line (received a newline
            // character) and the line is blank, the http request has ended,
            // so you can send a reply
            if (c == '\n' && currentLineIsBlank) {
              // send a standard http response header
              client.println(F("HTTP/1.1 200 OK"));
              client.println(F("Content-Type: text/html"));
              client.println(F("Connection: close"));  // the connection will be closed after completion of the response
              client.println(F("Refresh: 5"));  // refresh the page automatically every 5 sec
              client.println();
              client.println(F("<!DOCTYPE HTML>"));
              client.println(F("<html>"));
              // output the value of each analog input pin
              for (int analogChannel = 0; analogChannel < 6; analogChannel++) {
                sensorReading = analogRead(analogChannel);
                client.print(F("analog input "));
                client.print(analogChannel);
                client.print(F(" is "));
                client.print(sensorReading);
                client.println(F("<br />"));
              }
              client.print(F("TFT X="));
              client.print(dernierx);
              client.print(F(" Y="));
              client.print(derniery);
              client.println(F("</html>"));
              break;
            }
            if (c == '\n') {
              // you're starting a new line
              currentLineIsBlank = true;
            } else if (c != '\r') {
              // you've gotten a character on the current line
              currentLineIsBlank = false;
            }
          }
        }
        // give the web browser time to receive the data
        delay(1);
        // close the connection:
        client.stop();
        //Serial.println("client disconnected");
      }
     
        while (ts.dataAvailable())
      {
        ts.read();
        x = ts.getX();
        y = ts.getY();
     
        if ((x != -1) && (y != -1))
        {
          dernierx=x;
          derniery=y;
          snprintf_P(Buffer_DispXY, sizeof(Buffer_DispXY), PSTR("X=%3d Y=%3d"), x, y);
          //delay(10);
          tft.setCursor(55, 5);
          tft.print(Buffer_DispXY);
          tft.setCursor(55, 25);
          tft.print(Buffer_DispXY);
          tft.setCursor(55, 45);
          tft.print(Buffer_DispXY);
          tft.setCursor(55, 65);
          tft.print(Buffer_DispXY);
          tft.setCursor(55, 85);
          tft.print(Buffer_DispXY);
          tft.setCursor(55, 105);
          tft.print(Buffer_DispXY);
          tft.setCursor(55, 125);
          tft.print(Buffer_DispXY);
          tft.setCursor(55, 145);
          tft.print(Buffer_DispXY);
          tft.setCursor(55, 165);
          tft.print(Buffer_DispXY);
          tft.setCursor(55, 185);
          tft.print(Buffer_DispXY);
          tft.setCursor(55, 205);
          tft.print(Buffer_DispXY);
          tft.setCursor(55, 225);
          tft.print(Buffer_DispXY);
          tft.setCursor(55, 245);
          tft.print(Buffer_DispXY);
          tft.setCursor(55, 265);
          tft.print(Buffer_DispXY);
          tft.setCursor(55, 285);
          tft.print(Buffer_DispXY);
          tft.setCursor(55, 305);
          tft.print(Buffer_DispXY);
          tft.setCursor(55, 325);
          tft.print(Buffer_DispXY);
          retro=y-10;
          if (retro<0) {retro=0;}
          if (retro>255) {retro=255;}
          analogWrite(TFT_PWM_LED,retro);
          //delay(10);
        }
      }
    }
    Voilà de quoi exploiter pleinement l'écran TFT avec un Arduino UNO

    A bientôt
    Quand deux personnes échangent un euro, chacun repart avec un euro.
    Quand deux personnes échangent une idée, chacun repart avec deux idées.

+ Répondre à la discussion
Cette discussion est résolue.
Page 3 sur 3 PremièrePremière 123

Discussions similaires

  1. Arduino UNO + USB HOST Shield DUINOFUN
    Par fred2355 dans le forum Arduino
    Réponses: 9
    Dernier message: 26/04/2019, 21h55
  2. Réponses: 4
    Dernier message: 01/12/2018, 13h31
  3. Réponses: 2
    Dernier message: 31/12/2015, 10h11
  4. TFT TACTILE ADC STM32F1
    Par boby6613 dans le forum C
    Réponses: 8
    Dernier message: 26/04/2012, 15h17
  5. Réponses: 8
    Dernier message: 24/08/2006, 12h47

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