Initialisation ecran OLED

Bonjour à tous.

Je suis en train de fabriquer un système de télémétrie pour mon bateau RC (électrique). Objectif, pendant les courses, surveiller la tension de la batterie (6S, 22,2V).

Pour cela j'utilise deux modules LORA, des TTGO Lora 1.3.

Je ne suis pas un expert dans laprogrammation de ces modules. Incapable de coder depuis une page blanche, je récupère des exemples et je les assemble. la est peut être la source de mon problème.

Mon code ci dessous est fonctionnel mais dès que j'ajoute l'initialisation de l'écran, le retour de mesure de la tension, réalisé par un module INA226 affiche n'importe quoi. Pour mes tests, j'ai branché le pin qui doit aller à la batterie sur le 3.3V qui du INA226. Sans initialiser l'ecran, ma mesure renvois 3.3, dès que j'initialise l'écran, elle renvois 80.92 ou quelque chose du genre.

Voici mon code :

//
//    FILE: INA226_demo.ino
//  AUTHOR: Rob Tillaart
// PURPOSE: demo
//    DATE: 2021-05-18
//     URL: https://github.com/RobTillaart/INA226


//Librairies pour INA226
#include "INA226.h"
#include "Wire.h"

//Librairies pour LORA
#include "LoRa.h"
#include "SPI.h"

//Librairies pour écran OLED
#include "Adafruit_GFX.h"
#include "Adafruit_SSD1306.h"

//Configuration LORA
const int csPin = 18;
const int resetPin = 23;
const int irqPin = 26;

//Configuration INA226
INA226 INA(0x40);


void setup()
{
  Serial.begin(115200);
  //Serial.println(__FILE__);

  //Init LORA
  SPI.begin();
    LoRa.setPins(csPin, resetPin, irqPin);
  
    if (!LoRa.begin(866E6)) 
    {
      Serial.println("Erreur lors de l'initialisation du module LoRa");
      while (1);
    }
  
    LoRa.setSpreadingFactor(7);
  
    Wire.begin();
    if (!INA.begin() )
    {
      Serial.println("could not connect. Fix and Reboot");
    }
    //INA.setMaxCurrentShunt(1, 0.002);
  
  }


void loop()
{

  float voltage = INA.getBusVoltage();
  
  //Serial.println("\nBUS\tSHUNT\tCURRENT\tPOWER");
  Serial.println(voltage,3);
  
  // Envoi des données via LoRa
  String data = String(voltage);
  LoRa.beginPacket();
  LoRa.print(data);
  LoRa.endPacket();

  delay(1000);
}

Quelqu'un saurait me dire si :

  • Il est possible de faire fonctionner l'ecran en plus du module LORA et du INA226 ?
  • Si oui, comment initialiser l'écran !?

En vous remerciant pour votre aide,

JC

Pour initialiser l'ecran j'ajoute au début du code :

//OLED pins
#define OLED_SDA 21
#define OLED_SCL 22 
#define OLED_RST 16
#define SCREEN_WIDTH 128 // OLED display width, in pixels
#define SCREEN_HEIGHT 64 // OLED display height, in pixels
#define ADC_EN 14         //ADC_EN is the ADC detection enable port

Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RST);

Dans la boucle setup :

  //initialize OLED
  Wire.begin(OLED_SDA, OLED_SCL);
  if(!display.begin(SSD1306_SWITCHCAPVCC, 0x3c, false, false)) { // Address 0x3C for 128x32
    Serial.println(F("SSD1306 allocation failed"));
    for(;;); // Don't proceed, loop forever
  }

  display.clearDisplay();
  display.setTextColor(WHITE);
  display.setTextSize(1);
  display.setCursor(0,0);
  display.print("LORA RECEIVER ");
  display.display();

puis dans la boucle loop j'affiche ma donnée mais je n'arrive pas jusque la, la partie dans le setup() me fait planter la lecture de tension ...

Bonjour

Oui

cette page du site Random Nerd Tutorials explique comment initialiser et utiliser l'ecran OLED d'une carte TTGO LoRa (en espérant qu'il s'agisse de la même version de la carte...)

on y trouve donc traités LoRa + OLED , reste a ajouter INA226

Pour mes tests, j'ai branché le pin qui doit aller à la batterie sur le 3.3V qui du INA226

Un petit schéma (même à main levée) ne serait pas de trop pour montrer le câblage du module INA226 utilisé ici en 'voltmetre I2C. (36V maxi)

Il faut distinguer aimentation de l'INA226 (3,3V) et entrée de mesure de tension batterie 6S 22V

L'INA226 et l'écran OLED utilisent tous les deux l'interface I2C. Ils devraient donc être connectés sur les mêmes broches. Est-ce bien le cas?
Si ce n'est pas le cas, en faisant

//initialize OLED
Wire.begin(OLED_SDA, OLED_SCL);

Tu dois déconnecter l'INA226 de son bus.

Pour info les GPIO de la carte TTGO LoRa OLED V1.3

Merci à tous pour vos retours.

Le montage dont je parle ici est celui qui va dans le bateau. J'ai besoin de l'écran pour controler au moment du ravitaillement que la télémétrie fonctionne en vérifiant que le TTGO affiche bien la tension du pack que je viens de monter.

Au stand se trouve le même module sur lequel je n'utilise que le module LORA et l'écran. Le code est relativement identique et l'ecran fonctionne bien avec le même code que celui que je met dans la partie eméteur.

Voici le schéma de mon montage :

Le lien en rouge sur l'INA226 qui relie VBS à VCC est temporaire bien sur, il est la pour me donner quelque chose à mesurer pendant les tests.
Il sera remplacé plus tard par un lien vers la batterie du bateau.

bonjour.
le module ttgo est semblable au heltec v2 ou j'avais essayer de mettre en lcd en plus de l’écran oled qui lui est sur les broche 4 et 15..

essaie en modifiant ```
#define OLED_SDA 21 --> met 4 à la place de 21
#define OLED_SCL 22 --> met 15 à la place 22

Laisse le INA sur 21 22 si ça ne marche pas met les aussi sur les broche 4 et 15.

edit: je vois ça aussi qui semble ne pas aller selon moi
#define ADC_EN 14
selon les info des GPIO que al1fch a mis, la broche 14 est le reset de lora
tu es sur que lora fonctionne aussi ?

pour info ma config pour lora semble correspondre aussi avec ta carte
`//- Définition de pin pour le module LoRa V2 -//
#define SCK 5
#define MISO 19
#define MOSI 27
#define SS 18
#define RST 14
#define DIO0 26
``

TTGO ballade souvent les fonctions sur les GPIO d'une version de carte à l'autre :roll_eyes:

je viens de voir le code j'utilisais sur deux TTGO LoRa OLED V2

SDA est en 4
SCL est en 15
RST est en 16, avec un code pour resetter explicitement l'afficheur OLED avant utilisation

Encore merci pour votre aide.
En prenant en compte vos commentaires qui semblent tous se croiser, j'ai modifié le code et le montage pour passer le INA sur le même bus que le OLED. Mon code initial semblait effectivement foireux car le schema de brochage du module donne bien SDAet SCL de l'oled en 4 et 15, et pas en 21 et 22 comme je le parametrais. J'ai plusieurs modèles de cartes, ca explique surement l'erreur. j'ai pas repris le bon code.

Voici donc mon nouveau schéma :

voici mon code complet actuel ou je vais jusque l'affichage sur l'écran.

//
//    FILE: INA226_demo.ino
//  AUTHOR: Rob Tillaart
// PURPOSE: demo
//    DATE: 2021-05-18
//     URL: https://github.com/RobTillaart/INA226


//Librairies pour INA226
#include "INA226.h"
#include "Wire.h"

//Librairies pour LORA
#include "LoRa.h"
#include "SPI.h"

//Librairies pour écran OLED
#include "Adafruit_GFX.h"
#include "Adafruit_SSD1306.h"

//Configuration LORA
const int csPin = 18;
const int resetPin = 23;
const int irqPin = 26;

//Configuration INA226
INA226 INA(0x40);

//Configuration OLED
#define OLED_SDA 4
#define OLED_SCL 15 
#define OLED_RST 16
#define SCREEN_WIDTH 128 // OLED display width, in pixels
#define SCREEN_HEIGHT 64 // OLED display height, in pixels

Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RST);


void setup()
{
  Serial.begin(115200);
  //Serial.println(__FILE__);

  //Init LORA
  SPI.begin();
    LoRa.setPins(csPin, resetPin, irqPin);
  
    if (!LoRa.begin(866E6)) 
    {
      Serial.println("Erreur lors de l'initialisation du module LoRa");
      while (1);
    }
  
    LoRa.setSpreadingFactor(7);
  
    Wire.begin();
    if (!INA.begin() )
    {
      Serial.println("could not connect. Fix and Reboot");
    }
    //INA.setMaxCurrentShunt(1, 0.002);

    //initialize OLED
    Wire.begin(OLED_SDA, OLED_SCL);
    if(!display.begin(SSD1306_SWITCHCAPVCC, 0x3c, false, false)) 
    { 
      // Address 0x3C for 128x32
      Serial.println(F("SSD1306 allocation failed"));
      for(;;); // Don't proceed, loop forever
    }

    display.clearDisplay();
    display.setTextColor(WHITE);
    display.setTextSize(1);
    display.setCursor(0,0);
    display.print("LORA RECEIVER ");
    display.display();
  
  }


void loop()
{

  float voltage = INA.getBusVoltage();
  
  //Serial.println("\nBUS\tSHUNT\tCURRENT\tPOWER");
  Serial.println(voltage,3);
  
  // Envoi des données via LoRa
  String data = String(voltage);
  LoRa.beginPacket();
  LoRa.print(data);
  LoRa.endPacket();

  delay(1000);
}

La mesure de tension fonctionne bien. mais rien coté OLED.
Pour la ligne de code #define ADC_EN 14 je l'ai supprimée, c'est je crois un reste d'un ancien montage ou j'utilisait un pont de résistances pour mesurer la tension de la batterie.
La partie LORA fonctionne bien, mon récepteur est branché et je vois bien les valeurs s'afficher.
Le #define ADC_EN 14 est "juste" une déclaration mais n'etais pas utilisé plus loin dans le code, ca devait pas poser de problème je pense.

Tu dit "rien coté OLED"
Mais est ce qu'à l'allumage il s'affiche LORA RECEIVER
puis rien après ou tu n'a rien de rien dès la mise sous tension ?

L'écran OLED reste completement vide. Eteint. :frowning:

essaies en resettant physiquement l'afficheur OLED par GPIO 16 avant de chercher à l'initialiser

pinMode(16, OUTPUT);
digitalWrite(16, LOW);    // set GPIO16 low to reset OLED
delay(50);
digitalWrite(16, HIGH); // while OLED is running, must set GPIO16 in high
1 Like

tu as essayer les exemples pour faire fonctionner l'Oled tout seul ?

+1 pour valider séparément OLED, INA226 et LoRa avant de chercher à les combiner

@al1fch C'est tout bon, après avoir ajouté tes 4 lignes, le OLED fonctionne et la mesure reste fonctionelle aussi !!!

C'est top, un grand merci à tous pour votre aide !!!

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.