/*
code pour pour faire une mesure de force en newton, avec un amplificateur HX711
et un capteur d'effort CZL635-5, un bouton poussoir permet de faire la tare,
un bouton poussoir qui assure la calibration
et deux boutons poussoirs qui ajustent la calibration.
L'affichage de la mesure, la tare et la calibration se font par un écran
LCD 2 x 16 caractères rétroéclairé se raccordant via le bus I2C.
La calibration se fera avec une masse étalon de 1kg et l'utilisateur
lira la pesée de cette masse étalon, sur l'écran LCD.
L'utilisateur pourra lire sur l'écran LCD la valeur de la force maximale,
la valeur de la force minimale, et la valeur de la force moyenne pour une mesure durant 10 secondes.
Il peut appuyer sur un bouton pour afficher ces valeurs.
ce code nécessite la bibliothèque hd44780.h voir https://github.com/duinoWitchery/hd44780#readme
*/
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include "HX711.h"
#define DOUT_PIN 2 // Broche DOUT du HX711 connectée à la broche 2 de l'Arduino
#define CLK_PIN 3 // Broche CLK du HX711 connectée à la broche 3 de l'Arduino
#define TARE_BUTTON_PIN 4 // Broche du bouton poussoir pour la tare
#define CALIBRATION_BUTTON_PIN 5 // Broche du bouton poussoir pour la calibration
#define ADJUST_BUTTON_PIN_1 6 // Broche du premier bouton poussoir d'ajustement
#define ADJUST_BUTTON_PIN_2 7 // Broche du deuxième bouton poussoir d'ajustement
#define DISPLAY_BUTTON_PIN 8 // Broche du bouton poussoir pour afficher les résultats
#define LCD_ADDRESS 0x27 // Adresse I2C de l'écran LCD
#define LCD_COLUMNS 16
#define LCD_ROWS 2
LiquidCrystal_I2C lcd(LCD_ADDRESS, LCD_COLUMNS, LCD_ROWS);
HX711 scale;
float calibration_factor = 0.0;
float maxForce = 0.0;
float minForce = 0.0;
float sumForce = 0.0;
int forceCount = 0;
void setup() {
lcd.init();
Serial.begin(9600);
pinMode(TARE_BUTTON_PIN, INPUT_PULLUP);
pinMode(CALIBRATION_BUTTON_PIN, INPUT_PULLUP);
pinMode(ADJUST_BUTTON_PIN_1, INPUT_PULLUP);
pinMode(ADJUST_BUTTON_PIN_2, INPUT_PULLUP);
pinMode(DISPLAY_BUTTON_PIN, INPUT_PULLUP);
lcd.begin(16, 2);
lcd.backlight();
scale.begin(DOUT_PIN, CLK_PIN);
// Attendre que le capteur soit prêt
Serial.println("Attente du calibrage du capteur...");
delay(1000);
// Effectuer la tare au démarrage
scale.tare();
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Placez 1kg sur le");
lcd.setCursor(0, 1);
lcd.print("capteur et appuyez");
}
void loop() {
// Tare si le bouton est enfoncé
if (digitalRead(TARE_BUTTON_PIN) == LOW) {
scale.tare();
delay(500); // Délai pour éviter les rebonds du bouton
}
// Calibration avec une masse de 1 kg si le bouton est enfoncé
if (digitalRead(CALIBRATION_BUTTON_PIN) == LOW) {
calibrateScale();
delay(500); // Délai pour éviter les rebonds du bouton
}
// Ajuster la calibration si les boutons sont enfoncés
if (digitalRead(ADJUST_BUTTON_PIN_1) == LOW) {
scale.set_scale(scale.get_scale() * 1.01); // Augmenter la calibration
delay(500); // Délai pour éviter les rebonds du bouton
}
if (digitalRead(ADJUST_BUTTON_PIN_2) == LOW) {
scale.set_scale(scale.get_scale() * 0.99); // Diminuer la calibration
delay(500); // Délai pour éviter les rebonds du bouton
}
// Lire et afficher la force mesurée
float force = scale.get_units(10);
// Mettre à jour les valeurs de la force maximale, minimale et la somme pour la moyenne
if (force > maxForce) {
maxForce = force;
}
if (force < minForce || minForce == 0) {
minForce = force;
}
sumForce += force;
forceCount++;
// Lorsque le bouton d'affichage est enfoncé, afficher les résultats
if (digitalRead(DISPLAY_BUTTON_PIN) == LOW) {
displayResults();
delay(500); // Délai pour éviter les rebonds du bouton
}
// Lire et afficher la force mesurée
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Force (N): ");
lcd.setCursor(12, 0);
lcd.print(force, 2); // Afficher la force avec deux décimales
lcd.setCursor(0, 1);
lcd.print("Appuyez pour res.");
lcd.setCursor(12, 1);
lcd.print("ultats");
delay(1000); // Délai entre les mesures
}
void calibrateScale() {
Serial.println("Calibration en cours. Placez 1kg sur le capteur...");
// Attendre que le poids soit stable pour la calibration
while (!scale.get_units(10)) {
delay(500);
Serial.println("En attente de stabilité...");
}
calibration_factor = scale.get_units(10) / 1.0; // Divisez par le poids réel en newtons
scale.set_scale(calibration_factor);
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Calibration term.");
lcd.setCursor(0, 1);
lcd.print("Calib. factor: ");
lcd.print(calibration_factor, 5); // Afficher le facteur de calibration avec cinq décimales
}
void displayResults() {
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Max Force: ");
lcd.print(maxForce, 2);
lcd.setCursor(0, 1);
lcd.print("Min Force: ");
lcd.print(minForce, 2);
if (forceCount > 0) {
float averageForce = sumForce / forceCount;
lcd.setCursor(0, 2);
lcd.print("Avg Force: ");
lcd.print(averageForce, 2);
}
// Réinitialiser les valeurs après l'affichage
maxForce = 0.0;
minForce = 0.0;
sumForce = 0.0;
forceCount = 0;
delay(3000); // Délai pour afficher les résultats pendant 3 secondes
}