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 :

Compatibilité afficheur LCD et OLED


Sujet :

Arduino

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Retraite
    Inscrit en
    Janvier 2019
    Messages
    81
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 69
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Activité : Retraite

    Informations forums :
    Inscription : Janvier 2019
    Messages : 81
    Points : 31
    Points
    31
    Par défaut Compatibilité afficheur LCD et OLED
    Bonjour

    Je voudrais savoir si on peut faire cohabiter un afficheur OLED (mode I2C) et un afficheur TFT (mode SPI) ou afficheur LCD (mode 4bits) dans le même code, j'essaie depuis plusieurs jour mais je n'arrive pas.

    Je n'ai pas d'erreur de compilation, les codes de chaque afficheur tourne séparément mais dès que je veux rassembler tout cela sous le même code rien ne va plus.

    J'ai bien pensé à un problème d'alimentation mais même avec une alim séparée cela ne tourne pas non plus.

    Si quelqu'un a une idée ? Merci

    Amicalement, Fernand

  2. #2
    Modérateur

    Avatar de Vincent PETIT
    Homme Profil pro
    Consultant en Systèmes Embarqués
    Inscrit en
    Avril 2002
    Messages
    3 190
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Consultant en Systèmes Embarqués
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Avril 2002
    Messages : 3 190
    Points : 11 573
    Points
    11 573
    Par défaut
    Salut,
    Sur un Arduino UNO, électroniquement parlant, tu peux faire cohabiter I2C, SPI et GPIO sans problème sous réserve de tensions compatibles (ce qui parait évident). Les bus I2C et SPI sont sur des broches différentes du micro.

    Logiciellement parlant, ça dépend du logiciel faudrait voir.

    Niveau consommation, il faut que tu regardes combien consomme chaque écran dans un premier temps et qu'ensuite tu nous disent comment tu alimentes le tout.

    A+
    La science ne nous apprend rien : c'est l'expérience qui nous apprend quelque chose.
    Richard Feynman

  3. #3
    Nouveau membre du Club
    Homme Profil pro
    Retraite
    Inscrit en
    Janvier 2019
    Messages
    81
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 69
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Activité : Retraite

    Informations forums :
    Inscription : Janvier 2019
    Messages : 81
    Points : 31
    Points
    31
    Par défaut
    Bonjour

    Effectivement je ne vois pas ce qui me gène pour faire cohabiter tout ce petit monde, par contre je ne comprends pas ce que tu veux dire par là : "Logiciellement parlant, ça dépend du logiciel faudrait voir." ?

    Je fais des mesures concernant les afficheurs et je te donne tout cela.

    Amicalement, Fernand

  4. #4
    Nouveau membre du Club
    Homme Profil pro
    Retraite
    Inscrit en
    Janvier 2019
    Messages
    81
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 69
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Activité : Retraite

    Informations forums :
    Inscription : Janvier 2019
    Messages : 81
    Points : 31
    Points
    31
    Par défaut
    Re

    Concernant les mesures :

    - afficheur TFT graphique : 58 mA
    - afficheur OLED : 8 mA
    - l'ensemble (afficheur, capteur et carte) : 189 mA

    L'ensemble est alimenté par le port USB et une alimentation externe sur le jack de l'Arduino (12 volts / 500mA)

    Bonne soirée, Fernand

  5. #5
    Nouveau membre du Club
    Homme Profil pro
    Retraite
    Inscrit en
    Janvier 2019
    Messages
    81
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 69
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Activité : Retraite

    Informations forums :
    Inscription : Janvier 2019
    Messages : 81
    Points : 31
    Points
    31
    Par défaut
    Bonsoir

    Nouveau problème, lorsque je connecte une RTC DS3231 (mode I2C), il n'y a pas de code encore pour cette carte, cela plante l'afficheur OLED. L'affichage est bizarre au niveau de la présentation, les valeurs du capteur BME/BMP280 sont a zéro, par contre le capteur DS18b20 continue a donner une indication de température correct. ?

    Amicalement, Fernand

  6. #6
    Modérateur

    Avatar de Vincent PETIT
    Homme Profil pro
    Consultant en Systèmes Embarqués
    Inscrit en
    Avril 2002
    Messages
    3 190
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Consultant en Systèmes Embarqués
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Avril 2002
    Messages : 3 190
    Points : 11 573
    Points
    11 573
    Par défaut
    Salut
    190mA avec une alimentation secteur de 12V c'est trop. La puissance que dissipe un régulateur de tension linéaire comme celui de ton Arduino (UNO ?) c'est :

    (TensionENTREE - TensionSORTIE) * CourantTOTAL
    (12V - 5V) * 0.190A = 1.33W

    C'est énorme ! Le régulateur va se mettre en protection.


    Deux solutions :
    1. Choisir un adapateur secteur de tension plus basse, 9V ou 6V. Et encore...9V c'est limite
    2. Connecter le Arduino uniquement sur l'USB, tu pourras alors consommer un peu moins de 500mA
    La science ne nous apprend rien : c'est l'expérience qui nous apprend quelque chose.
    Richard Feynman

  7. #7
    Nouveau membre du Club
    Homme Profil pro
    Retraite
    Inscrit en
    Janvier 2019
    Messages
    81
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 69
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Activité : Retraite

    Informations forums :
    Inscription : Janvier 2019
    Messages : 81
    Points : 31
    Points
    31
    Par défaut
    Bonjour Vincent

    Merci pour ta réponse mais même avec une alimentation de 9 volts ou bien seulement l'alimentation par l'USB cela ne fonctionne pas. Avec cette alimentation 12 volts externe je voulais éliminé la possibilité due a un problème d'alimentation.

    Oui il s'agit d'un Arduino Uno

    Amicalement, Fernand

  8. #8
    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 vous tous

    Ce que je fais, très souvent, quand le 5V. est plus ou moins chargé, j'alimente par le jack, en 9 ou 12V. et je reprends le Vin sur ce type d'abaisseur de tension

    Nom : AlimSupplementaire.png
Affichages : 529
Taille : 57,0 Ko

    Pour recréer du 5V.
    L'avantage de ce genre de circuits, c'est réglable, pas chère et surtout ne chauffe pas. Il y en a une quantité de sortes, recherchez DC-DC Adjustable Power Supply Buck Converter Step Down
    Ainsi, le régulateur de la carte n'alimente que le processeur.

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

  9. #9
    Modérateur

    Avatar de Vincent PETIT
    Homme Profil pro
    Consultant en Systèmes Embarqués
    Inscrit en
    Avril 2002
    Messages
    3 190
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Consultant en Systèmes Embarqués
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Avril 2002
    Messages : 3 190
    Points : 11 573
    Points
    11 573
    Par défaut
    @jpbbricole
    C'est une bonne idée ce genre de petite alimentation à découpage.

    @Fernand56
    Tu peux nous donner les liens vers les afficheurs ?
    La science ne nous apprend rien : c'est l'expérience qui nous apprend quelque chose.
    Richard Feynman

  10. #10
    Nouveau membre du Club
    Homme Profil pro
    Retraite
    Inscrit en
    Janvier 2019
    Messages
    81
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 69
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Activité : Retraite

    Informations forums :
    Inscription : Janvier 2019
    Messages : 81
    Points : 31
    Points
    31
    Par défaut
    Bonjour

    - jpbbricole, nickel pour la pompe à chaleur, un problème de moins. Bien vue ton alim 5 volts

    - Vincent, voici le lien pour les afficheurs :
    - Afficheur graphique 12864B V2.0 : https://www.aliexpress.com/item/Free...AbTest=ae803_3

    - Afficheur OLED : https://www.aliexpress.com/item/0-96...AbTest=ae803_3

    Amicalement, Fernand

  11. #11
    Modérateur

    Avatar de Vincent PETIT
    Homme Profil pro
    Consultant en Systèmes Embarqués
    Inscrit en
    Avril 2002
    Messages
    3 190
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Consultant en Systèmes Embarqués
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Avril 2002
    Messages : 3 190
    Points : 11 573
    Points
    11 573
    Par défaut
    C'est bizarre car niveau hard il ne semble pas y avoir d'incompatibilité. Mais connecte le Arduino sur l'USB pour avoir suffisamment de courant.

    Dans ton premier message tu dis que plus rien ne fonctionne une fois que tu connectes le tout. Peux tu décrire un peu plus le dysfonctionnement ?
    La science ne nous apprend rien : c'est l'expérience qui nous apprend quelque chose.
    Richard Feynman

  12. #12
    Nouveau membre du Club
    Homme Profil pro
    Retraite
    Inscrit en
    Janvier 2019
    Messages
    81
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 69
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Activité : Retraite

    Informations forums :
    Inscription : Janvier 2019
    Messages : 81
    Points : 31
    Points
    31
    Par défaut
    Bonsoir Vincent

    En général j'utilise l'alimentation fourni par l'USB lorsque je suis sur le bureau, j'ai fait un essai avec une alimentation externe pour éliminer un éventuel problème d'alim mais cela n'a rien changé.

    J'ai deux codes qui me posent problème avec afficheurs OLED et LCD chaque fois que je veux avoir les deux en même temps.

    Pour l'un, l'affichage sur l'OLED se fige (pas de code pour afficher sur le LCD, celui-ci est juste déclaré), pour l'autre le code commence a se dérouler et puis au niveau du moniteur série l'affichage s'arrête en plein milieu d'une phrase. J'avais des captures d'écran mais je n'arrive pas à remettre la main dessus.

    Amicalement, Fernand

  13. #13
    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 Fernand

    Au vu de tout ces "petits" soucis, qui, alignés deviennent un "GROS" souci j'ai une question, est-.ce-que tout les GND de tout ces périfériques sont bien reliés ensemble et connectés au GND de l'Arduino?
    Pour le bus i2C, mets une résistance de ~1.5k sur chaque signal du bus (SDA et SCL) contre +5v. ça peut améliorer les choses.

    Connais-tu les adresses de tes périphériques sur le bus i2C?

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

  14. #14
    Nouveau membre du Club
    Homme Profil pro
    Retraite
    Inscrit en
    Janvier 2019
    Messages
    81
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 69
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Activité : Retraite

    Informations forums :
    Inscription : Janvier 2019
    Messages : 81
    Points : 31
    Points
    31
    Par défaut
    Bonjour jpbbricole

    Au vu de tout ces "petits" soucis, qui, alignés deviennent un "GROS" souci
    , voilà la situation bien résumé , mais je ne suis pas au bout car je dois encore mettre une RTC et un data logger et envoyé tout cela sur le PC.

    Pour répondre à ta question tous les gnd sont bien reliés entre eux, pas de soucis de ce côté là. Sur le bus I2C je n'ai pas de résistances de fin de ligne, l'erreur que cela entraine est un risque de perte d'informations j'ai donc fait l'impasse sur les résistances; mais tu as raison et je vais les mettre.

    Le capteur BME/BMP280 est en 0x76 et l'afficheur OLED est en 0x3C. L'afficheur graphique est en mode spi, les 2 DS18b20 sont en mode 1wire.

    Amicalement, Fernand

  15. #15
    Modérateur

    Avatar de Vincent PETIT
    Homme Profil pro
    Consultant en Systèmes Embarqués
    Inscrit en
    Avril 2002
    Messages
    3 190
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Consultant en Systèmes Embarqués
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Avril 2002
    Messages : 3 190
    Points : 11 573
    Points
    11 573
    Par défaut
    Et chaque élément fonctionne parfaitement bien de manière indépendante ?

    On peut voir le programme ? Indépendant et lorsque tu regroupes tout ?
    La science ne nous apprend rien : c'est l'expérience qui nous apprend quelque chose.
    Richard Feynman

  16. #16
    Nouveau membre du Club
    Homme Profil pro
    Retraite
    Inscrit en
    Janvier 2019
    Messages
    81
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 69
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Activité : Retraite

    Informations forums :
    Inscription : Janvier 2019
    Messages : 81
    Points : 31
    Points
    31
    Par défaut
    Oui chaque élément fonctionne séparément.

    Le programme est le même pour les deux afficheurs, je commente ou décommente pour isoler un afficheur. J'ai enregistré chaque code séparément pour que cela soit plus clair.

    Voici le code pour les deux afficheurs en même temps :
    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
    #include "SparkFunBME280.h"
    #include "Wire.h"
    #include "SPI.h"
    #include <LiquidCrystal.h>
    LiquidCrystal lcd(12, 11, 5, 4, 3, 2); // Déclaration des broches de l'afficheur
    #include <Adafruit_SSD1306.h>
    #include <splash.h>
     
    BME280 bme;
     
    // Afficheur OLED
    #define SCREEN_WIDTH 128 // Ecran OLED 128 pixels de long
    #define SCREEN_HEIGHT 64 // Ecran OLED 64 pixels de haut
    #define OLED_RESET     4 // Reset pin # (or -1 if sharing Arduino reset pin)
    Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
     
     
    //Declare variable
     
    class Capteur
    {
      public:
        float pression;
        float temperature;
        float humidite;
    };
     
    void setup()
    {
     
      Serial.begin(4800); // initialisation com série
     
     
      //configuration du capteur BME280
      bme.settings.commInterface = I2C_MODE; //Broche SKL>SDI BME280 - Broche SCL>SCK BME280
      bme.settings.I2CAddress = 0x76;
      bme.settings.runMode = 3;
      bme.settings.tStandby = 0;
      bme.settings.filter = 0;
      bme.settings.tempOverSample = 1 ;
      bme.settings.pressOverSample = 1;
      bme.settings.humidOverSample = 1;
     
      delay(100);  // attente de la mise en route du capteur. 2 ms minimum
      // chargement de la configuration du capteur
      bme.begin();
     
     
     
      // Configuration de l'afficheur LCD -20 caractères par lignes, 4 lignes.
      lcd.begin (20, 4);
      lcd.clear(); // Efface l'écran
     
      // SSD1306_SWITCHCAPVCC = generate display voltage from 3.3V internally
      display.begin(SSD1306_SWITCHCAPVCC, 0x3C); // Address 0x3C for 128x64
     
      // Show initial display buffer contents on the screen --
      // the library initializes this with an Adafruit splash screen.
      display.clearDisplay(); // Efface l'écran et le buffer
      display.display(); // Affiche le logo Adafruit
     
     
    }
     
    Capteur retourneCapteur(BME280 bme)
    {
      Capteur capteur;
      capteur.pression = bme.readFloatPressure() / 100;
      capteur.humidite = bme.readFloatHumidity();
      capteur.temperature = bme.readTempC();
      return capteur;
    }
     
    void loop()
    {
     
      Capteur capteur = retourneCapteur(bme);
     
      String nmea = retourneNmea(capteur);
      Serial.println(nmea); // Affichage sentence sur port série
      Serial.println (bme.readTempC()); 
    //  afficheurLCD(capteur); // Fonction affichage LCD
    //  Serial.println("LCD");
      afficheurOLED(capteur); // Appel de la fonction affichage OLED
      Serial.println("OLED");
     
     
      delay (1000);// temporisation avant nouvelle mesure de température en mS
      Serial.println("Fin de loop");  
    } // Fin de programme
     
     
    // Sentence NMEA0183
    String retourneNmea(Capteur capteur)
    {
      // Construction de la trame NMEA à partir de laquelle on calculera le CRC
      String donnees = "WIXDR,P,";
      donnees += String (capteur.pression,1);
      donnees += ",mB,barometer,C,";
      donnees += String (capteur.temperature,2);
      donnees += ",C,temperature,H,";
      donnees += String (capteur.humidite,0);
      donnees += ",%,humidite";
     
      // Calcul du CRC
      int crc8Res = crc8Xor(donnees); // CRC en decimal
      String crc8Hex = String(crc8Res, HEX); // Conversion en hexa
     
      // Construction finale de la trame NMEA
      String nmea = "$" + donnees + "*" + crc8Hex;
      Serial.println("Fin de boucle Sentence NMEA");   
      return nmea;
    }
     
     
    // Calcul CRC8
    int crc8Xor(const String s) {
      int i;
      int _xor;
      int c;
     
      for (_xor = 0, i = 0; i < s.length(); i++) {
        c = (unsigned char)s.charAt(i);
        if (c == '*') break;
        if ((c!='$') && (c!='!')) _xor ^= c;
      }
     
      Serial.print(_xor);
     
      Serial.println("Fin de boucle calcul CRC");
     
      return _xor; 
    } 
     
     
    void afficheurLCD(Capteur capteur)
    {
      lcd.clear(); // Efface l'écran
      lcd.setCursor(0, 0); //Position du curseur colonne 0 et ligne 0 (la première ligne)
      lcd.print ("Station meteo");
      lcd.setCursor(0, 1);
      lcd.print ("Humidite : ");
      lcd.print (String(capteur.humidite, 0));
      lcd.print ("%");
      lcd.setCursor(0, 2);
      lcd.print ("Temp.: ");
      lcd.print(String (capteur.temperature,2));
      lcd.print ("*C");
      lcd.setCursor(0, 3);
      lcd.print ("Pres.: ");
      lcd.print (String(capteur.pression, 1));
      lcd.print ("hPa");
      Serial.println("Fin de boucle LCD");  
    }
     
     
    void afficheurOLED(Capteur capteur) // Déclaration de la fonction
    {
      display.clearDisplay(); //Efface l'écran et le tampon
      display.setTextSize(2); // Taille du texte
      display.setTextColor(WHITE); // Couleur du texte
      display.setCursor(0, 1); // Position origine du texte T
      display.print("T: "); // Ligne pour la température eau de mer
      display.setCursor(39, 1); // Position origine valeur température
     // display.print(readTemperatureMeasure(SENSOR_ADDRESS_1)); // Affiche la température
      display.drawCircle(107, 4, 4, WHITE); // Dessine le symbole degré
      display.drawCircle(107, 4, 3, WHITE); // Epaissi le symbole degré
      display.setCursor(115, 1); // Position origine de l'unité
      display.print("C"); // Affiche C pour l'unité
     
      display.setCursor(0, 16); // Position origine du texte T
      display.print("T: "); // Ligne pour la température air exterieur
      display.setCursor(39, 16); // Position origine valeur température
      display.print(capteur.temperature,2); // Affiche la température
      display.drawCircle(107, 20, 4, WHITE); // Dessine le symbole degré
      display.drawCircle(107, 20, 3, WHITE); // Epaissi le symbole degré
      display.setCursor(115, 16); // Position origine de l'unité
      display.print("C"); // Affiche C pour l'unité
     
      display.setCursor(0, 33); // Position origine du texte H
      display.print("H: "); // Ligne pour l'humidité
      display.setCursor(39, 33); // Position origine valeur Humidité
      display.print(capteur.humidite, 0); // Affiche l'humidité
      display.setCursor(107, 33); // Position origine der l'unité
      display.print("%"); // Affiche % pour l'unité
     
      display.setCursor(0, 51); // Position origine du texte P
      display.print("P: "); // Ligne pour la pression
      display.setCursor(28, 51); // Position origine valeur pression
      display.print(capteur.pression, 1); // Affiche la pression
      display.setTextSize(1); // Taille du texte
      display.setCursor(108, 55); // Position origine der l'unité
      display.print("hPa"); // Affiche Pa  pour l'unité
     
      display.display(); 
    } // Fin de la fonction affichage OLED
    Le résultat en dur :
    - au niveau de l'afficheur OLED, aucune action, l'écran affiche les informations du dernier code qui n'ont pas été effacé.
    - au niveau de l'afficheur LCD, l'écran est vide.
    - au niveau de la sortie série, l'affichage est figé en plein milieu d'une phrase

    Nom : Capture ecran oled et lcd V5.0 sortie serie.JPG
Affichages : 525
Taille : 37,1 Ko

    voilà pour les deux afficheurs déclarés en même temps

  17. #17
    Nouveau membre du Club
    Homme Profil pro
    Retraite
    Inscrit en
    Janvier 2019
    Messages
    81
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 69
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Activité : Retraite

    Informations forums :
    Inscription : Janvier 2019
    Messages : 81
    Points : 31
    Points
    31
    Par défaut
    Voivi le code pour l'afficheur LCD :

    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
    #include "SparkFunBME280.h"
    #include "Wire.h"
    #include "SPI.h"
    #include <LiquidCrystal.h>
    LiquidCrystal lcd(12, 11, 5, 4, 3, 2); // Déclaration des broches de l'afficheur
     
    BME280 bme;
     
    //Declare variable
     
    class Capteur
    {
      public:
        float pression;
        float temperature;
        float humidite;
    };
     
    void setup()
    {
     
      Serial.begin(4800); // initialisation com série
     
     
      //configuration du capteur BME280
      bme.settings.commInterface = I2C_MODE; //Broche SKL>SDI BME280 - Broche SCL>SCK BME280
      bme.settings.I2CAddress = 0x76;
      bme.settings.runMode = 3;
      bme.settings.tStandby = 0;
      bme.settings.filter = 0;
      bme.settings.tempOverSample = 1 ;
      bme.settings.pressOverSample = 1;
      bme.settings.humidOverSample = 1;
     
      delay(100);  // attente de la mise en route du capteur. 2 ms minimum
      // chargement de la configuration du capteur
      bme.begin();
     
     
     
      // Configuration de l'afficheur LCD -20 caractères par lignes, 4 lignes.
      lcd.begin (20, 4);
      lcd.clear(); // Efface l'écran
    /*
      // SSD1306_SWITCHCAPVCC = generate display voltage from 3.3V internally
      display.begin(SSD1306_SWITCHCAPVCC, 0x3C); // Address 0x3C for 128x64
     
      // Show initial display buffer contents on the screen --
      // the library initializes this with an Adafruit splash screen.
      display.clearDisplay(); // Efface l'écran et le buffer
      display.display(); // Affiche le logo Adafruit
      
      // Clear the buffer
      //display.clearDisplay(); 
      //display.display();
      */
    }
     
    Capteur retourneCapteur(BME280 bme)
    {
      Capteur capteur;
      capteur.pression = bme.readFloatPressure() / 100;
      capteur.humidite = bme.readFloatHumidity();
      capteur.temperature = bme.readTempC();
      return capteur;
    }
     
    void loop()
    {
     
      Capteur capteur = retourneCapteur(bme);
     
      String nmea = retourneNmea(capteur);
      Serial.println(nmea); // Affichage sentence sur port série
      Serial.println (bme.readTempC()); 
      afficheurLCD(capteur); // Fonction affichage LCD
      Serial.println("LCD");
    //  afficheurOLED(capteur); // Appel de la fonction affichage OLED
    //  Serial.println("OLED");
     
     
      delay (1000);// temporisation avant nouvelle mesure de température en mS
      Serial.println("Fin de loop");  
    } // Fin de programme
     
     
    // Sentence NMEA0183
    String retourneNmea(Capteur capteur)
    {
      // Construction de la trame NMEA à partir de laquelle on calculera le CRC
      String donnees = "WIXDR,P,";
      donnees += String (capteur.pression,1);
      donnees += ",mB,barometer,C,";
      donnees += String (capteur.temperature,2);
      donnees += ",C,temperature,H,";
      donnees += String (capteur.humidite,0);
      donnees += ",%,humidite";
     
      // Calcul du CRC
      int crc8Res = crc8Xor(donnees); // CRC en decimal
      String crc8Hex = String(crc8Res, HEX); // Conversion en hexa
     
      // Construction finale de la trame NMEA
      String nmea = "$" + donnees + "*" + crc8Hex;
      Serial.println("Fin de boucle Sentence NMEA");   
      return nmea;
    }
     
     
    // Calcul CRC8
    int crc8Xor(const String s) {
      int i;
      int _xor;
      int c;
     
      for (_xor = 0, i = 0; i < s.length(); i++) {
        c = (unsigned char)s.charAt(i);
        if (c == '*') break;
        if ((c!='$') && (c!='!')) _xor ^= c;
      }
     
      Serial.print(_xor);
     
      Serial.println("Fin de boucle calcul CRC");
     
      return _xor; 
    } 
     
     
    void afficheurLCD(Capteur capteur)
    {
      lcd.clear(); // Efface l'écran
      lcd.setCursor(0, 0); //Position du curseur colonne 0 et ligne 0 (la première ligne)
      lcd.print ("Station meteo");
      lcd.setCursor(0, 1);
      lcd.print ("Humidite : ");
      lcd.print (String(capteur.humidite, 0));
      lcd.print ("%");
      lcd.setCursor(0, 2);
      lcd.print ("Temp.: ");
      lcd.print(String (capteur.temperature,2));
      lcd.print ("*C");
      lcd.setCursor(0, 3);
      lcd.print ("Pres.: ");
      lcd.print (String(capteur.pression, 1));
      lcd.print ("hPa");
      Serial.println("Fin de boucle LCD");  
    }
     
    /*
    void afficheurOLED(Capteur capteur) // Déclaration de la fonction
    {
      display.clearDisplay(); //Efface l'écran et le tampon
      display.setTextSize(2); // Taille du texte
      display.setTextColor(WHITE); // Couleur du texte
      
      display.setCursor(0,1); // Position origine du texte T
      display.print("hPa"); // Affiche Pa  pour l'unité  
      display.display();
     
      Serial.println("Fin de boucle OLED"); 
    } // Fin de la fonction affichage OLED
    */
    tout fonctionne correctement et voici ce que je récupère sur la sortie série :
    Nom : capture ecran sortie serie.JPG
Affichages : 547
Taille : 69,3 Ko

  18. #18
    Nouveau membre du Club
    Homme Profil pro
    Retraite
    Inscrit en
    Janvier 2019
    Messages
    81
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 69
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Activité : Retraite

    Informations forums :
    Inscription : Janvier 2019
    Messages : 81
    Points : 31
    Points
    31
    Par défaut
    et puis enfin l'afficheur OLED, 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
    #include "SparkFunBME280.h"
    #include "Wire.h"
    #include "SPI.h"
    //#include <LiquidCrystal.h>
    //LiquidCrystal lcd(12, 11, 5, 4, 3, 2); // Déclaration des broches de l'afficheur
    #include <Adafruit_SSD1306.h>
    #include <splash.h>
     
    BME280 bme;
     
    // Afficheur OLED
    #define SCREEN_WIDTH 128 // Ecran OLED 128 pixels de long
    #define SCREEN_HEIGHT 64 // Ecran OLED 64 pixels de haut
    #define OLED_RESET     4 // Reset pin # (or -1 if sharing Arduino reset pin)
    Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
     
     
    //Declare variable
     
    class Capteur
    {
      public:
        float pression;
        float temperature;
        float humidite;
    };
     
    void setup()
    {
     
      Serial.begin(4800); // initialisation com série
     
     
      //configuration du capteur BME280
      bme.settings.commInterface = I2C_MODE; //Broche SKL>SDI BME280 - Broche SCL>SCK BME280
      bme.settings.I2CAddress = 0x76;
      bme.settings.runMode = 3;
      bme.settings.tStandby = 0;
      bme.settings.filter = 0;
      bme.settings.tempOverSample = 1 ;
      bme.settings.pressOverSample = 1;
      bme.settings.humidOverSample = 1;
     
      delay(100);  // attente de la mise en route du capteur. 2 ms minimum
      // chargement de la configuration du capteur
      bme.begin();
     
     
    /*
      // Configuration de l'afficheur LCD -20 caractères par lignes, 4 lignes.
      lcd.begin (20, 4);
      lcd.clear(); // Efface l'écran
    */
      // SSD1306_SWITCHCAPVCC = generate display voltage from 3.3V internally
      display.begin(SSD1306_SWITCHCAPVCC, 0x3C); // Address 0x3C for 128x64
     
      // Show initial display buffer contents on the screen --
      // the library initializes this with an Adafruit splash screen.
      display.clearDisplay(); // Efface l'écran et le buffer
      display.display(); // Affiche le logo Adafruit
     
     
    }
     
    Capteur retourneCapteur(BME280 bme)
    {
      Capteur capteur;
      capteur.pression = bme.readFloatPressure() / 100;
      capteur.humidite = bme.readFloatHumidity();
      capteur.temperature = bme.readTempC();
      return capteur;
    }
     
    void loop()
    {
     
      Capteur capteur = retourneCapteur(bme);
     
      String nmea = retourneNmea(capteur);
      Serial.println(nmea); // Affichage sentence sur port série
      Serial.println (bme.readTempC()); 
    //  afficheurLCD(capteur); // Fonction affichage LCD
    //  Serial.println("LCD");
      afficheurOLED(capteur); // Appel de la fonction affichage OLED
      Serial.println("OLED");
     
     
      delay (1000);// temporisation avant nouvelle mesure de température en mS
      Serial.println("Fin de loop");  
    } // Fin de programme
     
     
    // Sentence NMEA0183
    String retourneNmea(Capteur capteur)
    {
      // Construction de la trame NMEA à partir de laquelle on calculera le CRC
      String donnees = "WIXDR,P,";
      donnees += String (capteur.pression,1);
      donnees += ",mB,barometer,C,";
      donnees += String (capteur.temperature,2);
      donnees += ",C,temperature,H,";
      donnees += String (capteur.humidite,0);
      donnees += ",%,humidite";
     
      // Calcul du CRC
      int crc8Res = crc8Xor(donnees); // CRC en decimal
      String crc8Hex = String(crc8Res, HEX); // Conversion en hexa
     
      // Construction finale de la trame NMEA
      String nmea = "$" + donnees + "*" + crc8Hex;
      Serial.println("Fin de boucle Sentence NMEA");   
      return nmea;
    }
     
     
    // Calcul CRC8
    int crc8Xor(const String s) {
      int i;
      int _xor;
      int c;
     
      for (_xor = 0, i = 0; i < s.length(); i++) {
        c = (unsigned char)s.charAt(i);
        if (c == '*') break;
        if ((c!='$') && (c!='!')) _xor ^= c;
      }
     
      Serial.print(_xor);
     
      Serial.println("Fin de boucle calcul CRC");
     
      return _xor; 
    } 
     
    /*
    void afficheurLCD(Capteur capteur)
    {
      lcd.clear(); // Efface l'écran
      lcd.setCursor(0, 0); //Position du curseur colonne 0 et ligne 0 (la première ligne)
      lcd.print ("Station meteo");
      lcd.setCursor(0, 1);
      lcd.print ("Humidite : ");
      lcd.print (String(capteur.humidite, 0));
      lcd.print ("%");
      lcd.setCursor(0, 2);
      lcd.print ("Temp.: ");
      lcd.print(String (capteur.temperature,2));
      lcd.print ("*C");
      lcd.setCursor(0, 3);
      lcd.print ("Pres.: ");
      lcd.print (String(capteur.pression, 1));
      lcd.print ("hPa");
      Serial.println("Fin de boucle LCD");  
    }
    */
     
    void afficheurOLED(Capteur capteur) // Déclaration de la fonction
    {
      display.clearDisplay(); //Efface l'écran et le tampon
      display.setTextSize(2); // Taille du texte
      display.setTextColor(WHITE); // Couleur du texte
      display.setCursor(0, 1); // Position origine du texte T
      display.print("T: "); // Ligne pour la température eau de mer
      display.setCursor(39, 1); // Position origine valeur température
     // display.print(readTemperatureMeasure(SENSOR_ADDRESS_1)); // Affiche la température
      display.drawCircle(107, 4, 4, WHITE); // Dessine le symbole degré
      display.drawCircle(107, 4, 3, WHITE); // Epaissi le symbole degré
      display.setCursor(115, 1); // Position origine de l'unité
      display.print("C"); // Affiche C pour l'unité
     
      display.setCursor(0, 16); // Position origine du texte T
      display.print("T: "); // Ligne pour la température air exterieur
      display.setCursor(39, 16); // Position origine valeur température
      display.print(capteur.temperature,2); // Affiche la température
      display.drawCircle(107, 20, 4, WHITE); // Dessine le symbole degré
      display.drawCircle(107, 20, 3, WHITE); // Epaissi le symbole degré
      display.setCursor(115, 16); // Position origine de l'unité
      display.print("C"); // Affiche C pour l'unité
     
      display.setCursor(0, 33); // Position origine du texte H
      display.print("H: "); // Ligne pour l'humidité
      display.setCursor(39, 33); // Position origine valeur Humidité
      display.print(capteur.humidite, 0); // Affiche l'humidité
      display.setCursor(107, 33); // Position origine der l'unité
      display.print("%"); // Affiche % pour l'unité
     
      display.setCursor(0, 51); // Position origine du texte P
      display.print("P: "); // Ligne pour la pression
      display.setCursor(28, 51); // Position origine valeur pression
      display.print(capteur.pression, 1); // Affiche la pression
      display.setTextSize(1); // Taille du texte
      display.setCursor(108, 55); // Position origine der l'unité
      display.print("hPa"); // Affiche Pa  pour l'unité
     
      display.display(); 
    } // Fin de la fonction affichage OLED
    et voici la capture d'écran de la sortie série :

    Nom : Capture ecran sortie serie.JPG
Affichages : 550
Taille : 45,9 Ko

    et la je viens de m'apercevoir que je ne vois pas ma sentence NMEA, encore un blème

  19. #19
    Modérateur

    Avatar de Vincent PETIT
    Homme Profil pro
    Consultant en Systèmes Embarqués
    Inscrit en
    Avril 2002
    Messages
    3 190
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Consultant en Systèmes Embarqués
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Avril 2002
    Messages : 3 190
    Points : 11 573
    Points
    11 573
    Par défaut
    D'accord, je vois.
    C'est inutile d'aller plus loin dans la recherche du problème, tu es allé bien trop loin dans le programme.

    Pour debugguer ça correctement, je voudrai que tu fasses :

    - Un programme de test le plus court possible. Pas de fonctions, pas de variables, juste le strict nécessaire (import de la bibliothèque, initiation des I/O, envoi d'un seul mot sur un seul afficheur.)

    - Idem pour l'autre afficheur

    - Un programme avec les deux afficheurs (il doit faire que quelques lignes)

    Et seulement si ça fonctionne, on avance. Quand je regarde tes captures d'écran j'ai l'impression de voir un débordements de variable (possible erreur avec la manipulation de l'objet String et le caractère \0 durant des concaténations mais on en est pas là)
    La science ne nous apprend rien : c'est l'expérience qui nous apprend quelque chose.
    Richard Feynman

  20. #20
    Nouveau membre du Club
    Homme Profil pro
    Retraite
    Inscrit en
    Janvier 2019
    Messages
    81
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 69
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Activité : Retraite

    Informations forums :
    Inscription : Janvier 2019
    Messages : 81
    Points : 31
    Points
    31
    Par défaut
    Bon c'est parti pour les choses sérieuses

    le code pour l'afficheur LCD, juste un hello world avec un compteur pour vérifier à l'écran que le code tourne.

    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
    #include <LiquidCrystal.h>
     
    const int rs = 12, en = 11, d4 = 5, d5 = 4, d6 = 3, d7 = 2;
    LiquidCrystal lcd(rs, en, d4, d5, d6, d7);
     
    void setup() {
      lcd.begin(16, 2);
      lcd.print("hello, world!");
    }
     
    void loop() {
     
      lcd.setCursor(0, 1);
      lcd.print(millis() / 1000);
    }
    Voici le code pour l'OLED, même topo :

    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
    #include <SPI.h>
    #include <Wire.h>
    #include <Adafruit_GFX.h>
    #include <Adafruit_SSD1306.h>
     
    // Afficheur OLED
    #define SCREEN_WIDTH 128 // Ecran OLED 128 pixels de long
    #define SCREEN_HEIGHT 64 // Ecran OLED 64 pixels de haut
    #define OLED_RESET     4 // Reset pin # (or -1 if sharing Arduino reset pin)
    Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
     
     
     
    void setup()
    {
      Serial.begin(9600);
     
      display.begin(SSD1306_SWITCHCAPVCC, 0x3C);  
      display.clearDisplay();
     
     
    }
     
     
    void loop()
    {
     display.display();
      display.clearDisplay(); 
      display.setTextSize(1); 
      display.setTextColor(WHITE);
      display.setCursor(0, 1);
      display.print("Hello world");
     
     display.setCursor(0, 40);
      display.print(millis() / 1000);
    }
    et la compilation des deux codes ... et ça tourne

    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
    #include <SPI.h>
    #include <Wire.h>
    #include <Adafruit_GFX.h>
    #include <Adafruit_SSD1306.h>
    #include <LiquidCrystal.h>
     
    // Afficheur OLED
    #define SCREEN_WIDTH 128
    #define SCREEN_HEIGHT 64
    #define OLED_RESET     4
    Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
     
    // Afficheur LCD
    const int rs = 12, en = 11, d4 = 5, d5 = 4, d6 = 3, d7 = 2;
    LiquidCrystal lcd(rs, en, d4, d5, d6, d7);
     
    void setup()
    {
      Serial.begin(9600);
     
      display.begin(SSD1306_SWITCHCAPVCC, 0x3C); 
      display.clearDisplay();
     
      lcd.begin(16, 2);
      lcd.print("hello, world!");
     
     
    }
     
     
    void loop()
    {
      display.display();
      display.clearDisplay();
      display.setTextSize(1);
      display.setTextColor(WHITE);
      display.setCursor(0, 1);
      display.print("Hello world");
      display.setCursor(0, 40);
      display.print(millis() / 1000);
     
      lcd.setCursor(0, 1);
      lcd.print(millis() / 1000);
    }
    Amicalement, Fernand

Discussions similaires

  1. [PIC 16F628A] Afficheur (lcd 2x16) n'affiche rien
    Par epc dans le forum Autres architectures
    Réponses: 2
    Dernier message: 03/07/2009, 09h37
  2. menu sur afficheur LCD
    Par nikita_sophie dans le forum Débuter
    Réponses: 5
    Dernier message: 20/08/2008, 09h59
  3. Réponses: 1
    Dernier message: 12/06/2008, 11h43
  4. [68HC11] Gestion d'un afficheur LCD
    Par Loup solitaire dans le forum Autres architectures
    Réponses: 2
    Dernier message: 06/05/2007, 15h28
  5. communication avec un afficheur lcd et analogique
    Par tapha dans le forum Delphi
    Réponses: 8
    Dernier message: 19/12/2006, 18h53

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