libreria Time: problema (link?)

Ciao, gioco con l'Arduino da un po' ed ho già utilizzato diverse librerie esterne, senza particolari problemi.

Con la libreria "Time" e con la "dateTime" succede che l'editor non riconosca la libreria come tale (la riga "#include <Time.h>" rimane tutta nera) e che le chiamate alla libreria stessa non vengano eseguite, anche se la compilazione arriva alla fine senza errori.

Ho provato su 2 macchine con windows XP ed una con Ubuntu, stessa storia... :frowning:

E' capitato anche a voi ? Come l'avete risolta ?

mandaci per favore il pogramma.
Ciao Uwe

non ce n'è bisogno, il problema si verifica SEMPRE... ecco un esempio scritto al volo:

#include <Matrix.h>
#include <Time.h>
#include <TimeAlarms.h>
#include <EEPROM.h>

void somesubr() {
// some action
}

void setup() {
Alarm.timerRepeat(1,somesubr);
}
// ...

La libreria "Time" e la "TimeAlarm" sembra che non siano riconosciute dall'ambiente... le loro funzioni vengono compilate, ma non eseguite, per questo ho pensato ad un problema di linking.

Il fatto che le librerie restano nere é giusto; con Matrix e EEprom sono arancioni perché sono keywords (esiste una funzione in qualche libreria che ha lo stesso nome e percui é evidenziata)
Per la cronaca: se scrivi #include"nomelibreria.h" diventa il nome della libreria blu.
Spiega meglio cosa intendi con: "e che le chiamate alla libreria stessa non vengano eseguite, anche se la compilazione arriva alla fine senza errori."

Ciao Uwe

Facendo riferimento all'esempio. significa che la "Alarm.timerRepeat" non viene chiamata, e quindi la "somesubr()" non viene eseguita.

Ecco il sorgente incriminato...

/*
Stove's regulator - Regolatore di ventilazione per stufe ad accumulo. - 08/2010 MfN
legge la temperatura dei fumi tramite termocoppia (MAX6675)
in base alla temperatura, regola la ventilazione tramite servo
visualizza sul display temperatura e c.
*/

#include <LiquidCrystal.h>
#include <MAX6675.h>
#include <buttons.h>
#include <Time.h>
#include <TimeAlarms.h>
#include <Servo.h>

LiquidCrystal lcd(2, 3, 4, 5, 6, 7);

int CS = 8; // CS pin on MAX6675
int SO = 9; // SO pin of MAX6675
int SCK = 10; // SCK pin of MAX6675
int units = 1; // Units to readout temp (0 = ?F, 1 = ?C)
float error = 0.0; // Temperature compensation error
float temp = 0.0; // Temperature output variable

// Initialize the MAX6675 Library for our chip
MAX6675 temp0(CS,SO,SCK,units,error);

Button A;
Button B;

// posizioni servo
Servo serv1;
int MAX_chiuso=180;
int MAX_aperto=1;

// soglie temperatura in gradi centigradi

int temp_lim0=90; // tutto chiuso (perc_ap0)
int temp_lim1=100; //
int temp_lim2=200;
int temp_lim3=300;
int temp_lim4=400; // tutto aperto

float perc_ap;
int perc_ap0=0; // tutto chiuso
int perc_ap1=40;
int perc_ap2=75;
int perc_ap3=85;
int perc_ap4=100; // tutto aperto

int alfa; //angolo di lavoro
int stato;
int pos;
float pos_r;
float incr_r = 0.1;
int avvio; // stato del regolatore: 1=avvio stufa, 0= normale

void leggi_temp() {
float t;
t = temp0.read_temp(9); // Read the temp 5 times and return the average value to the var
Serial.println(t);
temp = t;
}

void setup() {
A.assign(12); // inizializzazione pulsanti
B.assign(13);
A.setMode(4);
B.setMode(4);
Serial.begin(115200);
serv1.attach(11,1000,2050);
Alarm.timerRepeat(1, leggi_temp);
Serial.println("set");
lcd.begin(16, 2);
}

void loop() {
lcd.setCursor(0, 1);
// temp = temp0.read_temp(9); // Read the temp 5 times and return the average value to the var
Serial.println("loop");
if(temp == -1) { // If there is an error with the TC, temperature will be -1
lcd.setCursor(0, 1);
lcd.print("Errore termocoppia !"); // Temperature is -1 and there is a thermocouple error
}
else {
lcd.setCursor(0, 1);
lcd.print("C ");
lcd.print( temp ); // Print the temperature to Serial
}
delay(500);
// calcolo posizione
alfa=MAX_aperto-MAX_chiuso; //angolo operativo
if (temp<temp_lim0) {
perc_ap=0;
}

....

Come vedi, ho messo degli output sulla seriale per tracciare il running su Arduino: viene eseguita la "setup", la "loop" è eseguita regolarmente, ma la "leggi_temp" non viene eseguita MAI... ma viene compilata regolarmente, e gli eventuali errori sintattici vengono rilevati dal compilatore...

(non è codice definitivo, ne manca ancora un bel pezzo...)

ciao Nebula58

Dopo un bel po di ricerca e prove sono riuscito ad capire il problema. avrei potuto trovarlo piú velocemente leggendo il readmy.txt compreso nella libreria TimeAlarm.
lí dice riferendosi all esempio di codice compreso nel readme:
"Note that the loop code calls Alarm.delay(1000) - Alarm.delay must be used instead of the usual arduino delay function because the alarms are serviced in the Alarm.delay method.
Failing to regularly call Alarm.delay will result in the alarms not being triggered so always use Alarm.delay instead of delay in sketches that use the Alarms library."

In poche parole non puoi usare la funzione delay() ma devi usare la funzione Alarm.delay();.
La funzione Alarm.delay();deve essere presente nella funzione Loop() senó non funziona il Alarm.timerRepeat(). Facendo delle prove ho apurato che basta anche un tempo di 1 milisecondo.

Questo codice funziona:

#include <Time.h>
#include <TimeAlarms.h>
int i=0;

void setup() {
 Serial.begin(9600);  
 Alarm.timerRepeat( 1 , leggi_temp );
   Serial.println("set"); 
   leggi_temp();
}

void loop() { 
 Serial.print(i++); 
 Serial.println(" loop"); 
 Alarm.delay(500); 
 //delay(500); 
}

void leggi_temp() {
  Serial.println("temperatura"); 
}

Vorrei correggerti alcuni punti per non lasciare dubbi sia a Te che ad altri che hanno problemi simili:

"Con la libreria "Time" e con la "dateTime" succede che l'editor non riconosca la libreria come tale (la riga "#include <Time.h>" rimane tutta nera) e che le chiamate alla libreria stessa non vengano eseguite, anche se la compilazione arriva alla fine senza errori."

Che la libreria viene visualizzato nel editore del IDE in nero é normale.
Le chiamate alla libreria vengono eseguite. mancava la funzione Alarm.delay() che é necessaria.

"La libreria "Time" e la "TimeAlarm" sembra che non siano riconosciute dall'ambiente... le loro funzioni vengono compilate, ma non eseguite, per questo ho pensato ad un problema di linking. "
Sono riconosciute dal IDE senó darebbe errore durante la compilazione (verify)
"Linking" non é un termine usato in questo ambito intendevi l' "include"? :wink:

Ciao Uwe

Grazie mille, Uwe.
Effettivamente la chiamata alla Alarm.delay(x) non veniva eseguita...

Resta un mistero il perchè la <Time.h> non venga riconosciuta come libreria ed il testo rimanga in nero, sembrerebbe un bug della libreria, anche se minore...

Grazie ancora, ciao

Nebula58

Non so perché <Time.h> non viene evidenziata; ma funziona.
Ciao Uwe