Arduino Forum

International => Italiano => Software => Topic started by: stomosto on Mar 07, 2014, 09:43 am

Title: due cicli separati..?
Post by: stomosto on Mar 07, 2014, 09:43 am
Ciao a tutti, sono nuovo sia nel forum che nel mondo arduino, so che dovrei prima controllare per tutto il forum se trovo qualcosa che si avvicini al mio problema che sia già stato discusso, ma è una questione abbastanza urgente e non capisco quale sia la causa.
Quindi mi scuso per il disguido e procedo con il proporvi il mio problema.
Sto usando una Arduino UNO rev.3, quello che dovrei fare, è gestire un loop che controlli la temperatura e, al superare di una soglia preimpostata, fa scattare un relè che toglie alimentazione alle lampade. Fino a qui tutto ok, il ciclo funziona perfettamente, leggo la temperatura e il loop riparte, anche sul serial vedo che fa i suoi conteggi e dopo un delay di 2 secondi riparte. Ora il problema vero e proprio, ho collegato due ventoline per areare la "scatola" ogni tot di tempo che decido io (direi ogni 10 minuti, funzionano per 2 minuti); gli do una semplice funzione di digitalWrite a un pin di uscita che come sempre, comanda un relè che a sua volta comanda le ventole con i suoi relativi delay; verifica completata con successo, carico il programma e...legge la temperatura una volta e si impianta, anche sul serial..il sensore comunque legge perchè se gli do il reset, vedo il cambio di temperatura a cui è arrivato il sensore, ma comunque una volta sola e non a ciclo infinito. Quindi vorrei separare il ciclo temperatura dal ciclo ventole ma non saprei come fare. Grazie mille dell'aiuto e della vostra disponibilità e mi scuso ancora del disturbo.
Title: Re: due cicli separati..?
Post by: nid69ita on Mar 07, 2014, 10:36 am
Posta il codice, così a scatola chiusa è impossibile darti un parare. Magari anche uno schemino di come hai collegato il tutto, a volte il problema può essere hardware.
Title: Re: due cicli separati..?
Post by: stomosto on Mar 07, 2014, 10:44 am
vi posto il codice, non so se i delay delle ventole rientrano secondo Arduino nel loop del conteggio temperatura e quindi prima di rifare il loop aspetta i 10 minuti, però ho provato a mettere anche solo 1 minuto tra accese e spente ma comunque mi fa un loop solo. Non credo sia un problema hardware perchè quando ho fatto dei test singoli e funzionava tutto. Grazie mille

Code: [Select]
//misura della temperatura con display
//termometro che misura la media di venti rilevamenti
//di temperatura e manda i dati su serial monitor e su display
int virt_gnd=0; //il riferimento inferiore è collegato al pin 0
int virt_out=1; //il riferimento superiore è collegato al pin 1
int Rele1=9; //Lampada 1 collegata al pin 9
int Rele2=10; //ventole
int valore_out; //variabile lettura superiore
int valore_gnd; //variabile lettura inferiore
int cont; //dichiaro il contatore
int temp; //variabile che serve per il calcolo dei gradi
byte gra[8]={B00110,B01001,B01001,B00110,B00000,B00000,B00000,B00000};
//
float gradi; //misura dei gradi
float media_temp; //media delle temperature
float gradi_med; //media dei gradi
#include <LiquidCrystal.h>
LiquidCrystal lcd(7, 6, 5, 4, 3, 2);

void setup() {
  Serial.begin(9600); //inizializza e attiva la comunicazione seriale
  lcd.begin(16,2); lcd.createChar(1,gra);
  pinMode(Rele1, OUTPUT);
  pinMode(Rele2, OUTPUT);
  }
  void loop() {
    //
    for(cont=0; cont<20; cont++) //ciclo for per il conteggio della media
    //cont++ equivale a cont=cont+1;
    //incrementa di uno il contatore ad ogni passaggio
    {
      valore_out= analogRead(virt_out); //legge il valore superiore(out)
      valore_gnd= analogRead(virt_gnd); //legge il valore inferiore(diodi)
      //
      temp= (valore_out-valore_gnd)*100; //sottrae inf da sup e lo moltiplica per 100
      gradi=temp*(5.00)/1023; //trova il valore in gradi; 5 è il numero per la taratura del termometro
      media_temp+=gradi;//"media_temp" si incrementa di "gradi" ad ogni passaggio
      Serial.println(media_temp); //stampa sul serial monitor il valore di Media_temp e vai a capo
      delay(100);
      }
      cont=0;  //azzera il contatore
      gradi_med=media_temp/20; //calcola la media
      media_temp=0;  //azzera media_temp
      //*********************************
      Serial.print("La temperatura e' ");
      Serial.print(gradi_med,1); //stampa su serial monitor il valore "gradi_med" con una cifra decimale
      Serial.println(" gradi");
      Serial.println();
      //*********************************
      lcd.setCursor(0,0);
      lcd.print(gradi_med,1); //stampa grad_med con una cifra decimale
      lcd.write(1);
      lcd.print("C");
      //*********************************
      delay(2000);
     
      //*********************************
     
        if (gradi_med > 37.8)
        { digitalWrite(Rele1, HIGH); }
        else
        { digitalWrite(Rele1, LOW); }
        //********************************
       
       {digitalWrite(Rele2, HIGH);
      delay(60000);
     digitalWrite(Rele2,LOW);
    delay(600000);
   }
       
      }


Title: Re: due cicli separati..?
Post by: leo72 on Mar 07, 2014, 11:46 am
Sì si può fare. Ti consiglio la lettura di questo mio articolo (http://www.leonardomiliani.com/2013/programmiamo-i-compiti-con-millis/) che spiega come gestire 2 compiti temporizzati insieme.
Title: Re: due cicli separati..?
Post by: stomosto on Mar 07, 2014, 12:13 pm
Grazie mille!!
ora sul serial il conteggio della temperatura continua con il suo ciclo. Appena avrò possibilità collegherò le ventole e vedrò se ho fatto bene i conti. :)
Title: Re: due cicli separati..?
Post by: uwefed on Mar 07, 2014, 10:24 pm
Non serve usare un sistema multitasking, ma basta eliminare i delay() perché arduino non prosegue col codice mentre aspetta il trascorrere del tempo.
Usa millis() come descritto nel esempio "wait witout delay" corredo del IDE.
Ciao Uwe
Title: Re: due cicli separati..?
Post by: leo72 on Mar 08, 2014, 10:57 am
Difatti è quanto spiego nel mio articolo che ho linkato  ;) ;)