Multiples ST7735 tft duplica datos en lolin32 esp32

Hola a todos.
Quisiera comentar una situación que se me presenta.

quiero conectar hasta 4 TFT 1.8" SPI a mi ESP32,
comparto los pines, SLK,MOSI,DC, RST (los tengo conectados al rst del ESP32)
y he indicado pines independientes de chip select CS para cada una de las pantallas.

estoy usando la librería ST7735.h

el inconveniente es que.
al enviar información a la que tengo configurada como pantalla 1 "tft" con pin cs 26, la pantalla 2 "tft2" con pin cs 35 duplica la información,

y al enviar información a la pantalla 2 "tft2" lo hace únicamente en ella (o sea, funciona bien)

Preformatted text`
type or paste code here

#include <Fonts/FreeSerif9pt7b.h>
#include <Fonts/FreeMono9pt7b.h>
#include "SPI.h"
#include "BluetoothSerial.h"

BluetoothSerial SerialBT;

#define tft_SCLK 12   // set these to be whatever pins you like!
#define tft_MOSI 14   // SDA set these to be whatever pins you like!
#define tft_DC   27   // A0
#define tft_RST  -1  // you can also connect this to the Arduino reset
#define tft_CS   26  // CS
#define tft2_CS   35  // CS2
//#define tft3_CS   34  // CS3
//#define tft4_CS   33  // CS4

Adafruit_ST7735 tft = Adafruit_ST7735(tft_CS, tft_DC, tft_MOSI, tft_SCLK, tft_RST);
Adafruit_ST7735 tft2 = Adafruit_ST7735(tft2_CS, tft_DC, tft_MOSI, tft_SCLK, tft_RST);
//Adafruit_ST7735 tft3 = Adafruit_ST7735(tft3_CS, tft_DC, tft_MOSI, tft_SCLK, tft_RST);

int prueba=0;
int silencio=0;
int sensor1 = 0;

#define LED_PIN 5
 

void setup()  // SET UP SET UP SET UP SET UP SET UP SET UP SET UP SET UP SET UP
{
  SPI.begin();
  pinMode(LED_PIN, OUTPUT);
  pinMode (13,OUTPUT); //backligth1
  pinMode (4,OUTPUT); //backligth2
  digitalWrite (13, HIGH);
  digitalWrite (4, HIGH);

    tft.initR(INITR_BLACKTAB);
    tft2.initR(INITR_BLACKTAB);
    tft.setRotation (2);
    tft2.setRotation (2);
    
  //tft3.initR(INITR_BLACKTAB);
  //tft4.initR(INITR_BLACKTAB);// initialize a ST7735S chip, black tab

 }

void loop() //LOOP LOOP LOOP LOOP LOOP LOOP LOOP LOOP LOOP LOOP LOOP LOOP LOOP LOOP LOOP LOOP 
{
  digitalWrite (LED_PIN, HIGH);
  Serial.print("LED  PRENDE .....");
  Serial.println("EN LOOP");
  delay (900);
  digitalWrite (LED_PIN,LOW);
  delay (900);
  
  
  tft.setFont(&FreeSerif9pt7b);; //PANTALLA 1
  tft.fillScreen(ST77XX_GREEN);
  tft.setTextColor(ST77XX_BLACK);
  tft.fillRoundRect(0,35, 160,10, 5, ST77XX_WHITE); //LINEA GUIA
  tft.setTextSize(1);
  tft.setCursor(5,15);
  tft.println("OXIGENO");
  tft.setFont();
    
  tft2.setFont(&FreeSerif9pt7b);; //PANTALLA 2
  tft2.fillScreen(ST77XX_YELLOW);
  tft2.setTextColor(ST77XX_BLACK);
  tft2.fillRoundRect(0,35, 160,2, 0, ST77XX_WHITE); //LINEA GUIA
  tft2.setTextSize(1);
  tft2.setCursor(5,15);
  tft2.println("AIRE");
  tft2.setFont();

  Serial.println("FIN DE LOOP");
  
} // CIERRO LOOP

Agradezco su guía porque, no se me ocurre, qué esté sucediendo.

Gracias.

ALL_IN_ONE_ON_OFF.ino (2.4 KB)

Debería verificar que los CS realmente se ponen en HIGH cuando no estan activos (LOW). Eso para comenzar como tarea 1.
Solo para probar agrega extras

digitalWrite(tft_CS, HIGH); //con lo que deshabiiltas 1
digitalWrite(tft_CS2, HIGH); //con lo que deshabiiltas 2

previo al accionamiento del otro TFT

Traduzco

  digitalWrite(tft_CS2, HIGH); //con lo que deshabiiltas 2
  tft.setFont(&FreeSerif9pt7b);; //PANTALLA 1
  tft.fillScreen(ST77XX_GREEN);
  tft.setTextColor(ST77XX_BLACK);
  tft.fillRoundRect(0,35, 160,10, 5, ST77XX_WHITE); //LINEA GUIA
  tft.setTextSize(1);
  tft.setCursor(5,15);
  tft.println("OXIGENO");
  tft.setFont();
  digitalWrite(tft_CS, HIGH); //con lo que deshabiiltas 1  
  tft2.setFont(&FreeSerif9pt7b);; //PANTALLA 2
  tft2.fillScreen(ST77XX_YELLOW);
  tft2.setTextColor(ST77XX_BLACK);
  tft2.fillRoundRect(0,35, 160,2, 0, ST77XX_WHITE); //LINEA GUIA
  tft2.setTextSize(1);
  tft2.setCursor(5,15);
  tft2.println("AIRE");
  tft2.setFont();

Seguramente no funcione pero es una prueba.

Hola Surbyte.
Gracias por la observación,
efectivamente el CS de la pantalla dos, de mantenía en LOW, y pues por eso duplicaba la info.

Seguí tu consejo; Cambiar "manualmente" cada CS a LOW o HIGH según corresponda y funciona ahora perfectamente...

Surbyte, gracias nuevamente, tus instrucciones siempre me has sido útiles.

Sorprendente, no me lo hubiera imaginado pero no había nada que perder.
Algo va mal con la forma en que se accede a uno y otro.
Habia pensado en esto, te voy a cambiar el código de manera que funcione como un arreglo de objetos y no como dos objetos. Al final es lo mismo pero digamos que tal vez lo maneje mejor.
Veamos. Solo prueba a ver, si sirve la solución para 4 es fácil de cambiar o ampliar.
Hay un error importante que tal vez se deba a que compiaste mal, asi que lo dejo como que eso pasó.
Prueba esto.

#include <Adafruit_GFX.h>    // Core graphics library
#include <Adafruit_ST7735.h> // Hardware-specific library for ST7735
#include <SPI.h>
#include <Fonts/FreeSerif9pt7b.h>
#include <Fonts/FreeMono9pt7b.h>
//#include "BluetoothSerial.h"

//BluetoothSerial SerialBT;

#define tft_SCLK 12   // set these to be whatever pins you like!
#define tft_MOSI 14   // SDA set these to be whatever pins you like!
#define tft_DC   27   // A0
#define tft_RST  -1  // you can also connect this to the Arduino reset

byte tft_cs[2] = {26, 35};
//byte tft_cs[4] = {26, 35, 34, 33};

Adafruit_ST7735 tft[2] = {{Adafruit_ST7735(tft_cs[0], tft_DC, tft_MOSI, tft_SCLK, tft_RST)},
                          {Adafruit_ST7735(tft_cs[1], tft_DC, tft_MOSI, tft_SCLK, tft_RST)}};

int prueba=0;
int silencio=0;
int sensor1 = 0;

#define LED_PIN 5
 

void setup()  // SET UP SET UP SET UP SET UP SET UP SET UP SET UP SET UP SET UP
{
  SPI.begin();
  pinMode(LED_PIN, OUTPUT);
  pinMode (13,OUTPUT); //backligth1
  pinMode (4,OUTPUT); //backligth2
  digitalWrite (13, HIGH);
  digitalWrite (4, HIGH);

    tft[0].initR(INITR_BLACKTAB);
    tft[1].initR(INITR_BLACKTAB);
    tft[0].setRotation (2);
    tft[1].setRotation (2);
    
 }

void loop()
{
  digitalWrite (LED_PIN, HIGH);
  Serial.print("LED  PRENDE .....");
  Serial.println("EN LOOP");
  delay (900);
  digitalWrite (LED_PIN,LOW);
  delay (900);
  
  
  tft[0].setFont(&FreeSerif9pt7b);; //PANTALLA 1
  tft[0].fillScreen(ST77XX_GREEN);
  tft[0].setTextColor(ST77XX_BLACK);
  tft[0].fillRoundRect(0,35, 160,10, 5, ST77XX_WHITE); //LINEA GUIA
  tft[0].setTextSize(1);
  tft[0].setCursor(5,15);
  tft[0].println("OXIGENO");
  tft[0].setFont();
    
  tft[1].setFont(&FreeSerif9pt7b);; //PANTALLA 2
  tft[1].fillScreen(ST77XX_YELLOW);
  tft[1].setTextColor(ST77XX_BLACK);
  tft[1].fillRoundRect(0,35, 160,2, 0, ST77XX_WHITE); //LINEA GUIA
  tft[1].setTextSize(1);
  tft[1].setCursor(5,15);
  tft[1].println("AIRE");
  tft[1].setFont();

  Serial.println("FIN DE LOOP");
  
} // CIERRO LOOP

Si no funciona hay que poner el control de CS al final de cada pantalla.

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