Comando di start programma da tastiera (RISOLTO!)

Buongiorno a tutti

devo comandare due sensori (in seguito anche un relè) e leggere i risultati. Voglio che il programma di lettura parta dopo aver digitato un comando da tastiera (digito lettera 'a')
Ho fatto questo sketch, ma giustamente per ogni lettura devo digitare 'a'
Come posso bypassare il comando dopo la prima digitazione di start?

#include <dht11.h>
dht11 DHT;
#define DHT11_PIN 4

const int triggerPort = 9;
const int echoPort = 10;
char tastiera=0;
 
void setup(){
  Serial.begin(9600);
  pinMode(triggerPort, OUTPUT);
  pinMode(echoPort, INPUT);
  Serial.println("Distanza, Temperatura");
  
  

}
 
void loop(){

  tastiera = Serial.read();
  switch(tastiera){

case 'a':


    
  
  int chk;

  chk = DHT.read(DHT11_PIN);    // READ DATA




//porta bassa l'uscita del trigger
digitalWrite( triggerPort, LOW );
//invia un impulso di 10microsec su trigger
digitalWrite( triggerPort, HIGH );
delayMicroseconds( 10 );
digitalWrite( triggerPort, LOW );

long durata = pulseIn( echoPort, HIGH );

long distanza = 0.346 * durata / 2;



//dopo 38ms è fuori dalla portata del sensore
if( durata > 38000 ){
Serial.println("Fuori portata   ");
}
else{ 
Serial.print(distanza); 
Serial.print(",        ");
Serial.println(DHT.temperature,1);
 
 
}

//Aspetta 1 secondi
delay(1000);



  }
  }

ciao...leggi il carattere in ingresso...se è quello che vuoi metti a "true" una variabile boolean...così con altro carattere puoi mettere a "false" e quindi interrompere le letture...in un if verifichi se questa variabile è "true" o "false" e quindi, nel caso, leggi il sensore...se vuoi temporizzare le letture dentro l'if ne metti un altro con il classico confronto su millis().

Grazie della risposta. Ho capito perfettamente cosa hai scritto, ma non essendo esperto (Ho cominciato da pochissimo) adesso devo tradurre in pratica il tuo suggerimento. :sob:
E studiare come e dove mettere questi comandi
Puoi darmi tu una mano sullo sketch? :smiley:

ciao...al volo:

boolean getSensor = false;
unsigned long myMillis;

void setup() {
  Serial.begin(9600);

}

void loop() {
  char command;
  if (Serial.available()) {
    command = Serial.read();
    switch (command) {
      case 'a':
        getSensor = true;
        // se vuoi temporizzare ad ogni 2 secondi le letture inserisci la riga sotto
        // myMillis = millis()-2000;
        break;

        // altri case se necessari tipo:
        // case 'A' :
        //   getSensor = false;
        //   break;
    }
  }
  if (getSensor) {
    //inserire qui lettura sensore se vuoi eseguirla di continuo altrimenti:
    //if (millis() - myMillis >= 2000) {
      // leggi sensore
      // myMillis = millis();
    }
  }
}

Una soluzione alternativa. Non so se con quello switch è previsto di dover fare altre cose, nel caso un'idea può essere questa. La seriale si legge solo se c'è qualcosa da leggere, e la variabile tastiera si usa in un secondo switch indipendente dalla lettura.

void loop()
{
    if(Serial.available)
    {
        switch(Serial.read())
        {
            case 'a':
                tastiera = 'a';
                break;
        }
    }
    
    switch(tastiera)
    {
        case 'a':
            ....fai cose....
            break;
    }
}

Grazie mille ad entrambe (Birra pagata)

Ci studio sopra

Grazie mille ad entrambe (Birra pagata)

bhe...io sono un maschietto... :wink: ...per la birra...più che volentieri :smiley:

Ho fatto come suggerito da ORSO2001 e ricompilato lo Sketch.
In questo modo faccio partire le letture digitando la lettera 'a' e le interrompo con la lettera 'q'

grazie ancora

//Programma per letture di due sensori (Dist., temp.)
//con Start letture da lettera 'a' su tastiera
//Stop con lettera 'q'

#include <dht11.h>
dht11 DHT;
#define DHT11_PIN 4

const int triggerPort = 9;
const int echoPort = 10;
char tastiera=0;
boolean getSensor = false;
unsigned long myMillis;
 
void setup(){
  Serial.begin(9600);
  pinMode(triggerPort, OUTPUT);
  pinMode(echoPort, INPUT);
  Serial.println("Distanza, Temperatura");
  
}
 
void loop(){

  char command;
  if (Serial.available()) {
    command = Serial.read();
    switch (command) {
      case 'a':
       getSensor = true;  // start letture con lettera 'a'
    }
    switch (command) {
      case 'q' :
       getSensor = false;
      break;               // stop letture con lettera 'q'
  }    
  }
  if (getSensor) {     

  int chk;
  chk = DHT.read(DHT11_PIN);    // leggi i dati temperatura

digitalWrite( triggerPort, LOW ); // leggi dati distanza
digitalWrite( triggerPort, HIGH );  
delayMicroseconds( 10 );
digitalWrite( triggerPort, LOW );
long durata = pulseIn( echoPort, HIGH );
long distanza = 0.346 * durata / 2;
if( durata > 38000 ){
Serial.println("Fuori portata   ");

}

else{ 
Serial.print(distanza); 
Serial.print(",        ");
Serial.println(DHT.temperature,1);

}

delay(100); //tempo fra le letture

}
}

Usare lo switch come un singolo if non ha molto senso:

switch (command) 
{
    case 'a':
        getSensor = true;
        break;
    case 'q':
        getSensor = false;
        break;
}

Poi, l'indentazione è importante, vedi commento rosso in questo post.

Grazie

Sto ancora studiando .... :wink: