Go Down

Topic: Arduino Due: parallelismo funzioni (Read 810 times) previous topic - next topic

Hydrarian

Ciao a tutti, ho un problema nel fare una funzione che attiva i relay prendendoli da un Arrayqueue. In pratica, attraverso la pressione di 4 pulsanti accedo a un menu in cui seleziono le voci tenendo premuti i pulsanti per almeno 5 secondi (e fin qua ci siamo). Una di queste modalità attiva un relay per un tempo definito dalla costante "ricarica". Ho usato millis() per tenere traccia del tempo trascorso. Il problema è che i relay da attivare vorrei aggiungerli alla coda anche durante l'operazione che tiene attivato il relay corrente. Per esempio mentre il ciclo while che attiva il relay corrente per il tempo "ricarica" è in esecuzione io voglio scorrere lo stesso il menu e attivare ad esempio altre modalità o anche modalità ricarca stessa che adrebbe aggiunta alla coda in attesa del suo turno. Purtroppo però non riesco a farlo. Inserendo switchPulsanti() dentro al while non mi visualizza il menu, anzi, se premo un pulsante (per meno di 5 secondi) mi aggiunge direttamente alla coda, cosa che non voglio! Io voglio scorrere il menu normalmente, selezionando normalmente. Come posso fare?

Code: [Select]
void setRicarica(int nrelay, int presaRC, int setC, int setR){
  if (queueRC.isEmpty() && esecuzionePRY==0){ // coda vuota e nessuna ricarica o priorità in esecuzione
  if (esecuzioneRC==0){
  queueRC.push(presaRC);
  eseguiRicarica();
  }
  else if (esecuzioneRC==1){
    queueRC.push(presaRC);
  Serial.println(presaRC);
  Serial.print(" aggiunta alla coda");
  eseguiRicarica();
  }
  }
  else if (!queueRC.isEmpty() && esecuzionePRY==0){
  if (esecuzioneRC==1 ){   //se la coda ricarica non è vuota o è in esecuzione una ricarica allora aggiungi la presa da ricaricare alla coda ricarica
  queueRC.push(presaRC);
  Serial.println(presaRC);
  Serial.println(" aggiunta alla coda");
  }
  else if (esecuzioneRC==0){
  eseguiRicarica();
  }
  }
  }

void eseguiRicarica(){
  while (!queueRC.isEmpty() && esecuzionePRY==0 && esecuzioneRC==0) {  // finchè la coda non è vuota e non si sta fancendo già ricarica o priorità
if (esecuzioneMN==1){  //se è in esecuzione un mantenimento, lo ferma mettendo esecuzioneMN=0
    esecuzioneMN=0;
  }

if (esecuzioneRC==0){ // controlla se è in esecuzione un'operazione di ricarica 
  startTimeRC=millis();
  esecuzioneRC=1;
  }
  durataRC =0;     // inizializzo la durata a 0. Questo mi serve perché altrimenti ad ogni iterazione durataRC avrebbe un modulo sempre maggiore e non soddisferebbe mai il prossimo while
    int estrattaRC=queueRC.pop();  // estraggo dalla coda il primo elemento e procedo col ciclo:
  while (durataRC < ricarica && esecuzioneRC==1){    // finchè il contatore non raggiunge il tempo di ricarica e finché la ricarica è attiva
  delay(1000);
    switchPulsanti();
    buttonVal = analogRead(buttonPin);    // continua a leggere il valore dei pulsanti per interrompere la ricarica in caso di selezione di modalità priorità
    durataRC = millis() - startTimeRC;
    digitalWrite(relay[estrattaRC], HIGH);
    Serial.print(estrattaRC);
    Serial.println(" RC");
    }
    digitalWrite(relay[estrattaRC], LOW);
    esecuzioneRC=0;
  }
}

lestofante

non puoi fare parallelismo con una sola CPU/core.

Il problema è che hai ancora parti di codice "bloccanti", quindi che non usano la parte di millis() ma delle delay() (non ho letto il tuo codice, non è ben formattato e non contiene nanche tutte le funzioni es. switchPulsanti(); )
Guida per principianti http://playground.arduino.cc/Italiano/newbie
Unoffical Telegram group https://t.me/genuino

Go Up