impostare pin alto quando supero una soglia

Io ho preso il suo codice messo per ultimo al post #20, poi se tu hai un altro codice aggiornato/differente non so

Standardoil:
Dopo la facile battuta, scusami
Sicuro dei tempi?
Lui usa double, qualche dubbio magari....

Double? Dove? usa unsigned long int per tempo_1 _2 e _3. i double sono per la pressione

Il post 20 è proprio quello dove fa le letture consecutive, non il salvataggio che consigli tu, e aveva appena corretto i tempi, perché glielo avevamo indicato
Fino al 19 i suoi codici postati nemmeno compilavano, causa uno scambio maiuscola con minuscola, e questo la dice tutta
Inoltre è dal post 14 che non fa prove sul campo, il suo programma del post 14 ha i tempi come dicevo io....
Edit, anzi peggio, consigliato insigned int long, usa int..

In buona sostanza io a questo problema non ci bado più, troppo fumo e troppa confusione
I miei consigli li ho dati....

Non vorrei che ibnterpretassi questo scambio di messaggi come arrogante o polemico, ma non capisco e visto che evidentemente mi sta sfuggendo qualcosa insisto, questo è il codice copiato dal post #20

#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 Fiamma = 0;
int j = 1;
int intervallo_1 = 100;
int intervallo_2 = 1000;
int intervallo_3 = 500;
double m = 0;
double Pressione_oggi = 0;
double costante_correttiva = 0;
double Volt_P = 0;
double Press = 0;
unsigned long int Tempo_1 = 0;
unsigned long int Tempo_2 = 0;
unsigned long int 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 N = 10;
   double k = 0;
   double m = 0;
   double Costante_correttiva = 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,0>20);  // ventola disattivata
  digitalWrite(r_1,0>20);//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);
 
 
  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.
     
     //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();
   
    m = media(Volt_P, Pressione_oggi);
    j++;
  }while(j<11);
 
     
  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
    }
}

Io vedo una sola lettura dentro l'if temporizzato a 1 secondo, dove sono le altre letture a cui fai riferimento?
Poi convengo con te che se l'OP non fa prove e non da feedback stiamo parlando tra noi di un problema non nostro :slight_smile:

Nessuna polemica, o altra forma di attrito tra noi due, figuriamoci. Ti stimo, anzi.
Lo OP ha generato, magari involontariamente, un bel po' di confusione
Al post 20, poche righe dopo il programma che hai citato, mette altre due righe, li non fa quello che gli hai consigliato.
Inoltre lamenta problemi che non può avere, su programmi che non può aver compilato, dopo aver volutamente ignorato errori di compilazione
In buona sostanza, e senza voler dare giudizi personali, si comporta da "confusionario tocascione" come chiamo io chi non riesce a fare chiarezza e modifica (tocca) cose che non capisce
O questa cosa cambia o io non ci sono

digitalWrite(v,0>20);  // ventola disattivata
  digitalWrite(r_1,0>20);//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

prima di sviscerarti con millis() devi aggiustare parti basilari del codice...
questo appena riportato non ha un "senso logico", o meglio potrebbe avere un senso logico diversamente interpretato dal compilatore!!!
il digitalWrite() presuppone due valori ovvero il pin sul quale andare in low o high, ed appunto il valore da attribuirgli. E' possibile sostituire questi valori con numeri, ma parliamo di 0=LOW ed 1=HIGH (non so se vale anche per false = LOW e true = HIGH, poi verifico buttando giù un semplice blink e ti farò sapere).

Tornando a quello che tu scrivi nel codice ha proprio dell'incomprensibile perché 0>20 sarà sempre ed esclusivamente false.
ed ancora Fiamma<1 //controllo ... :o non pensare che eseguirà quel digitalWrite() solo se Fiamma<1 perché non è così. Per quel che riesco ad intuire il compilatore, in quel caso, restituisce true o false attribuendo HIGH o LOW.
I controlli li puoi fare sostanzialmente in due modi: if/else e switch() case n.
credo che sia ben chiaro che non puoi fondere le istruzioni come stai facendo in questo momento.
se proprio vuoi controllare dovresti impostarlo indicativamente così.

switch (Fiamma) {
case 0:
  //in caso di digitalRead(f) = 0
  digitalWrite(r_2, 0); // corrispondente al digitalWrite(r_1, LOW);
  break;
case 1:
  // in caso di digitalRead(f) = 1
  digitalWrite(r_2, 1); //corrispondente al digitalWrite(r_1, HIGH);
  break;
default :
  //qui puoi inserire quello che deve fare se non risponde ai requisiti di case 0 e case 1
  break; //esci dallo switch
}

stessa cosa vale per r_1 e v.

se no anche il semplice debug con i led può essere un problema.

Il led che si accende con LOW è un grave problema. a rischio tanto fumo dall'mcu... ::slight_smile:

Io ti darei un consiglio: visto che (almeno all'esterno) sembra che tu abbia molta confusione sia lato hw (perché, ad esempio, un led che si accende a pin in low, seppure sembra collegato a ground non é un led), sia sw (usare 0>20 come argomento? E avrei altri esempi) credo sia meglio prendere un bel foglio di carta (bello grosso) e una matita (ben appuntita) e scrivere la risposta alle seguenti domande:
1)Cosa voglio fare?
2)Con che hardware? (link a datasheet)
3)Come si usa l'hardware?(studio del datasheet)
4)Dove ho messo un buon libro di C(risposta migliore: ce lo ho di fronte)
Infine inviare il contenuto di tale foglio su questa discussione, aprire il menù file dell'ide e premere su "nuovo".
E insieme si scrive il programma, tenendo sempre presenti le risposte precedenti

miky_police:
prima di sviscerarti con millis() devi aggiustare parti basilari del codice...
questo appena riportato non ha un "senso logico", o meglio potrebbe avere un senso logico diversamente interpretato dal compilatore!!!
il digitalWrite() presuppone due valori ovvero il pin sul quale andare in low o high, ed appunto il valore da attribuirgli. E' possibile sostituire questi valori con numeri, ma parliamo di 0=LOW ed 1=HIGH (non so se vale anche per false = LOW e true = HIGH, poi verifico buttando giù un semplice blink e ti farò sapere).

Tornando a quello che tu scrivi nel codice ha proprio dell'incomprensibile perché 0>20 sarà sempre ed esclusivamente false.

L'uso dell'operatore è perfettamente lecito in quanto darà come risultato true o false che di fatto sono 1 o 0 così come HIGH e LOW (sono tutte etichette ridefinite)
La parte incomprensibile 0>20 è perché l'OP non sa cosa scriverci e ha messo un codice fittizio per evitare l'accensione incondizionata dei dispositivi (ovvero li lascia sempre spenti)

Invece sarebbe interessante te nei sempre accesi....

Si, ma se non si sa nemmeno quale valore ha Fiamma che tipo di debug stiamo facendo??? Nel senso che a Fiamma sicuramente verrà assegnato un valore, ma quant'è non lo sapremo mai... quindi digitalWrite(r_2, Fiamma<1) può essere sempre verificato perché non sappiamo quant'è Fiamma!!!!
PS: fiamma è il valore letto dal sensore collegato sul pin 5, al che mi chiedo. è stata una scelta voluta per avere solo valori 0 e 1 oppure andava messo su un analogico ed effettuare una lettura del tipo

Fiamma = map(analogRead(f),0,1023,min,max)

::slight_smile:
Quindi siamo sicuri che stia interrogando in modo corretto il pin5? abbiamo un'idea di quali valori debba restituire in caso di quesito?
Mi concentro su fiamma perché in base al suo valore dobbiamo pilotare il led(relè)... è inammissibile pretendere di accendere/spegnere un led se non so i valori assumibili da Fiamma... w quindi ripiegare su Fiamma<1...

Attendo chiarimenti dall'OP.. (che non so manco che acronimo è OP :o so solo che è grigorot :smiley: )

fabpolli:
L'uso dell'operatore è perfettamente lecito in quanto darà come risultato true o false che di fatto sono 1 o 0 così come HIGH e LOW (sono tutte etichette ridefinite)
La parte incomprensibile 0>20 è perché l'OP non sa cosa scriverci e ha messo un codice fittizio per evitare l'accensione incondizionata dei dispositivi (ovvero li lascia sempre spenti)

attenzione l'OP aveva precisato che aveva modificato così le due istruzioni perchè al momento non sapeva come scrivere il risultato della lettura sonde :slight_smile:
Al netto di tutta la confusione che comunque regna :smiley:

@miky_police: non sono mai entrato nel merito di come legge i vari sensori e se è giusto o meno, già c'è troppo caos, volevo risolvergli il problema del "blocco" di lettura se usato assieme alla digitalWrite, ma visto che tutto tace dall'interessato non lo sapremo mai forse :slight_smile:

Io per risolvere un problema devo avere tutti i dati ESPLICITI, quelli impliciti li calcolo ed infine risolvo.
Che lui dice che prima funzionava non vuol dire che lo faceva lecitamente... ::slight_smile:
Poi sicuramente il digitalRead() restituisce sicuramente 0 fino a letture se non ricordo male di 3v o giù di lì, e superiori a questa soglia fino a 5v restituisce 1...
può accadere che ci sia fiamma, ma il sensore non supera la soglia dei 3v (quindi ritorna 0 =LOW) e noi usciamo pazzi per niente...
PS: low=spento. se fa il contrario è un problema...

Mi faccio vivo solo adesso perché ho finito poco fa di sistemare il listato, adesso gira tutto alla perfezione senza inceppi di varia natura.

l'ho anche ordinato per bene, evitando di lavorare nelle funzioni millis().

Il led era collegato bene, e in realtà avevo solo confuso i commenti, ma stando a casa senza circuito ho difeso il commento sbagliato.

non so che dirvi, Grazie a chi si è espresso in merito anche se alla fine ho risolto tutto da solo :slight_smile: ahahahahah, al prossimo posto cercherò di essere più chiaro, ho riguardato adesso alcune cose, effettivamente mi scuso per la confusione.

direi che il post si può chiudere qua.

Magari se tu almeno in questo post (era già stato chiesto nell'altro) mettessi il codice definitivo che ha risolto a beneficio di chi potrebbe trovarsi nella medesima situazione non sarebbe cosa sbagliata, anzi...

Purtroppo non posso, mi sono già beccato una ramanzina dal relatore per aver messo l'intero codice,anche se errato, sul forum perché c'è dietro un progetto importante.

Un perfetto esempio dell'utilizzo della filosofia dell'opensource insomma...

lo so mi dispiace tantissimo e mi sento anche mortificato ma io che ci posso fare?

non posso postare il listato ma per risolvere il problema delle termocoppie basta dare il valore letto dalle termocoppie a due variabili separate e usare un ciclo if al posto di mettere la condizione nel digitalWrite, io ho risolto cosi.

le due variabili che ricevono lo stessa lettura servono perché con una controllo l'if e con l'altra stampo a video

Questo me lo ritrovo in ditta
Vabbe' tanti ne ho....
Conferma la prima legge di Nelson, che sono io:
Dare retta agli ingannieri è tempo perso e sudore sprecato...

grigorot:
anche se alla fine ho risolto tutto da solo :slight_smile: ahahahahah

che capacità di autoilludersi....
bisognerebbe scoprire chi è il suo relatore, e "relazionarlo"...