collect2exe-Fehlermeldung beim Kompilieren

Hallo an alle,

hab da jetzt neuerdings ein weiteres Problem mit Fehlermeldungen. Kann mir jemand folgenden Fehler mal genauer erklären?

collect2.exe: error: ld returned 5 exit status

Binde ich eine Bibliothek ein und erstelle eine Klasse

#include <LiquidCrystal_I2C.h> //neu eingebundene Bibliothek
#include <Wire.h>

LiquidCrystal_I2C lcd(0x27,20,4); //Klasse erstellen und Adresse setzen, 20 Zeichen, 4 Zeilen

nach Probe ist hier noch alles in Ordnung

dann sollte folgendes kommen:

void setup() {

lcd.init(); //initialisiere LCD

//Gib einen Text aufs Display
lcd.print(“Hallo Welt!”);

}

aber schon die Probe nach einfügen der init-Zeile bringt den oben erwähnten Fehler. Das kuriose ist: manchmal funktioniert es aber dann wird nur der erste Buschstabe ausgegeben, in diesem Falle das H.

Den kompletten Sketch-Code nebst Fehlermeldung werde ich heute Abend mal posten, ich kann hier im mom nix kopieren, Arbeitsplatzrechner :wink:
Aber vl hat ja schon jemand eine Idee.
Danke Euch schonmal
Gruß Steffen

Win XP?
Dann: collect2.exe: error: ld returned 5 exit status - Deutsch - Arduino Forum

Yapp, WinXP, die IDE1.8.1 drauf...wieso hat man das noch nicht geändert? Auf einem Win10 Rechner habe ich es noch nicht probiert...mache ich aber heute noch.

Danke erstmal. :slight_smile:

Input_de:
WinXP, die IDE1.8.1 drauf...wieso hat man das noch nicht geändert?

Stimmt, warum hast du das noch nicht geändert?

wieso hat man das noch nicht geändert?

Das kann ICH dir nicht beantworten.
Die Arduino Entwickler haben darauf keinen Einfluss.
Also ist die Frage hier sowieso ganz falsch!

Atmel liefert die "Tool Chain".
Da wäre die Frage gut aufgehoben....

Und ob die nochmal das tote Pferd satteln, möchte ich stark bezweifeln.

Ok, OK...das war eine falsche Tonwahl, sorry...
Nun, ich dachte ja, daß man den bekannten Fehler in höheren Versionen behebt...ich wußte ja nicht, daß das von Atmel kommt. Und zum Problem selbst, ich hab die Vorschläge ausprobiert, sogar die Datei der russischen Seite versucht aber es hat nichts gebracht. Also Back to the Roots und eine frühere Version versuchen.
Trotzdem, hat jemand eine Idee, was die Ursache sein könnte? Ich mein, der Fehler besteht ja nicht erst seit gestern. Mal abgesehen vom etwas antiquierten Betriebssystem. Ich versuche es jedenfalls auch mal auf Win10 und berichte dann.
Danke für Eure Nachsicht :wink:
Steffen

Guten Abend gewünscht!

Es gibt einige Neuigkeiten zum Thema: also, auf WinXP funktioniert nur die IDE 1.0.6 einigermaßen zufriedenstellend. Au meinem Win10-Rechner kann ich ebenfalls nur die 1.0.6 verwenden, obwohl die 1.8.1 beim Kompilieren keine Fehler meldet. Allerdings “verschluckt” der kompilierte Code so ziemlich alles, was ausgegeben werden soll(VFD 4 Zeilen a 20 Zeichen, kompatibel zu allen üblichen LCD’s, angesteuert durch I²C-Bus): Zeile 0 soll der Wochentag stehen…korrekt mit der 1.0.6, die 1.8.1 gibt nur den 1. Buchstaben aus, Zeile 1, in die Mitte gerückt mit setCursor(x,x), das Datum im Format Tag. Monat(sname) Jahr, auch hier "verschluckt die 1.8.1 den Rest außer dem 1. Zeichen. Zeile 2 scrollt von rechts nach links(Ticker), im mom nur einen frei gewählten Text, funktioniert mit der 1.0.6 Problemlos, 1.8.1 gibt wieder nur das erste Zeichen und scrollt nicht. Zeile 3 wie gehabt, dort soll die Zeit stehen hh:mm:ss…aber wieder nur die erste Zahl, der Rest “verschluckt”.

Aber OK, mit der 1.0.6 funzt es ja. Was ich allerdings gern machen würde: statt des freien Textes würde ich gern Umweltdaten scrollen, Temperatur, Luftdruck und Feuchte. Diese Programmteile sind schon fertig, allerdings in meinem Beispiel noch nicht eingebunden. Kann mir jemand einen Tip geben, wie ich eine Variable, und eine solche wird es ja werden Temp…Druck…Humidy, in die Textausgabezeile bringe, so daß diese, wie der Text, gescrollt wird?

Hier der Scetch:

  // Einstellen der Uhrzeit der RTC DS3231
   // Die aktuelle Zeit wird in Setup() eingestellt und beim Start übertragen
   // Dazu wird das Programm ca. 4 Sekunden vor der eingestellten Zeit übersetzt 
   // und übertragen, dann ist es rechtzeitig fertig
   //
   // Matthias Busse 7.11.2016 Version 1.0
   // modifiziert von Steffen Kaersten 03.02.2017 für ein VFD-Display von Noritake
   // 20 Zeichen je 4 Zeilen
   
   // einbinden der Bibliotheken
      #include <LiquidCrystal_I2C.h>
      #include <Wire.h>
   
   // Definitionen
      #define LEDLINE 20
     #define DS3231_ADDRESSE 0x68 //Adresse der RTC 0x68
       
// setzen der LCD-Adresse auf 0x27, 40 Zeichen, 4 Zeilen
   LiquidCrystal_I2C lcd(0x27,20,4);

// definieren der Scrollgeschwindigkeiten Zeile 0...4
   const int ledScrollSpeed[4]={500,500,125,500};

// definieren der Scrollrichtung ('true' bedeutet von rechts nsch links, 'false' in die andere Richtung)
  const boolean ledScrollDir[4]={true,true,true,true};

    char charAt(char *text, int pos)
    
// scrolling-logic coded here
{
 if (pos<LEDLINE) return ' '; // scroll in
 else if (pos>=LEDLINE && pos<LEDLINE+strlen(text))
   return text[pos-LEDLINE]; // scroll text
 else return ' ';  // scroll out

}
void task_text(char *text, byte line)

// scroll the LED lines
{
 char currenttext[LEDLINE+1];
 static unsigned long nextscroll[4];
 static int positionCounter[4];
 int i;
 if (millis()>nextscroll[line])
 {
   nextscroll[line]=millis()+ledScrollSpeed[line];

   for (i=0;i<LEDLINE;i++)
     currenttext[i]=charAt(text,positionCounter[line]+i);
   currenttext[LEDLINE]=0;   

   lcd.setCursor(0,line);
   lcd.print(currenttext);
   if (ledScrollDir[line])
   {
     positionCounter[line]++;
     if (positionCounter[line]==strlen(text)+LEDLINE) positionCounter[line]=0;
   } 
   else 
   {
     positionCounter[line]--;
     if (positionCounter[line]<0) positionCounter[line]=strlen(text)+LEDLINE-1;
   } 
 }
}

   void setup() {
     lcd.init();
     Wire.begin();
     
       // aktuelle Zeit    sek  min std wt tag mon jahr
     //einstellenDS3231zeit(00, 27, 14, 1, 30,  01,  17);
              
     }
     
   void loop() {
     
           // Scroll text in Zeile 2
              task_text("Das hier scrollt in Zeile-3 und bringt auch einen ueberlangen Text mit :)",2);
  
               zeigeZeit(); // Zeit ausgeben     
  

          // Scroll text in Zeile 1
          //task_text("Zeile-2",1);
     }
    
   void einstellenDS3231zeit(byte sekunde, byte minute, byte stunde, byte wochentag, byte tag, byte monat, byte jahr) {
     // Datum und Uhrzeit einstellen
     Wire.beginTransmission(DS3231_ADDRESSE);
     Wire.write(0);
     Wire.write(decToBcd(sekunde)); // Sekunden einstellen
     Wire.write(decToBcd(minute)); // Minuten einstellen
     Wire.write(decToBcd(stunde));
     Wire.write(decToBcd(wochentag)); 
     Wire.write(decToBcd(tag));
     Wire.write(decToBcd(monat));
     Wire.write(decToBcd(jahr)); // 0...99
     Wire.endTransmission();
   }
   
   void leseDS3231zeit(byte *sekunde, byte *minute,byte *stunde, byte *wochentag, byte *tag, byte *monat, byte *jahr) {
     Wire.beginTransmission(DS3231_ADDRESSE);
     Wire.write(0); // DS3231 Register zu 00h
     Wire.endTransmission();
     Wire.requestFrom(DS3231_ADDRESSE, 7); // 7 Byte Daten vom DS3231 holen
     *sekunde = bcdToDec(Wire.read() & 0x7f);
     *minute = bcdToDec(Wire.read());
     *stunde = bcdToDec(Wire.read() & 0x3f);
     *wochentag = bcdToDec(Wire.read());
     *tag = bcdToDec(Wire.read());
     *monat = bcdToDec(Wire.read());
     *jahr = bcdToDec(Wire.read());
   }
   void zeigeZeit(){
   byte sekunde, minute, stunde, wochentag, tag, monat, jahr;
     leseDS3231zeit(&sekunde, &minute, &stunde, &wochentag, &tag, &monat, &jahr);   // Daten vom DS3231 holen
     
     
     //Wochentagsausgabe
     lcd.setCursor(0,0);
 if (wochentag == 1) {lcd.print("Montag    ");}
  if (wochentag == 2) {lcd.print("Dienstag  ");}
   if (wochentag == 3) {lcd.print("Mittwoch  ");}
    if (wochentag == 4) {lcd.print("Donnerstag");}
   if (wochentag == 5) {lcd.print("Freitag   ");}
 if (wochentag == 6) {lcd.print("Samstag   ");}
if (wochentag == 7) {lcd.print("Sonntag   ");}
  //lcd.clear();
  
    //Curserposition für Datum
lcd.setCursor(3,1);

    // Datumsausgabe
   lcd.print(tag);
   lcd.print(".");
     
     if (monat == 1) { lcd.print("Januar");}
     if (monat == 2) { lcd.print("Februar");}
     if (monat == 3) { lcd.print("März");}
     if (monat == 4) { lcd.print("April");}
     if (monat == 5) { lcd.print("Mai");}
     if (monat == 6) { lcd.print("Juni");}
     if (monat == 7) { lcd.print("Juli");}
     if (monat == 8) { lcd.print("August");}
     if (monat == 9) { lcd.print("September");}
     if (monat == 10) { lcd.print("Oktober");}
     if (monat == 11) { lcd.print("November");}
     if (monat == 12) { lcd.print("Dezember");}
     //lcd.print(monat);
     lcd.print(" 20");
    lcd.print(jahr);
    
              //Cursorposition für Zeit
    lcd.setCursor(12,3);
       if (stunde < 10) { lcd.print("0");}
        lcd.print(stunde, DEC);
         lcd.print(":");
         if (minute < 10) { lcd.print("0");}
       lcd.print(minute, DEC);
      lcd.print(":");
     if (sekunde < 10) { lcd.print("0"); }
   lcd.print(sekunde, DEC);
    
       } byte decToBcd(byte val) {
         
   // Dezimal Zahl zu binary coded decimal (BCD) umwandeln
     return((val/10*16) + (val%10));
   }
   byte bcdToDec(byte val) {
   // BCD (binary coded decimal) in Dezimal Zahl umwandeln
     return((val/16*10) + (val%16));
   }

Dein Code wird von der Bordsoftware verstümmelt.
Bitte setze Deinen Sketch in Codetags (oben links </> im Foreneditor oder [code] davor und [/code] dahinter - ohne die *).
Das kannst Du auch noch nachträglich durch Editieren tun. Bitte mach das, der Sketch ist besser zu lesen, besonders auf mobilen Geräten.

Gruß Tommy

@Input_de,
wie lange bist du schon dabei und hast es immer noch nicht mit den Code-Tags verstanden ?

Sorry, war im Eifer des Gefechts...sollte jetzt lesbar sein.

Gruß Steffen

Da gibt es mehrere Möglichkeiten.

  1. Du setzt den Text zusammen:
// Die Textzeile
char buffer[21];
// die Variable
char zbuf[6];

// evtl. noch auf konstante Länge formatieren
itoa(wert,zbuf,10);

strcpy(buffer,"davor ");
strcat(buffer, zbuf);
strcat(buffer," danach");
  1. Möglichkeit: Du baust einen Platzhalter ein und programmierst eine replace-Funktion.

Für Deine kurzen Texte halte ich Variante 1 für günstiger.

Gruß Tommy

Vielen Dank Tommy, das werde ich ausprobieren. So ähnlich waren meine Gedanken, ich wußte nur nicht genau wie ich das übergeben sollte :slight_smile:

Grüße