Salve a tutti, il mio intento era quello di memorizzare un peso rilevato da una cella di carico controllata da scheda HX711, fissarlo su uno schermo tft e poi, mano a mano che il peso scende, visualizzare la differenza tra il peso iniziale è il peso che piano piano scende. Non so proprio da dove cominciare. C’è qualcuno che può darmi una mano, grazie mille.
Ciao.
Il problema è utilizzare la cella di carico col HX711 o impostare lo skecth che partendo da un peso iniziale visualizza la differenza sul display?
Il problema è la differenza
Non mi sembra un grosso problema, un tasto lo dedichi ad impostare lo "zero" (cosa che puoi fare per prima cosa sella setup), ed a quel punto memorizzi il valore corrente in una variabile globale e da quel momento mostri solo la differenza.
Se vuoi qualcosa di più preciso devi postare il tuo codice.
Forse non mi sono spiegato bene:
Il mio progetto era quello di misurare quanta acqua veniva sprecata per ogni piantina di un orto da me costruito. Per fare questo, sotto il serbatoio dell’acqua ho posizionato una cella di carico e, volevo che alla pressione di un bottone, la pesa cominciasse a pesare la differenza tra il peso iniziale (individuato alla pressione del bottone) e il peso che mano a mano corre. Ad esempio se il serbatoio pesa 2kg, quando pesa 1,5kg, sullo schermo tft appare -0,5kg o grammi. Il problema che ho io sta nell’effettuazione della differenza, con lo schermo e la bilancia non ho problemi, anzi riesco ad utilizzarli al meglio.
Posta il codice che usi al momento, così possiamo modificarlo per effettuare la sottrazione.
Io penso che alla pressione del tasto mi devo memorizzare il peso in una variabile. Poi in loop effettuo una altra misurazione che salvo in altra variabile Es pesoCorrente e faccio: pesoTotale = pesoPrecedente - pesoCorrente.
Dovrò quindi stampare la variabile pesoTotale. Il nome dato alle variabili è solo di esempio, non ho dedicato tempo per trovare il nome più adatto.
Ciao.
Ecco il mio codice:
#include "HX711.h"
#include <Wire.h>
#include <Adafruit_GFX.h> // Include core graphics library
#include <Adafruit_ST7735.h> // Include Adafruit_ST7735 library to drive the display
#include <Fonts/FreeSerif18pt7b.h>
#define TFT_CS 10
#define TFT_RST 9
#define TFT_DC 8
Adafruit_ST7735 tft = Adafruit_ST7735(TFT_CS, TFT_DC, TFT_RST);
const int dout = 2;
const int sck = 3;
HX711 bilancia;
int peso = 0;
int pesoprec = 0;
void setup(){
tft.initR(INITR_BLACKTAB);
tft.fillScreen(ST7735_GREEN);
tft.setRotation(1);
tft.setTextWrap(false);
Serial.begin (9600);
bilancia.begin(dout, sck);
bilancia.set_scale(474);
bilancia.tare(30);
}
void loop(){
Peso();
}
void Peso(){
tft.setCursor(0 , 10);
tft.setTextSize(2);
tft.setTextColor(ST7735_WHITE, ST7735_BLUE);
tft.print("Grammi:");
tft.setCursor(85 , 10 );
tft.setTextSize(2);
tft.setTextColor(ST7735_WHITE, ST7735_BLUE);
tft.print(peso);
tft.setCursor(85, 10);
tft.print(" ");
tft.setCursor(85, 10);
tft.print(peso);
delay(1);
peso = bilancia.get_units(10);
if (!(peso == pesoprec)){
pesoprec = peso;
}
if((peso < 0 )){
peso = 0;
}
}
Intanto io non ho mai avuto esperienza diretta con un HX711 ma la libreria l'ho già visionata diverse volte sul repositor. Se è la stessa libreria che usi tu (sembra di si) vedo già dei problemi con il tipo di variabile che hai usato. Al posto di int dovresti usare float, cioè:
float peso = 0;
float pesoprec = 0;
Poi ci guardo meglio dentro alla lib e dovrei essere in grado di suggerirti altro.
Ciao.
Ora che hai spiegato meglio e soprattutto hai messo il codice, ti si può dire qualcosa.
Ora, a parte quanto detto da Maurotec (non entro in considerazionisu quella libreria che non ho mai usato) ho qualche considerazione "generale": abituati ad indentare bene (per iniziare usa il tasto Ctrl-T per farlo fare una prima volta all'IDE).
Questo serve per rendere il codice più facilmente leggibile in primo luogo per TE (specialmente quando farai codici più complessi, e/o se vuoi evitare di doverci ragionare sopra o dopo un anno per capire come funziona e dove modificare o per correggere e fare debug) ma anche per chi, come noi, deve leggere il tuo codice. E magari aggiungi comunque anche dei commenti, per i motivi di cui sopra. Evita anche tutte quelle inutili righe vuote: lascia una riga prima di ogni funzione e prima di ogni blocco in qualche modo da "evidenziare", e togli le altre.
Detto questo, passiamo alla logica del codice che hai mostrato. La prima cosa è che in sostanza chiama la funzione "Peso()" ad ogni ciclo di loop, e questo è quantomeno inutile. La funzione loop() viene chiamata MIGLIAIA di volte al secondo (comunque circa 1 millisecondo visto ch ehai una "delay(1)"), e non credo che tu voglia monitorare il peso così di frequente.
Potresti fare una lettura ogni 10 secondi come minimo, anche se forse per la tua applicazione basta anche una volta ogni 30 secondi o più, dipende dalla velocità di svuotamento, che non conosciamo, e dalla precisione che desideri. Per ora se non deve fare altro, basta mettere "in pausa" con delay() (in futuro se dovrà fare altro la cosa migliore sarebbe studiare la funzione "millis()")
Poi inizia a gestire bene il display. Aggiornalo solamente se il peso dovesse cambiare, inutile ridisegnare tutto se non serve (tantomeno farlo 1000 volte al secondo...), e le scritte fisse disegnale solo una volta all'inizio del codice poi scrivi solo i valori letti alla posizione giusta facendo setcursor().
Tra l'altro tu nella funzione "Peso()" prima scrivi il valore (che è quello precedente) e poi leggi quello nuovo: l'aggiornamento del display devi farlo DOPO aver letto il valore...
Poi ti consiglio, più che cancellare il valore scrivendo 8 spazi, di controllare l'output con un formato fisso, ad esempio 2 cifre intere ed un decimale (tra l'altro tu dedichi ben 8 caratteri attualmente, che ad ogni visualizzazione pulisci: ti servono realmente?). Ah, sempre nella "Peso()" scrivi due volte il valore a 85,10: perché?
Per prima cosa però fai in modo che nella setup() tu legga il primo valore di riferimento (così in genere ti basta anche solo accendede Arduino per avere la prima misurazione) che metterai nella variabile globale che già hai.
Insomma, puoi iniziare mettendo questo nel setup():
...
// Intervallo tra letture (in millisecondi)
#define INTERVALLO 10000
...
// Scrive l'etichetta
tft.setCursor(0, 10);
tft.setTextSize(2);
tft.setTextColor(ST7735_WHITE, ST7735_BLUE);
tft.print("Grammi:");
// Prima lettura iniziale
Peso();
quindi la tua funzione "Peso()" potrebbe diventare:
void Peso(){
// Lettura del peso
peso = bilancia.get_units(10);
if((peso < 0 ))
peso = 0;
// Verifico se è cambiato (qual è la precisione richiesta??)
if (peso != pesoprec)){
tft.setTextColor(ST7735_WHITE, ST7735_BLUE);
tft.setCursor(85, 10);
tft.print(" ");
tft.setCursor(85, 10);
tft.print(peso);
pesoprec = peso;
}
delay(INTERVALLO);
}
Insomma, una volta che avrai sistemato il tuo codice per fare quanto ti ho consigliato (se vorrai farlo... ) già la funzionalità di base ce l'hai, dovrai poi solo aggiungere la gestione di un pulsante per eventualmente resettare la lettura senza dover riavviare Arduino (lascio a te il codice, ma ovviamente se hai bisogno posta qui il tuo tentativo e ti aiutiamo...).
This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.