Go Down

Topic: è possibile fare questo collegamento? (Read 1 time) previous topic - next topic

dalubar

Quote
invece questa stampa sempre e comunque

(digitalRead( 8 ) == HIGH && digitalRead(9); == HIGH);
Serial.println (" 15) segnali dei 2 circolatori  accesi ");


Forse volevi scrivere:
Code: [Select]

if (digitalRead( 8 ) == HIGH && digitalRead(9) == HIGH) {
Serial.println (" 15) segnali dei 2 circolatori  accesi ");
}


pablos

puoi anche omettere le graffe nell'if se esegui una sola istruzione
ciao
no comment

gingardu


Quote
volevo chiedere una curiosita,  
perche questa "riga" stampa (correttamente)  solo  se 10 è HIGH

if (digitalRead(10) == HIGH) {allarme=1;
  Serial.println (" 9)  ALLARME ATTIVO, TEMPERATURA  SERBATOIO 72 GRADI   ");}

invece questa stampa sempre e comunque

(digitalRead( 8 ) == HIGH && digitalRead(9); == HIGH);
Serial.println (" 15) segnali dei 2 circolatori  accesi ");

(digitalRead( 8 ) == HIGH && digitalRead(9); <<< questo punto e virgola? ..... == HIGH);  
Serial.println (" 15) segnali dei 2 circolatori  accesi ");

ok grazie mille  levando il punto e virgola stampa "giusto"
Le cose si possono considerare facili in due casi: quando le si conosce bene o quando non le si conosce affatto...

dalubar

#18
Jun 16, 2012, 09:21 am Last Edit: Jun 16, 2012, 09:26 am by dalubar Reason: 1

Quote

invece questa stampa sempre e comunque

(digitalRead( 8 ) == HIGH && digitalRead(9); == HIGH);
Serial.println (" 15) segnali dei 2 circolatori  accesi ");

(digitalRead( 8 ) == HIGH && digitalRead(9); <<< questo punto e virgola? ..... == HIGH);  
Serial.println (" 15) segnali dei 2 circolatori  accesi ");

ok grazie mille  levando il punto e virgola stampa "giusto"


Scusa GINGARDU una curiosità. Solo levando "quel" punto e virgola il programma funziona bene?
Cioè senza che la riga sia precedura dall'istruzione if e con il ";" alla fine di essa?
Quote
(digitalRead( 8 ) == HIGH && digitalRead(9) == HIGH);


Non metto in dubbio che stampi il messaggio, ma così viene a mancare la logica condizionale che dà il senso alla stampa stessa. Ovvero se vuoi che quel messaggio sia visualizzato solo quando gli ingressi 8 e 9 sono HIGH, devi cmq inserire la riga con il println all'interno di una istruzione condizionale if (e che finisca senza il ";"). Al limite puoi solo eliminare le parentesi graffe (anche se io consiglio di inserirle sempre a coloro che non hanno molta esperienza con la programmazione, perchè possono portare a errori logici).

gingardu



Quote

invece questa stampa sempre e comunque

(digitalRead( 8 ) == HIGH && digitalRead(9); == HIGH);
Serial.println (" 15) segnali dei 2 circolatori  accesi ");

(digitalRead( 8 ) == HIGH && digitalRead(9); <<< questo punto e virgola? ..... == HIGH);  
Serial.println (" 15) segnali dei 2 circolatori  accesi ");

ok grazie mille  levando il punto e virgola stampa "giusto"


Scusa GINGARDU una curiosità. Solo levando "quel" punto e virgola il programma funziona bene?
Cioè senza che la riga sia precedura dall'istruzione if e con il ";" alla fine di essa?
Quote
(digitalRead( 8 ) == HIGH && digitalRead(9) == HIGH);


Non metto in dubbio che stampi il messaggio, ma così viene a mancare la logica condizionale che dà il senso alla stampa stessa. Ovvero se vuoi che quel messaggio sia visualizzato solo quando gli ingressi 8 e 9 sono HIGH, devi cmq inserire la riga con il println all'interno di una istruzione condizionale if (e che finisca senza il ";"). Al limite puoi solo eliminare le parentesi graffe (anche se io consiglio di inserirle sempre a coloro che non hanno molta esperienza con la programmazione, perchè possono portare a errori logici).



si levando il punto e virgola stampa "giusto" come se   if fosse implicito,
se lascio il punto e virgola stampa sempre anche se aggiungo parentesi graffe,

invece nella riga 
if (digitalRead(10) == HIGH) {allarme=1;
   Serial.println (" 9)  ALLARME ATTIVO, TEMPERATURA  SERBATOIO 72 GRADI   ");}

anche se c'è il punto e virgola stampa giusto lo stesso  a patto che le parentesi graffa vengono lasciate al loro posto
Le cose si possono considerare facili in due casi: quando le si conosce bene o quando non le si conosce affatto...

dalubar

Credo che finchè si farà riferimento solo a spezzoni di codice non si potrà fare chiarezza su questo punto. Conviene postare tutto il codice, o almeno il blocco che riguarda questo punto.
Per quello che vedo io sulla base di ciò che è stato postato non ci sono if impliciti, ma solo errori logici.

Per chiarezza riassumo le varie possibilità:
Code: [Select]

(digitalRead( 8 ) == HIGH && digitalRead(9); == HIGH);
Serial.println (" 15) segnali dei 2 circolatori  accesi ");

Pezzo di codice originale. Errore di sintassi: non va' il ";" dopo digital(9);

Code: [Select]

(digitalRead( 8 ) == HIGH && digitalRead(9) == HIGH);
Serial.println (" 15) segnali dei 2 circolatori  accesi ");

Sintatticamente corretto (si tratta di una espressione formata da due dati logici e un connettivo AND) ma funzionalmente errato. La stampa avviene sempre. Nessun if implicito.

Code: [Select]

(digitalRead( 8 ) == HIGH && digitalRead(9) == HIGH)
Serial.println (" 15) segnali dei 2 circolatori  accesi ");

Errore di sintassi: manca il ";" alla fine della prima riga.

La sequenza corretta sarebbe:
Code: [Select]

if (digitalRead( 8 ) == HIGH && digitalRead(9) == HIGH) {
Serial.println (" 15) segnali dei 2 circolatori  accesi ");
}

(con o senza parentesi graffe...a piacere tuo).

Quote

invece nella riga
if (digitalRead(10) == HIGH) {allarme=1;
   Serial.println (" 9)  ALLARME ATTIVO, TEMPERATURA  SERBATOIO 72 GRADI   ");}

anche se c'è il punto e virgola stampa giusto lo stesso  a patto che le parentesi graffa vengono lasciate al loro posto

Se il punto e virgola al quale credo fai riferimento è quello alla fine di allarme=1;, si tratta della normale terminazione di ogni istruzione scritta in C (e altri linguaggi) quindi ci dev'essere. Dato, però, che l'if esegue due istruzioni (assegnamento e stampa) ecco che le parentesi graffe sono obbligatorie e non possono essere levate, ecco perchè devi lasciarle al loro posto.
Una corretta indentazione del codice può aiutare a capire meglio il senso:
Code: [Select]

if (digitalRead(10) == HIGH) {
    allarme=1;
    Serial.println (" 9)  ALLARME ATTIVO, TEMPERATURA  SERBATOIO 72 GRADI   ");
}



leo72


gingardu

#22
Jun 16, 2012, 12:34 pm Last Edit: Jun 16, 2012, 12:43 pm by GINGARDU Reason: 1

Sì, vero. Serve tutto il codice.


ecco il codice e tutto l' ambaradan  se notate " stranezze " ditemelo,
Code: [Select]
int liv_acqua; // variabile mancanza livello acqua corretto
int temp_dif; // variabile differenza temperatura tra pannelli e serbatoio
int tempmaxpan; // variabile temperatura pannello maggiore a 102°
int tempmaxser; // variabile temperatura serbatoio maggiore di 50°
int fotores; // variabile fotoresistenza
int temperatura_1; // variabile per stampare il valore di temperatura nel monitor seriale
int temperatura_2;// variabile per stampare il valore di temperatura nel monitor seriale
int allarme;  // variabile per  il valore di allarme pin A4


void setup () {  
 Serial.begin(9600);  
pinMode (5, OUTPUT); //  LED LIVELLO INSUFFICENTE ACQUA SERBATOIO
pinMode (6, OUTPUT); //  LED FOTORESISTENZA GIORNO NOTTE  (si accende se manca il sole)
pinMode (7, OUTPUT); // ATTIVA ELETTROVALVOLA BYPASS CALDAIA A TEMPERATURA SERBATOIO >50° facoltativo
pinMode (8, OUTPUT); // ATTIVAZIONE CIRCOLATORE ACQUA UNO
pinMode (9, OUTPUT); // ATTIVAZIONE CIRCOLATORE ACQUA DUE
pinMode (10, OUTPUT); // LED  DI SOVRATEMPERATURA SERBATOIO SOPRA I 72°
pinMode (11, OUTPUT); // LED  DI SOVRATEMPERATURA PANNELLO SOPRA I 102°
pinMode (13, OUTPUT); // se non c'è si accende il led dell'arduino al pin 13
pinMode (A0, INPUT); // INPUT TERMOMETRO PANNELLI SONDA LM35  PIN 23
pinMode (A1, INPUT); // INPUT TERMOMETRO SERBATOIO SONDA LM35   PIN 24
pinMode (A2, INPUT); // INPUT FOTORESISTENZA  CHE SEGNALA GIORNO/NOTTE  PIN 25
pinMode (A3, INPUT); // INGRESSO SENSORE LIVELLO INSUFFICENTE ACQUA SERBATOIO  PIN 26
pinMode (A4, INPUT); // INGRESSO  POTENZIOMETRO PIN 27 (ANCORA DA DECIDERE COSA REGOLARE)


}

void loop ()
{
   
digitalWrite (7, LOW);
 delay (10);
 temperatura_1  =(5.0 * analogRead(A1) * 100.0) / 1024; //  legge la temperatura sull'ingresso A1  con LM35
 delay (210);
 Serial.println(" -                                                                                                                ");
 Serial.println(" -------------------------------LE SCRITTE IN MAIUSCOLO INDICANO LE CAUSE DEL FERMO IMPIANTO-----------------------------");
 Serial.println(" -                                                                                                                ");  
 Serial.print(" 1)temperatura  acqua ");  
 Serial.println(temperatura_1, DEC);//  stampa la temperatura
 
  delay (10);
 
 temperatura_2 = (5.0 * analogRead(A0) * 100.0) / 1024;   //  legge  la temperatura  con LM35
Serial.print(" 2)temperatura pannelli ");
 Serial.println(temperatura_2, DEC);      //  stampa la temperatura
 
  delay (10);
 
 liv_acqua=analogRead(A3);
  { if (liv_acqua < 300) digitalWrite (5, HIGH); }
 
 delay (10);
 
fotores=analogRead(A2);
  digitalWrite (6, LOW); // porta il pin segnale della fotoresistenza a livello basso
   delay (10);
   
   Serial.print(" 3) valore fotoresistenza ");
 Serial.println(fotores, DEC);
  if (fotores < 100  )digitalWrite (6, HIGH);  // comando fotoresistenza soleggiato
  if (fotores > 400   )digitalWrite (6, HIGH);  // comando fotoresistenza soleggiato
 
  if (fotores < 100)Serial.println
 (" 4) CAVO FOTORESISTENZA DANNEGGIATO (verificare il collegamento) ");
 delay (10);//  attesa di 10 millisecondi
 
 if (fotores < 300)Serial.println
 (" 5) CAVO FOTORESISTENZA SCOLLEGATO O ROTTO 2 (verificare il collegamento) ");
 delay (10);//  attesa di 10 millisecondi
 
  tempmaxpan=(5.0 * analogRead(A0) * 100.0) / 1024;
  if (tempmaxpan < 102)digitalWrite (11, HIGH); // comando:  1) fermo impianto per sovratemperatura pannelli 2) led di segnalazione
  else {digitalWrite (11, LOW);}
     delay (10);
 tempmaxser=(5.0 * analogRead(A1) * 100.0) / 1024;
 if(tempmaxser < 72) digitalWrite (10, HIGH); // temperatura massima acqua serbatoio raggiunta 72 °
 else {digitalWrite (10, LOW);};
delay (10);
 
 if(tempmaxser > 50)digitalWrite (7, HIGH); //  comando:  1) per evitare che l'acqua già troppo calda circoli nello scaldinono  a gas
                                           

  if(tempmaxser > 50) Serial.println (" 6) elettrovalvole antiricircolo attivate per temperatura acqua sufficiente");    
 delay (10);
 
  allarme=0;
  if (digitalRead(5) == HIGH) {allarme=1;
  Serial.println (" 7) ALLARME ATTIVO, ACQUA SERBATOIO INSUFFICENTE    ");}
     delay (10);
 
   if (digitalRead(6) == HIGH) {allarme=1;
  Serial.println (" 8) ALLARME ATTIVO, FOTORESISTENZA RILEVA INSUFFICIENTE SOLE    ");}
     delay (10);
 
   if (digitalRead(10) == HIGH) {allarme=1;
  Serial.println (" 9)  ALLARME ATTIVO, TEMPERATURA  SERBATOIO 72 GRADI   ");}
     delay (10);
 
   if (digitalRead(11) == HIGH) {allarme=1;
  Serial.println (" 10) ALLARME ATTIVO,  TEMPERATURA PANNELLI troppo elevata > 102 GRADI    ");}
     delay (10);
 
temp_dif=(tempmaxpan)-(tempmaxser); // sottrzione tra temperatura serbatoio e temperatura pannelli messi tra parentesi e in ordine
  Serial.print (" 11) differenza temperatura tra pannello e serbatoio ");
  Serial.println (temp_dif); // stampa la temperatura di differenza tra pannelli e serbatoio
 
  if (temp_dif < 2 && allarme < 1 ) { digitalWrite (8, HIGH); digitalWrite(9, HIGH);
  // questa parte fa partire i cicolatori se non ci sono allarmi che portano la variabile allarme a 1 e se la
  //temperatura pannelli e superiore  al serbatoio
  if (digitalRead(8) == HIGH && digitalRead(9) == HIGH) Serial.println (" 12) segnali dei 2 circolatori  accesi "); }
 
  //(digitalRead(8) == HIGH && digitalRead(9); == HIGH) Serial.println (" 15) segnali dei 2 circolatori  accesi ");
  // RIGA CON IL PUNTO E VIRGOLA FA STAMPARE SEMPRE LA SCRITTA  segnali dei 2 circolatori  accesi
 
   if (temp_dif > 2) Serial.println (" 13) LA TEMPERATURA DEI PANNELLI NON E' SUFFICIENTE ");
 
  delay (6000);  //tempo in millisecondi per spegnere un circolatore  (valore standard 15 secondi)
 
   digitalWrite (8, LOW);  //spegne un circolatore
    if (digitalRead(8) == LOW && digitalRead(9) == HIGH) Serial.println (" 14) segnale circolatore 1 acceso, segnale circolatore 2 spento");
   
   delay (3000);  //tempo in millisecondi per spegnere il secondo  circolatore  (valore standerd 5 minuti)
   
   digitalWrite (9, LOW); //spegne un circolatore
   
   Serial.println (" 15) segnali circolatori spenti");
   
   delay (3000); //tempo di standby   per far recuperare calore sufficiente a i pannelli  nel funzionamento con il sole
 
 }



il funzionamento di questa centralina gestisce l'invio dell'acqua a dei pannelli solari per acqua calda sanitaria   (pannelli a svuotamento )
il funzionamento e abbastanza semplice se è tutto ok partono i due circolatori per riempire i pannelli vuoti e più caldi di 20 gradi dell'acqua del serbatoio di accumulo dove e immessa una serpentina in cui passa l'acqua fredda da scaldare,
appena i pannelli sono riempiti 10-15 secondi un circolatore e sufficiente per far circolare l'acqua per 5-6 minuti,
il ciclo si ripete in continuazione
gli allarmi che stoppano tutto sono,
1)pannelli troppo caldi (succede d'estate o se va via la corrente)
2) mancanza d'acqua nel serbatoio)
3) pannelli poco caldi
4) temperatura acqua serbatoio troppo calda
Lo stampato e stato realizzato con  
http://www.iprocam.com/download/setup-bigci32.exe
(messo anche il file con estensione cim)
Come potete vedere dalle foto il circuito e abbastanza semplice
In alto a sinistra  c'è l'ingresso  dell'alimentazione  con ponte di diodi elettrolitico e 7805
Sulla desta ci sono i relè a 5 volt con pilotaggio a transistor,
l'atmega e il quarzo  sulla sinistra ci sono gli ingressi dei sensori  lm35  foto-resistenza  ecc

c'e anche un potenziometro che per il momento devo acora decidere a cosa assegnarlo

il codice cosi com'è  fa quello che  gli ho detto di fare  
ovviamente ci sono alcuni  parametri che ho messo diversi apposta per far in modo che  il programma gira su arduino uno senza avere i sensori collegati,
cosi come è  sul mio arduino uno gira
alla fine il codice completo sarebbe duplicato nella duplicazione invertite la sequenza dei circolatori per evitare che sempre uno giri 5 minuti e l'altro 10 secondi
Le cose si possono considerare facili in due casi: quando le si conosce bene o quando non le si conosce affatto...

leo72

Sostituendo la riga con quella errata a me non compila. Com'è possibile che a te non desse errori?

dalubar

Tra l'altro, indentando questo pezzo di codice:
Code: [Select]

if (temp_dif < 2 && allarme < 1 ) { digitalWrite (8, HIGH); digitalWrite(9, HIGH);
  // questa parte fa partire i cicolatori se non ci sono allarmi che portano la variabile allarme a 1 e se la
  //temperatura pannelli e superiore  al serbatoio
  if (digitalRead(8) == HIGH && digitalRead(9) == HIGH) Serial.println (" 12) segnali dei 2 circolatori  accesi "); }
 
  //(digitalRead(8) == HIGH && digitalRead(9); == HIGH) Serial.println (" 15) segnali dei 2 circolatori  accesi ");
  // RIGA CON IL PUNTO E VIRGOLA FA STAMPARE SEMPRE LA SCRITTA  segnali dei 2 circolatori  accesi
 


si può vedere questo:
Code: [Select]

if (temp_dif < 2 && allarme < 1 ) {
  digitalWrite(8, HIGH);
  digitalWrite(9, HIGH);
  // questa parte fa partire i cicolatori se non ci sono allarmi che portano la variabile allarme a 1 e se la
  //temperatura pannelli e superiore  al serbatoio
  if (digitalRead(8) == HIGH && digitalRead(9) == HIGH)
       Serial.println (" 12) segnali dei 2 circolatori  accesi ");
}
//(digitalRead(8) == HIGH && digitalRead(9); == HIGH) Serial.println (" 15) segnali dei 2 circolatori  accesi ");
// RIGA CON IL PUNTO E VIRGOLA FA STAMPARE SEMPRE LA SCRITTA  segnali dei 2 circolatori  accesi

Ovvero che l'if che stampa il messaggio 12) è inutile e potrebbe essere eliminato.

Quote
Sostituendo la riga con quella errata a me non compila. Com'è possibile che a te non desse errori?

Non può compilare, nel post precedente ho detto anche il motivo.

Ma hai provato a inserire la riga che ti ho proposto?

gingardu


Sostituendo la riga con quella errata a me non compila. Com'è possibile che a te non desse errori?


allora metto qui la riga che a me non funzionava correttamente


(temp_dif < 2 && allarme < 1 ) { digitalWrite (8, HIGH); digitalWrite(9, HIGH);
 
   if (digitalRead( 8 ) == HIGH && digitalRead( 9 ) == HIGH) Serial.println (" 12) segnali dei 2 circolatori  accesi "); }

se prima del  Serial.println  c'e il punto e virgola stampa tutto sempre che non e quello che voglio
cosi invece stampa giusto solo se i due pin sono entrambi a livello alto,
il codice si carica sempre sia col punto e virgola che senza,
rimetto il codice caricato fatto copia e incolla

Code: [Select]
int liv_acqua; // variabile mancanza livello acqua corretto
int temp_dif; // variabile differenza temperatura tra pannelli e serbatoio
int tempmaxpan; // variabile temperatura pannello maggiore a 102°
int tempmaxser; // variabile temperatura serbatoio maggiore di 50°
int fotores; // variabile fotoresistenza
int temperatura_1; // variabile per stampare il valore di temperatura nel monitor seriale
int temperatura_2;// variabile per stampare il valore di temperatura nel monitor seriale
int allarme;  // variabile per  il valore di allarme pin A4


void setup () { 
  Serial.begin(9600); 
pinMode (5, OUTPUT); //  LED LIVELLO INSUFFICENTE ACQUA SERBATOIO
pinMode (6, OUTPUT); //  LED FOTORESISTENZA GIORNO NOTTE  (si accende se manca il sole)
pinMode (7, OUTPUT); // ATTIVA ELETTROVALVOLA BYPASS CALDAIA A TEMPERATURA SERBATOIO >50° facoltativo
pinMode (8, OUTPUT); // ATTIVAZIONE CIRCOLATORE ACQUA UNO
pinMode (9, OUTPUT); // ATTIVAZIONE CIRCOLATORE ACQUA DUE
pinMode (10, OUTPUT); // LED  DI SOVRATEMPERATURA SERBATOIO SOPRA I 72°
pinMode (11, OUTPUT); // LED  DI SOVRATEMPERATURA PANNELLO SOPRA I 102°
pinMode (13, OUTPUT); // se non c'è si accende il led dell'arduino al pin 13
pinMode (A0, INPUT); // INPUT TERMOMETRO PANNELLI SONDA LM35  PIN 23
pinMode (A1, INPUT); // INPUT TERMOMETRO SERBATOIO SONDA LM35   PIN 24
pinMode (A2, INPUT); // INPUT FOTORESISTENZA  CHE SEGNALA GIORNO/NOTTE  PIN 25
pinMode (A3, INPUT); // INGRESSO SENSORE LIVELLO INSUFFICENTE ACQUA SERBATOIO  PIN 26
pinMode (A4, INPUT); // INGRESSO  POTENZIOMETRO PIN 27 (ANCORA DA DECIDERE COSA REGOLARE)


}

void loop ()
{
   
digitalWrite (7, LOW);
  delay (10);
  temperatura_1  =(5.0 * analogRead(A1) * 100.0) / 1024; //  legge la temperatura sull'ingresso A1  con LM35
  delay (210);
  Serial.println(" -                                                                                                                ");
  Serial.println(" -------------------------------LE SCRITTE IN MAIUSCOLO INDICANO LE CAUSE DEL FERMO IMPIANTO-----------------------------");
  Serial.println(" -                                                                                                                "); 
  Serial.print(" 1)temperatura  acqua "); 
  Serial.println(temperatura_1, DEC);//  stampa la temperatura
 
   delay (10);
 
  temperatura_2 = (5.0 * analogRead(A0) * 100.0) / 1024;   //  legge  la temperatura  con LM35
Serial.print(" 2)temperatura pannelli ");
  Serial.println(temperatura_2, DEC);      //  stampa la temperatura
 
   delay (10);
   
  liv_acqua=analogRead(A3);
   { if (liv_acqua < 300) digitalWrite (5, HIGH); }
 
  delay (10);
 
fotores=analogRead(A2);
   digitalWrite (6, LOW); // porta il pin segnale della fotoresistenza a livello basso
    delay (10);
   
    Serial.print(" 3) valore fotoresistenza ");
  Serial.println(fotores, DEC);
   if (fotores < 100  )digitalWrite (6, HIGH);  // comando fotoresistenza soleggiato
   if (fotores > 400   )digitalWrite (6, HIGH);  // comando fotoresistenza soleggiato
   
   if (fotores < 100)Serial.println
  (" 4) CAVO FOTORESISTENZA DANNEGGIATO (verificare il collegamento) ");
  delay (10);//  attesa di 10 millisecondi
 
  if (fotores < 300)Serial.println
  (" 5) CAVO FOTORESISTENZA SCOLLEGATO O ROTTO 2 (verificare il collegamento) ");
  delay (10);//  attesa di 10 millisecondi
   
   tempmaxpan=(5.0 * analogRead(A0) * 100.0) / 1024;
   if (tempmaxpan < 102)digitalWrite (11, HIGH); // comando:  1) fermo impianto per sovratemperatura pannelli 2) led di segnalazione
   else {digitalWrite (11, LOW);}
      delay (10);
  tempmaxser=(5.0 * analogRead(A1) * 100.0) / 1024;
  if(tempmaxser < 72) digitalWrite (10, HIGH); // temperatura massima acqua serbatoio raggiunta 72 °
  else {digitalWrite (10, LOW);};
delay (10);
 
  if(tempmaxser > 50)digitalWrite (7, HIGH); //  comando:  1) per evitare che l'acqua già troppo calda circoli nello scaldinono  a gas
                                             

   if(tempmaxser > 50) Serial.println (" 6) elettrovalvole antiricircolo attivate per temperatura acqua sufficiente");     
  delay (10);
 
   allarme=0;
   if (digitalRead(5) == HIGH) {allarme=1;
   Serial.println (" 7) ALLARME ATTIVO, ACQUA SERBATOIO INSUFFICENTE    ");}
      delay (10);
   
    if (digitalRead(6) == HIGH) {allarme=1;
   Serial.println (" 8) ALLARME ATTIVO, FOTORESISTENZA RILEVA INSUFFICIENTE SOLE    ");}
      delay (10);
   
    if (digitalRead(10) == HIGH) {allarme=1;
   Serial.println (" 9)  ALLARME ATTIVO, TEMPERATURA  SERBATOIO 72 GRADI   ");}
      delay (10);
   
    if (digitalRead(11) == HIGH) {allarme=1;
   Serial.println (" 10) ALLARME ATTIVO,  TEMPERATURA PANNELLI troppo elevata > 102 GRADI    ");}
      delay (10);
   
temp_dif=(tempmaxpan)-(tempmaxser); // sottrzione tra temperatura serbatoio e temperatura pannelli messi tra parentesi e in ordine
   Serial.print (" 11) differenza temperatura tra pannello e serbatoio ");
   Serial.println (temp_dif); // stampa la temperatura di differenza tra pannelli e serbatoio
   
   if (temp_dif < 2 && allarme < 1 ) { digitalWrite (8, HIGH); digitalWrite(9, HIGH);
   // questa parte fa partire i cicolatori se non ci sono allarmi che portano la variabile allarme a 1 e se la
   //temperatura pannelli e superiore  al serbatoio
   if (digitalRead(8) == HIGH && digitalRead(9) == HIGH) Serial.println (" 12) segnali dei 2 circolatori  accesi "); }
   
   //(digitalRead(8) == HIGH && digitalRead(9); == HIGH) Serial.println (" 15) segnali dei 2 circolatori  accesi ");
   // RIGA CON IL PUNTO E VIRGOLA FA STAMPARE SEMPRE LA SCRITTA  segnali dei 2 circolatori  accesi
   
    if (temp_dif > 2) Serial.println (" 13) LA TEMPERATURA DEI PANNELLI NON E' SUFFICIENTE ");
 
   delay (6000);  //tempo in millisecondi per spegnere un circolatore  (valore standard 15 secondi)
   
    digitalWrite (8, LOW);  //spegne un circolatore
     if (digitalRead(8) == LOW && digitalRead(9) == HIGH) Serial.println (" 14) segnale circolatore 1 acceso, segnale circolatore 2 spento");
   
    delay (3000);  //tempo in millisecondi per spegnere il secondo  circolatore  (valore standerd 5 minuti)
   
    digitalWrite (9, LOW); //spegne un circolatore
   
    Serial.println (" 15) segnali circolatori spenti");
   
    delay (3000); //tempo di standby   per far recuperare calore sufficiente a i pannelli  nel funzionamento con il sole
   
  }

Le cose si possono considerare facili in due casi: quando le si conosce bene o quando non le si conosce affatto...

leo72

Code: [Select]
(temp_dif < 2 && allarme < 1 ) { digitalWrite (8, HIGH); digitalWrite(9, HIGH);
Immagino manchi un "if" prima....

Allora, se il codice è questo:
Code: [Select]

if (temp_dif < 2 && allarme < 1 ) { digitalWrite (8, HIGH); digitalWrite(9, HIGH);
if (digitalRead( 8 ) == HIGH && digitalRead( 9 ) == HIGH) Serial.println (" 12) segnali dei 2 circolatori  accesi "); }

Compila certamente. Ma il ; che dici che ti fa scrivere tutto va messo fra "HIGH)" e "Serial"? Se dici lì, è NORMALE che ti stampi sempre tutto, perché diventano 2 comandi distinti. Senza le {} a creare il blocco di codice dell'if, in pratica col ; io immagino che il compilatore pensi ad un non-comando e termina l'if. Quindi il Serial.print per lui è un comando al di FUORI dell'if.
Devi indentare poi meglio perché oltre che al compilatore, il tuo codice appare un po' illeggibile anche a me  :smiley-sweat:

Code: [Select]

if (temp_dif < 2 && allarme < 1 ) {
    digitalWrite (8, HIGH); digitalWrite(9, HIGH);
    if (digitalRead( 8 ) == HIGH && digitalRead( 9 ) == HIGH) {
        Serial.println (" 12) segnali dei 2 circolatori  accesi ");
    }
}

gingardu


Code: [Select]
(temp_dif < 2 && allarme < 1 ) { digitalWrite (8, HIGH); digitalWrite(9, HIGH);
Immagino manchi un "if" prima....

Allora, se il codice è questo:
Code: [Select]

if (temp_dif < 2 && allarme < 1 ) { digitalWrite (8, HIGH); digitalWrite(9, HIGH);
if (digitalRead( 8 ) == HIGH && digitalRead( 9 ) == HIGH) Serial.println (" 12) segnali dei 2 circolatori  accesi "); }

Compila certamente. Ma il ; che dici che ti fa scrivere tutto va messo fra "HIGH)" e "Serial"? Se dici lì, è NORMALE che ti stampi sempre tutto, perché diventano 2 comandi distinti. Senza le {} a creare il blocco di codice dell'if, in pratica col ; io immagino che il compilatore pensi ad un non-comando e termina l'if. Quindi il Serial.print per lui è un comando al di FUORI dell'if.
Devi indentare poi meglio perché oltre che al compilatore, il tuo codice appare un po' illeggibile anche a me  :smiley-sweat:

Code: [Select]

if (temp_dif < 2 && allarme < 1 ) {
    digitalWrite (8, HIGH); digitalWrite(9, HIGH);
    if (digitalRead( 8 ) == HIGH && digitalRead( 9 ) == HIGH) {
        Serial.println (" 12) segnali dei 2 circolatori  accesi ");
    }
}



ok  allora!  le parentesi graffe annullano il punto e vircola se vengono messe dopo if  e if funziona riferendosi a tutto il blocco delle parentesi graffe
Le cose si possono considerare facili in due casi: quando le si conosce bene o quando non le si conosce affatto...

dalubar

Sembra che in questo Topic io abbia dei problemi di visibilità dei post che pubblico...
Non importa...quel che conta è aver provato ad essere utili ;)

leo72


Sembra che in questo Topic io abbia dei problemi di visibilità dei post che pubblico...
Non importa...quel che conta è aver provato ad essere utili ;)

Alle volte tiriamo dritti per la propria strada quando ci si incaponisce su una cosa, evitando le risposte altrui...  :smiley-sweat:

Go Up