Problema ingessi analogici

Salve! ho realizzato un serie di circuito diodo resistenza e piezo su una basetta millefori dove l'uscita di ogni resistenza viene connessa ad un ingresso analogico di arduino il problema è che quando collego più di 3 ingressi la board inpazzisce iniziando a registrare e trasmettere ingressi alti anche senza il piezo collegato da cosa può dipendere?

Esempio di circuito utilizzato? Codice da te scritto?

il circuito è questo: il codice legge solo gli ingressi analogici

Potresti postare anche il codice così gli diamo una occhiata? Se colleghi un cavetto al piedino analogico di arduino senza un piezo è normale che questo "fluttui" dandoti valori a caso. Inoltre al piedino dell'arduino non ci va l'uscita della resistenza... La resistenza, infatti, deve essere in parallelo al piezo. Scusa se ti dico cose note :-)

alla board collego esattamente la resistenza in figura. anche se c'è il piezo collegato questo inizia ad impazzire mi vengono trasmessi valori a caso anche da ingressi che nn sono collegati.

Ma scusa... Come fanno ad arrivarti valori da ingressi che non sono collegati? Vuol dire che li gestisci a livello di codice. E se così è... che senso ha inserirli nel codice se non vi associ un piezo?

appunto! ecco perchè è strano!! controllo tutti gli ingressi analogici con un ciclo for li controllo tutti perchè se non voglio collegare un pad della batteria non lo collego no?

Ok, adesso la cosa inizia ad avere un senso. Secondo me la soluzione potrebbe essere la rilevazione del valore almeno 10 volte prima di decidere se l'ingresso ha un senso o meno. Occhio al tempo che fai trascorrere tra una rilevazione e l'altra per via dell'inerzia. Se le rilevazioni non sono in crescita o decrescita allora è un valore ciucco. Questo potrebbe essere un algoritmo da sviscerare:

unsigned long time;
unsigned long tmp;
int measure;
int measuretmp;
int i;
int up;
int down;

void setup(){
  time = millis();
  i=0;
  ....
}


void loop(){
  time = millis();
  if(time >= tmp+200){   // Il 200 è da tarare
    measure=analogRead(PIN);  //Al posto di PIN ci vuole quello che ti interessa
    if(i>=10){
      if(up>=down+5 || down>=up+5){
          // Valore con senso
      }
      else{
           // Valore SENZA SENSO
      }
      i=0;
      up=0;
      down=0;
    }
    else{
      i=i+1;
      if(measuretemp>=measure){
         up++;
     }
     else{
         down++;
     }
     measuretemp=measure;
    }

    
  }

}

PS: Il codice è stato scritto di getto e assolutamente da testare ma era per darti una idea.

ecco il mio codice non vedo che errori possano esserci

#define LEDPIN     13     // status LED pin
#define PIEZOTHRESHOLD 50  // analog threshold for piezo sensing
#define PADNUM 6          // number of pads

//int status[]={0, 0, 0, 0, 0, 0};
int val;
long previousMillis = 0;
long interval = 100;

void setup() {
  pinMode(LEDPIN, OUTPUT);
  Serial.begin(57600);   // set serial output rate
}

void loop() {

  // Loop through each piezo and send data
  // on the serial output if the force exceeds
  // the piezo threshold
  for(int i = 0; i < PADNUM; i++) {
    val = analogRead(i);
    if( (val >= PIEZOTHRESHOLD) && (millis() - previousMillis > interval)){
      previousMillis = millis();
       if (val > 127){
      val = 127;
    }
      digitalWrite(LEDPIN,HIGH);  // indicate we're sending MIDI data
      Serial.print(i);
      Serial.print(",");
      Serial.print(val);
      Serial.println();
    digitalWrite(LEDPIN,LOW);
    
    }
  }
}

Non vi alcun errore. Il problema è che, come ti dicevo in un precedente post, i piedini dell'arduino fluttuano. Allora la soluzione (a mio avviso) è duplice:

  • Livello Hardware: colleghi il piedino che non hai collegato ad un piezo ad una resistenza e l'altra estremità della resistenza a massa; in questo modo "blocchi" i valori che vedi in ingresso.
  • Livello Software: sviluppi l'algoritmo come ti ho descritto nel precedente post ovvero controlli i valori ogni tot millisecondi e conteggi se una rilevazione è superiore o inferiore alla precedente. Se hai i valori minori o maggiori che superano di 5 gli altri allora il valore sta crescendo o scendendo altrimenti fluttua per cui è un errore.