HX710B sensore di pressione

Buonasera !!
E' circa 3 settimane che cerco di far lavorare questo sensore e sono arrivato al capolinea.
Non voglio dilungarmi troppo perchè ho fatto un sacco di esperimenti ... tutti infruttuosi!!
Dunque probabilmente c'è un errore macroscopico che proprio non vedo!!
E' un sensore composto dal sensore, a seguire un amplificatore e successivamente un convertitore a 24 bit collegato in seriale.
Lui parte da un valore medio e dà sia letture positive che negative.
Campiona a circa 40hz, ovvero circa ogni 25 ms ti avvisa che il dato è pronto da leggere.
Io ho la necessità di leggere più di un sensore alla volta e dunque ho levato di mezzo il ritardo di default ed ho fatto una funzione banale che in base al tempo di partenza alla fine
crea un delay per sincornizzare le letture successive dei vari sensori.
E rispetto alla funzione di lettura originaria, nel ciclo while, ho aggiunto un controllo anti sleep . Perchè il sensore suddetto può andare anche in risparmio energetico, e dunque se il tempo di attesa supera quello di campionamento lo sveglio.

unsigned long read_pressure(char dat,char ck){
 
 int T_AD_ck =millis()+T_AD;
 
 while(digitalRead(dat)){
   // controllo che non sia in sleep e lo risveglio
   if(millis()>=T_AD_ck){
        digitalWrite(ck, HIGH);
        digitalWrite(ck, LOW);
        T_AD_ck=millis()+T_AD;
   }
  }
 
      
      // read 24 bits
 unsigned long result = 0;
  for (int i = 0; i < 24; i++) {
    digitalWrite(ck, HIGH);
    digitalWrite(ck, LOW);
    result = result << 1;
    if (digitalRead(dat)) {
      
      result++;
    }
  }

  // get the 2s compliment
  result = result ^ 0x800000;

  // pulse the clock line 3 times to start the next pressure reading
  for (char i = 0; i < 3; i++) {
    digitalWrite(ck, HIGH);
    digitalWrite(ck, LOW);
  }

 //delay(25); // delay between readings 40 hz
 return result;
}

T_AD è una variabile globale utilizzata come riferimento per l'anti sleep che per la sincronizzazione dei vari sensori.
a seguito la funzione per il 'giusto ritardo'

  // verifico i tempi di cenversione e genero il ritardo di attesa
void sample_cicle(unsigned int strtt){
  
  strtt=millis()-strtt;
  if(strtt<T_AD)delay((T_AD-strtt));

 } 

Dunque funzionerebbe tutto, ma non à nulla !
In che senso, praticamente anche dopo diverse integrazioni per il valore medio di lettura, insomma per fare lo zero .. continuano ad andare in deriva. Il comportamento cambia anche in base alle sollecitazioni ed ai fronti più o meno repentini di lettura.
Poi durante il lavoro, ogni tanto saltano fuori degli spike !
Ovvero picchi positivi o negativi , dopodichè il sensore si stabilizza, e poi random ripartono.
Questa è la cosa che mi fà più preoccupare, ho iniziato con l'antisleep, pensando che si addormentassero, poi con resistenze sia in pullup che down.. condensatori ecc ecc
perchè ritenevo fosse un disturbo, visto che il segnale viene amplificato e poi convertito ho pensato rientrasse qualcosa.
Ne ho comprati 5 , prima su aliexpress aspettandomi qualche stranezza, ed ho iniziato a fare prove su prove, scambia .. metti ... fosse l'ingresso .. il cavo ecc ecc ma nulla
Dopodichè prima di rinunciare ne ho comprati altri 3 'official' diciamo da distributore nostrano, e di cambia la serigrafia, qualche dettaglio , ma il problema spike e deriva persiste !
Praticamente questo forum è l'ultima speranza, tipo guerre stellari !
Non sò più che pesci prendere!
Unico dubbio mio ignorantemente stò usando un banale arduino R3, ed essenso un 8 bit non vorrei proprio che la cappellata l'abbia fatta io, e che proprio faccia fatica o abbia qualche limite ad impaginare i 24 bit? E' un dubbio tra i tanti ! Ho anche un minima ma ancora non ho provato a compilare e buttare su .
Ringrazio anticipatamente !
Saluti
Riccardo

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.