impostare pin alto quando supero una soglia

#include <Thermocouple.h>
#include <SPI.h>

#define l 4 //collegato al pin 8 led
#define f 5 //collegato al pin 9 sensore di fiamma
#define v 3 // collegato al pin 10 ventola
#define r_1 6 // collegato al pin 11 rele 1
#define r_2 7 // collegato al pin 12 rele 2
#define P A0  //collegato al pin A0 sensore pin pressione da 1.2 MPa

// per il collegamento delle termocoppie, collegare i pin SO1 e SO2 insieme al pin 12 mentre i pin SCK1 e SCK2 insieme al pin 13
// i pin CS si collegano separati e vanno come descritto nel define

#define T_2 10 //termocoppia 2 al pin 10  termocoppia radiatore 
#define T_1 9  //termocoppia 1 al pin 9   termocoppia punto caldo

Thermocouple T1 = Thermocouple(T_1);    
Thermocouple T2 = Thermocouple(T_2);

// dichiarazione variabili e costanti
int intervallo_1 = 100;
int intervallo_2 = 1000;
int intervallo_3 = 500;
int Fiamma = 0;
double Volt_P = 0;
double Press = 0;
double Tempo_1 = 0;
double Tempo_2 = 0;
double Tempo_3 = 0;
double T_C = 0; //variabile di controllo temperatura per periferiche (Ventola e relè)
  
void setup() {

  pinMode(r_1,OUTPUT);  //rele 1
  pinMode(r_2,OUTPUT); // rele 2
  pinMode(l,OUTPUT); //led
  pinMode(v,OUTPUT); //ventola
  pinMode(f,INPUT);  //sensore di fiamma
  pinMode(P,INPUT);  //sensore di pressione da 1.2MPa
  
  Serial.begin(9600);
  delay(500);
}

void loop() {
        
 if (millis() - Tempo_1 > intervallo_1){
 
  Tempo_1 = millis();
  Fiamma = digitalRead(f);
     
  digitalWrite(v,T_C>30);//Ventola spenta
  digitalWrite(r_1,T_C>30);//disattivo il relè, il cavo nero della pompa va al NC1, mentre il jumper nero va alla COM1
  digitalWrite(r_2,Fiamma<1);
  digitalWrite(l,1);//imposto il led a stato nullo 
  
  if(Fiamma==0){
    digitalWrite(l,0); //accendo il led
  }
 }

 if(millis() - Tempo_2 > intervallo_2){
   
    Tempo_2 = millis();

    Serial.println("");
    Serial.println("TEMP_RADIATORE = "); 
    Serial.println(T2.readC());
    Serial.println("TEMP_PUNTO_CALDO = ");
    Serial.println(T1.readC()); 
   
 }

 if(millis() - Tempo_3 > intervallo_3){
  
  Tempo_3 = millis();
    
  Volt_P = analogRead(P);//leggo il sensore di pressione
  Volt_P = ((Volt_P*5.0)/1024.0);
  Press = (5*((Volt_P-0.5))*0.10);// pressione in MPa

  Serial.println("Pressione in MPa");
  Serial.println(Press);

 }
}


void displayTemp(float fTemp) {
    if (fTemp < 0.0) {
        Serial.println("Open thermocouple circuit");
    }
    else {
        Serial.print(fTemp, 0);
        Serial.println("\260F");    //octal 260 = degree symbol
    }
}

Ciao a tutti, vi metto il codice in alto cosi che possiate vederlo, lo scopo di questo codice è quello di rilevare la temperatura, la pressione ed eventualmente la presenza di una fiamma, con la funzione millis() e con altri vostri suggerimenti sono riuscito a fare in modo che la rilevazione dei dati sia continua, adesso ho un altro problema:

quando cerco di impostare il valore della ventola alto insieme a quello dell relè, la termocoppia che gli associo inizia a segnarmi sempre la stessa temperatura

esempio:

digitalWrite(v,T2.readC()>30);//Ventola spenta
         digitalWrite(r_1,T2.readC()>30);//disattivo il relè, il cavo nero della pompa va al NC1, mentre il jumper nero va alla COM1

// se metto T2.readC() la termocoppia 2, inizia a segnarmi sempre lo stesso valore di temperatura senza variazioni

avete un idea del perchè?

(uso sempre una scheda Arduino uno).

Il relé è già collegato al pin? Se si, prova a scollegarlo e a sostituirlo con un led e vedere se il problema continua a presentarsi, potrebbe essere un problema legato al relè

il relè è collegato al pin come anche la ventola, quindi secondo te è un problema di disturbo dato dal relè e dalla ventola?

Direi relé, per toglierci il dubbio scollega entrambe i dispositivi, sostituiscili con due led e verifica, se tutto funziona colleghi la ventola e riprovi, se non funziona.. è lei :slight_smile: se funziona la scolleghi e colleghi il relé se non funziona allora è il relé, se presi da soli funzionano ma con entrambe i dispositivi hai problemi puoi provare a mettere un attesa (Es 500ms o adirittura 1 sec per provare) tra l'accensione della ventola e l'accensione del relé.

Ah mi raccomando la resistenza tra led e pin di Arduino!

uno dei problemi che sicuramente hai è questo

edit
eliminato tutto :smiley:
il compilatore è più sveglio di me :slight_smile:

Patrick_M:
uno dei problemi che sicuramente hai è questo

#define P A0  //collegato al pin A0 sensore pin pressione da 1.2 MPa

qui tu stai dicendo: ogni volta che il precompilatore (o come si chiama) trova il caratteremaiuscolo "P"
lo deve sostituire con A0
quindi questa riga ( e tutte le altre)

  pinMode(r_1, OUTPUT); //rele 1

diventa

  pinMode(r_1, OUTA0UT); //rele 1

Ma anche no! Puoi provare tu stesso con questo codice:

#define P A0
void setup() {
  // put your setup code here, to run once:
  pinMode(10, OUTPUT);
}

void loop() {
  // put your main code here, to run repeatedly:

}

e vedrai che compila senza problemi

Arrivato tardi :slight_smile:

eh infatti il problema non è ciò che dichiaro nel #define ahahah, provvedo subito a staccare ventola e relè e a mettere i led con la loro resistenza :wink:

anche se stacco ventola e relè, e metto due led al loro posto la temperatura mi si blocca, devo provare a mettere un delay?

ho messo la dicitura T2.readC() ad un solo led e adesso mi trovo con un led acceso e con la temperatura letta dalla termocoppia bloccata sui 29°C, (ho abbassato la soglia a 20°C per far accendere il led)

non credo servirebbe, prova a fare così, quando leggi le due sonde invece di mettere il valore letto in output sulla seriale mettilo in una variabile e stampa quest'ultima sulla seriale e poi usa la stessa variabile all'interno delle digitalWrite per accendere o spegnere i due dispositivi.

ci stavo già pensando, adesso scrivo e riporto.

Edit, anche se sposto le letture delle termocoppie su altre variabili e immetto il nome della variabile nel digitalWrite e nell serialprint, la termocoppia non mi trasmette un segnale variabile, continua rimanere fissa sull ultima temperatura letta prima che io apra il monitor seriale

Come fai a sapere che è l'ultima letta prima di aprire la seriale?
Aprire la seriale resetta arduino, non esiste più l'ultima letta
Che comunque non è quello che dicevi prima
Fai così:
Metti schema e programma aggiornati, con l'occasione metti a posto i commenti, che cosi inducono solo confusione

… Inoltre a me fa strano che l’alzata di un pin non collegato al sensore faccia bloccare la lettura del sensore stesso. Siamo sicuri che i risultato della lettura non significhi “errore”, e che il sensore non abbia bisogno di tempo per cambiare temperatura (insomma, se fa freddo e accendo la caldaia da qui a fare automaticamente caldo qualche ora ci passa)?

uhmm non credo che il ragionamento regga, in quanto la termocoppia incriminata per il momento non è collegata a nulla, e in più le termocoppie hanno tempi di risposta brevi, infatti basta toccarla per fargli subito variare l’uscita, detto questo non saprei che errore possa essere.

testando il listato senza collegamento tra alzata del pin e valore termocoppia, riesco a vedere secondo per secondo la temperatura che varia quando metto la termocoppia su una piccola fiamma o anche semplicemente se la tengo stretta nella mano.

cosa che non accade quando lego il valore letto dalla termo coppia alla alzata dei due pin.

vi metto il listato aggiornato qui sotto :slight_smile:

#include <Thermocouple.h>
#include <SPI.h>

#define l 4 //collegato al pin 4 led
#define f 5 //collegato al pin 5 sensore di fiamma
#define v 3 // collegato al pin 3 ventola
#define r_1 6 // collegato al pin 6 rele 1
#define r_2 7 // collegato al pin 7 rele 2
#define P A0  //collegato al pin A0 sensore pin pressione da 1.2 MPa

// per il collegamento delle termocoppie, collegare i pin SO1 e SO2 insieme al pin 12 mentre i pin SCK1 e SCK2 insieme al pin 13
// i pin CS si collegano separati e vanno come descritto nel define

#define T_2 10 //termocoppia 2 al pin 10  termocoppia radiatore 
#define T_1 9  //termocoppia 1 al pin 9   termocoppia punto caldo

Thermocouple T1 = Thermocouple(T_1); //leggo il pin 9    
Thermocouple T2 = Thermocouple(T_2); //leggo il pin 10

// dichiarazione variabili e costanti
int intervallo_1 = 100;
int intervallo_2 = 1000;
int intervallo_3 = 500;
int Fiamma = 0;
double m = 0;
double Pressione_oggi = 0;
double costante_correttiva = 0;
double Volt_P = 0;
double Press = 0;
double Tempo_1 = 0;
double Tempo_2 = 0;
double Tempo_3 = 0;
  
void setup() {

  pinMode(r_1,OUTPUT);  //rele 1
  pinMode(r_2,OUTPUT); // rele 2
  pinMode(l,OUTPUT); //led
  pinMode(v,OUTPUT); //ventola
  pinMode(f,INPUT);  //sensore di fiamma
  pinMode(P,INPUT);  //sensore di pressione da 1.2MPa
  
  Serial.begin(9600);
  delay(500);
}




double Media(double Volt_P,double Pressione_oggi){
   int i = 0;
   int k = 0;
   int N = 10;
   double m = 0;

   Costante_correttiva = ((Pressione_oggi/(Volt_P - 0.5))*0.001); // calcolo il valore della 
  //costante correttiva da mettere nella formula per il calcolo della Pressione associato
  //alla variabile Press 

  //calcolo una media su 10 valori per avere un valore poco impreciso
  //da mettere nel calcolo della Pressione associato alla variabile
  //Press
    
  for(i=0; i<N; i++){
    k += costante_correttiva; 
  }
  
  m = k/N; 

  Serial.println("costante da mettere:");
  Serial.println(m);
   
  return m;  
}




void loop() {
  
  if (millis() - Tempo_1 > intervallo_1){
 
  Tempo_1 = millis();
  
  Fiamma = digitalRead(f);
     
  digitalWrite(v,(?)>20);  //cosa devo mettere? ventola disattivata
  digitalWrite(r_1,(?)>20);//cosa devo mettere? disattivo il relè (il cavo nero della pompa va al NC1, mentre il jumper nero va alla COM1)
  digitalWrite(r_2,Fiamma<1); //controllo il sensore di fiamma e se è basso(fiamma accesa) allora scatta il relè
  digitalWrite(l,1);          //imposto il led a stato nullo 
  
  if(Fiamma==0){
    digitalWrite(l,0); //accendo il led
  }
 }

 if(millis() - Tempo_2 > intervallo_2){
   // stampo sulla porta seriale i valori letti dalla termocoppia 
   // uso un altra funzione millis() perchè necessito di un tempo di campionamento
   // diverso da quello della prima millis()
   
    Tempo_2 = millis();

    Serial.println("");
    Serial.println("TEMP_RADIATORE = "); 
    Serial.println(T2.readC());
    Serial.println("TEMP_PUNTO_CALDO = ");
    Serial.println(T1.readC()); 
   
 }

 
 if(millis() - Tempo_3 > intervallo_3){
  //uso un' altra funzione millis per campionare i valori letti dal sensore di pressione
  //uso una terza funzione millis() per tempi di campionamento diversi.
  Tempo_3 = millis();
  Volt_P = analogRead(P);//leggo il sensore di pressione
  Volt_P = ((Volt_P*5.0)/1024.0);
  
  //leggo da tastiera il valore della pressione atmosferica giornaliera in Pa
  Serial.println("Scrivi il valore della Pressione atmosferica di ogg in [Pa]:");
  Pressione_oggi = Serial.read();


  do{
     // in questo ciclo voglio legger una sola volta e all'inizio del programma 
     //il valore della media da mettere come costante correttiva per avere la lettura
     //della pressione prossimo per eccesso o difetto a quella atmosferica. 
    int j = 1;
    m = media(Volt_P, Pressione_oggi);
    j++;
  }while(j=1);
     
  Press = (m*(Volt_P - 0.5))*(1);// leggo il valore della pressione in MPa, la costante non influeza 
  //le eventuali fluttuazioni di pressione 
 
  Serial.println("Pressione in MPa");
  Serial.println(Press);
 }
}


void displayTemp(float fTemp) {
    if (fTemp < 0.0) {
        Serial.println("Open thermocouple circuit");
    }
    else {
        Serial.print(fTemp, 0);
        Serial.println("\260F");    //octal 260 = degree symbol
    }
}
digitalWrite(v,(?)>20);  //cosa devo mettere? ventola disattivata
digitalWrite(r_1,(?)>20);//cosa devo mettere?

// ho messo il (?) perché non so cosa fare ahah

piccolo particolare, ho lasciato tutta l’attrezzatura in laboratorio, quindi per il momento non posso testare eventuali listati.

e stavo pensando, se al posto di scrivere

digitalWrite(v,T2.redaC()>20);  //ventola disattivata
digitalWrite(r_1,T2.readC()>20);//

che a quanto pare non mi fa funzionare il listato

mettessi degli if di controllo?

tipo:

if(T2.readC()>20){
//fai azionare la ventole e il relè
}

allora, cominciamo
Tempo 1 2 e 3 devono essere unsigned long int e non double
nella funzione Media fai un calcolo un po' strano, ma tantè
lo schema non lo abbiamo visto
e il programma aggiornato nn lo abbiamo visto, ci ha messo una versioje che tu stesso hai de-commentato e che certamente non compila, scusa ma io capisco solo che hai una grande confusione, ma non posso certo capire altro se non mi metti le cose che ti chiedo
La libreria delle termocoppie, dove sei andato a prenderla?
io nel gestore librerie non la ho trovata, ne ho cercata una, ma è l'ultima volta che cerco qualcosa, che potrebbe essere vecchiotta, sembra comunqye che i convertitori richiadano 220ms per fare la lettura, tu aspetti almeno 220 millisecondi tra una lettura e la successiva, vero? dove hai messo quel ritardo? io nel programma non lo vedo....

non riguarda quello che cerchi ma:

     Pressione_oggi = Serial.read();
     do {
         // in questo ciclo voglio legger una sola volta e all'inizio del programma
         //il valore della media da mettere come costante correttiva per avere la lettura
         //della pressione prossimo per eccesso o difetto a quella atmosferica.
         int j = 1;
         m = media(Volt_P, Pressione_oggi);
         j++;
      } while (j = 1);

qui lanci la funzione media(...)
leggendo 1 sola volta la pressione che quindi calcola un valore che sommi per 10 volte e poi dividi per 10
tra l'altro m è double ma fai una divisione tra interi (k/N)

inoltre se lo vuoi calcolare 1 sola volta mettilo nel setup

quasi assieme :smiley:

Bravo.....
non ti dico quello che ho deciso di non dirti più....
comunque era quello che intendevo con "nella funzione Media fai un calcolo strano...."
molto strano
inoltre la funzione è dichiarate "Media" e usata "media"
quel programma non ha mai compilato, e io rinnovo la mia richiesta:
programma completo e attuale e CHE COMPILI
schema completo
descrizione del problema, non contraddittoria
senza questo.... senza me

https://forum.arduino.cc/index.php?topic=547967.0, (EDIT http://forum.arduino.cc/index.php?topic=445054.0) per la libreria <Thermocouple.h>

il listato l’ho ricontrollato poco fa mettendo la funziona media che voglio che me la calcoli una sola volta, non sapendo che potevo metterla nel setup ho preferito agire in questo modo, non sapevo che le variabili tempo dovessero essere inizializzate con il cast unsigned lon int, rimedio subito.

cos’altro devo mettere?

il listato non l’ho potuto riprovare siccome, come già detto, ho lasciato Arduino uno e tutti i sensori in laboratorio,

ma gli errori che poi mi segnerà il debug, non mi interessano più di tanto, li controllo meglio in seguito, l’importate è che adesso abbia dato un impronta di quello che domani devo modificare e migliorare(funzione media)

double Media(double Volt_P,double Pressione_oggi){
   int i = 0;
   double k = 0;
   int N = 10;
   double m = 0;

   Costante_correttiva = ((Pressione_oggi/(Volt_P - 0.5))*0.001); // calcolo il valore della 
  //costante correttiva da mettere nella formula per il calcolo della Pressione associato
  //alla variabile Press 

  //calcolo una media su 10 valori per avere un valore poco impreciso
  //da mettere nel calcolo della Pressione associato alla variabile
  //Press
    
  for(i=0; i<N; i++){
    k += costante_correttiva; 
  }
  
  m = k/N; 

  Serial.println("costante da mettere:");
  Serial.println(m);
   
  return m;  
}

questa funzione mi calcola una media, non capisco cosa ci sia di strano, ho modificato adesso il cast di k da int a double, ma sono per adesso errori di forma che non mi permettono di capire il perché non possa mettere a pin alto la ventola e il relè quando la temperatura supera una certa soglia

EDIT (Ho appena fatto il debug e avevo degli errori, li ho sistemati e adesso gira, domani vedo se gira bene ahah :slight_smile: )
EDIT(ho capito il problema della funzione media, non è tanto la funzione ma il ciclo do{}while(), che mi legge un solo valore di volt_P e quindi non mi sta restituendo una vera e propria media
dovrei quindi fare do{ … j++;}while(j<=10); se non erro)