Possibile conflitto tra librerie "CapacitiveSensorDue.h" e "WiFi.h"

Buona sera, vi riporto un problema che non riesco a risolvere, premettendo che sono uno smanettone alle prime armi del mondo Arduino, mi ci diverto ma non sempre so quel che faccio !! :smiley: ma si impara anche così !! Detto questo...

Sto cercando di fare un progettino che comprende lo shield wifi per Arduino e volevo aggiungere un tasto a sfioramento e sono incappato nella libreria CapSense, e tra varie prove sono arrivato ad un codice di questo tipo (lievemente ritoccato da me):

#include <CapacitiveSensorDue.h>

CapacitiveSensorDue cs_13_8 = CapacitiveSensorDue(13,8);	

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

void loop()					
{
	long total1 = cs_13_8.read(30);
	Serial.println(total1);
	delay(100);
}

E tutto funziona come credo dovrebbe... ho dei valori, e quando tocco il tasto questi valori cambiano. Il problema è che se aggiungo "#include <WiFi.h>" come nuova libreria, il valore che ho è -1.

Probabilmente è un problema secondario,ma riporto anche questo:
La cosa che reputo ancora più strana è che questo accade anche se lascio la direttiva ma commentata !!!

Però ho appena provato, questo accade se commento con /* / ma non con //, evidentemente con quest'ultimo tipo di commento la libreria viene realmente esclusa, mentre con / */, qualcosa non funziona come dovrebbe...

Mi sapreste dare una soluzione per il primo problema in particolare ? Grazie infinite !

Per il problema di compatibilità fra lib, forse dipende dai pin in uso. La WiFi dovrebbe comunicare tramite ISP, ed il pin D13 sull'Arduino è agganciato al segnale SCK usato nella comunicazione ISP. Quindi devi liberarlo altrimenti le 2 lib vanno in conflitto.

Sul fatto dei commenti non so, dovrebbero essere equivalenti.
Compilando noti differenze nella dimensione dello sketch fra le 2 "versioni"?

Fantastico !!! Hai ragione, ho risolto, ho spostato il 13 sul 10 (sono andato a scalare ma anche il 12 e l'11 mi davano lo stesso problema).

Per il discorso commenti, si, effettivamente compila dimensioni diverse, 3.454 bytes per "//", contro 4.232 bytes, non credo si possa risolvere, ma almeno per le prossime volte mi ricorderò che è meglio usare "//" per testare qualche altro problema simile !

Grazie mille Leo, sei stato molto gentile ! :slight_smile:

Non c'è alcuna differenza tra i due tipo di commento, per cui penso che ci sia qualcosa che non fa solo a te con l'ide in questione e con il compilatore che usi, insomma un caso isolato.

Comunque puoi abilitare la modalità verbose al fine di vedere in quale directory temporanea avviene la compilazione, li dentro ci sarò un file ".cpp" che contiene tutto il codice da compilare, aprendo questo file devi verificare che il commento che ha usato sia ancora presente.

Questo ci permette di capire a chi dare la "colpa", tra preprocessore C e preprocessore arduino.

Ciao.

Baro:
Fantastico !!! Hai ragione, ho risolto, ho spostato il 13 sul 10 (sono andato a scalare ma anche il 12 e l'11 mi davano lo stesso problema).

Perché l'ISP è agganciato a determinati pin dell'Atmega328 che sono mappati sui pin 13/12/11 dell'Arduino :wink:

Per il discorso commenti, si, effettivamente compila dimensioni diverse, 3.454 bytes per "//", contro 4.232 bytes, non credo si possa risolvere, ma almeno per le prossime volte mi ricorderò che è meglio usare "//" per testare qualche altro problema simile !

Che cosa curiosa...
Potresti per favore mettere lo sketch esatto che compila in modo atipico usando i commenti /**/?

Allora, vediamo se riesco a riportare le casistiche in modo ordinato per tentare di soddisfare la mia/nostra curiosità!

Senza il commento alla libreria WiFi.h le dimensioni del file binario dello sketch sono:

Dimensione del file binario dello sketch: 4.252 bytes (su un massimo di 32.256 bytes)

Invece, se tolgo fisicamente la libreria le dimensioni sono :

Dimensione del file binario dello sketch: 3.454 bytes (su un massimo di 32.256 bytes)

Ora riporto i 3 esempi (ne ho aggiunto uno per curiosità):

Esempio 1:

#include <CapacitiveSensorDue.h>

//#include <WiFi.h>

CapacitiveSensorDue cs_13_8 = CapacitiveSensorDue(13,8);	
void setup()					
{
	Serial.begin(9600);
}

void loop()					
{
	long total1 = cs_13_8.read(30);
	Serial.println(total1);
	delay(100);
}

Dimensione del file binario dello sketch: 3.454 bytes (su un massimo di 32.256 bytes)

E il codice da compilare generato nella cartella temp è questo :

#line 1 "CapacitiveSensorDueSketch.ino"
#include <CapacitiveSensorDue.h>

//#include <WiFi.h>

#include "Arduino.h"
void setup();
void loop();
#line 5
CapacitiveSensorDue cs_13_8 = CapacitiveSensorDue(13,8);
void setup()					
{
	Serial.begin(9600);
}
void loop()					
{
	long total1 = cs_13_8.read(30);
	Serial.println(total1);
	delay(100);
}

Esempio 2:

#include <CapacitiveSensorDue.h>
/*
#include <WiFi.h>
*/
CapacitiveSensorDue cs_13_8 = CapacitiveSensorDue(13,8);
void setup()					
{
	Serial.begin(9600);
}
void loop()					
{
	long total1 = cs_13_8.read(30);
	Serial.println(total1);
	delay(100);
}

Dimensione del file binario dello sketch: 4.232 bytes (su un massimo di 32.256 bytes)

E il codice da compilare generato nella cartella temp è questo :

#line 1 "CapacitiveSensorDueSketch.ino"
#include <CapacitiveSensorDue.h>
/*
#include <WiFi.h>
*/
#include "Arduino.h"
void setup();
void loop();
#line 5
CapacitiveSensorDue cs_13_8 = CapacitiveSensorDue(13,8);
void setup()					
{
	Serial.begin(9600);
}
void loop()					
{
	long total1 = cs_13_8.read(30);
	Serial.println(total1);
	delay(100);
}

Esempio 3:

#include <CapacitiveSensorDue.h>

/*#include <WiFi.h>*/

CapacitiveSensorDue cs_13_8 = CapacitiveSensorDue(13,8);
void setup()					
{
	Serial.begin(9600);
}
void loop()					
{
	long total1 = cs_13_8.read(30);
	Serial.println(total1);
	delay(100);
}

Dimensione del file binario dello sketch: 3.454 bytes (su un massimo di 32.256 bytes)

E il codice da compilare generato nella cartella temp è questo :

#line 1 "CapacitiveSensorDueSketch.ino"
#include <CapacitiveSensorDue.h>

/*#include <WiFi.h>*/

#include "Arduino.h"
void setup();
void loop();
#line 5
CapacitiveSensorDue cs_13_8 = CapacitiveSensorDue(13,8);
void setup()					
{
	Serial.begin(9600);
}
void loop()					
{
	long total1 = cs_13_8.read(30);
	Serial.println(total1);
	delay(100);
}

In pratica il commento /**/ utilizzato su righe diverse, non sembra avere effetto sul processore arduino ? Perchè se ho preso il file giusto che viene compilato nella cartella, riporta esattamente quello che ho nello sketch con qualche aggiunta ma senza stravolgere il mio codice. Il file cpp è in una cartella così: "..\utente\appdata\local\temp\bulid....tmp\nomesketch.cpp" ed è l'unico .cpp senza ulteriori estensioni.

Anche il pin 10 è utilizzato dalla ethernet shield come SS (slave selector). Potresti avere comportamenti imprevisti se lo manipoli esternamente.

Ah, allora continuerò a scalare su pin inferiori !!

Grazie

@Baro:
sembra un problema durante il parsing del codice.... perché non provi a segnalare la cosa agli sviluppatori?

Fatto, e grazie ancora per l'aiuto !

sì, probabilmete è il codice che "aggista" gli include portandoli dal .ino al .cpp che non riconosce il /**/

lesto:
sì, probabilmete è il codice che "aggista" gli include portandoli dal .ino al .cpp che non riconosce il /**/

Ho fatto un test con il codice seguente:

/*
#define GENERA_ERRORE
*/

void setup() {
    pinMode(13, OUTPUT);
    digitalWrite(13, HIGH);
}

#ifdef GENERA_ERRORE
void loop() {
}
#endif

Viene generato l'errore per mancanza della funzione loop. Eppure il caso è simile a quello dell'errore di Baro: una direttiva contenuta all'interno di un commento //.
Sembra quindi che il problema dei commenti /
/ riguardi solo le #include, che vengono lette e gestite anche se commentate. Mentre non riguarda ad esempio le #define.

allora da fare la stessa cosa con il loop() in un file .h separato, ed includerlo.. dopo provo, ora sono di fretta

allora ho controllato, facendo:

/* #include "loop.cpp" */
void setup(){
}

e nel loop.cpp

void loop(){
}

senza commeti da un errore di loop() ridichiarato, con da errore di loop() mancante. Quindi la teoria va a farsi benedire.

Però è normale che il cpp contenga tutto: esso è un copia incolla dell'INO con qualche modifica. Poi questo viene compilato, ed è il risultato della compilazione da esaminare.
Se il problema persiste è più un problema/bug di precompilatore che di arduino IDE, poichè il passo successivo è usare il compilatore a l'uppatore senza ulteriori modifiche da parte dell'IDE