Besoin d'avis pour architecture affichage (écran multiple, tactile, ou pas)

Bonjour à tous,

j'ai un projet de banc de test dans lequel j'ai des touches qui ont des fonctions diverses selon les phases de fonctionnement.

ma première version (qui marche) comporte donc mon clavier, et plein de légendes en dessous. Chaque ligne de légende correspondant à un mode de fonctionnement.

Voulant faire un upgrade, j'ai envisagé plusieurs solutions, dont deux qui me semblent pertinentes :

  • placer un petit écran OLED 0,96" sous chaque touche, et écrire la fonction de la touche en texte.
    l'inconvénient est que j'ai besoin d'un dizaine d'écran, et donc autant de port I2C vu qu'on ne peut pas paramétrer leurs adresses.

  • placer un gros écran LCD tactile, et faire mes touches en bouton sur l'écran.
    l'inconvénient est que j'ai besoin d'un écran de 4 ou 5 pouces, et qui ne consomme pas trop de ressource.

Est-ce que quelqu'un ici a déjà été confronté à ce genre de problème ? est-ce qu'il existe des écran graphique texte tactile simple à piloter ?

Pour ça, il y a le TCA9548, tu peux en mettre 8 comme ceci.


Ca te fait autant de bus i2C.

Il y a le smartphone ou la tablette et développer (je n'ai de l'expérience qu'en Android) avec MIT App Inventor
image

C'est comme du LEGO.

A+
Cordialement
jpbbricole

Hello,

merci pour votre réponse. Je vais regarder le TCA9548, effectivement je ne connaissais pas ce composant.
Je vais reflechir à comment ça s'utilise logiciellement car avec ce composant ; au demeurant très pratique ; je devrai envoyer 2 adresses avant d’accéder à mon périphérique
(première fois pour basculer sur le bon canal, seconde fois pour causer avec le périphérique). J’avoue que je n'ai jamais fait ça !

Bonjour alex_vrc

Oui, il faut voir ce TCA9548 comme un simple aiguillage.
Je te donne un exemple pour 2 écrans de ce type:


Ce programme est une version "économie de mémoire", il n'y a qu'une instance de l'écran OLED, ce qui oblige à réécrire l'entier de l'écran à chaque accès, c'est fait dans void oledDisplayFull(int oledIndex, boolean withCls) mais si ce n'est que du text, ça n'a pas beaucoup d'impact.
L'aiguillage du canal se fait dans void tcaselect(uint8_t i)
Il existe une bibliothèque pour gérer le TCA9548:

Son auteur, Rob Tillaart est une référence dans le domaine :wink:

Le programme:

#include <Wire.h>
#include "SSD1306Ascii.h"
#include "SSD1306AsciiAvrI2c.h"

//======================================= Affichage OLED i2C
#define oledI2cAddress 0x3C                                          // Adresse de l'affichage OLED
SSD1306AsciiAvrI2c oledI2c;
#define displCls true
String displTextLine1 = "", displTextLine2 = "", displTextLine3 = "", displTextLine4 = "";

//===================================== TCA9548
#define tcaAddress 0x70
enum muxUsersIndex {muxOLEDa, muxOLEDb, muxUsersNumber};

void setup()
{
	Wire.begin();
	Serial.begin(115200);             // Define baud rate
	
	oledInitialisation(muxOLEDa);
	displTextLine1 = "TCA9548 A";
	displTextLine2 = "";
	displTextLine3 = "";
	displTextLine4 = "";
	oledDisplayFull(muxOLEDa, !displCls);
	
	oledInitialisation(muxOLEDb);
	displTextLine1 = "TCA9548 B";
	displTextLine2 = "";
	displTextLine3 = "";
	displTextLine4 = "";
	oledDisplayFull(muxOLEDb, !displCls);
	delay(1500);
}

void loop()
{
	//displTextLine4 = String(mpu6050ReadAnglesValues(gyAnglelValueRoll)) + " " + String(mpu6050ReadAnglesValues(gyAnglelValuePitch));
	//oledDisplayFull(muxOLEDb, !displCls);

	delay(1000);
	displTextLine3 = String(millis());
	displTextLine4 = "";
	oledDisplayFull(muxOLEDb, !displCls);
	displTextLine3 = "";
	displTextLine4 = String(100000-millis());
	oledDisplayFull(muxOLEDa, !displCls);
}

void tcaselect(uint8_t i)
{
	if (i > 7) return;
	Wire.beginTransmission(tcaAddress);
	Wire.write(1 << i);
	Wire.endTransmission();
	delay(100);
}

//===================================== OLED display

void oledInitialisation(int oledIndex)
{
	tcaselect(oledIndex);
	oledI2c.begin(&Adafruit128x64, oledI2cAddress);
	oledI2c.setFont(Adafruit5x7);
	oledI2c.clear();
}
//------------------------------------- Affichage des 4 lignes
void oledDisplayFull(int oledIndex, boolean withCls)
{
	tcaselect(oledIndex);
	if (withCls) {oledI2c.clear();}

	oledDisplayColRow(0, 0, displTextLine1);
	oledDisplayColRow(0, 1, displTextLine2);
	oledDisplayColRow(0, 2, displTextLine3);
	oledDisplayColRow(0, 3, displTextLine4);
}

void oledDisplayColRow(int colIndex, int rowIndex, String lineText)
{
	oledI2c.set2X();
	oledI2c.setCursor(colIndex, 2*rowIndex);
	oledI2c.print(lineText);
	oledI2c.clearToEOL();
}

String zeroPadding(int padValue, byte padSize)
{
	String retVal = "000000" + String(padValue);
	retVal = retVal.substring(retVal.length()-padSize);
	
	return retVal;
}

J'ai écrit ce programme, il y a quelques années, il pourrait être optimisé :wink:

A+
Cordialement
jpbbricole

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