libreria leOS: task e valore ritornato, chiarimenti.

Ciao a tutti, premetto che so già che per quello che intendo fare potrei utilizzare la funzione mills(), ma siccome è la prima volta che mi trovo davanti a problemi di multitasking vorrei chiarire un po le idee. Spiego al situazione:

Mi trovo alle prese con un sensore capacitivo, tramite questo sensore capacitivo, dovrei cambiare le "modalità" di una matrice led. Quindi una cosa del genere

if (capsenseRead > 10)
{
modalita=modalita+1;
}

switch (modalita)

case 1:
..
break;

case 2:
...
break;

Quindi poi fino a quando modalità è ugulae a 1 esegui sempre 1. Quindi qui per eseguire la lettura potrei utilizzare le funzioni mills(). Essendo che non è ho mai usate, dovrei documetarmi. Ma siccome un paio di settimane fa ho pravato la libreria leOS mi cheidevo se si potesse fare tramite leOS.

In particolare, ho provato gli esempi della libreria, e ho visto che ogni task aggiunto è una funzione di tipo void() quindi esegue l'operazioe ma non ritorna nessun valore. Potrei utilizzare leOS per eseguire la lettura del capsese? del tipo:

leos myos;
myos.addtask(leggiCapSense, 500);

quindi leggicapsense ognu 500ms

e qui il problema, potrei eseguire leggiCapSense per incrementare il contatore "modalità" e poi ritornare questo contatore ed eseguire lo switch nel loop() ?!

mi serivirebbe quindi ritornare un int, cosa che alemno dagli esempi non mi pare sia possibile fare con i task di leOS.

Se così fosse dovrò documentarmi un po su mills() e multitasking con arduino, intanto se funziona con leOS sarebbe meglio, molto più semplice!:)

Grazie a tutti!

Le routine da eseguire con il leOS non restituiscono (non usare “ritornano”, non si può sentir dire :sweat_smile: ) nessun valore perché esse sono chiamate dallo scheduler e non direttamente dal loop principale. I valori restituiti verrebbero ricevuti dal primo, che non se ne farebbe nulla.

Per ovviare a ciò basta semplicemente usare delle variabili globali e far modificare queste variabili dal tuo task.

Effettivamente non ho mai letto “ritornano” , chiedo perdono! :slight_smile:

Comunque stavo provando a fare come hai detto tu, ma ho un problema, ecco lo sketch:

//libreria leos
#include "leOS.h"
leOS myOS; //creo nuovo os 

//SENSORE CAPACITIVO
#include <CapSense.h>
CapSense   capacitiveSensor = CapSense(4,2);
//variabile gloabale
int scelta = 1;



void setup()
{
Serial.begin(9600);
//aggiugo task per os
myOS.begin(); 
myOS.addTask(menuControl, 600);
}

void loop()
{
Serial.println("Sono nel loop");
delay(500);
}


//*************************************************************
//*************************************************************
void menuControl()
//*************************************************************
//*************************************************************
{
long start = millis();
 long valore =  capacitiveSensor.capSense(30);
  Serial.print("VALORE SENSORE CAPACITIVO");
  Serial.println(millis() - start);
  Serial.print("SCELTA");
  Serial.println(scelta);  
  if (valore > 100)
  {
    scelta = scelta + 1;
    delay(2000);
    
  }
  
  if (scelta > 2)
  {
    scelta = 1;
    delay(2000);  
}


}

Praticamente è come se il task non eseguisse il compito, in questo caso dovrebbe ad esempio stamparmi il valore del sensore e la scelta, ma non accade, mi stampa sempre “sono nel loop”.
Se invece tolgo:

long valore =  capacitiveSensor.capSense(30);

con i relativi if allora il tutto viene stampato (cioè in effetti solo scelta e valore, che ovviamente vale 0).

Dove sbaglio? :slight_smile:

Grazie

Sono col cell, non riesco a leggere il tuo sketch. non vedo oltre le prime righe del setup. Cosa fai nel task? Accedi alla caps? La capsense usa timer?

Si nel task accedo alla capSense per leggere il valore e, a seconda del valore, incrementare o decrementare la variabile globale per lo switch delle scelte. Se il capSense usa il timer sinceramente non lo so... :blush: Come posso capirlo?

Grazie

Devi guardare nella lib che cosa fa. io non posso farlo perché. sono col cellulare in vacanza.