Go Down

Topic: impostare pin alto quando supero una soglia (Read 1 time) previous topic - next topic

grigorot

Code: [Select]
#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:

Code: [Select]
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).


fabpolli

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è

grigorot

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

fabpolli

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 :) 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é.

fabpolli

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

Patrick_M

#5
May 17, 2018, 03:12 pm Last Edit: May 17, 2018, 03:23 pm by Patrick_M
uno dei problemi che sicuramente hai è questo

edit
eliminato tutto :D
il compilatore è più sveglio di me :)
per inserire (lo sketch) il programma, dall'IDE clicca modifica, clicca copia per il forum poi vieni qui e incolla nel tuo post (ctrl+v) ;)

fabpolli

uno dei problemi che sicuramente hai è questo
Code: [Select]

#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)
Code: [Select]

  pinMode(r_1, OUTPUT); //rele 1

diventa
Code: [Select]

  pinMode(r_1, OUTA0UT); //rele 1

Ma anche no! Puoi provare tu stesso con questo codice:
Code: [Select]

#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

fabpolli


grigorot

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 ;)

grigorot

#9
May 17, 2018, 03:34 pm Last Edit: May 17, 2018, 03:38 pm by grigorot
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)

fabpolli

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.

grigorot

#11
May 17, 2018, 03:55 pm Last Edit: May 17, 2018, 04:01 pm by grigorot
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

Standardoil

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
Prima legge di Nelson (che sono io):
A parità di risultato
maggiore è il pensiero,
minore il lavoro.
Quindi prima di fare pensa!

Silente

... 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)?

grigorot

#14
May 17, 2018, 06:17 pm Last Edit: May 17, 2018, 06:24 pm by grigorot
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 :)

Code: [Select]


#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
    }
}








Code: [Select]



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

Code: [Select]

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:

Code: [Select]

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

Go Up