Balance Électronique avec Microcontrôleur 51 et Module HX711 en Simulation Proteus

Conception Matérielle

Le système repose sur le microcontrôleur AT89C51 pour le traitement central, intégrant le module de pesage HX711, un clavier matriciel pour la saisie des prix unitaires, et un écran LCD1602 pour afficher les données. Un buzzer et des LED sont utilisés pour les indications utilisateur.

Système minimal du microcontrôleur 51

Bien que les circuits d'horloge et de réinitialisation ne soient pas strictement nécessaires en simulation, ils sont inclus pour assurer la fiabilité.

Circuit du HX711

Étant donné que Proteus 8.9 ne propose pas de modèle natif pour le HX711, un fichier de simulation externe a été intégré pour permettre la fonctionnalité.

Circuit du DS1302

Le DS1302 fournit l'heure système. En l'absence de configuration manuelle, il se synchronise avec l'horloge de l'ordinateur via une communication série. Un quartz de 32,768 kHz est requis pour son fonctionnement.

Circuit du clavier matriciel

Le clavier utilise une méthode de scan, avec des boutons connectés aux broches d'E/S.

Autres circuits

Les composants tels que l'écran LCD, le buzzer et les LED ne sont pas détaillés ici.

Conception Logicielle

Fonctions de pilotage

Les modules logiciels incluent les pilotes pour le LCD, le HX711, le DS1302, le clavier matriciel et les fonctions de délai, permettant une abstraction des opérations matérielles.

Conception du programme

Le système fonctionne en deux modes : le mode de tarification normal et le mode veille. Il gère les entrées du clavier pour la saisie des prix unitaires, y compris la gestion des décimales via une position de point mémorisée. Exemple de code modifié pour la lecture des touches :

// Lire la touche du clavier matriciel
touche = LireClavierMatriciel();
if (touche >= 0 && touche <= 10) {
    if (longueur < 4) {
        if (touche != 10) {
            valeur = valeur * 10 + touche;
            longueur++;
        }
        if (touche == 10) {
            point_active = 1;
            position_point = longueur;
        }
    }
}

D'autres fonctions sont implémentées pour la tare, l'ajustement de la sensibilité, le calcul du prix et la remise à zéro. Exemple de code modifié pour la tare et le calcul :

// Tare
if (touche == 11) {
    if (tare_valeur == 0)
        tare_valeur = Poids_Mesure;
    else
        tare_valeur = 0;
}
// Ajustement de la calibration
if (touche == 12) {
    if (ValeurCalibration < 10000)
        ValeurCalibration += 10;
    EcrireEEPROM();
}
if (touche == 13) {
    if (ValeurCalibration > 1)
        ValeurCalibration -= 10;
    EcrireEEPROM();
}
// Calcul du prix
if (touche == 15 && termine == 0) {
    if (point_active != 0) {
        resultat = (float)valeur * Poids_Mesure / Puissance10(10, longueur - position_point);
    } else {
        resultat = (float)valeur * Poids_Mesure;
    }
}
// Remise à zéro
if (touche == 14) {
    valeur = 0;
    resultat = 0;
    position_point = 0;
    longueur = 0;
    point_active = 0;
    AfficherChaineLCD(1, 11, "        ");
}

Le système passe en mode veille après une période d'inactivité, et se réveille sur n'importe quelle action du clavier. Exemple de code modifié pour la gestion de la veille :

// Compteur de veille
if (touche == 255) {
    compteur_actif = 1;
} else {
    compteur = 0;
    compteur_actif = 0;
    mode_veille = 0;
}

En mode actif, le programme effectue des mesures de poids périodiques et met à jour l'affichage avec les données de poids, de prix et de temps. Exemple de code modifié pour l'affichage et la mesure :

if (mode_veille == 0) {
    // Mesurer le poids toutes les 0.5 secondes
    if (DrapeauTest == 1) {
        Obtenir_Poids();
        DrapeauTest = 0;
    }
    // Afficher le prix final
    AfficherNombreLCD(2, 10, resultat / 1000, 3);
    AfficherChaineLCD(2, 13, ".");
    AfficherNombreLCD(2, 14, resultat % 1000, 3);
    // Afficher le point décimal
    if (position_point != 0) {
        AfficherChaineLCD(1, 11 + position_point, ".");
    }
    temp = 0;
    for (i = 0; i < longueur; i++) {
        if (i == position_point && position_point != 0) temp++;
        AfficherNombreLCD(1, 11 + temp, valeur / Puissance10(10, longueur - i - 1) % 10, 1);
        temp++;
    }
    // Afficher l'heure en temps réel
    LireTempsDS1302();
    AfficherNombreLCD(2, 1, TempsDS1302[3], 2);
    AfficherChaineLCD(2, 3, ":");
    AfficherNombreLCD(2, 4, TempsDS1302[4], 2);
    AfficherChaineLCD(2, 6, ":");
    AfficherNombreLCD(2, 7, TempsDS1302[5], 2);
} else {
    // Effacer l'écran en mode veille
    EcrireCommandeLCD1602(0x01);
}

Démonstration des Fonctionnalités

Au démarrage, le système affiche un message de bienvenue après une brève temporisation. En mode normal, l'écran affiche le poids, le temps et le prix total, avec la zone du prix unitaire initiale en attente d'entrée. L'utilisateur peut ajuster le poids via le HX711 et saisir le prix unitaire via le clavier. Après confirmation, le prix final est calculé et affiché. En cas d'inactivité prolongée, le système entre en mode veille avec écran éteint, réactivable par une touche. Le bouton de remise à zéro permet de réinitialiser les données pour une nouvelle saisie. Les fonctions de tare et d'ajustement de calibration sont également disponibles mais non testées ici.

Étiquettes: microcontroller-51 HX711 Proteus electronic-scale LCD1602

Publié le 4 juin à 19h00