Dans le cadre d'un projet je dois faire en sorte que, quand les 6 balances détectent une présence cela m'ouvre une porte.
J'ai donc placé mes 6 balances dissimulées en dessous de pierres dans une salle. Lorsque je marche dessus tout fonctionne parfaitement.
Cependant j'ai un bug quand même. Quand les gens passent rapidement sur les pierres, certaines balances gardent une valeurs de présence. Donc parfois, les gens n'ont pas besoin d'être placés sur les balances pour que la porte s'ouvre car certaines balances ne reviennent pas à une tare de 0.
Quelle serait donc la modification dans mon sketch pour que ce bug n'apparaisse pas et que lorsque l'on quitte une pierre (balance) la valeur reviennent à 0.
Le seul moment ou je refais une tare c'est au redémarrage du raspberry pi qui redémarre l'arduino.
Voici mon sketch :
#include "HX711.h"
//DECLARATION DES VARIABLES
int MINLOAD = 30; //Sensibilité de la pression à travailler
String message = "";
String command;
bool stringComplete = false;
//CLASS SCALE - Programmation des balances
class _Scale {
private :
public :
HX711 scale;
int D;
int S;
long zero;
_Scale(int D, int S) {
this->D = D;
this->S = S;
this->scale.begin(D, S);
this->scale.read();
this->zero = this->scale.read();
this->scale.tare();
}
int getData() {
long reading = 0;
if (scale.is_ready()) {
reading = scale.read() - this->zero;
reading = int((90000 - reading) / 10000);
}
return (reading);
}
};
//FIN CLASS SCALE
//BRANCHEMENT DES BALANCES ET LECTURE DE DONNEES
_Scale scales[6] = {
_Scale(2, 3),
_Scale(4, 5),
_Scale(6, 7),
_Scale(8, 9),
_Scale(10, 11),
_Scale(12, 13)
};
//FIN BRANCHEMENT BALANCE ET LECTURE DE DONNEES
void sendMessage(String mesg) {
char charBuf[50];
mesg.toCharArray(charBuf, 50);
Serial.println(mesg);
}
void setup() {
Serial.begin(57600);
}
void loop() {
if (stringComplete) {
// manage message here :
message.trim();
if (message.substring(0, 6) == "BALMIN") {
MINLOAD = message.substring(7).toInt();
}
//REset stuff :
stringComplete = false;
message = "";
}
int nbp = 0;
String bals = "";
for (int i = 0; i < 6; i++) {
int p = scales[i].getData();
bals = bals + "|" + String(p);
if (p > MINLOAD) {
nbp += 1;
}
delay(10);
}
delay(1000);
sendMessage("BAL*T" + String(nbp));
sendMessage("BAL*B" + String(bals));
}
void serialEvent() {
while (Serial.available()) {
char inChar = (char)Serial.read();
message += inChar;
if (inChar == '\n') {
stringComplete = true;
}
}
}
Les balances sont correctement dimensionnées? Elles ne seraient pas en surcharge, lorsqu'une personne passe rapidement il y a une impulsion qui pourrait surcharger la jauge de contrainte.
Non je ne pense pas puisque par moment les balances reviennent bien a leur état initial.
Le seul truc qui me chagrine dans mon programme (et je ne trouve pas la raison) c'est qu'a l'état initial, les balances sont à 9 (valeur par défaut après la tare) et quand les valeurs passent a 11, mon capteur sur le raspi valide la présence et il attends les 6 présence avant d'ouvrir la porte.
Par moment les balances reviennent bien a 9 et par moment elles restent bloquées à 10 ou 11 minimum et ce problème ne se pose pas toujours sur les mêmes balances, par exemple la balance 1 peut avoir le problème, rester à 11 et en remarchant dessus, en poussant la valeur a 40 ou 50 et en la relâchant la pierre revient bien a 9 et parfois le problème peut se faire sur la balances 2 et 5 par exemple. La fois suivante la 2 et 5 vont très bien régir et ca sera la 3 et 1.
Donc il faudrait que je trouve une solution pour éviter se désagrément mais je ne trouve pas spécialement la façon de faire.
Le HX711 donne un résultat de mesure sur 24 bits. De 9 à 11 tu es dans le bruit de mesure.
Il me semble que tu places ton seuil de déclenchement bien trop bas.
Quelle valeur la mesure te retourne-t-elle lorsqu'une personne est sur la pierre?
Tout dépend du poids des personnes, ça va de 30 à 80/90.
En fait je suis obligé de mettre une faible détection puisque par moment quand il n'y a pas 6 personnes, les personnes doivent mettre 2 poids quand ils sont que 4 joueurs.
Et j'ai réglé à 11 le déclenchement car les poids n'arrivent pas à dépasser les 11 en valeurs quand ils sont sur les pierres. Et les poids sont déjà bien lourd pour les manipuler.
Quelle est la source de la librairie utilisée ? (on en trouve plusieurs pour les HX711)
Celle de Bodgan Necula disponible dans le Gestionnaire de Librairie semble donner satisfaction à de nombreux utilisateurs
Les valeurs anormalement très basses que tu trouves (la valeur brute fournie par un HX711 peut monter jusqu'à 8 388 607 !) pourraient découler d'un code qui me semble pas définir correctement l'échelle des mesures