Display flackert bei schreiben auf SD?

Hallo,
ich baue gerade einen Datenlogger, der z.B. die Temperatur misst, auf dem Display anzeigt und auf einer SD-Card speichert.

Die Werte werden alle 10 Sekunden gespeichert und in diesem Takt “blinkt” das Display.
beides ist über SPI angeschlossen. Das sollte doch eigendlich funktionieren…

Displaybeschaltung:
Arduino(NANO-Pin) - ST7735 TFT Display 128*160:
mosi 11 - SDA
sck 13 - SCL
cs 10 - CS
dc 9 - A0
rst 8 - RESET

SD cardbeschaltung:
Arduino(NANO-Pin) - SD-Card:
MOSI 11 - MOSI
MISO 12 - MISO
SCK 13 - SCK
CS 4 - CS_SD

hier noch das (gekürzte) Programm:

//---Librarys:---
#include <Wire.h> //für CO2 Sensor
//#include "SparkFun_SCD30_Arduino_Library.h" //CO2 Sensor get the library: http://librarymanager/All#SparkFun_SCD30

#include <Adafruit_GFX.h>    // Core graphics library for ST7735
#include <Adafruit_ST7735.h> // Hardware-specific library for ST7735

#include <SPI.h> //für SD-Card
#include <SD.h> //für SD-Card


//---Definitionen:---
#define TFT_CS        10 // Hallowing display control pins: chip select
#define TFT_RST       8 // Display reset
#define TFT_DC        9 // Display data/command select
Adafruit_ST7735 tft = Adafruit_ST7735(TFT_CS, TFT_DC, TFT_RST); // For 1.44" and 1.8" TFT with ST7735 (including HalloWing) use:

const int chipSelect = 4; //CS für SD-Card

//SCD30 airSensor;

//---Variablen:---
unsigned long previousMillis; //Millisekunden als Taktgeber

word co2ppm; //CO2 in ppm 0-40.000
float temp; //Temperatur
float humi; //Luftfeuchtigkeit

String dataString = ""; // make a string for assembling the data to log on SD-Card:

String co2String = "CO2: -"; //CO2 Wert für TFT
String tempString = "Temp: -------"; //TEMP Wert für TFT
String humiString = "Humi: -"; //HUMI Wert für TFT
String sdString = "SD: FEHLER"; //Status: SD-Aufnahme, SD-Fehler, ...

byte tftfarbe;
byte tftfarbeold;

//_________________________________________________________________________________________________
void setup()
{
  //Wire.begin(); //CO2 Sensor

  //Display ST7735:
  tft.initR(INITR_BLACKTAB);      // Init ST7735S chip, black tab
  tft.setRotation(1); //Where rotation is 0, or 2 for portrait and 1 or 3 for landscape rotations.
  tft.fillScreen(ST77XX_GREEN);         //Hintergrundfarbe festlegen
  tft.setTextWrap(false);               //Zeilenumbruch
  
  Serial.begin(9600);
  Serial.println("CO2 Sensor v0.02");

  // see if the SD-CARD is present and can be initialized:
  if (!SD.begin(chipSelect)) {
    Serial.println("Card failed, or not present");
    // don't do anything more:
    return;
  }
  Serial.println("card initialized.");

}

//_________________________________________________________________________________________________
void loop()
{
  if (millis() - previousMillis > 10000) {


    //---SD-CARD:---
    SDCARD();

    //---DISPLAY:---
    Anzeige();

    previousMillis = millis();
  }

} // LOOP - ENDE

//_________________________________________________________________________________________________
// - - - - - Unterprogramme - - - - -

void SDCARD() {

  dataString = co2ppm;
  dataString = dataString + "," + temp + "," + humi;

  File dataFile = SD.open("datalog.txt", FILE_WRITE);

  // if the file is available, write to it:
  if (dataFile) {
    dataFile.println(dataString);
    dataFile.close();

    sdString = "SD: Aufnahme";
  }
  // if the file isn't open, pop up an error:
  else {
    Serial.println("error opening datalog.txt");
    sdString = "SD: FEHLER";
  }
}

void Anzeige() {

   co2ppm = 900; // TEST
  //Hintergrundfarbe an CO2 Wert anpassen
  if (co2ppm < 1000) {
    tftfarbe = 1;
    if (tftfarbeold == tftfarbe) {
      //tu nix
    }
    else {
      tftfarbeold = tftfarbe;
      tft.fillScreen(ST77XX_GREEN); //Hintergrundfarbe festlegen;
    }

  }
  else  {
    if (co2ppm > 1999) {
      tftfarbe = 3;
      tft.fillScreen(ST77XX_RED); //Hintergrundfarbe festlegen
    }
    else    {
      tftfarbe = 2;
      tft.fillScreen(ST77XX_YELLOW); //Hintergrundfarbe festlegen
    }
  }


  tft.setTextColor(ST77XX_BLUE, ST77XX_GREEN);       //Schriftfarbe, Hintergrundfarbe festlegen
  tft.setTextSize(3);                   //Schriftgröße
  
  co2String = "CO2:";
  co2String = co2String + co2ppm;
  tft.setCursor(1, 1);                  //Position setzen: von links, von oben
  tft.println(co2String);             //TEXT

  tft.setTextSize(2);                   //Schriftgröße
  tft.setTextColor(ST77XX_BLACK, ST77XX_GREEN);       //Schriftfarbe festlegen

  tempString = "Temp:";
  tempString = tempString + temp;
  tempString = tempString + " C";
  tft.setCursor(1, 40);                 //Position setzen: von links, von oben
  tft.println(tempString);                //TEXT

  humiString = "Humi:";
  humiString = humiString + humi;
  humiString = humiString + "%";
  tft.setCursor(1, 60);                 //Position setzen: von links, von oben
  tft.println(humiString);                //TEXT



}

Wenn ich den Sprungbefehl für die SD-Card lösche/auskommentiere ist alles ok:
//—SD-CARD:—
// SDCARD();

gruß,
stfan

Gib uns mal einen Link zum Display.

Gruß Tommy

Hallo,
hier das Datenblatt:

http://pdf1.alldatasheetde.com/datasheet-pdf/view/326213/SITRONIX/ST7735.html

und programmiert mit der aktuellen Version von Adafruit_ST7735.h(Arduino Download)

Ist das Display als SPI oder I2C geschaltet? Da hört sich Deine ursprüngliche Schaltung widersprüchlich an.
Wenn Du aber sinnvolle Ausgaben bekommst, scheint es SPI zu sein.
Ich vermisse aber die SPI-Umschaltung aufs Display.

Das Datenblatt ist nicht sinnvoll lesbar. Außerdem ist wohl die Beschaltung des Moduls das interessantere.

Zur Adafruit-Lib fehlt der Link.

Gruß Tommy

Hallo,
also die SD Karte und das Display sind über SPI angeschlossen.
Das Display zeigt die Daten richtig an(werden auch aktualisiert).
Die Daten werden auf der SD Karte richtig gespeichert.

Benutzt habe ich: #include <Adafruit_ST7735.h>

Was meinst du mit SPI-Umschaltung? Muss ich das machen oder macht das die Lib?
Also ich habe keine Umschaltung programmiert… Also wenn ich das richtig verstehe, eine Umschaltung, ob gerade die SD-Karte angesprochen werden soll oder das Display?

Gruß,
Stfan

Probiere mal, vor dem Schreiben auf SD den /CS vom Display auf HIGH zu schalten. Wenn danach das Display nichts neues mehr anzeigt, dann am Ende vom SD-Schreiben wieder auf LOW.

Gruß Tommy

Hallo,

stfan1409:
Die Werte werden alle 10 Sekunden gespeichert und in diesem Takt "blinkt" das Display.
beides ist über SPI angeschlossen. Das sollte doch eigendlich funktionieren...

da es letztens irgendwo ein ähnliches Problem gab: was "blinkt"?
Der angezeigte Inhalt oder die Displaybeleuchtung?
Der Nano 5V oder 3,3V Version?
Und um auf Tommy56 zurückzukommen: welches Display genau? Link zum Anbieter oder Bild der Rückseite bitte, das ST7735 Datenblatt hilft hier nur wenig.

Gruß aus Berlin
Michael

Probiere mal, vor dem Schreiben auf SD den /CS vom Display auf HIGH zu schalten.

Ich fürchte, die SD Bibliothek selbst macht das nur einmal, bei .begin(CS).
Hoffentlich stört die SPI-Anzeige nicht die SD Karte.

Das Entsprechende kannst du auch mit dem CS der SD Karte machen: Nur das jeweilige Gerät wird vorher
mit digitalWrite(SS, LOW) aktiviert.

Das Display ist dieses:

Der Arduino NANO läuft mit einem 5V Netzteil(2A).
NICHT der Text sondern das ganze Display blinken immer dann, wenn der Arduino in der Routine
void Anzeige() ist.
-->> geändert: es blinkt wohl immer , wenn auf die SD-Karte geschrieben wird.

Habe die Zeit auf 1 Sekunde bzw. 10 Sekunden geändert und so ändert sich auch das flackern / blitzen.

Ich habe im laufenden Betrieb den CS-Pin vom Display an +5V angeschlossen.
Die Werte ändern sich nun nicht mehr(habe eine Variable hochzählen lassen), aber das flackern ist weiterhin

wenn ich abwechselnd SD/TFT ansteuer blinkt es trotzdem - genau dann, wenn die SD angesteuert wird, obwohl das TFT gar nicht drann ist...

void loop()
{
  if (millis() - previousMillis > 1000) {
co2ppm = co2ppm + 1;

if (co2ppm % 2) { //vergleich ob zahl gerade/ungerade
 temp = 1;
 //---SD-CARD:---
    SDCARD();
} else {
 temp = 2;
 //---DISPLAY:---
    Anzeige();
}


    previousMillis = millis();
  }

 
} // LOOP - ENDE

Hallo,

Displaycontroller und auch die SD-Card wollen 3,3V Pegel. Wie hast Du das mit den Pegelwandlern zum 5V Nano gelöst?

Gruß aus Berlin
Michael

Auf der Platine sind Schutzwiderstände. Diese scheinen seit Tagen der Karte und dem TFT das überleben zu sichern. Ich hatte zuerst ein Display mit gleichem Treiber, aber anderem Layout. Auf der Webseite stand für 3,3V & 5V. Wandler sind aber auch nicht verbaut(nur die Widerstände und davon zu wenig für "Wandler"). Bei diesem Display habe ich tatsächlich nicht darauf geachtet, aber es scheint zu funktionieren - werde aber mal nachsehen, wie es andere gelöst haben.

Mache ich einen Denkfehler?

Am NANO gibt es den Pin D13, also SCK für das Taktsignal.
An diesem sind 2 Kabel:

Bez. am "Display mit SD-Card"

  1. SCK (für die SD-Karte)
  2. SCL (für das Display)

nun habe ich den Stecker "1) SCK (für die SD-Karte)" abgezogen.
Das flackern ist weg (und es werden natürlich keine Daten mehr auf die Karte geschrieben).
Aber warum ist das flackern weg...?

Hallo,

dann könnte es der Effekt sein, der auch im anderen Thread für Verwirrung sorgte: die 5V Pegel der Datenleitungen heben über Scgutzwiderstaände und Scutzdioden der ICs die 3,3V Spannung etwas an. Wenn da auch das Backlight des Displays dranhängt, ändert sich dessen Helligkeit merklich durch den SPI-Zugriff auf die SD-Card.
Entweder mit größeren Widerständen in SCK/MOSI/CS probieren oder oder Pegelwandler oder (meine böse Methode) kleine Schottkydioden in die Leitungen mit Kathide an den AVR-Pin. Dann zihr der nur nach Low aktiv, H müssen dann aber PullUps gegen 3,3V machen.

Gruß aus Berlin
Michael

Wenn ich die SD-Karte ziehe ist das flackern weg. Genauso wenn ich den chipSelectPin(für die SD-Karte) abziehe.
Aus einem anderen Posting

habe ich gelesen, dass 1k Widerstände zwischen Display und Arduino geschaltet werden sollen. Und vom Display je 2,2k an GND.

Widerstände an der SD-Karte funktionieren nicht. Dann wird die Karte nicht mehr erkannt.
Die Widerstände am Display funktionieren und das Flackern ist weg.
juhu