Ciao a tutti! Sto avendo problemi a far funzionare il codice del mio progetto. Problemi sicuramente legati alla mia ignoranza in fatto di programmazione.
Inizio dal principio e vi spiego la situazione. Ho un tornio un po' datato e ho la necessità di campionare delle temperature e la velocità di rotazione del mandrino. L'intervallo di velocità del mandrino è tra i 100rpm e i 1000rpm. Inoltre, sto sfruttando una scheda MEGA2560.
La questione temperatura l'ho risolta acquistando quattro termocoppie di tipo K con relativo circuito integrato (MAX6675), ne ho scritto il codice che campiona ogni 2 secondi e poi sfrutto un programma esterno (CoolTerm) per il salvataggio dei dati su file .txt (che poi vado ad aprire in excel).
I problemi nascono nel momento in cui voglio andare a misurare il tempo che ci impiega il mandrino a compiere una rotazione. Per fare tale misurazione ho acquistato un sensore ad effetto hall (KY-003).
Ho sfruttato uno sketch trovato su questo forum per far campionare il sensore. Tale sketch sfrutta la funzione interrupt, la quale mi sta dando parecchie rogne.
di seguito il codice:
#include <max6675.h>
int ktcSO1 = 6; //Termocoppia #3
int ktcSO2 = 7; //Termocoppia #2
int ktcSO3 = 8; //Termocoppia #1
int ktcSO4 = 5; //Termocoppia #4
int ktcCS = 9;
int ktcCLK = 10;
unsigned long time;
unsigned long Tempo_Attuale;
unsigned long Tempo_Precedente;
unsigned long Tempo_Evento;
MAX6675 ktc1(ktcCLK, ktcCS, ktcSO1);
MAX6675 ktc2(ktcCLK, ktcCS, ktcSO2);
MAX6675 ktc3(ktcCLK, ktcCS, ktcSO3);
MAX6675 ktc4(ktcCLK, ktcCS, ktcSO4);
void setup() {
attachInterrupt(0,Evento,RISING); //mettere su pin digitale 2
Serial.begin(9600);
Serial.print("Tempo");
Serial.print(" "); //questo spazio mi serve per facilitare il passaggio da txt a excel
Serial.print("Termo#1");
Serial.print(" ");
Serial.print("Termo#2");
Serial.print(" ");
Serial.print("Termo#3");
Serial.print(" ");
Serial.print("Termo#4");
Serial.print(" ");
Serial.println("Millisecondi/Giro");
}
void loop() {
time = millis();
Tempo_Attuale = millis();
Serial.print(time/1000);
Serial.print(" ");
Serial.print(ktc3.readCelsius());
Serial.print(" ");
Serial.print(ktc2.readCelsius());
Serial.print(" ");
Serial.print(ktc1.readCelsius());
Serial.print(" ");
Serial.println(ktc4.readCelsius());
delay(2000);
}
void Evento(){
Tempo_Evento = Tempo_Attuale - Tempo_Precedente;
Serial.println(Tempo_Evento);
Tempo_Precedente = Tempo_Attuale;
}
Giustamente, quando viene "attivato" il void Evento(), questo mi va a bloccare momentaneamente il loop per stampare sul seriale il valore Tempo_Evento. Però questa cosa non mi va bene, perché mi va a "sporcare" l'acquisizione dei dati di temperatura. Vi faccio un'esempio:
12 25.50 26.25 26.25 27.25
14 25.50 26.00 26.25 27.25
4272
17 25.75 25.75 2136
25.75 27.25
0
0
19 25.50 26.00 26.00 27.00
2137
In rosso ho segnato il tempo trascorso dall'avvio, in verde la temperatura delle quattro termocoppie e in nero i valori relativi al tempo al giro (il fatto che siano molto differenti tra di loro è semplicemente perchè al momento sto provando il sensore "manualmente", facendoci passare vicino un magnete).
In primo luogo ho problemi legati all'interruzione del mio loop, come al tempo 17. in secondo luogo, ho problemi legati all'acquisizione del tempo del giro al di sotto dei 2000 ms, infatti mi restituisce un valore pari a 0.
Arrivato a questo punto ho provato una seconda strada, ovvero utilizzare un costrutto IF-ELSE:
#include <max6675.h>
int ktcSO1 = 6; //Termocoppia #3
int ktcSO2 = 7; //Termocoppia #2
int ktcSO3 = 8; //Termocoppia #1
int ktcSO4 = 5; //Termocoppia #4
int ktcCS = 9;
int ktcCLK = 10;
unsigned long time;
unsigned long Tempo_Attuale;
unsigned long Tempo_Precedente;
int hall = 2; //pin sensore effetto hall
int val; //numeric variable
MAX6675 ktc1(ktcCLK, ktcCS, ktcSO1);
MAX6675 ktc2(ktcCLK, ktcCS, ktcSO2);
MAX6675 ktc3(ktcCLK, ktcCS, ktcSO3);
MAX6675 ktc4(ktcCLK, ktcCS, ktcSO4);
void setup() {
Serial.begin(9600);
pinMode(hall, INPUT); //settaggio sensore effetto hall
Serial.print("Tempo");
Serial.print(" ");
Serial.print("Termo#1");
Serial.print(" ");
Serial.print("Termo#2");
Serial.print(" ");
Serial.print("Termo#3");
Serial.print(" ");
Serial.print("Termo#4");
Serial.print(" ");
Serial.println("Millisecondi/Giro");
}
void loop() {
val = digitalRead(hall);
time = millis();
Tempo_Attuale = millis();
if (val == HIGH){
Serial.print(time/1000);
Serial.print(" ");
Serial.print(ktc3.readCelsius());
Serial.print(" ");
Serial.print(ktc2.readCelsius());
Serial.print(" ");
Serial.print(ktc1.readCelsius());
Serial.print(" ");
Serial.print(ktc4.readCelsius());
Serial.print(" ");
Serial.println("none");
}
else{
Serial.print(time/1000);
Serial.print(" ");
Serial.print(ktc3.readCelsius());
Serial.print(" ");
Serial.print(ktc2.readCelsius());
Serial.print(" ");
Serial.print(ktc1.readCelsius());
Serial.print(" ");
Serial.print(ktc4.readCelsius());
Serial.print(" ");
Serial.println(Tempo_Attuale-Tempo_Precedente);
Tempo_Precedente = Tempo_Attuale;
}
//delay(2000);
}
Pure in questo caso mi sono ritrovato ad avere problemi: se mantengo il delay(2000), quello che ottengo è la perdita del'acquisizione del segnale del contagiri. Se invece tolgo il delay, il sistema delle termocoppie non è più in grado campionare le temperature, segnandomi sempre la temperatura ambiente.
Ipotizzando che il primo codice che ho scritto sia quello più corretto, vorrei sapere se è possibile modificare o riscrivere il codice in maniera tale che la funzione che calcola il tempo al giro, non vada ad interrompere quella del campionamento delle temperature.
Un'altra possibile idea che mi era venuta prevedeva di salvare i valori del tempo per giro in un array per poi stamparli a schermo una volta finito il mio ciclo di campionamento. Però avrei la necessità di far girare il tornio per 45minuti a 1000Giri al minuto, e dubito fortemente si possano tenere in memoria 45000 valori.
Chiedo scusa per la lunghezza del post, ma ho cercato di spiegare tutto quanto per dare un quadro completo della situazione. O perlomeno è quello che ho cercato di fare. Ovviamente qualsiasi consiglio anche per quello che sto considerando corretto nel codice è ben accetto.
Ringrazio anticipatamente chiunque si prenderà la briga di leggere.