Arduino Nano mit adafruit 160x80 color TFT

Mein Vorhaben ist es zwei simple Grafik auf das Display zu bekommen, diese mit einem Taster umzuschalten und die Drehrichtung eines Motors, je nach gezeichneter Grafik zu ändern. Nach jetzt über einem Monat rumprobieren klappt nichts. Gibt es einn Code mit dem ich irgendetwas auf dem Display anzeigen lassen kann um die Hardware zu testen? Meine Arduino-/ Programmierkentnisse sind nahezu 0.

Du musst nur in die Beispiele zur entsprechenden Library zum Display reinschauen. Da findest du das gesuchte.

Hallo, Ja so ein Code gibt es. Da ich aber nicht weiss, welche Hardware Du testen willst, kann ich Dir aber nicht sagen, welchen Code Du dafür nemen musst.

LG Stefan.

Hi

Adafruit ist eigentlich bekannt dafür, ausgereifte Beispiele mitzuliefern - also dürfte Deine Frage mit JA zu beantworten sein.

Einen Monat ohne Erfolgserlebnis - wow, Du hast ein dickes Fell - zeig uns Mal, was Du feines hast, vll. ist's ja - sorry - ein saudummer Fehler :)

MfG

Zu meiner Hardware: Adafruit 0.96" 160x80 Color TFT Display w/ MicroSD Card Breakout - ST7735 und einen, zum Arduino Nano baugleichen Controller mi einem ATMEGA 328P.
Das Programm wurde für einen teensy 3.2 geschrieben. Meine Vermutung ist, dass es unter anderem an der “Bounce.h” library liegt. Die habe ich niergends gefunden. Nur die Bounce2 ist auffindbar. Diese habe ich eingebunden und einfach bei dem “include” Teil das “Bounce.h” durch “Bounce2” ersetzt.
Die Pins habe ich soweit umgeschrieben, soweit ich es verstanden habe. Es ist anscheinend auch irgendwtwas mit einer Audioausgabe mit drin, die ich nicht benötige. Oben sind die lirbrys schon auskommentiert.
Hier der Code:

#include <Adafruit_GFX.h>    // Core graphics library
#include <Adafruit_ST7735.h> // Hardware-specific library
//#include <Adafruit_DotStar.h>
#include <SPI.h>
//#include <Audio.h>
//#include <Wire.h>
#include <Bounce.h>
//#include <SD.h>
//#include <SerialFlash.h>

/*#define NUMPIXELS 12
#define PROP_AMP_ENABLE         //??
#define FLASH_CHIP_SELECT      //??
#define TFT_SCLK 16   
#define TFT_MOSI 14 
#define TFT_CS        //??
#define TFT_DC     12
#define TFT_RST       //??
//#define mainButton  //??
#define MOTA1         //??
#define MOTA2         //??
#define MOTAP         //??
/*
Adafruit_DotStar strip = Adafruit_DotStar(NUMPIXELS, DATAPIN, CLOCKPIN, DOTSTAR_BRG);
AudioPlaySerialflashRaw  playFlashRaw;
AudioOutputAnalog        dac1;           
AudioConnection          patchCord1(playFlashRaw, dac1);*/
Adafruit_ST7735 tft = Adafruit_ST7735(TFT_CS,  TFT_DC, TFT_RST);
//Bounce stateButton = Bounce(mainButton, 10); 
boolean beamState = false;
unsigned long curTime = 0;
unsigned long lastTime = -1;
unsigned long duration = 10000;

void setup() {
//Serial.begin(9600);
//pinMode(mainButton, INPUT_PULLUP);
pinMode(MOTA1, OUTPUT);
pinMode(MOTA2, OUTPUT);
pinMode(MOTAP, OUTPUT);
analogWrite(MOTAP, 150);
/*AudioMemory(8);
analogReference(EXTERNAL);
SerialFlash.begin(FLASH_CHIP_SELECT);
pinMode(PROP_AMP_ENABLE, OUTPUT);
digitalWrite(PROP_AMP_ENABLE, HIGH);    // Enable Amplifier
*/
tft.initR(INITR_MINI160x80);
tft.fillScreen(ST7735_BLACK);
drawIconHeal();
//playFlashRaw.play("DISK.RAW");
}

void loop() {

curTime = millis();
//play beam active sound
if (curTime - lastTime > duration){
  beamState = !beamState;
    if (beamState){
      drawIconBoost();
      //set LEDs blue; strip.setPixelColor(head, color);
      digitalWrite(MOTA1, HIGH);
      digitalWrite(MOTA2, LOW);
    } else {
      drawIconHeal();
      digitalWrite(MOTA1, LOW);
      digitalWrite(MOTA2, HIGH);
      //set LEDs yellow;
      //set motor direction;
    }
    lastTime = curTime;  
}

} // ************************ END MAIN LOOP ************************

void drawIconHeal(){
tft.fillScreen(ST7735_BLACK);
tft.fillRect(24, 39 , 30, 80, ST7735_YELLOW); // vertical bar
tft.fillRect(0, 64 , 79, 30, ST7735_YELLOW);
}

void drawIconBoost(){
tft.fillScreen(ST7735_BLACK);
tft.fillTriangle(5, 20, 12, 90, 69, 20, 0x05FD);
tft.fillTriangle(12, 90, 39, 90, 69, 20, 0x05FD);
tft.fillTriangle(26, 80, 26, 155, 69, 80, 0x05FD);
}

Hier auch nochmal die orginale Pinbelegung:

/*#define NUMPIXELS 8 
#define PROP_AMP_ENABLE    5
#define FLASH_CHIP_SELECT  6*/
#define TFT_SCLK 13   // set these to be whatever pins you like!
#define TFT_MOSI 11 
#define TFT_CS     10
#define TFT_DC     9
#define TFT_RST   -1
//#define mainButton 4
#define MOTA1    21
#define MOTA2    22
#define MOTAP   23
/*

Was hat das jetzt mit einem simplen Beispiel für ein Display zu tun ?
Zudem setzt man normal die Sketche hier in Code-Tags rein.
Verwende dazu die Schaltfläche </> oben links im Editorfenster. Das kannst du mit deinem Copy&Paste-Code noch nachträglich machen.

Hi

Die wire.h solltest Du wieder einbinden - Die macht I²C erst möglich - und somit die Kommunikation mit dem Display. Eigentlich müsste Das angemeckert werden.

Oha - Da bekomme ich, egal was ich mache, dutzende weitere Meldungen. Mir fehlen diverse Libs, Deklarationen sind nicht vollständig - der Sketch ist noch nicht Mal eine Baustelle ...

Vorschlag: Bringe das Display mit einem Demo-Sketch zum Laufen.

WAS soll das Konstrukt später machen? Zwischen zwei Grafiken umschalten, könnte man mit den Beispielen hinbekommen. Identisch zu den Bildchen einen Motor umpolen? Sollte sich auch machen lassen.

Nebentip(p): Code-Tags für Code

MfG

Nach der Anleitung bei adafruit funktioniert auch nichts. Das Display bleibt weiß.
Display

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

#if defined(ESP32)
  #define TFT_CS         13
  #define TFT_RST        -1 
  #define TFT_DC         11
  //
  // define not needed for all pins; reference for ESP32 physical pins connections to VSPI:
  // SDA  GPIO23 aka VSPI MOSI
  // SCLK GPIO18 aka SCK aka VSPI SCK
  // D/C  GPIO21 aka A0 (also I2C SDA)
  // RST  GPIO22 aka RESET (also I2C SCL)
  // CS   GPIO5  aka chip select
  // LED  3.3V
  // VCC  5V
  // GND - GND
  //
#elif defined(ESP8266)
  #define TFT_CS         13
  #define TFT_RST        -1                                            
  #define TFT_DC         11

#else
  // For the breakout board, you can use any 2 or 3 pins.
  // These pins will also work for the 1.8" TFT shield.
  #define TFT_CS        13
  #define TFT_RST        -1 // Or set to -1 and connect to Arduino RESET pin
  #define TFT_DC         11
#endif

// OPTION 1 (recommended) is to use the HARDWARE SPI pins, which are unique
// to each board and not reassignable. For Arduino Uno: MOSI = pin 11 and
// SCLK = pin 13. This is the fastest mode of operation and is required if
// using the breakout board's microSD card.

// For 1.44" and 1.8" TFT with ST7735 use:
//Adafruit_ST7735 tft = Adafruit_ST7735(TFT_CS, TFT_DC, TFT_RST);

// OPTION 2 lets you interface the display using ANY TWO or THREE PINS,
// tradeoff being that performance is not as fast as hardware SPI above.
#define TFT_MOSI 11  // Data out
#define TFT_SCLK 13  // Clock out

// For ST7735-based displays, we will use this call
Adafruit_ST7735 tft = Adafruit_ST7735(TFT_CS, TFT_DC, TFT_MOSI, TFT_SCLK, TFT_RST);


float p = 3.1415926;

void setup(void) {
  Serial.begin(9600);
  Serial.print(F("Hello! ST77xx TFT Test"));

  // OR use this initializer (uncomment) if using a 0.96" 160x80 TFT:
  tft.initR(INITR_MINI160x80);  // Init ST7735S mini display

  Serial.println(F("Initialized"));

  uint16_t time = millis();
  tft.fillScreen(ST77XX_BLACK);
  time = millis() - time;

  Serial.println(time, DEC);
  delay(500);

  // large block of text
  tft.fillScreen(ST77XX_BLACK);
  testdrawtext("Lorem ipsum dolor sit amet, consectetur adipiscing elit. Curabitur adipiscing ante sed nibh tincidunt feugiat. Maecenas enim massa, fringilla sed malesuada et, malesuada sit amet turpis. Sed porttitor neque ut ante pretium vitae malesuada nunc bibendum. Nullam aliquet ultrices massa eu hendrerit. Ut sed nisi lorem. In vestibulum purus a tortor imperdiet posuere. ", ST77XX_WHITE);
  delay(1000);

  // tft print function!
  tftPrintTest();
  delay(4000);

  // a single pixel
  tft.drawPixel(tft.width()/2, tft.height()/2, ST77XX_GREEN);
  delay(500);

  // line draw test
  testlines(ST77XX_YELLOW);
  delay(500);

  // optimized lines
  testfastlines(ST77XX_RED, ST77XX_BLUE);
  delay(500);

  testdrawrects(ST77XX_GREEN);
  delay(500);

  testfillrects(ST77XX_YELLOW, ST77XX_MAGENTA);
  delay(500);

  tft.fillScreen(ST77XX_BLACK);
  testfillcircles(10, ST77XX_BLUE);
  testdrawcircles(10, ST77XX_WHITE);
  delay(500);

  testroundrects();
  delay(500);

  testtriangles();
  delay(500);

  mediabuttons();
  delay(500);

  Serial.println("done");
  delay(1000);
}

void loop() {
  tft.invertDisplay(true);
  delay(500);
  tft.invertDisplay(false);
  delay(500);
}

void testlines(uint16_t color) {
  tft.fillScreen(ST77XX_BLACK);
  for (int16_t x=0; x < tft.width(); x+=6) {
    tft.drawLine(0, 0, x, tft.height()-1, color);
    delay(0);
  }
  for (int16_t y=0; y < tft.height(); y+=6) {
    tft.drawLine(0, 0, tft.width()-1, y, color);
    delay(0);
  }

  tft.fillScreen(ST77XX_BLACK);
  for (int16_t x=0; x < tft.width(); x+=6) {
    tft.drawLine(tft.width()-1, 0, x, tft.height()-1, color);
    delay(0);
  }
  for (int16_t y=0; y < tft.height(); y+=6) {
    tft.drawLine(tft.width()-1, 0, 0, y, color);
    delay(0);
  }

  tft.fillScreen(ST77XX_BLACK);
  for (int16_t x=0; x < tft.width(); x+=6) {
    tft.drawLine(0, tft.height()-1, x, 0, color);
    delay(0);
  }
  for (int16_t y=0; y < tft.height(); y+=6) {
    tft.drawLine(0, tft.height()-1, tft.width()-1, y, color);
    delay(0);
  }

  tft.fillScreen(ST77XX_BLACK);
  for (int16_t x=0; x < tft.width(); x+=6) {
    tft.drawLine(tft.width()-1, tft.height()-1, x, 0, color);
    delay(0);
  }
  for (int16_t y=0; y < tft.height(); y+=6) {
    tft.drawLine(tft.width()-1, tft.height()-1, 0, y, color);
    delay(0);
  }
}

void testdrawtext(char *text, uint16_t color) {
  tft.setCursor(0, 0);
  tft.setTextColor(color);
  tft.setTextWrap(true);
  tft.print(text);
}

void testfastlines(uint16_t color1, uint16_t color2) {
  tft.fillScreen(ST77XX_BLACK);
  for (int16_t y=0; y < tft.height(); y+=5) {
    tft.drawFastHLine(0, y, tft.width(), color1);
  }
  for (int16_t x=0; x < tft.width(); x+=5) {
    tft.drawFastVLine(x, 0, tft.height(), color2);
  }
}

void testdrawrects(uint16_t color) {
  tft.fillScreen(ST77XX_BLACK);
  for (int16_t x=0; x < tft.width(); x+=6) {
    tft.drawRect(tft.width()/2 -x/2, tft.height()/2 -x/2 , x, x, color);
  }
}

void testfillrects(uint16_t color1, uint16_t color2) {
  tft.fillScreen(ST77XX_BLACK);
  for (int16_t x=tft.width()-1; x > 6; x-=6) {
    tft.fillRect(tft.width()/2 -x/2, tft.height()/2 -x/2 , x, x, color1);
    tft.drawRect(tft.width()/2 -x/2, tft.height()/2 -x/2 , x, x, color2);
  }
}

void testfillcircles(uint8_t radius, uint16_t color) {
  for (int16_t x=radius; x < tft.width(); x+=radius*2) {
    for (int16_t y=radius; y < tft.height(); y+=radius*2) {
      tft.fillCircle(x, y, radius, color);
    }
  }
}

void testdrawcircles(uint8_t radius, uint16_t color) {
  for (int16_t x=0; x < tft.width()+radius; x+=radius*2) {
    for (int16_t y=0; y < tft.height()+radius; y+=radius*2) {
      tft.drawCircle(x, y, radius, color);
    }
  }
}

void testtriangles() {
  tft.fillScreen(ST77XX_BLACK);
  int color = 0xF800;
  int t;
  int w = tft.width()/2;
  int x = tft.height()-1;
  int y = 0;
  int z = tft.width();
  for(t = 0 ; t <= 15; t++) {
    tft.drawTriangle(w, y, y, x, z, x, color);
    x-=4;
    y+=4;
    z-=4;
    color+=100;
  }
}

void testroundrects() {
  tft.fillScreen(ST77XX_BLACK);
  int color = 100;
  int i;
  int t;
  for(t = 0 ; t <= 4; t+=1) {
    int x = 0;
    int y = 0;
    int w = tft.width()-2;
    int h = tft.height()-2;
    for(i = 0 ; i <= 16; i+=1) {
      tft.drawRoundRect(x, y, w, h, 5, color);
      x+=2;
      y+=3;
      w-=4;
      h-=6;
      color+=1100;
    }
    color+=100;
  }
}

void tftPrintTest() {
  tft.setTextWrap(false);
  tft.fillScreen(ST77XX_BLACK);
  tft.setCursor(0, 30);
  tft.setTextColor(ST77XX_RED);
  tft.setTextSize(1);
  tft.println("Hello World!");
  tft.setTextColor(ST77XX_YELLOW);
  tft.setTextSize(2);
  tft.println("Hello World!");
  tft.setTextColor(ST77XX_GREEN);
  tft.setTextSize(3);
  tft.println("Hello World!");
  tft.setTextColor(ST77XX_BLUE);
  tft.setTextSize(4);
  tft.print(1234.567);
  delay(1500);
  tft.setCursor(0, 0);
  tft.fillScreen(ST77XX_BLACK);
  tft.setTextColor(ST77XX_WHITE);
  tft.setTextSize(0);
  tft.println("Hello World!");
  tft.setTextSize(1);
  tft.setTextColor(ST77XX_GREEN);
  tft.print(p, 6);
  tft.println(" Want pi?");
  tft.println(" ");
  tft.print(8675309, HEX); // print 8,675,309 out in HEX!
  tft.println(" Print HEX!");
  tft.println(" ");
  tft.setTextColor(ST77XX_WHITE);
  tft.println("Sketch has been");
  tft.println("running for: ");
  tft.setTextColor(ST77XX_MAGENTA);
  tft.print(millis() / 1000);
  tft.setTextColor(ST77XX_WHITE);
  tft.print(" seconds.");
}

void mediabuttons() {
  // play
  tft.fillScreen(ST77XX_BLACK);
  tft.fillRoundRect(25, 10, 78, 60, 8, ST77XX_WHITE);
  tft.fillTriangle(42, 20, 42, 60, 90, 40, ST77XX_RED);
  delay(500);
  // pause
  tft.fillRoundRect(25, 90, 78, 60, 8, ST77XX_WHITE);
  tft.fillRoundRect(39, 98, 20, 45, 5, ST77XX_GREEN);
  tft.fillRoundRect(69, 98, 20, 45, 5, ST77XX_GREEN);
  delay(500);
  // play color
  tft.fillTriangle(42, 20, 42, 60, 90, 40, ST77XX_BLUE);
  delay(50);
  // pause color
  tft.fillRoundRect(39, 98, 20, 45, 5, ST77XX_RED);
  tft.fillRoundRect(69, 98, 20, 45, 5, ST77XX_RED);
  // play color
  tft.fillTriangle(42, 20, 42, 60, 90, 40, ST77XX_GREEN);
}

Dann machstdu etwas falsch, was, können wir nicht sehen.

Also poste ein Foto (direkt im Forum, nicht auf irgendwelchen externen Seiten) von deinem Aufbau, wo wir alles erkennen können. Und poste Hyperlinks von deinem Display. Das sind Links zum anklicken.

Hier das Bild von meinem Aufbau.

Warum hast du Pin 11, 12 und 13 nicht angeschlossen ? Dein Display nutzt SPI und braucht daher die Pins.

Hi

Wenn ich das Bild recht interpretiere, fehlt ausschließlich Pin 12. Zugegeben: Die Farbwahl der verschiedenen Strippen ist gewagt, aber schlimmer finde ich, daß man die Anschlüsse am Display nur sehr besch*** entziffern kann.

MfG

Mag sein, so schief kann man nicht gucken, wie das Bild verzerrt.

Also TO, bitte nochmal den genauen Verdrahtungsplan posten.

Pin 12 sehe ich im Programm gar nicht. Wo muss der angeschlossen werden?

Das Bild ist nicht verzerrt und ich kann darauf auch alle Leitungswege verfolgen sowie die Beschriftungen erkennen.

Becc: Pin 12 sehe ich im Programm gar nicht. Wo muss der angeschlossen werden?

Das Bild ist nicht verzerrt und ich kann darauf auch alle Leitungswege verfolgen sowie die Beschriftungen erkennen.

Na dann.... Verzerrt heißt, der Pin13 landet im Plastik von Steckbrett und nicht in einen Loch. Nochmal.....poste eine Liste der Verkabelung.

Edit: Stimmt, Pin12 ist Miso und wird hier nicht benötigt.

Pinbelegung: DC D8 (11) TFTCS D10 (13) MOSI D11 (14) SCK D13 (16)

Hi

Becc: Pin 12 sehe ich im Programm gar nicht. Wo muss der angeschlossen werden?

Das Bild ist nicht verzerrt und ich kann darauf auch alle Leitungswege verfolgen sowie die Beschriftungen erkennen.

Dann beglückwünsche ich Dich Das ist mir nicht vergönnt. Nun denn, werde ich mich lesend zurück lehnen :) (Und JA, mir wäre aufgefallen, daß der TO mittlerweile sogar in Textform was zur Verdrahtung geschrieben hat ... und?)

MfG

Weiß keiner weiter? Ist wenigstens die Verdrahtung richtig?

Verzerrt heißt daß man auf dem Foto nur mit viel Phantasie erkennt welches Pin in welcher Reihe des Steckbretts steckt und optisch auf dem Foto um mehr als 1 Pin versetzt sind.

Warum hast Du das Display mit 3,3V an Vin angeschlossen und nicht mit 5V an Vin? Siehe https://learn.adafruit.com/adafruit-mini-tft-0-dot-96-inch-180x60-breakout/wiring-test

Grüße Uwe

Das mit den 3,3 V ist eine gute Frage. Leider funktioniert das Display auch mit 5 V nicht.