Einfluss verschiedener Anschlussmöglichkeiten

Hallo, das ist mein erster Beitrag.

Ich bin gerade dabei mich in Arduino einzuarbeiten.
Wenn die Projekte klappen macht es echt Spaß.
Wenn nicht, bin ich ziemlich am Herumsuchen.

Ich programmiere zwar schon ziemlich lange, aber bis jetzt noch nie
mit einer “C”-ähnlichen Sprache. Früher mal Assembler 68000 jetzt
viel VisualBasic.

Meine Frage beim Arduino: Wie bekomme ich raus, wo sich verschiedene
Anschlussarten gegeneinander ausschließen?

Beispielsweise habe ich hier ein GT-U7 (GPS), das kann ich problemlos
mit einem Terminalprogramm am PC auslesen.
Als erstes habe ich es per SoftwareSerial (über UNO) an ein 2 Zeilen I2C LCD Display gehängt.
Das funktioniert auch.
Dann habe ich versucht das Test-Programm für ein 2.8" TFT LCD Shield
umzuschreiben. Das klappt nicht.
Der UNO funktioniert, das GPS-Modul blinkt vor sich hin, das TFT-Display
gibt auch (sehr langsam) Text aus.
Aber die GPS-Daten bekomme ich nicht angezeigt.

Irgendwie müssen sich beide Systeme gegenseitig stören.
Ich verwende SoftwareSerial, so wie auch bei der Benutzung des kleinen LCD.

Wie kann ich jetzt nach dem Fehler suchen?

Im Sketch und den Libs. Mehr ist aus Deinen mageren Infos nicht herauszulesen.

Gib uns Deinen Sketch und Links zu den Komponenten und LIbs.

Setze Deinen Code bitte in Codetags (</>-Button oben links im Forumseditor oder [code] davor und [/code] dahinter ohne *).
Dann ist er auch auf mobilen Geräten besser lesbar.

Gruß Tommy

oleum:
Meine Frage beim Arduino: Wie bekomme ich raus, wo sich verschiedene
Anschlussarten gegeneinander ausschließen?

Naja, es gibt ja nicht allzuviele "Arten"
Die Mehrfachverwendung von PIN's ist bei I2C möglich, genauso bei SPI wenn für CS ein zusätzlicher eingeplant wird.
PIN 0 und 1 solltest nicht benutzen, da der USB dran klemmt.
A5 / A5 ist mit I2C belegt.
PWM ist auch nicht bei allen möglich.
Belastbarkeit der PINS beachten.

Such Dir entweder ein gutes Schematic - Bildersuche der Suchmaschine der schlechesten Wahl - oder schau in die Doku zum Board, welche CPU-Pins wo liegen und nimm das DaBla zum Controller.

Sorry für den Code, da ist schon ziemlich viel herumprobiert worden.

GPS-Modul

Display

#include <Wire.h>
#include <SoftwareSerial.h>
#include <TinyGPS.h>

#include <Adafruit_GFX.h>    // Core graphics library
#include <Adafruit_TFTLCD.h> // Hardware-specific library


/* This sample code demonstrates the normal use of a TinyGPS object.
   It requires the use of SoftwareSerial, and assumes that you have a
   4800-baud serial GPS device hooked up on pins <> 4(rx) and 3(tx).
*/

TinyGPS gps;
SoftwareSerial ss(2, 3 );

// The control pins for the LCD can be assigned to any digital or
// analog pins...but we'll use the analog pins as this allows us to
// double up the pins with the touch screen (see the TFT paint example).
#define LCD_CS A3 // Chip Select goes to Analog 3
#define LCD_CD A2 // Command/Data goes to Analog 2
#define LCD_WR A1 // LCD Write goes to Analog 1
#define LCD_RD A0 // LCD Read goes to Analog 0

#define LCD_RESET A4 // Can alternately just connect to Arduino's reset pin


static void smartdelay(unsigned long ms);
static void print_float(float val, float invalid, int len, int prec, int pos);
static void print_int(unsigned long val, unsigned long invalid, int len, int pos);
static void print_date(TinyGPS &gps, int pos);
static void print_str(const char *str, int len, int pos);

// Assign human-readable names to some common 16-bit color values:
#define  BLACK   0x0000
#define BLUE    0x001F
#define RED     0xF800
#define GREEN   0x07E0
#define CYAN    0x07FF
#define MAGENTA 0xF81F
#define YELLOW  0xFFE0
#define WHITE   0xFFFF

Adafruit_TFTLCD tft(LCD_CS, LCD_CD, LCD_WR, LCD_RD, LCD_RESET);
// Adafruit_TFTLCD tft;

void setup()
{
  Serial.begin(9600);

#ifdef USE_ADAFRUIT_SHIELD_PINOUT
  Serial.println(F("Using Adafruit 2.8\" TFT Arduino Shield Pinout"));
#else
  Serial.println(F("Using Adafruit 2.8\" TFT Breakout Board Pinout"));
#endif

  Serial.print("TFT size is "); Serial.print(tft.width()); Serial.print("x"); Serial.println(tft.height());

  tft.reset();

  uint16_t identifier = tft.readID();

  if(identifier == 0x9325) {
    Serial.println(F("Found ILI9325 LCD driver"));
  } else if(identifier == 0x9328) {
    Serial.println(F("Found ILI9328 LCD driver"));
  } else if(identifier == 0x7575) {
    Serial.println(F("Found HX8347G LCD driver"));
  } else if(identifier == 0x9341) {
    // Dieser ist es
    Serial.println(F("Found ILI9341 LCD driver"));
  } else if(identifier == 0x8357) {
    Serial.println(F("Found HX8357D LCD driver"));
  } else {
    Serial.print(F("Unknown LCD driver chip: "));
    Serial.println(identifier, HEX);
    Serial.println(F("If using the Adafruit 2.8\" TFT Arduino shield, the line:"));
    Serial.println(F("  #define USE_ADAFRUIT_SHIELD_PINOUT"));
    Serial.println(F("should appear in the library header (Adafruit_TFT.h)."));
    Serial.println(F("If using the breakout board, it should NOT be #defined!"));
    Serial.println(F("Also if using the breakout, double-check that all wiring"));
    Serial.println(F("matches the tutorial."));
    return;
  }

  tft.begin(identifier);
  testFillScreen();

  
  Serial.print("Testing TinyGPS library v. "); Serial.println(TinyGPS::library_version());
  Serial.println("by Mikal Hart");
  Serial.println();
  Serial.println("Sats HDOP Latitude  Longitude  Fix  Date       Time     Date Alt    Course Speed Card  Distance Course Card  Chars Sentences Checksum");
  Serial.println("          (deg)     (deg)      Age                      Age  (m)    --- from GPS ----  ---- to London  ----  RX    RX        Fail");
  Serial.println("-------------------------------------------------------------------------------------------------------------------------------------");

  ss.begin(9600);
}

void loop()
{
  float flat, flon;
  unsigned long age, date, time, chars = 0;
  unsigned short sentences = 0, failed = 0;
  static const double LONDON_LAT = 51.508131, LONDON_LON = -0.128002;

//
  int year;
  byte month, day, hour, minute, second, hundredths;
  gps.crack_datetime(&year, &month, &day, &hour, &minute, &second, &hundredths, &age);

    char sz[32];
    sprintf(sz, "%02d/%02d/%02d %02d:%02d:%02d ",
        month, day, year, hour, minute, second);
    
    tft.setCursor(0, 100);  
    tft.setTextColor(GREEN,BLACK);  tft.setTextSize(2);
    tft.print(sz);

//


  
//  print_int(gps.satellites(), TinyGPS::GPS_INVALID_SATELLITES, 5,10);
//  print_int(gps.hdop(), TinyGPS::GPS_INVALID_HDOP, 5,25);
//  gps.f_get_position(&flat, &flon, &age);

//  print_float(flat, TinyGPS::GPS_INVALID_F_ANGLE, 10, 6,40);
//  print_float(flon, TinyGPS::GPS_INVALID_F_ANGLE, 11, 6,55);
//  print_int(age, TinyGPS::GPS_INVALID_AGE, 5,70);
//  print_date(gps,5);

//  print_float(gps.f_altitude(), TinyGPS::GPS_INVALID_F_ALTITUDE, 7, 2,85);
//  print_float(gps.f_course(), TinyGPS::GPS_INVALID_F_ANGLE, 7, 2,100);
//  print_float(gps.f_speed_kmph(), TinyGPS::GPS_INVALID_F_SPEED, 6, 2,115);
//  print_str(gps.f_course() == TinyGPS::GPS_INVALID_F_ANGLE ? "*** " : TinyGPS::cardinal(gps.f_course()), 6,130);
//  print_int(flat == TinyGPS::GPS_INVALID_F_ANGLE ? 0xFFFFFFFF : (unsigned long)TinyGPS::distance_between(flat, flon, LONDON_LAT, LONDON_LON) / 1000, 0xFFFFFFFF, 9,145);
//  print_float(flat == TinyGPS::GPS_INVALID_F_ANGLE ? TinyGPS::GPS_INVALID_F_ANGLE : TinyGPS::course_to(flat, flon, LONDON_LAT, LONDON_LON), TinyGPS::GPS_INVALID_F_ANGLE, 7, 2,160);
//  print_str(flat == TinyGPS::GPS_INVALID_F_ANGLE ? "*** " : TinyGPS::cardinal(TinyGPS::course_to(flat, flon, LONDON_LAT, LONDON_LON)), 6,175);

//  gps.stats(&chars, &sentences, &failed);
//  print_int(chars, 0xFFFFFFFF, 6,190);
//  print_int(sentences, 0xFFFFFFFF, 10,205);
//  print_int(failed, 0xFFFFFFFF, 9,220);
//  Serial.println();
  
  smartdelay(1000);
}

static void smartdelay(unsigned long ms)
{
  unsigned long start = millis();
  do 
  {
    while (ss.available())
      gps.encode(ss.read());
  } while (millis() - start < ms);
}

static void print_float(float val, float invalid, int len, int prec, int pos)
{
  if (val == invalid)
  {
    while (len-- > 1)
      Serial.print('*');
    Serial.print(' ');
  }
  else
  {
    Serial.print(val, prec);
    tft.setCursor(5, pos);  
    tft.setTextColor(GREEN,BLACK);  tft.setTextSize(2);
    tft.print(val, prec);

    
    int vi = abs((int)val);
    int flen = prec + (val < 0.0 ? 2 : 1); // . and -
    flen += vi >= 1000 ? 4 : vi >= 100 ? 3 : vi >= 10 ? 2 : 1;
    for (int i=flen; i<len; ++i)
      Serial.print(' ');
  }
  smartdelay(0);
}

static void print_int(unsigned long val, unsigned long invalid, int len, int pos)
{
  char sz[32];
  if (val == invalid)
    strcpy(sz, "*******");
  else
    sprintf(sz, "%ld", val);
  sz[len] = 0;
  for (int i=strlen(sz); i<len; ++i)
    sz[i] = ' ';
  if (len > 0) 
    sz[len-1] = ' ';
    Serial.print(sz);
    tft.setCursor(5, pos);  
    tft.setTextColor(GREEN,BLACK);  tft.setTextSize(2);
    tft.println(sz);
  
  smartdelay(0);
}

static void print_date(TinyGPS &gps, int pos)
{
  int year;
  byte month, day, hour, minute, second, hundredths;
  unsigned long age;
  gps.crack_datetime(&year, &month, &day, &hour, &minute, &second, &hundredths, &age);
  if (age == TinyGPS::GPS_INVALID_AGE){
    Serial.print("********** ******** ");
    tft.setCursor(5, pos);  
    tft.setTextColor(GREEN,BLACK);  tft.setTextSize(2);
    tft.print("Noch kein Datum");
  }
  else
  {
    char sz[32];
    sprintf(sz, "%02d/%02d/%02d %02d:%02d:%02d ",
        month, day, year, hour, minute, second);
    Serial.print(sz);
    tft.setCursor(5, pos);  
    tft.setTextColor(GREEN,BLACK);  tft.setTextSize(2);
    tft.print(sz);
  }
  print_int(age, TinyGPS::GPS_INVALID_AGE, 5, 5);
  smartdelay(0);
}

static void print_str(const char *str, int len, int pos)
{
  int slen = strlen(str);
  for (int i=0; i<len; ++i)
    {
    Serial.print(i<slen ? str[i] : ' ');

    tft.setCursor(5,pos);  
    tft.setTextColor(GREEN,BLACK);  tft.setTextSize(2);
    tft.print(i<slen ? str[i] : ' ');
    }
    
  smartdelay(0);
}


unsigned long testFillScreen() {
  unsigned long start = micros();
  tft.fillScreen(BLACK);
  tft.fillScreen(RED);
  tft.fillScreen(GREEN);
  tft.fillScreen(BLUE);
  tft.fillScreen(BLACK);
  return micros() - start;
}

Das war leider kein guter Kauf, denn alle auf dem TFT-Display beschrifteten Pins werden auch benötigt, es bleibt kaum ein Pin frei.

Displays mit serieller Schnittstelle sind da besser. Allerdings fressen Fontdefinitionen viel Speicher. Das kann man dann beispielsweise mit Nextion-Displays umgehen, weil da das Display sowas speichert.

Das hört sich interessant an, hat dann aber auch seinen Preis.

Wie sieht es aus, mit einer Art Sharing?
Also, dass man zwischen zwei Geräten hin und her schaltet.
Sobald ein Block von der seriellen Schnittstelle gelesen ist, die Pins
umschalten zum Display. Das wäre dann ein größerer Hardwareaufwand…

Ich hätte hier auch noch einen DUE habe mich bis jetzt aber noch nicht
dran getraut, wegen der 3.3V. Da weiß ich nicht wie und was da eventuell
5V dran hängt.
Wenn ich jetzt z.B. das Display an einen DUE hänge, kann es dann sein,
dass das Display 5V an einen 3.3V Eingang schickt?

Ich habe meinen Fehlkauf an einen Mega2560 gehängt, der hat genügend Pins und Speicher für Fonts. Da die Displays meist mit 3,3 V funktionieren, sollte man es auch mit einem Due zum Laufen bringen. Aber natürlich nicht mit Draufstecken und geht.