Salve a tutti,
Sto cercando di far funzionare uno schermo LCD TFT ILI9341 da 2.8 pollici e un modulo SD su Esp32 Devkit o Arduino Mega.
Ho collegato lo schermo sui PIN 27,26,4,18,23 per quanto riguarda CS, DC RST,SCK,MOSI invece il
Modulo Sd sia uno esterno che quello presente nello schermo, sui pin 5,15,19,4 rispettivamente per CS,MOSI,MISO,SCK, alimentazione 3.3v.
Non riesco a capire perché entrambi non funzionano se invece li faccio funzionare separatamente quindi o il modulo SD o lo schermo funzionano correttamente. Siccome sto facendo un progetto didattico, c’è il modo per farli funzionare entrambi in contemporanea?
Grazie mille
- metti un link al display che hai comprato. Dire tft ili9341 dice poco.
- ma i numeri che indichi sono per esp32 o mega ??
- lo spi hardware ha 3 pin fissi (su Mega), MISO, MOSI, SCK e sono 50, 51, 52 rispettivamente.
Per il CS devi usare un pin diverso (un pin qualsiasi) per i due dispositivi. In pratica i 3 MISO/MOSI/SCK sono in comune a tutte le periferiche SPI, il singolo CS viene attivato (dovrebbe) dalla libreria relativa al dispositivo tft o sd (si spera che la lib sia fatta bene)
Esp32, sezione " ESP32 Default SPI Pins":
"ESP32 SPI Communication: Pins, Multiple SPI, Peripherals (Arduino) | Random Nerd Tutorials"
Ciao ti ringrazio per la risposta.
Hai ragione, quei pin usati sono riferiti all’esp32 ma era per dire che ho provato anche su scheda arduino e ho lo stesso problema,
cioè che funziona o lo schermo LCD o il modulo SD e il problema si verifica sia con SD su LCD che su modulo esterno, insieme non riesco a farli andare, perché lo schermo funziona ma mi da errore su lettura della SD come se non fosse inserita, se faccio andare uno sketch solo per SD invece tutto ok.
Lo schermo lcd è questo: https://www.amazon.it/dp/B0CQ7VQB3P/ref=cm_sw_r_cp_apip_3LRa6gaFkxr5X
Considera che ho anche collegato un sensore BMP280 e un sensore DHT22 che al momento funzionano correttamente, il problema me lo ritrovo solo con il modulo SD che mi dovrebbe salvare un file log con i dati dei sensori.
Come librerie uso per TFT la libreria adafruit ili9341e adafruit gfx, mentre per SD le classiche SD.h ed SPI.h
Grazie
Si, ma la domanda è .. perché usi pin differenti per il TFT e per la SD?
e
Guglielmo
Tutti i progetti che ho visto online di esempio prevedono pin diversi e non gli stessi per questo ho seguito questa logica, in ogni caso essendo al momento un progetto di sviluppo come faccio a collegare gli stessi pin? Esistono dei cavetti che dà un pin si sdoppiano in due?
Pensi possa essere questo il problema?
Grazie
SPI è un bus e gli oggetti su tale bus hanno alcuni pin in comune (MISO, MOSI, SCK) e un pin ciascuno diverso per identificare il device (pin SS o CS) ...
... direi che puoi cominciare studiando QUI, poi QUI ed anche QUI.
Normalmente, la libreria SPI di Arduino, salvo, ove possibile, istanziarla più volte con parametri diversi, fissa i pin MISO, MOSI ed SCK ... il costruttore delle varie librerie legate ai vari oggetti, si aspetta, normalmente, invece il pin SS/CS da utilizzare per abilitare/disabilitare il singolo device (UN SOLO device per volta può essere attivo su un bus SPI).
Le librerie che gestiscono i vari oggetti su bus SPI, provvedono, normalmente, a mettere HIGH tale pin quando il device non è in uso e LOW quando è in uso.
È buona cosa, nel setup, quando si definiscono i vari pin di SS/CS come pin di OUTPUT, metterli anche HIGH così da avere, inizialmente, tutti i devices SPI NON selezionati.
Spero ti sia un po' più chiaro come si lavora su bus SPI ...
Guglielmo
Posta un link da cui hai preso spunto. Poi è naturale che non funziona, usi il pin 4 come SCK e come RST o l'uno o l'altro non tutte e due le funzioni. In genere il bus SPI hardware è più rapido della emulazione SPI via software, per cui si preferisce sempre usare il bus SPI hardware, allora 3 pin sono condivisi SCK, MISO e MOSI, mentre per ogni device si usa un pin CS (chip select) differente.
Posta anche il codice che stai usando se possibile o almeno dall'inizio fino al setup() incluso.
Ciao.
Continuo ad avere problemi nonostante ho condiviso i PIN SPI tra il modulo SD e lCD come suggerito da voi. Potreste dare un'occhiata al codice? Se faccio un codice solo per la SD funziona correttamente, se c'è anche LCD nel codice la SD non funziona.
Grazie
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_ILI9341.h>
#include <DHT.h>
#include <Adafruit_Sensor.h>
#include <Adafruit_BMP280.h>
#include <Fonts/FreeSans9pt7b.h>
#include <SD.h>
#include <SPI.h>
#define TFT_CS 5
#define TFT_DC 26
#define TFT_RST 4
#define TFT_SCK 18
#define TFT_MISO 19
#define TFT_MOSI 23
#define SD_CS 5
#define SD_SCK 18
#define SD_MISO 19
#define SD_MOSI 23
#define SDA_PIN 21
#define SCL_PIN 22
#define DHT_PIN 32
DHT dht(DHT_PIN, DHT22);
Adafruit_BMP280 bmp;
float pressure_offset = 0.0;
Adafruit_ILI9341 tft = Adafruit_ILI9341(TFT_CS, TFT_DC, TFT_RST);
void setup() {
Serial.begin(115200);
delay(1000);
Wire.begin(SDA_PIN, SCL_PIN);
tft.begin();
tft.setRotation(3);
for (int y = 0; y < 64; y++) {
tft.drawFastHLine(0, y, tft.width(), 0x0010);
}
int rowHeight = (tft.height() - 64) / 9;
for (int i = 0; i < 8; i++) {
uint16_t color = (i % 2 == 0) ? 0xFFFF : 0xEFBF;
for (int y = 64 + i * rowHeight; y < 64 + (i + 1) * rowHeight; y++) {
tft.drawFastHLine(0, y, tft.width(), color);
}
}
int lastRowHeight = (tft.height() - 64) - (8 * rowHeight);
tft.fillRect(0, 64 + 8 * rowHeight, tft.width(), lastRowHeight, 0xFFFF);
dht.begin();
Serial.println("DHT22 inizializzato.");
if (!bmp.begin(0x76)) {
Serial.println("Errore di inizializzazione BMP280!");
while (1);
}
Serial.println("BMP280 inizializzato.");
if (!SD.begin(SD_CS)) {
Serial.println("Errore di inizializzazione della scheda SD!");
} else {
Serial.println("Scheda SD inizializzata.");
}
tft.setFont(&FreeSans9pt7b);
tft.setTextColor(ILI9341_RED);
tft.setTextSize(1);
tft.setCursor(4, 14);
tft.print("Alpha Flight Computer");
tft.setTextColor(ILI9341_BLACK);
tft.setTextSize(1);
const char* labels[] = {
"Latitude",
"Longitude",
"Altitude [m]",
"Speed [km/h]",
"Out Temp.[C]",
"In Temp.[C]",
"Out Hum.[%]",
"Out Press.[hPa]",
"IR [mW/m^2]"
};
for (int i = 0; i < 9; i++) {
int yOffset = 64 + i * rowHeight + rowHeight / 2 + 4;
tft.setCursor(10, yOffset);
tft.println(labels[i]);
}
}
void loop() {
float temperature = bmp.readTemperature();
float pressure = bmp.readPressure() / 100.0F;
pressure += pressure_offset;
float humidity = dht.readHumidity();
Serial.print("Temperatura Esterna: ");
Serial.print(temperature);
Serial.println(" °C");
Serial.print("Pressione: ");
Serial.print(pressure);
Serial.println(" hPa");
if (isnan(humidity)) {
Serial.println("Errore nella lettura dell'umidità!");
} else {
Serial.print("Umidità esterna: ");
Serial.print(humidity);
Serial.println(" %");
}
int rowHeight = (tft.height() - 64) / 9;
for (int i = 0; i < 9; i++) {
int yOffset = 64 + i * rowHeight;
tft.fillRect(216, yOffset, tft.width() - 216, rowHeight, (i % 2 == 0) ? 0xFFFF : 0xEFBF);
}
int lastRowHeight = (tft.height() - 64) - (8 * rowHeight);
tft.fillRect(216, 64 + 8 * rowHeight, tft.width() - 216, lastRowHeight, 0xFFFF);
tft.setTextSize(1);
tft.setTextColor(ILI9341_BLUE);
tft.setFont(&FreeSans9pt7b);
tft.setCursor(216, 64 + 0 * rowHeight + rowHeight / 2 + 4);
tft.print("0");
tft.setCursor(216, 64 + 1 * rowHeight + rowHeight / 2 + 4);
tft.print("0");
tft.setCursor(216, 64 + 2 * rowHeight + rowHeight / 2 + 4);
tft.print("0");
tft.setCursor(216, 64 + 3 * rowHeight + rowHeight / 2 + 4);
tft.print("0");
tft.setCursor(216, 64 + 4 * rowHeight + rowHeight / 2 + 4);
if (isnan(temperature)) {
tft.print("0");
} else {
tft.print(String(temperature, 1));
tft.print(" ");
}
tft.setCursor(216, 64 + 5 * rowHeight + rowHeight / 2 + 4);
tft.print("0");
tft.setCursor(216, 64 + 6 * rowHeight + rowHeight / 2 + 4);
if (isnan(humidity)) {
tft.print("0");
} else {
tft.print(String(humidity, 1));
tft.print(" ");
}
tft.setCursor(216, 64 + 7 * rowHeight + rowHeight / 2 + 4);
if (isnan(pressure)) {
tft.print("0");
} else {
tft.print(String(pressure, 1));
tft.print(" ");
}
tft.setCursor(216, 64 + 8 * rowHeight + rowHeight / 2 + 4);
tft.print("0");
static unsigned long lastSdCheck = 0;
if (millis() - lastSdCheck >= 5000) {
lastSdCheck = millis();
if (!SD.begin(SD_CS)) {
Serial.println("Errore di lettura della scheda SD!");
} else {
Serial.println("Scheda SD presente.");
}
}
delay(3000);
}
... e mi meraviglierebbe il contrario:
#define TFT_CS 5
...
...
#define SD_CS 5
... t'abbiamo spiegato che i pin MISO, MOSI e SCK sono in comune, ma i pin di selezione del device (CS o SS) DEVONO essere univoci, uno per ciascun device!!!
Guglielmo
Come fai a selezionare uno dei due dispositivi se hanno il Chip Select in comune?... Un CS seleziona la SD e un altro l'LCD.
Si grazie, mi ero confuso per il Chip Select perchè leggendo una guida mi dava che su ESP32 è sul PIN5. Comunque ho spostato il CS sul pin 13 e finalmente riesco a farlo funzionare utilizzando un modulo SD esterno. Devo provare con il modulo SD dello schermo per vedere se funziona.
This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.