Salve, sono nuovo e quello per cui vi chiederò aiuto è il mio progetto con Arduino uno. Fino ad oggi non avevo mai provato ad utilizzare Arduino, ma grazie alle poche nozioni di matlab sono riuscito a far funzionare il mio progetto. In poche parole si tratta di una bilancia che se rileva un peso compreso in un certo intervallo (io ho messo 40g e 160g) fa partire una serie di azioni. Se ciò non accade continua il monitoraggio. Le azioni che partono quando la bilancia rileva il peso dell'intervallo specificato, sono:
- azionamento di un servomotore, 179 gradi
- apertura di due relè per un certo tempo e chiusura dei due successivi
- chiusura dei primi due e apertura degli ultimi due
- azionamento del servomotore, 0 gradi
I relè servono per azionare un motore di un tergicristallo alimentato esternamente con 12v. Il perchè di 4 relè è per invertire l'alimentazione (i primi due sono + e - e gli altri due sono - e +) ed ottenere prima la rotazione oraria e poi antioraria.
Dopo qualche test mi sono accorto che il sensore ha come un transitorio, nel senso che se metto un oggetto di 300g sulla bilancia può anche fare due tre rilevazioni con peso incrementale (tipo 60g, 180g, 300g=peso corretto) e questo manda in crisi la condizione di azionamento del ciclo.
Per ovviare al problema ho pensato di cambiare il ciclo if, in maniera tale che scarti le prime letture facendo la media delle successive (ad esempio le 20 successive). In questo modo otterrei sicuramente una rilevazione più attendibile, perchè in questo progetto non conta tanto l'errore di rilevazione del peso ma che la variazione di peso tra il prima e dopo sia inclusa nell'intervallo 40g e 160g.
L'idea che mi sono fatto per fare tutto questo è costruire un array che contenesse tutte le pesate eccetto le prime 3-4 (quindi se le pesate fossero 20 dovrebbe essere un array di dimensioni 17-16) e fare la media di tutti gli elementi dell'array con la funzione average. A questo punto il numero ottenuto va verificato se è compreso nell'intervallo 40-160: se si partono le azioni, altrimenti no e la bilancia deve continuare il monitoraggio. Il problema è che sto provando da giorni ma non riesco, anche se capisco il senso generale non riesco a scrivere niente...sapreste aiutarmi?
Ecco lo sketch:
#include "HX711.h"
#define DOUT A1
#define CLK A0
HX711 bilancia(DOUT, CLK);
int peso = 0; // zona di memorizzazione del peso corrente
int pesoprec = 0; // zona di memorizzazione dell'ultimo peso esposto
int X = peso - pesoprec;
int RELAY1 = 2 ; //PIN pulsante 1 azionamento motore
int RELAY2 = 5; //PIN pulsante 1 azionamento motore
int RELAY3 = 6; //PIN pulsante 1 azionamento motore
int RELAY4 = 7; //PIN pulsante 1 azionamento motore
#include <Servo.h>
Servo fermo;
//
//
void setup()
{
Serial.begin(9600);
Serial.println("calcolo della tara - tare");
Serial.println("non mettere nulla sul piatto – don’t place anything on the scale...");
delay (94);
bilancia.set_scale(100); // inserire il valore di scala, al posto di 2022 - insert scale value instead of 2022
bilancia.tare(20); // il peso a vuoto e' considerato tara
Serial.println("sistema pronto - system ready");
}
//
void loop()
{ peso = bilancia.get_units(50), 3;
if ((peso > 40 && peso < 160)) // se e' variato il peso
{
pesoprec = peso; // memorizza il peso corrente
Serial.print("peso - weigth: ");
Serial.print(peso);
Serial.println("g");
fermo.attach(3); //collegamento servomotore pin3
fermo.write(179); //gradi di rotazione servomotore, apertura perno
delay(1000);
//motore piano
pinMode(RELAY1, OUTPUT);
pinMode(RELAY2, OUTPUT);
pinMode(RELAY3, OUTPUT);
pinMode(RELAY4, OUTPUT);
digitalWrite(RELAY1, LOW);
digitalWrite(RELAY2, LOW);
digitalWrite(RELAY3, HIGH);
digitalWrite(RELAY4, HIGH);
delay(2000); //durata apertura relè, pulsante motore 2
digitalWrite(RELAY1, HIGH);
digitalWrite(RELAY2, HIGH);
digitalWrite(RELAY3, LOW);
digitalWrite(RELAY4, LOW);
delay(2000); //durata apertura relè, pulsante motore 1
digitalWrite(RELAY1, HIGH);
digitalWrite(RELAY2, HIGH);
digitalWrite(RELAY3, HIGH);
digitalWrite(RELAY4, HIGH);
delay(2000); //durata chiusura tutti i relè
fermo.write(0); //gradi di rotazione servomotore, chiusura perno
delay(10000); // attende 100 millisecondi prima di procedere
// alla successiva pesata
}
}
Grazie