Personenweegschaal met HX711

Sommige projectjes kunnen tijden blijven liggen. De reden daarvoor is niet altijd duidelijk. In het geval van de hier beschreven personenweegschaal weet ik het: ik kreeg om de een of andere reden de zaak niet aan de praat. Waarschijnlijk een slecht contact tussen de diverse onderdelen. In ieder geval heb ik het weer opgepakt en zowaar ook nog werkend gekregen!
De HX711 is een analoog-digitaal omzetter (ADC) speciaal gemaakt voor weegdoeleinden. Hieraan worden zogenaamde weegcellen (load cells) aangesloten met een bepaalde capaciteit. De door mij gebruikte hebben elk een weegcapaciteit van 50Kg; samen goed om tot 200Kg te wegen! De vier weegcellen vormen samen een brug van Wheatstone (Wheatstone bridge).

Hierboven het gehele schema: de Arduino Nano en de HX711-module met rechts de vier weegcellen. Om te kunnen zien wat het resultaat van de weging is, is het wel handig om ook nog een OLED-schermpje aan te sluiten.
Ik heb me eens voorgenomen om wanneer ik een OLED-schermpje gebruik ook een knopje op te nemen. Wanneer zo’n schermpje namelijk langere tijd aanstaat brandt het namelijk op enig moment in en vervaagt de tekst. In het programma neem ik dan het volgende op:

- wanneer de knop ingedrukt is
- zet scherm aan (toon waarde) 
- voor een bepaald aantal seconden
- zet scherm uit

Het is zeer effectief, maar in dit geval, op dit moment niet nodig. Op pin 2 is wel een knopje aangesloten, maar die heeft dus (nog) geen functie.

Weegcel

Twee plaatjes MDF vormen de basis van de weegschaal. De weegcellen worden op elke hoek van het onderste MDF-plaatje bevestigd. Op het bovenliggende plaatje komen boven de weegcellen metalen ringetjes (sluitringen) te liggen om indrukken (beschadiging) van het MDF, wat op termijn natuurlijk weegfouten geeft, te voorkomen. Ik moet nog iets verzinnen hoe ik ervoor zorg dat het bovenste plaatje op zijn plaats blijft.

Zijaanzicht van de twee MDF-plaatjes.

Een optie is om, zoals hierboven weergegeven, een pin te gebruiken die vastzit in het onderste en ruimte heeft in het bovenste MDF-plaatje. Of andersom!

Voetje (3D-geprint) voor de weegcel. Daaronder een ringetje.

Hierboven de bodemplaat met de vastgelijmde voetjes met meetcellen erin geschoven. Op de bovenste plaat zijn de ringen (ter bescherming van het MDF) geplakt. Deze ringen houden de plaat eigenlijk heel goed op zijn plaats: pinnen zoals hierboven beschreven zijn blijkbaar niet echt nodig.

De gebruikte HX711-library (https://github.com/RobTillaart/HX711) heeft een aantal voorbeeldsketches, waaronder een om te kalibreren. Dat heb ik gedaan met een pak rietsuiker van (volgens de huisweegschaal) 764gr. Na 5 metingen met deze resultaten:

Het gemiddelde heb ik overgenomen in onderstaande Arduino sketch.

//
//    FILE: HX_is_ready.ino
//    AUTHOR: Rob Tillaart
//    PURPOSE: HX711 demo
//    URL: https://github.com/RobTillaart/HX711

#include "HX711.h"
HX711 scale;

uint8_t dataPin = 4;
uint8_t clockPin = 5;

#include <Wire.h>
#include "SSD1306Ascii.h"
#include "SSD1306AsciiWire.h"
// 0X3C+SA0 - 0x3C or 0x3D
#define I2C_ADDRESS 0x3C
SSD1306AsciiWire oled;

int Btn1 = 2;                                 // Niet gebruikt
double gem = 0;

void setup()
{
  pinMode (Btn1, INPUT_PULLUP);
  
  Wire.begin();
  oled.begin(&Adafruit128x64, I2C_ADDRESS);
  oled.set400kHz();  
  oled.setFont(Adafruit5x7);  
  oled.clear(); 
  
  Serial.begin(115200);
  Serial.println(__FILE__);

  // Clear the buffer
  oled.clear();
  oled.setFont(fixednums8x16);
  oled.set2X();                               // Draw 2X-scale text

  scale.begin(dataPin, clockPin);
  scale.set_scale(23.702429);                 // TODO you need to calibrate this yourself.
  scale.tare(20);
}

void loop()
{
  if (scale.is_ready())
  {
    // Serial.println(scale.get_units(1)/1000);  
    // delay(1000);
    oled.clear();
    oled.setCursor(30,2);
    for (int i=0; i<10; i++)                  // 10 metingen ...
    {
    gem = gem + scale.get_units(1);
    }
    gem = gem/10;                             // ... en daar het gemiddelde van
    oled.print(gem/1000);                     // Meting delen door 1000 om tot kilogram te komen
    delay(3000);
    gem = 0;                                  // reset
  }
}

De eerste officiële meting! Komt wel overeen met de verwachtingen: 79Kg.

Geef een reactie

Je e-mailadres wordt niet gepubliceerd. Vereiste velden zijn gemarkeerd met *

Deze site gebruikt Akismet om spam te verminderen. Bekijk hoe je reactie gegevens worden verwerkt.