W tym artykule szczegółowo omówimy funkcje klasy Tensometer zawartej w bibliotece ADEAS.h. Klasa ta umożliwia komunikację z belką tensometryczną przy użyciu biblioteki ADEAS_HX711.h, którą możecie znaleźć tutaj. Skupimy się na teoretycznym opisie działania klasy Tensometer oraz funkcji, które oferuje. Jeżeli interesuje Cię praktyczne zastosowanie tej klasy, zachęcamy do zapoznania się z artykułem Obsługa Widgetu Waga w którym przedstawiono konkretne przykłady użycia.
Do poprawnego działania układu ADEAS HX711 wymagane jest podłączenie wszystkich 4 czujników tensometrycznych w przeciwnym wypadku układ nie zadziała prawidłowo, a wskazania wagi będą niepoprawne. Dodatkowo każdy z czujników musi być czujnikiem posiadającym trzy wyprowadzenia : zasilanie dodatnie, zasilanie ujemne oraz sygnał. Większość dostępnych na rynku belek tensometrycznych posiada przewody o jednakowym standardzie kolorystycznym (czerwony, biały i czarny) więc na tych kolorach będziemy bazować.
Prawidłowe podłączenie czujników do wzmacniacza ADEAS HX711 przedstawia się następująco :
Każda z belek oznaczona jest na układzie symbolami J1, J2, J3 i J4. Kolejność podłączenia kabli według kolorów :
J1 i J2 : CZARNY -> CZERWONY -> BIAŁY
J3 i J4 : BIAŁY -> CZERWONY -> CZARNY
Najprostszym sposobem weryfikacji czy układ jest podłączony prawidłowo jest wyświetlanie na monitorze portu szeregowego kolejnych wskazań wagi. Jeżeli wartość wagi przyjmuje niestandardowe liczby typu -25 kg przy zerowym obciążeniu, to znak że któraś z belek lub sam układ jest nieprawidłowo podłączony.
Przyjrzyjmy się teraz wszytkim funkcjom jakie oferuje klasa Tensometer.
Tensometer::prepare(sda_pin, scl_pin)
Funkcja ta jest najistotniejszym elementem klasy, informując urządzenie o pinach do których podłączony jest układ ADEAS HX711. Pin SDA odpowiada za linię danych magistrali komunikacyjnej a pin SCL to linia zegarowa magistrali komunikacyjnej. Przy podłączeniu napięcia i masy układu ADEAS HX711 oraz odpowiednim podpięciu linii magistrali komunikacyjnej do pinów I/O urządzenia ADEAS UNO, waga staje się gotowa do pracy.
Tensometer::setTensometerZeroFactor()
Ta metoda nie została omówiona w artykule Obsługa Widgetu Waga, ponieważ jest ona automatycznie wywoływana podczas naciśniecia przycisku tarowania, natomiast możemy ją również wywołać bezpośrednio w kodzie. Działanie tej funkcji opiera się na odczytaniu aktualnego nieprzetworzonego wskazania wagi 30 razy w celu wyciągnięcia jak najdokładniejszej średniej wartości, a następnie ustawiany jest offset wagi, czyli wartość która będzie zawsze odejmowana od wskazania wagi. Najprościej mówiąc jest to poinformowanie wagi, że cieżar który aktualnie leży na wadze ma nie być brany pod uwagę podczas mierzenie więc wskazanie wagi ma w tym miejscu pokazywać 0kg. Dla przykładu ustawiając na wadze ciężar 2 kg i wywołując metodę setTensometerZeroFactor() od teraz od każdego pomiaru odejmowane będą 2 kg, więc zdejmując ten ciężar dla pustej wagi otrzymamy wskazanie -2 kg, a kładąc 10kg otrzymamy wskazanie 10 kg - 2 kg czyli 8 kg. Dodatkowo funkcja ta zapisuje offset w pamięci EEPROM naszego urządzenia, więc przy zresetowaniu mikrokontrolera wartość ta zostaje zczytana z pamięci i nie jest wymagane ponowne wytarowanie wagi.
Tensometer::getWeight()
Funkcja ta zwraca odczytaną wartość wagi pomniejszoną o ustawiony offset jako liczbę zmiennoprzecinkową do 3 cyfr po przecinku. Podczas wywołania, metoda ta każdorazowo na nowo wzbudza wagę i ustawia aktualną wartość offsetu, tak aby ewentualne wytarowanie wagi podczas działania programu uwzględniło nowy offset podczas kolejnego odczytu wagi. W przypadku klasy Tensometer, pojedynczy odczyt wagi jest wartością średnią z 10 wskazań w celu otrzymania jak najmniejszego błędu pomiarowego.
#include <ADEAS.h>
#include <ADEAS_HX711.h>
/**** SETUP ****/
void setup()
{
ADEAS::setup("WIFI_SSID", "WIFI_PASSWORD", "XXXXXXXXX");
SerialConnector::commandsHandler.attach("Tensometer::tare", Tensometer::setTensometerZeroFactor);
Tensometer::prepare(4, 5);
}
float weight = 0;
/**** LOOP ****/
void loop()
{
ADEAS::process();
if (API::isReady())
{
weight = Tensometer::getWeight();
API::updateData("waga", weight);
}
}