Go Down

Topic: Celle di carico con HX711 (Read 2304 times) previous topic - next topic

gpb01

#30
May 03, 2018, 10:53 am Last Edit: May 03, 2018, 10:56 am by gpb01
Guglielmo, mi puoi spiegare in pratica le istruzioni? Ammetto che lul e CharAt mi sono ostiche...
Semplici ...
... 'ul' sta per unsigned long e lo metti dopo un valore numerico per specificare al compilatore le dimensioni di quel numero.
Come ti ho scritto, se avessi semplicemente scritto 1 il compilatore avrebbe preso quel numero come un valore intero e quindi trattato come un qualche cosa a 16 bit. Dato che io invece lo uso per uno shift a 24 bit (è mi serve il risultato con quella precisione), dovevo specificare al compilatore di NON trattarlo come intero, ma come un oggetto a 32 bit (unsigned long) da qui il postfisso 'ul'.

Per la CharAt() ... altro non è che uno dei tanti metodi che mette a disposizione la classe String. Ricorda che String in realtà NON è un tipo di base come 'int', 'char', ecc., ma una vera e propria classe con i suoi metodi. Basta che vai nel reference per trovare il tutto.
Il metodo CharAt() non fa altro che ritornare il carattere che gli chiedi dove 0 e il carattere più a sinistra (come negli array) e poi a seguire.

Tutto chiaro ?

Guglielmo
Search is Your friend ... or I am Your enemy !

steve-cr

Samantha Cristoforetti: "Mi fai fare un giro sul tuo ultraleggero?". "Certamente, però piloto io !"

Patrick_M

#32
May 03, 2018, 11:49 am Last Edit: May 03, 2018, 11:51 am by Patrick_M
così funziona :)
Code: [Select]


String myString = "110101110001101010101101";
String odd;
void setup() {
   Serial.begin(9600);

   unsigned long numero = 0;
   for (int x = 0; x <= 23; x++) {
      odd = myString.substring(x, x + 1);
      numero = (numero << 1) | odd.toInt();
   }
   Serial.println(numero);
   Serial.println(numero, BIN);
}

void loop() {


}


e alla fine è simile alla proposta di Guglielmo...
per inserire (lo sketch) il programma, dall'IDE clicca modifica, clicca copia per il forum poi vieni qui e incolla nel tuo post (ctrl+v) ;)

gpb01

#33
May 03, 2018, 11:54 am Last Edit: May 03, 2018, 11:55 am by gpb01
e alla fine è simile alla proposta di Guglielmo...
... solo un po' più lento :D :D :D

Guglielmo
Search is Your friend ... or I am Your enemy !

Patrick_M

#34
May 03, 2018, 12:00 pm Last Edit: May 03, 2018, 12:26 pm by Patrick_M
si infatti stavo provando
104   micro il tuo
1248 micro il mio :D

arrivo a 1188 se la conversione la faccio così:
Code: [Select]

numero = (numero << 1) | myString.substring(x, x + 1).toInt();
per inserire (lo sketch) il programma, dall'IDE clicca modifica, clicca copia per il forum poi vieni qui e incolla nel tuo post (ctrl+v) ;)

steve-cr

Quanto mi piacete quando fate cosi   :D  :D  :D
Samantha Cristoforetti: "Mi fai fare un giro sul tuo ultraleggero?". "Certamente, però piloto io !"

Standardoil

Adesso dovrei convertire la stringa in numero binario e da numero binario a numero decimale.....

Ma ce la posso fare....
Forse ! :o
Scusa se entro così, ma ho una domanda
ma perchè?
non fai prima a creare subito il numero, evitando sia Stringhe che stringhe?
mi sono perso qualche pezzo?
Prima legge di Nelson (che sono io): Se vuoi il mio aiuto dimostrami almeno che hai letto il nostro "aiutateCi ad aiutarVi"

Non bado a studenti, che copino altrove

Tu hai problema-Io ti domando-Tu non mi rispondi: vuol dire che non ti serve più

Silente

E poi non capisco quale sia il problema di una funzione che riceva in ingresso l'oggetto Stringa da trasformare in numero, e restituisca il numero stesso.
E soprattutto perché essa non possa creare un numero interno, inizializzato a zero, entrare in un ciclo ripetuto tante volte quanti sono gli elementi della Stringa (for sarebbe l'ideale), nel quale legge ogni elemento della Stringa stessa, moltiplica il numero per due (shiftando così tutti i bit che lo compongono di un posto e liberando l'ultimo), ed aggiungendo a quel numero l'elemento letto dalla Stringa (eventualmente elemento letto -'0', se la Stringa non contenesse boolean ma caratteri).
Avevo già proposto questa strada ma "non é così semplice". Ammetto la mia ignoranza nel non capirne il motivo
Dove va un numero va una variabile, una funzione e/o  un test.
Per ottenere devi spiegare

Strumenti/Formattazione automatica fino alla morte!
Cristianesimo:bibbia='C':K&R

gpb01

Silente ... ma li leggi i post o no ? ... perché la soluzione è già stata data e funziona, ora le domande sono altre ...

Guglielmo
Search is Your friend ... or I am Your enemy !

steve-cr

Scusa se entro così, ma ho una domanda
ma perchè?
non fai prima a creare subito il numero, evitando sia Stringhe che stringhe?
mi sono perso qualche pezzo?
Se leggi bene, io mando un impulso e ricevo un BIT che parte da MSB e arriva, dopo 24 BIT al LSB.
Quindi se come MSB ricevo un 1 poi spiegami come lo trasformo in numero decimale dato che mi mancano le altre 23 cifre binarie... E comunque non ha senso trasformarlo 24 volte...
E' normale che devo attendere che arrivino tutti i 24 BIT che compongono il mio numero e solo dopo lo trasformo, una volta sola, in decimale.
Ora, io ho una Stringa oppure una Dword o qualsiasi altra cosa. Mi è venuto semplice prendere BIT per BIT e "infilzarli" in una stringa, tutti in fila come dei bei soldatini, e poi trasformarla.
In Structured Text posso mettere la lettura in una DWORD e poi shiftare di un carattere verso sinistra (SHL) e trasformare con DWORD_TO_DINT.

Le soluzioni sono diverse, a me ne bastava una :D
Samantha Cristoforetti: "Mi fai fare un giro sul tuo ultraleggero?". "Certamente, però piloto io !"

Standardoil

Nel pomeriggio ho pensato che la tua fosse una domanda ipotetica
Quindi se come MSB ricevo un 1 poi spiegami come lo trasformo in numero decimale dato che mi mancano le altre 23 cifre binarie... E comunque non ha senso trasformarlo 24 volte...
 
nel pomeriggio ho crreduto la tua fosse una domanda retorica, poi ci ho pensato bene, e complice una panascè di troppo forse ho capito che la tua non è domanda ipotetica

questo è il tuo codice, preso dal mesagio numero 7
Code: [Select]



void setup() {
 
 pinMode(3, OUTPUT);
 pinMode(4, INPUT);
 digitalWrite (3,LOW);
 Serial.begin(9600);
 
}

void loop() {
unsigned long int numero=0;
if (digitalRead (4) == LOW) {
for (int i=0; i <= 24; i++){
 
      digitalWrite (3,HIGH);
      // data = digitalRead (4);
// NO NO, niente Stringhe
     numero=numero*2+digitalread(4);
// mi ricordassi la sintassi degli shift di bit farei anche prima

      //delay (1);
      digitalWrite (3,LOW);
     
     }
     
 Serial.println (numero);
 
 }
}


lo ho corretto qui, vedi se compila
ti ho lasciato commenteta una sola riga, dove ipostavi  la variabile data
subito dpo hai la versione numerica
se compila ho buona confdenza che vada
casomai lasciami passare la sbornia
buonanotte
Prima legge di Nelson (che sono io): Se vuoi il mio aiuto dimostrami almeno che hai letto il nostro "aiutateCi ad aiutarVi"

Non bado a studenti, che copino altrove

Tu hai problema-Io ti domando-Tu non mi rispondi: vuol dire che non ti serve più

steve-cr

Nel pomeriggio ho pensato che la tua fosse una domanda ipotetica
nel pomeriggio ho crreduto la tua fosse una domanda retorica, poi ci ho pensato bene, e complice una panascè di troppo forse ho capito che la tua non è domanda ipotetica

questo è il tuo codice, preso dal mesagio numero 7
Code: [Select]



void setup() {
 
 pinMode(3, OUTPUT);
 pinMode(4, INPUT);
 digitalWrite (3,LOW);
 Serial.begin(9600);
 
}

void loop() {
unsigned long int numero=0;
if (digitalRead (4) == LOW) {
for (int i=0; i <= 24; i++){
 
      digitalWrite (3,HIGH);
      // data = digitalRead (4);
// NO NO, niente Stringhe
     numero=numero*2+digitalread(4);
// mi ricordassi la sintassi degli shift di bit farei anche prima

      //delay (1);
      digitalWrite (3,LOW);
     
     }
     
 Serial.println (numero);
 
 }
}


lo ho corretto qui, vedi se compila
ti ho lasciato commenteta una sola riga, dove ipostavi  la variabile data
subito dpo hai la versione numerica
se compila ho buona confdenza che vada
casomai lasciami passare la sbornia
buonanotte

Figo! Magari la prossima volta vado sulla Panascé anche io  :D
Samantha Cristoforetti: "Mi fai fare un giro sul tuo ultraleggero?". "Certamente, però piloto io !"

Standardoil

vuol dire che va?
grazie per aver provato
Prima legge di Nelson (che sono io): Se vuoi il mio aiuto dimostrami almeno che hai letto il nostro "aiutateCi ad aiutarVi"

Non bado a studenti, che copino altrove

Tu hai problema-Io ti domando-Tu non mi rispondi: vuol dire che non ti serve più

steve-cr

#43
May 06, 2018, 10:13 am Last Edit: May 06, 2018, 10:17 am by steve-cr
Guglielmo, cosa dici? E' di una semplicità disarmante!!!
Come dice la regola, "solitamente la soluzione e la via più semplice..."

Il discorso simpatico è che funziona su ogni MCU con ogni linguaggio di programmazione, nel senso che non si spostano bit a sinistra e non devi tenerne la conta in una DWORD...
E' semplicemante ina operazione aritmetica...  :)

Silente c'era arrivato prima ma si stava ancora "incasinando" con l'identazione di una stringa, mentre è ancora più semplice perché il numero binario fine a se stesso non mi interessa...

Samantha Cristoforetti: "Mi fai fare un giro sul tuo ultraleggero?". "Certamente, però piloto io !"

gpb01

#44
May 06, 2018, 10:27 am Last Edit: May 06, 2018, 10:59 am by gpb01
... dico che, più di una semplicità, è di una lentezza disarmate !

Ma siete matti ad usare su piccole MCU a 8 bit operazioni matematiche (moltiplicazione) invece che, dove possibile, gli shift ? ? ? .... non ho verificato ... mi auguro solo che il compilatore, estremamente più ottimizzato di voi :smiley-twist: , si accorga che state facendo una moltiplicazione per due (che è uno << 1) e la trasformi lui in uno shift ... così da riportare in "come va fatto" quello che state facendo !  :smiley-yell:

Guglielmo
Search is Your friend ... or I am Your enemy !

Go Up