Library Konflikt

Hallo zusammen

Ich bin bereits im Besitz einer funktionierenden Arduino Tanküberwachung mit Ultraschall und GSM Übermittlung. Nun möchte ich mit einem Nextion Touch Display ein wenig “Kosmetik” in die Anlage verbauen.

Leider befürchte ich, dass die jeweiligen Librarys, also <Nextion.h> und <GSM.h> in Konflikt miteinander stehen, da ich folgende Fehlermeldung bekomme:

libraries\SoftwareSerial\SoftwareSerial.cpp.o (symbol from plugin): In function `SoftwareSerial::read()’:

(.text+0x0): multiple definition of `__vector_9’

libraries\GSM\GSM3SoftSerial.cpp.o (symbol from plugin):(.text+0x0): first defined here

c:/users/ pc weiss/appdata/local/arduino15/packages/arduino/tools/avr-gcc/4.9.2-atmel3.5.4-arduino2/bin/…/lib/gcc/avr/4.9.2/…/…/…/…/avr/bin/ld.exe: Disabling relaxation: it will not work with multiple definitions

libraries\SoftwareSerial\SoftwareSerial.cpp.o (symbol from plugin): In function `SoftwareSerial::read()’:

(.text+0x0): multiple definition of `__vector_11’

libraries\GSM\GSM3SoftSerial.cpp.o (symbol from plugin):(.text+0x0): first defined here

libraries\SoftwareSerial\SoftwareSerial.cpp.o (symbol from plugin): In function `SoftwareSerial::read()’:

(.text+0x0): multiple definition of `__vector_10’

libraries\GSM\GSM3SoftSerial.cpp.o (symbol from plugin):(.text+0x0): first defined here

collect2.exe: error: ld returned 1 exit status

Mehrere Bibliotheken wurden für “SD.h” gefunden
Benutzt: C:\Users\PC weiss\Desktop\Mikrocontroller\Arduino Sketche\libraries\SD
Nicht benutzt: C:\Program Files (x86)\Arduino\libraries\SD
exit status 1
Fehler beim Kompilieren für das Board Arduino Mega ADK.

Könnte man diesen Fehler einfach beheben oder kann ich mein Vorhaben wieder vergessen?

Danke und ein Gruss

Tja ....

Arduino Modell geheim
Skript geheim
Also wie so oft....

Da hilft nur die Glaskugel.......
Und die sagt: Zwei Programmteile verwenden PCINTs

Übrigens:
Wenn du dich mal kundig gemacht hättest, was _vector_10 und _vector_11 auf deinem µC anstellen, dann hätte dich das auch auf diese Erkenntnis gebracht.
Zumindest hätte das sein können.
Ohne Garantie.
Aber ich würde es mir wünschen.

Du hast GSM3SoftSerial und SoftwareSerial eingebunden, die vergleichbare Funktionen haben. Du kannst nur eine davon nutzen. Dazu mußt Du Dein Programm entsprechend umschreiben.

Natürlich könntest Du auch die Bibliotheken entwirren, dürfte nach meiner Vermutung aber der schwierigere Weg sein.

Arduino Modell geheim

Steht drin… ganz unten. Aber grundsätzlich habe ich ein UNO verbaut, kein Mega.

Skript geheim

Im Prinzip läuft es schon nicht, wenn ich nur die beiden Librarys deklariere. Darum dachte ich, dass es mein Code vermutlich nicht einmal benötigt. Aber falls dem nicht so ist, liefere ich den Skript natürlich:

#include <Nextion.h>
#include <GSM.h>

#define triggerPIN 12
#define echoPIN 13

GSM gsmAccess;
GSM_SMS sms;
char Natel[20] = "XXXXXXXXXX";
char senderNumber[20];

int returnCM;



void setup() {

Serial.begin(9600);  // Start serial comunication at baud=9600

// I am going to change the Serial baud to a faster rate.
// The reason is that the slider have a glitch when we try to read it's value.
// One way to solve it was to increase the speed of the serial port.

delay(500);  // This dalay is just in case the nextion display didn't start yet, to be sure it will receive the following command.

Serial.print("baud=115200");  // Set new baud rate of nextion to 115200, but it's temporal. Next time nextion is power on,
                                // it will retore to default baud of 9600.
                                // To take effect, make sure to reboot the arduino (reseting arduino is not enough).
                                // If you want to change the default baud, send the command as "bauds=115200", instead of "baud=115200".
                                // If you change the default baud, everytime the nextion is power ON is going to have that baud rate, and
                                // would not be necessery to set the baud on the setup anymore.
Serial.write(0xff);  // We always have to send this three lines after each command sent to nextion.
Serial.write(0xff);
Serial.write(0xff);

Serial.end();  // End the serial comunication of baud=9600

Serial.begin(115200);  // Start serial comunication at baud=115200




pinMode(triggerPIN, OUTPUT);         
pinMode(echoPIN,INPUT_PULLUP);


// connection state
boolean notConnected = true;

// Start GSM connection
  while (notConnected) {
    if(gsmAccess.begin() == GSM_READY) {
      notConnected = false;
    } else {
      delay(1000);
    }
  }
}



void loop() {


int distanzCM = 0;                     
unsigned long schallMS = 0;
distanzCM = 0;
schallMS = 0;

// Clear the trigger pin
digitalWrite(triggerPIN, LOW);
delayMicroseconds(100);

// Sets the trigger on HIGH state for 10 micro seconds
digitalWrite(triggerPIN, HIGH);
delayMicroseconds(100);
digitalWrite(triggerPIN, LOW);

// wait for the echo
schallMS = pulseIn(echoPIN, HIGH);

// Calculating the distance
distanzCM = (((int)schallMS * 0.034) / 2);

//Hier Kalibrieren mit den Schallwerten und 0 bis 100 Prozent
int Aussentankstand = map(distanzCM,37,175,100,0);

//Kein überlauf der Werte
if(distanzCM < 37){
  Aussentankstand = 100;
  }
if(distanzCM > 175){
  Aussentankstand = 0;
  }




//Anzeige der US Werte im Display

//Zisterne
Serial.print("j1.val=");
Serial.print(Aussentankstand);
  Serial.write(0xff);
  Serial.write(0xff);
  Serial.write(0xff);

Serial.print("n1.val=");
Serial.print(Aussentankstand);
  Serial.write(0xff);
  Serial.write(0xff);
  Serial.write(0xff);

//Regenwasser
//Serial.print("j0.val=");
//Serial.print(Regenwasserstand);
//  Serial.write(0xff);
//  Serial.write(0xff);
//  Serial.write(0xff);

//Serial.print("n0.val=");
//Serial.print(Regenwasserstand);
//  Serial.write(0xff);
//  Serial.write(0xff);
//  Serial.write(0xff);




//SMS Empfänger und Sender
char smsInhalt;
char natel[20] = "XXXXXXXXXX";
char txtMsg1[50] = "Der Wasserstand der Zisterne betraegt ";
char txtMsg2[10] = " Prozent";

  // Wenn SMS verfügbar sind...()
if (sms.available()) {
//  Serial.print("Nachricht erhalten: ");

  // Lese SMS bytes und zeige sie...
  while (smsInhalt = sms.read()) {
//    Serial.println(smsInhalt);
//    Serial.println("Ende der Mitteilung");
    if(smsInhalt == '1'){
    sms.beginSMS(natel);
    sms.print(txtMsg1);
    sms.print(Aussentankstand);
    sms.print(txtMsg2);
    sms.endSMS();
//    Serial.println("Antwort verschickt");
    }
  }

//  SMS aus Speicher löschen
  sms.flush();
//  Serial.println("Mitteilung wurde gelöscht");
}
delay(1000);

}

Wenn du dich mal kundig gemacht hättest, was _vector_10 und _vector_11 auf deinem µC anstellen, dann hätte dich das auch auf diese Erkenntnis gebracht.

Wisst ihr, ich in ein einfacher Elektriker, welcher nur Hobbymässig mit dem Arduino hantiert. Natürlich habe ich Google nach Rat gefragt, aber ich verstehe die Antworten oftmals nicht. Geschweige denn was PCINTs sind. Ich bin ehrlich gesagt schon froh, wenn mein US Sensor mit meinem LCD harmoniert…

…darum:

Wenn sich das Problem auf relativ einfache Art und Weise beheben lässt, wäre ich um Mithilfe dankbar. Falls es ein eher schwieriger Eingriff ist und sehr gute Programmierkosten benötigt, möchte ich euch nicht weiter damit belästigen und werde mein Vorhaben beenden.

Clud:
Wisst ihr, ich in ein einfacher Elektriker, welcher nur Hobbymässig mit dem Arduino hantiert. Natürlich habe ich Google nach Rat gefragt, aber ich verstehe die Antworten oftmals nicht. Geschweige denn was PCINTs sind. Ich bin ehrlich gesagt schon froh, wenn mein US Sensor mit meinem LCD harmoniert...

Nimm Combie nicht so ernst. Ich habe kürzlich beschlossen, seine Postings einfach zu ignorieren. Für meinen Geschmack lässt der zu oft dämliches Zeug vom Stapel.

Clud:
... und werde mein Vorhaben beenden.

Tu das nicht! Wenn man ein paar (meist nicht allzu hohe) Hürden überwunden hat, kann man mit Arduino einen Haufen Spaß haben. Wenn Du Hilfe benötigst, kommst Du einfach hier vorbei.

Gruß

Gregor

Deinen Fehler wird so bestimmt keiner finden, wenn du uns einen unfertigen Sketch lieferst.

Dieser hat sicher gleich mehrere Probleme:
Fehlende Libraries, mehrfach definierte serielle Schnittstelle mit unterschiedlichen Geschwindigkeiten, Nutzung der seriellen Schnittstelle durch das Nextion, dadurch können Probleme mit USB auftreten.
Mehr kann ich aktuell nicht sehen.

Aber grundsätzlich habe ich ein UNO verbaut, kein Mega.

Aber doch kein ADK ?

Aber dass du einen UNO verwenden willst, machts nicht besser.

Jetzt, da ich dein Script sehe, sehe ich auch dass du den seriellen Port mehrfach verwenden willst.
A: über USB fpr die PC Verbindung
B: Das Display
Das wird nichts.
Die Serielle ist kein Bus.
Das GSM Dingen nutzt sein eigenes SoftSerial

Der Mega hat 4 Serielle, wäre also viel besser dafür geeignet.
Nextion verwendet per default Serial2 des Mega
Und da wird es dann wohl angeschlossen sein müssen.

Jetzt zum eigentlichen Fehler:
Offensichtlich, werden 2 Varianten von SoftwareSerial geladen.
Einmal von der Nextion Lib und einmal von der GSM Lib
Und das geht schief, weil beide die betreffenden PCINT Vectoren belegen.

Zumindest Nextion kann man das abgewöhnen. Braucht SoftwareSerial offensichtlich nur für Debuggingzwecke, oder so…

Nötige Änderung in NexUpload.cpp
Original:

#include "NexUpload.h"
#include <SoftwareSerial.h>


//#define USE_SOFTWARE_SERIAL
#ifdef USE_SOFTWARE_SERIAL
SoftwareSerial dbSerial(3, 2); /* RX:D3, TX:D2 */
#define DEBUG_SERIAL_ENABLE
#endif

Besser:

#include "NexUpload.h"

//#define USE_SOFTWARE_SERIAL
#ifdef USE_SOFTWARE_SERIAL
#include <SoftwareSerial.h>
SoftwareSerial dbSerial(3, 2); /* RX:D3, TX:D2 */
#define DEBUG_SERIAL_ENABLE
#endif

So wird SoftwareSerial nur kompiliert, wenn Bedarf besteht.

Geschweige denn was PCINTs sind.

Das lernst du, sobald du dich kundig machen möchtest.
Wäre jetzt eine Gelegenheit…

Darum dachte ich, dass es mein Code vermutlich nicht einmal benötigt. Aber falls dem nicht so ist, liefere ich den Skript natürlich:

Nur so habe ich die Chance gegenzuprüfen, was du da überhaupt tust.
Ohne Code geht in der Regel nichts.

Und “Nichts” Hilfe möchtest du ja nicht…

Aber dass du einen UNO verwenden willst, machts nicht besser.

Ich habe in der Anlage ein UNO verbaut, kann aber auch auf ein Mega aufrüsten. Gehen wir ab sofort davon aus, dass es sich um ein Mega handelt.

Jetzt, da ich dein Script sehe, sehe ich auch dass du den seriellen Port mehrfach verwenden willst.
A: über USB fpr die PC Verbindung

Hmm also zum PC brauche ich eigentlich keine Verbindung… Ich habe es nur zur Fehlerbehebung verwendet. Ich habe den Sketch zwecks besserer Übersicht ein wenig vereinfacht:

#include <Nextion.h>
#include <GSM.h>

GSM gsmAccess;
GSM_SMS sms;

char Natel[20] = "0788888888";
char senderNumber[20];

void setup() {

//Hier wird die baudrate auf 115200 festgelegt. Mit 9600 funktioniert das Nextion Display nicht (?)
Serial2.begin(9600); 
delay(500);
Serial2.print("baud=115200");
Serial2.write(0xff);
Serial2.write(0xff);
Serial2.write(0xff);
Serial2.end();
Serial2.begin(115200);

// connection state
boolean notConnected = true;

// Start GSM connection
  while (notConnected) {
    if(gsmAccess.begin() == GSM_READY) {
      notConnected = false;
    } else {
      delay(1000);
    }
  }
}

void loop() {

int Messwert;

//Anzeige der Werte im Display
Serial2.print("j1.val=");
Serial2.print(Messwert);
Serial2.write(0xff);
Serial2.write(0xff);
Serial2.write(0xff);

//SMS Empfänger und Sender
char smsInhalt;
char natel[20] = "0788888888";

  // Wenn SMS verfügbar sind...()
if (sms.available()) {
  // Lese SMS bytes und zeige sie...
  while (smsInhalt = sms.read()) {
    if(smsInhalt == '1'){
    sms.beginSMS(natel);
    sms.print(Messwert);
    sms.endSMS();
    }
  }
  sms.flush();
  }
}

Nextion verwendet per default Serial2 des Mega und da wird es dann wohl angeschlossen sein müssen.

Das konnte ich beim UNO mit der entsprechenden Änderung in der nexConfig beheben. Aber gehen wir von nun an wie gesagt von einem Mega aus.

Nötige Änderung in NexUpload.cpp

Ich habe die Änderung vorgenommen, jedoch erhalte ich dennoch diverse Fehlermeldungen. Ich habe sie mal herauskopiert:

Build-Optionen wurden verändert, alles wird neu kompiliert
Archiving built core (caching) in: C:\Users\C\AppData\Local\Temp\arduino_cache_519088\core\core_arduino_avr_megaADK_adb03cacc50c3a38bfa699cb08aa3e7f.a
libraries\SoftwareSerial\SoftwareSerial.cpp.o (symbol from plugin): In function `SoftwareSerial::read()':

(.text+0x0): multiple definition of `__vector_9'

libraries\GSM\GSM3SoftSerial.cpp.o (symbol from plugin):(.text+0x0): first defined here

c:/users/pc weiss/appdata/local/arduino15/packages/arduino/tools/avr-gcc/4.9.2-atmel3.5.4-arduino2/bin/../lib/gcc/avr/4.9.2/../../../../avr/bin/ld.exe: Disabling relaxation: it will not work with multiple definitions

libraries\SoftwareSerial\SoftwareSerial.cpp.o (symbol from plugin): In function `SoftwareSerial::read()':

(.text+0x0): multiple definition of `__vector_11'

libraries\GSM\GSM3SoftSerial.cpp.o (symbol from plugin):(.text+0x0): first defined here

libraries\SoftwareSerial\SoftwareSerial.cpp.o (symbol from plugin): In function `SoftwareSerial::read()':

(.text+0x0): multiple definition of `__vector_10'

libraries\GSM\GSM3SoftSerial.cpp.o (symbol from plugin):(.text+0x0): first defined here

collect2.exe: error: ld returned 1 exit status

Mehrere Bibliotheken wurden für "SD.h" gefunden
 Benutzt: C:\Users\PC weiss\Desktop\Mikrocontroller\Arduino Sketche\libraries\SD
 Nicht benutzt: C:\Program Files (x86)\Arduino\libraries\SD
exit status 1
Fehler beim Kompilieren für das Board Arduino Mega ADK.

Fehlende Libraries, mehrfach definierte serielle Schnittstelle mit unterschiedlichen Geschwindigkeiten, Nutzung der seriellen Schnittstelle durch das Nextion, dadurch können Probleme mit USB auftreten.

Fehlen denn hier Libraries? Das GSM Modul, sowie das Nextion Display funktionieren einzeln wunderbar. Nur halt beide zusammen möchten nicht.

Ich stehe hier ein wenig auf dem Schlauch. Wie gesagt bin ich ein absoluter Anfänger und verstehe vermutlich diverse Dinge in Sachen serieller Schnittstelle noch nicht. Ich war der Meinung, dass zb beim Mega 4 verschiedene Dinge über die jeweiligen TX/RX mit dem Arduino kommunizieren können, oder nicht? Beim UNO hingegen nur eines. Und da erscheint es mir irgendwie nicht logisch, dass ein GSM Shield und ein Nextion nicht separat über die jeweiligen Schnittstellen mit dem Arduino kommunizieren können. Ihr müsst mein Unwissen entschuldigen, ich muss mich in dieser Sache irgendwie einlesen…

Schade…

Ich habe die Änderung vorgenommen,

Da dürfte was schief gelaufen sein.

Denn dann darf die Meldung mit libraries\SoftwareSerial\SoftwareSerial.cpp.o nicht mehr kommen!
Bei mir ist es so.

Ich hoffe, dass dir klar ist, dass ich nur einen Ausschnitt der Datei gezeigt habe, oder?

Ich war der Meinung, dass zb beim Mega 4 verschiedene Dinge über die jeweiligen TX/RX mit dem Arduino kommunizieren können, oder nicht?

Grundsätzlich hättest du ja recht.

Aber die GSM Lib, welche du verwendest, besteht auf SoftSerial.
Eine einfache Alternative sehe ich nicht.
Natürlich könntest du die Lib verändern…

Also:
Die PC Verbindung über Serial (upload und debug)
Nextion über einen weiteren HardwareSerial, z.B. Serial2, wie schon als Default vorgegeben
Und das GSM Dingen halt über SoftSerial, weils erst mal nicht anders geht.

Diesmal hat es geklappt. Leider springt mir nun der US Sensor nicht mehr an. Ich werde mich genauer mit der Sache auseinandersetzen.

Vielen Dank für die Hilfe. Ich werde mich später noch einmal melden. Für heute ist genug für mich.....

Mehrere Bibliotheken können gleiche Hardware nutzen wollen, Timer sind gerne davon betroffen. Manche Bibliotheken lassen eine Konfiguration der zu verwenden Hardware zu, um Konflikte zu vermeiden.