UN AIUTO SU QUALCOSA DI SEMPLICE PER VOI :(

Buongiorno a tutti e grazie di cuore in anticipo per tutto ciò che fate per i neofiti come me! :slight_smile:
chiedo scusa in anticipo per il disturbo che potrei creare!
allora, sono dietro a ricreare una serra semplice con ricircolo dell'acqua tramite vasche, riscaldata da una serpentina, con una lampada led e 2 semplici ventole pc il tutto pilotato da un modulo relè a 4 canali ( le tensioni 12-9-220 per gestire tutto non sono un problema e nemmeno il wiring su breadborad o millefori). il mio problema vero e' questo;
ho provato separatamente i vari sketch separatamente ed è tutto perfetto,
adesso facendo un copia incolla delle varie parti su un solo sketch mi ritrovo
-con il serial monitor che legge i valori dell'lm35 una sola volta ( come se non fosse in loop)
-e inoltre non sono sicuro che il processo (pur non dando problemi format) non effettui il ciclo che desidero es:(se lm35 rileva temp <30° accendi il rele serpentina, se lm 35 rileva temp >35° spegni il rele serpentina) - (gli altri rele saranno semplicemente controllati a tempo)
ECCO, praticamente ho un puzzle che sulla carta funziona ma una volta assemblato ha un buco, vi incollo lo skatch completo,
grazie ancora, siete davvero squisiti!!! :wink:

//COMANDI RELATIVI ALL'ACCENDIMENTO E SPEGNIMENTO RELE SERPENTINA (ACCENDI SERPENTINA SE TEMP INFERIORE A 30 GRADI, SPEGNI SE SUPERA I 35
const int VENTOLA =9; //the "s" of relay module attach to    CONTROLLO ACCENDI SPEGNI VENTOLA
const int LUCE =7; //the "s" of relay module attach to       CONTROLLA ACCENDI SPEGNI LUCE
const int POMPA =8; //the "s" of relay module attach to      CONTROLLA ACCENDI SPEGNI POMPA
const int LM35 = 0;       // SENSORE LM35 ATTACCATO SU PIN A0 PER CONTROLLARE LA TEMPERATURA
float celsius = 0;      // temperature variables
float millivolts;             //dichiarazione di variabile tensione (float è per i numeri con la virgola)
int sensor;
const int SERPENTINA = 6;      //RELE 6 CONTROLLA LA SERPENTINA
const int LEDSERPENTINA = 10; //LED CONTROLLO ACCENSIONE SERPENTINA PIN 10 
void setup()
{
Serial.begin(9600);                   // inizializza la comunicazione seriale
// COMUNICAZIONE CON RELE' E ISTRUZIONI ACCENDI SPEGNI VENTOLE LUCI E ACQUA
pinMode(SERPENTINA, OUTPUT); //RELE CONTROLLO SERPENTINA ACCENDI E SPEGNI SECONDO TEMPERATURE LM35
pinMode(LEDSERPENTINA, OUTPUT); // LED CONTROLLO ACCENSIONE SERPENTINA
pinMode(LUCE, OUTPUT); // CONTROLLO ACCENDI SPEGNI LUCE
pinMode(POMPA, OUTPUT); //CONTROLLO ACCENDI SPEGNI POMPA ACQUA
pinMode(VENTOLA, OUTPUT); //CONTROLLO ACCENDI SPEGNI VENTOLA

}
void loop()
{
 digitalWrite(VENTOLA, HIGH); //ACCENDI LA VENTOLA
 delay(60000); //TIENILA ACCESA PER 60000 EQUIVALENTE A UN MINUTO
 digitalWrite(VENTOLA, LOW); //SPEGNI LA VENTOLA
 delay(3540000); //SPEGNI LA VENTOLA PER 3540000 EQUIVALENTE A 59 MINUTI
 digitalWrite(LUCE, HIGH); //ACCENDI LA LUCE 
 delay(64800000); //TIENILA ACCESA PER 64800000 EQUIVALENTE A 18 ORE
 digitalWrite(LUCE, LOW); //SPEGNI LA LUCE
 delay(21600000); //SPEGNI LA LUCE PER 21600000 EQUIVALENTE A 6 ORE
 digitalWrite(POMPA, HIGH); //ACCENDI LA POMPA ACQUA
 delay(600000); //TIENILA ACCESA PER 600000 EQUIVALENTE A 10 MINUTI
 digitalWrite(POMPA, LOW); //SPEGNI LA POMPA ACQUA
 delay(1200000); //SPEGNI LA VENTOLA PER 1200000 EQUIVALENTE A 20 MINUTI
sensor = analogRead(LM35);                     //lettura valore del sensore LM35 messo sull'ingresso analogico A0
millivolts = ( sensor/1023.0)*5000;                           //formula per ottenere la tensione di uscita dell'LM35 in millivolts
celsius =millivolts/10;                             // valore espresso in gradi Celsius (l'out del sensore è 10mv per grado)
Serial.print(celsius);Serial.println(" GRADI");                // stampa su serial monitor del valore di temperatura in gradi Celsius
// accendi il RELE
if (analogRead(LM35)<62) {            // 41 corrisponde a 20°C - 62 SONO CIRCA 30 GRADI -       QUINDI SE LA TEMPERATURA SCENDE SOTTO I 30 ° ACCENDI IL RELE' SERPENTINA
digitalWrite(SERPENTINA , HIGH);
analogWrite(LEDSERPENTINA, 255); }
if (analogRead(LM35)>72) {           // 41 corrisponde a 20°C - 72 SONO CIRCA 35 GRADI         QUINDI SE LA TEMPERATURA OLTREPASSA   I 35 ° SPEGNI IL RELE' SERPENTINA
digitalWrite(SERPENTINA , LOW);
analogWrite(LEDSERPENTINA, 0);}                                         // SE LA TEMPERATURA OLTREPASSA   I 35 SPEGNI IL LED POSIZIONATO IN PIN 10
delay(1000);
}

CARI SALUTI E GRAZIE!!
DIEGO

Semplicemente perchè i tuoi delay(x) bloccano il programma per x tempo

digitalWrite(VENTOLA, HIGH); //Accende la ventola
delay(60000); il programma aspetta 1 minuto qui su questa linea e non fa nient'altro
digitalWrite(VENTOLA, LOW); poi spegne la ventola
delay(3540000); e il programma aspetta su questa riga ancora per 59 min e non fa nient'altro
e così via
...
...
...
il tuo LM35 viene letto ogni 35 ore e 20 min +/-

usa la funzione millis()
http://www.leonardomiliani.com/2013/programmiamo-i-compiti-con-millis/

Ps:

  1. non scrivere maiuscolo, significa urlare
  2. posta il codice usando l'apposito tag </>

Il delay() espetta.

Praticamente fai una lettura di temperatura ca ogni 25ora e mezza e poi riscaldi o non-riscaldi per tutto quel tempo arrostendo o facendo congelare la serra.

Ma nessuno si chiede mai come funzionano le funzioni che usa?

Segui il consiglio di pablos e fai i pilotaggi temporizzati con millis.

Programma dei cicli separati per le ventole, pompa e per le luci.

NON SCRIVERE TUTTO in maiuscolo.

Ciao Uwe

Grazie mille del vostro aiuto, ci proverò al piu presto. Avevo appunto la quasi certezza che il delay di ogni istruzione avrebbe bloccato il ciclo e appunto li mi sono perso. Lavorando fino a tardi dedico la notte a questo progettino e haime capita un calo di attenzione

Buonasera a tutti, sono sempre piu in panne a quanto pare,
non mi capacito di come si riesca a "dettare il tempo con "millis"
ho provato a buttar giu qualche comando ma son sicuro che non funziona e
il mio problema è la logica delle istruzioni di millis, ho letto un po di tutto in merito ma non mi entra proprio in testa :frowning: vi posto quel poco che ho provato prima di impazzire, chiedo perdono e apprezzo molto il Vs aiuto.

const int VENTOLA =9; //the "s" of relay module attach to    CONTROLLO ACCENDI SPEGNI VENTOLA
const int LUCE =7; //the "s" of relay module attach to       CONTROLLA ACCENDI SPEGNI LUCE
const int POMPA =8; //the "s" of relay module attach to      CONTROLLA ACCENDI SPEGNI POMPA
const int SERPENTINA = 6;      //RELE 6 CONTROLLA LA SERPENTINA
const int LEDSERPENTINA = 10; //LED CONTROLLO ACCENSIONE SERPENTINA PIN 10 
const int LM35 = 0;       // SENSORE LM35 ATTACCATO SU PIN A0 PER CONTROLLARE LA TEMPERATURA
float celsius = 0;      // temperature variables
float millivolts;             //dichiarazione di variabile tensione (float è per i numeri con la virgola)
int sensor;


void setup() {
Serial.begin(9600);                   // inizializza la comunicazione seriale
// COMUNICAZIONE CON RELE' E ISTRUZIONI ACCENDI SPEGNI VENTOLE LUCI E ACQUA

pinMode(VENTOLA, OUTPUT); //CONTROLLO ACCENDI SPEGNI VENTOLA
pinMode(LUCE, OUTPUT); // CONTROLLO ACCENDI SPEGNI LUCE
pinMode(POMPA, OUTPUT); //CONTROLLO ACCENDI SPEGNI POMPA ACQUA
pinMode(SERPENTINA, OUTPUT); //RELE CONTROLLO SERPENTINA ACCENDI E SPEGNI SECONDO TEMPERATURE LM35
pinMode(LEDSERPENTINA, OUTPUT); // LED CONTROLLO ACCENSIONE SERPENTINA

VENTOLA = millis();
LUCE = millis();
POMPA = millis();
}

}

void loop() {
  time=millis();

if(time>sensor+1){
VENTOLA = digitalWrite(HIGH);
VENTOLA = millis();
LUCE = digitalWrite(HIGH);
LUCE = millis();
POMPA = digitalWrite(HIGH);
POMPA = millis();
}
if(time>VENTOLA+6000){
VENTOLA = digitalWrite(LOW);
VENTOLA = millis();
}

grazie e cari saluti
Diego

Si, direi che hai molta confusione, si evince da questo che non ha senso:

VENTOLA = digitalWrite(HIGH);
VENTOLA = millis();

Il valore di ritorno delle digitalWrite è ... none ovvero nulla, basta che guardi il reference:

Se VENTOLA deve essere il contatore di millis() relativo alla ventola, beh, lo sai tu magari in base al nome che gli dai, al programma mica gli frega nulla. Ma... VENTOLA è const quindi come potresti assegnargli il valore di millis() che è variabile ed inoltre è long e non int ?
Quindi:

  1. i pin che usi di solito è meglio dichiararli di tipo const byte e poi un nume significativo, magari che inizi con pin, esempio
const byte pinVentola=9;
const byte pinLuce =7;
  1. se devi usare dei contatori che utilizzano i valori della millis() allora questi contatori devono essere unsigned long e il nome anche qui potrebbe essere significativo ed iniziare con una parolina che li identifica, esempio cont come contatore o tmr come timer:
unsigned long tmrVentola=0;
unsigned long tmrLuce=0;

La millis() la usi per "differenza", ovvero QUANDO serve la memorizzi in quelle variabili di tipo unsigned long tmrXXX qualcosa come contVentola. Poi per sapere da quanto tempo hai memorizzato il valore, per differenza lo calcoli:

if(millis()-contVentola> 2000) 
{ // passati 2 secondi
  contVentola=millis();   // riassegno se serve
}

Da questo si evince che facilmente puoi avere delle altre costanti da dichiarare, i tempi di attesa tipo quel 2000. Meglio anche qui metterli a inizio programma come costanti con un bel nome e prenome significativi, esempio waitVentola:

const int waitVentola=2000;
...
if(millis()-contVentola> waitVentola) 
{ // passati 2 secondi
  contVentola=millis();   // riassegno se serve
}

Ora però serve anche capire a parole quello che deve fare il programma, a parole, non puoi pretendere che si capisca dal tuo primo post, appena abbozzato a parole e il resto leggendo un codice errato.
Quindi spiegaci bene, a parole, cosa dovrebbe fare. Ad esempio, non capisco, vuoi un ciclo a tempo sulle cose che scaldano/raffreddano, quindi cosa centra, come si infila il termometro ? Cosa deve controllare ?

Perchè forse, quello che ti serve (spero di non confonderti ancora di più) è una macchina a stati finiti.
Semplicemente una variabile che memorizza in quale "momento" è il marchingegno. Stato iniziale=avvio, poi stato =attesa poi se la temperatura è alta stato=raffreddamento, poi se la temperatura è bassa allora stato=riscaldamento, etc. il tutto usando un timer che verifica i tempi con millis()
qui un esempio più semplice del tuo: http://www.lucadentella.it/2013/04/30/macchina-a-stati-finiti-e-arduino/

Inizio con gli auguri e i ringraziamenti per le risposte.
Mi spiace non aver fatto capire l'insieme :frowning:
in pratica, e' un progetto per una mini serra interna per delle orchidee.
-il sensore per la temperatura è un lm 35 che dovrebbe fare eccitare un relè che attiva una serpentina ed esegue il Serial print,

if (analogRead(LM35)<62) {            // 41 corrisponde a 20°C - 62 SONO CIRCA 30 GRADI -       QUINDI SE LA TEMPERATURA SCENDE SOTTO I 30 ° ACCENDI IL RELE' SERPENTINA
digitalWrite(SERPENTINA , HIGH);
analogWrite(LEDSERPENTINA, 255); }
sensor = analogRead(LM35);                     //lettura valore del sensore LM35 messo sull'ingresso analogico A0
millivolts = ( sensor/1023.0)*5000;                           //formula per ottenere la tensione di uscita dell'LM35 in millivolts
celsius =millivolts/10;                             //  10mv per grado)
Serial.print(celsius);Serial.println(" GRADI");

-luce, ventola e pompa
saranno controllate semplicemente a tempo costante es: 12 h low - 12 low

digitalWrite(VENTOLA, HIGH); //ACCENDI LA VENTOLA
  delay(60000); //TIENILA ACCESA PER 60000 EQUIVALENTE A UN MINUTO
  digitalWrite(VENTOLA, LOW); //SPEGNI LA VENTOLA
  delay(3540000); //SPEGNI LA VENTOLA PER 3540000 EQUIVALENTE A 59 MINUTI
  digitalWrite(LUCE, HIGH); //ACCENDI LA LUCE 
  delay(64800000); //TIENILA ACCESA PER 64800000 EQUIVALENTE A 18 ORE
  digitalWrite(LUCE, LOW); //SPEGNI LA LUCE
  delay(21600000); //SPEGNI LA LUCE PER 21600000 EQUIVALENTE A 6 ORE
  digitalWrite(POMPA, HIGH); //ACCENDI LA POMPA ACQUA
  delay(600000); //TIENILA ACCESA PER 600000 EQUIVALENTE A 10 MINUTI

e, provando tutti i pezzi separatamente funzionano ma, assieme, il delay mi blocca.

Grazie mille del vs. aiuto!
Buon Natale a tutti
DC

Devi abbandonare la delay(), NON la puoi usare per la tua applicazione e ...

... devi studiarti come si usa la millis() prima QUI, poi QUI ed infine leggi anche QUI e QUI ... vedrai che ti sarà tutto più chiaro :wink:

Guglielmo

Grazie mille! finalmente son riuscito ad aprire quella pagina!
adesso si studia!
grazie e buone feste