logo elektroda
logo elektroda
X
logo elektroda
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

Arduino: Waga na 4 czujnikach HX711, kompilacja pliku, kalibracja i modyfikacja kodu źródłowego

zbzu 04 Lut 2023 11:08 891 13
  • #1 20421667
    zbzu
    Poziom 9  
    Posty: 70
    Pomógł: 1
    Ocena: 25
    Witam
    robię sobie wagę pod arduino i mam problem z poprawną kompilacją pliku,
    waga jest na 4 czujnikach i układzie HX711
    wgrałem bibliotekę i na oryginalnym programie biblioteki waga działa, kalibruje się i dokonuje ważenia więc wszystko działa, jednak jest tam zbyt wiele rzeczy które nie są mi potrzebne więc chciałem użyć już gotowych rozwiązań i takiego programiku użyłem
    (żródło: http://home.agh.edu.pl/~bartus/index.php?action=efekty&subaction=arduino&item=39)
    jednak cos mi się burzy podczas kompilacji, mógłby ktoś podpowiedzieć w czym jest problem, bo nie jestem zbyt biegły w programowaniu.
    W użytym programie musiałem zmienić odwołanie do biblioteki z "HX711.h" na "HX711_ADC.h", no i porty ale nadal kompilacja zatrzymuje mi sie na instrukcji "HX711 scale:"

    takich instrukcji użyłem:

    #include "HX711.h"

    #define DOUT 4
    #define CLK 5

    HX711 scale;

    float calibration_factor = -7050; //-7050 worked for my 440lb max scale setup

    void setup() {
    Serial.begin(9600);
    Serial.println("HX711 calibration sketch");
    Serial.println("Remove all weight from scale");
    Serial.println("After readings begin, place known weight on scale");
    Serial.println("Press + or a to increase calibration factor");
    Serial.println("Press - or z to decrease calibration factor");

    scale.begin(DOUT, CLK);
    scale.set_scale();
    scale.tare(); //Reset the scale to 0

    long zero_factor = scale.read_average(); //Get a baseline reading
    Serial.print("Zero factor: "); //This can be used to remove the need to tare the scale. Useful in permanent scale projects.
    Serial.println(zero_factor);
    }

    void loop() {

    scale.set_scale(calibration_factor); //Adjust to this calibration factor

    Serial.print("Reading: ");
    Serial.print(scale.get_units(), 1);
    Serial.print(" kg"); //Change this to kg and re-adjust the calibration factor if you follow SI units like a sane person
    Serial.print(" calibration_factor: ");
    Serial.print(calibration_factor);
    Serial.println();

    if(Serial.available())
    {
    char temp = Serial.read();
    if(temp == '+' || temp == 'a')
    calibration_factor += 10;
    else if(temp == '-' || temp == 'z')
    calibration_factor -= 10;
    }
    }



    po próbie kompilacji taką zwrotkę otrzymuję:

    sketch_feb04d:6: error: 'HX711' does not name a type

    HX711 scale;

    ^

    C:\Users\user\AppData\Local\Temp\arduino_modified_sketch_160287\sketch_feb04d.ino: In function 'void setup()':

    sketch_feb04d:18: error: 'scale' was not declared in this scope

    scale.begin(DOUT, CLK);

    ^

    C:\Users\user\AppData\Local\Temp\arduino_modified_sketch_160287\sketch_feb04d.ino: In function 'void loop()':

    sketch_feb04d:29: error: 'scale' was not declared in this scope

    scale.set_scale(calibration_factor); //Adjust to this calibration factor

    ^

    Znaleziono wiele bibliotek w "HX711_ADC.h"
    Wykorzystane: C:\Program Files (x86)\Arduino\libraries\HX711_ADC
    Niewykorzystane: C:\Users\user\Documents\Arduino\libraries\HX711_ADC-1.2.12
    exit status 1
    'HX711' does not name a type


    Dodano po 2 [godziny] 38 [minuty]:

    robie próby z różnymi podobnymi programami i zawsze na tym samym zatrzymuje się podczas kompilacji czyli na "HX711 scale:"
  • Pomocny post
    #2 20422343
    gps79
    Poziom 37  
    Posty: 2212
    Pomógł: 495
    Ocena: 797
    zbzu napisał:
    W użytym programie musiałem zmienić odwołanie do biblioteki z "HX711.h" na "HX711_ADC.h",
    właśnie to spowodowało błąd. Przywróć kod do poprzedniego stanu, czyli
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
  • #3 20422443
    zbzu
    Poziom 9  
    Posty: 70
    Pomógł: 1
    Ocena: 25
    tyle tylko że jak puszczałem kompilację w oryginale czyli z #include "HX711.h" to wywala mi taki komunikat (bo zapomniałem o tym napisać, od tego zaczął się problem i dlatego szukam przyczyny):

    C:\Users\user\AppData\Local\Temp\arduino_modified_sketch_295478\sketch_feb04i.ino:1:19: fatal error: HX711.h: No such file or directory
    #include "HX711.h"
    ^
    compilation terminated.
    exit status 1
    Błąd kompilacji dla płytki Arduino/Genuino Uno.



    natomiast jak wgram program z biblioteki to on działa a ma wpis "HX711_ADC.h" i faktycznie ta biblioteka znajduje się w takim katalogu i tu sie o nic nie burzy
  • Pomocny post
    #4 20422585
    gps79
    Poziom 37  
    Posty: 2212
    Pomógł: 495
    Ocena: 797
    To, że do baku samochodu benzynowego dasz radę wlać diesla, to nie znaczy, że pojedzie. Nie podmieniaj biblioteki na inną, bo nie wiesz, jaki to da efekt.
    zbzu napisał:
    fatal error: HX711.h: No such file or directory
    oznacza, że plik nie został znaleziony. Prawdopodobnie nie masz zainstalowanej biblioteki.
    W Arduino IDE wybierz menu Tools -> Manage Libraries...
    Tam wybierz i zainstaluj bibliotekę użytą w Twoim kodzie:
    Arduino: Waga na 4 czujnikach HX711, kompilacja pliku, kalibracja i modyfikacja kodu źródłowego
    Skompiluj i baw się dobrze.
  • #5 20422672
    zbzu
    Poziom 9  
    Posty: 70
    Pomógł: 1
    Ocena: 25
    Do samej zabawy to jeszcze chyba trochę potrwa,
    pobrałem i zainstalowałem bibliotekę HX711 Arduino Library
    teraz na liście bibliotek mam dwie:
    HX711 Arduino Library (ver 0,7,5 z 24-11-2021)
    HX711 ADC (ver 1,2,12 z 30-01-2022)
    mam wykasować tą ***ADC ?
    tak przy okazji zauważyłem że biblioteki siedzą w dwóch miejscach, w katalogu LIBRARY oraz w USERS część tu a część tam

    zachowało się inaczej przy kompilacji ale jeszcze jest problem i kompilacja wywala błędy:

    sketch_feb04a:4: error: no matching function for call to 'HX711::HX711(int, int)'
    HX711 scale(DOUT, CLK);
    ^
    C:\Users\user\AppData\Local\Temp\arduino_modified_sketch_89499\sketch_feb04a.ino:4:22: note: candidates are:
    In file included from C:\Users\user\AppData\Local\Temp\arduino_modified_sketch_89499\sketch_feb04a.ino:1:0:
    C:\Users\user\Documents\Arduino\libraries\HX711_Arduino_Library-0.7.5\src/HX711.h:30:3: note: HX711::HX711()
    HX711();
    ^
    C:\Users\user\Documents\Arduino\libraries\HX711_Arduino_Library-0.7.5\src/HX711.h:30:3: note: candidate expects 0 arguments, 2 provided
    C:\Users\user\Documents\Arduino\libraries\HX711_Arduino_Library-0.7.5\src/HX711.h:19:7: note: constexpr HX711::HX711(const HX711&)
    class HX711
    ^
    C:\Users\user\Documents\Arduino\libraries\HX711_Arduino_Library-0.7.5\src/HX711.h:19:7: note: candidate expects 1 argument, 2 provided
    exit status 1
    no matching function for call to 'HX711::HX711(int, int)'
  • #7 20425778
    zbzu
    Poziom 9  
    Posty: 70
    Pomógł: 1
    Ocena: 25
    Wielkie dzięki za chęć pomocy i za pomoc

    trochę się pobawiłem i okazało się że coś co wcześniej nie chciało chodzić samo zaczęło działać, jeszcze nie wszystkie skrypty ale przynajmniej jeden z tych co mnie interesują działa. Ponieważ ten jeden działa to na razie skupiłem się na nim żeby osiągnąć to co chcę, a resztą zajmę się później,
    i tak:
    - waga działa, waży i jest ok
    - ale po wyłączeniu zasilania i ponownym włączeniu waga się resetuje i uznaje stan za zerowy pomimo że ma na sobie ciężar, a mnie by chodziło żeby tego resetu nie było tylko aby po ponownym załączeniu zasilania nadal wskazywała wagę tego co na niej stoi,
    zablokowałem instrukcję scale.tare(); ale wtedy zawsze wskakuje jakaś stała wartość 3,768 i jest ona zawsze taka sama nawet po wyłączeniu zasilania i ponownym włączeniu plus to co stoi na wadze, nie wiem jak się tej wartości pozbyć aby pokazywało tylko wagę tego co na niej stoi
    (- jest jeszcze taki mały flek na wyświetlaczu po instrukcjach
    lcd.print(scale.get_units(), 3); 
    lcd.print("kg"); 
    lcd.println();

    na dwóch miejscach na końcu (za napisem kg) wyświetlają mi się po 4 poziome kreski i też nie wiem jak to wyczyścić
    ) - to już znalazłem - błędna i niepotrzebna komenda lcd.println(); - po usunięciu jest ok

    kod skryptu wagi wygląda tak:

    #include "HX711.h"
    
    #define calibration_factor -20941.00 //This value is obtained using the SparkFun_HX711_Calibration sketch - wartość kalibracji moich czujników
    #include <LiquidCrystal_I2C.h> //biblioteka obsługująca typ wyświetlacza 
    LiquidCrystal_I2C lcd(0x27,20,4); //adres i typ wyświetlacza
    
    #define DOUT  4
    #define CLK  5
    
    HX711 scale;
    
    void setup() {
      Serial.begin(9600);
      
      Serial.println("HX711 scale demo");
    
      scale.begin(DOUT, CLK);
      scale.set_scale(calibration_factor); //This value is obtained by using the SparkFun_HX711_Calibration sketch
      scale.tare(); //Assuming there is no weight on the scale at start up, reset the scale to 0
      Serial.println("aktualna waga:");
    }
    
    void loop() {
      
      Serial.print("aktualna waga: ");
      Serial.print(scale.get_units(), 3); 
      Serial.print(" kg"); 
      Serial.println();
      
    
    //dodane funkcje wysyłania danych na wyświetlacz
          lcd.init(); // inicjalizacja wyświetlacza
          lcd.backlight(); //aktywacja podświetlenia wyświetlacza
          lcd.setCursor(0,0);
          lcd.print("-- waga  --");
          lcd.setCursor(1,2);
          lcd.print("pomiar 1 = ");
          lcd.setCursor(11,2);
          lcd.print(scale.get_units(), 3); 
          lcd.print("kg"); /
          lcd.println();
      
    }
  • #8 20426075
    gps79
    Poziom 37  
    Posty: 2212
    Pomógł: 495
    Ocena: 797
    Warto zrobić przycisk tarowania z zapamiętaniem wartości w pamięci EEPROM. Wtedy po włączeniu prądu odczytujesz (w funkcji "setup") wartość z pamięci EEPROM, aplikujesz ją funkcją scale.set_offset(wartość) i wyświetlacz od razu pokaże wagę garnka z bigosem, który stoi na wadze.

    Tu masz symulator Arduino wraz z Twoim sensorem. Lektura przykładów i eksperymenty na symulatorze powinny przyspieszyć pisanie programu.
    https://docs.wokwi.com/parts/wokwi-hx711

    Dodatkowo, inicjalizację LCD wykonaj raz w funkcji "setup". Nie ma sensu robić tego w pętli "loop".
    Problemów z wyświetlaczem nie zauważyłem po wgraniu Twojego programu na symulator.
  • #9 20427344
    zbzu
    Poziom 9  
    Posty: 70
    Pomógł: 1
    Ocena: 25
    Problem z wyświetlaczem rozwiązałem (pisałem o tym poprzednio)
    Inicjację LCD za Twoim wskazaniem poprawiłem przenosząc do "setup"
    Natomiast eksperymenty z EEPROM to już dla mnie za wysokie progi i sam sobie z tym nie poradzę.

    Nie chcę dodawać żadnej funkcji kalibracji czy tarowania do gotowego modelu bo idea jest taka żeby wagę skalibrować i wytarować na etapie wgrywania programu do arduino i potem ma być już bezobsługowa i ma pokazywać wagę tego co na niej stoi cały czas, nawet jak zniknie napięcie i potem powróci to ona ma nadal pokazywać ten sam ciężar co wcześniej czyli ten który na niej nadal stoi, bez resetu czy ponownej kalibracji co robi większość programów. Waga po zaniku napięcia nie ma się resetować.
    Taki efekt osiągam blokując w tym skrypcie instrukcję "scale.tare();" (pisałem o tym wcześniej) tyle tylko że wtedy wskakuje mi nie wiedzieć skąd stała wartość 3,768 plus to co stoi na wadze i gdyby nie ta wartość 3,768 to by w zasadzie było to o co mi chodzi, wprawdzie jest to takie moje obejście problemu ale na tym etapie nie potrafię inaczej. Pewnie da się to zrobić tak jak piszesz czyli za pomocą EEPROM ale ja tego nie potrafię, jestem bardziej elektronikiem niż programistą więc z programowania radzę sobie jedynie z bardzo prostymi rzeczami na zasadzie prób i błędów, a coś więcej to już dla mnie wyższa jazda.
    Chyba że chciałoby Ci się zrobić taką instrukcję to ją wypróbuję i potestuję za co byłbym wielce wdzięczny bo by mi to ułatwiło ogarnięcie tego tematu.
  • Pomocny post
    #10 20427846
    gps79
    Poziom 37  
    Posty: 2212
    Pomógł: 495
    Ocena: 797
    Opcja bez użycia EEPROMu - tarowanie jednorazowe w kodzie źródłowym:
    Sensor HX711 ma dwa parametry kalibracyjne: scale i offset (mnożnik i przesunięcie). Mnożnik masz wprowadzony do programu jako calibration_factor. Offset wprowadzasz za pomocą funkcji set_offset().

    Offset wyliczasz mnożąc przesunięcie (w kg) wyświetlane dla nieobciążonej wagi przez calibration_factor:
    offset = 3.768*calibration_factor
    offset = 3.768*(-20941.00)
    offset = -78906

    Zatem w funkcji setup() zamiast linijki
    scale.tare();
    wprowadź:
    scale.set_offset(-78906);


    Dokładną wartość możesz wyznaczyć przy użyciu tego programu:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod

    Po wprowadzeniu poprawnego offsetu pętla loop powinna co 0.5s wyświetlać wartość 0.00
  • #11 20428059
    zbzu
    Poziom 9  
    Posty: 70
    Pomógł: 1
    Ocena: 25
    kurcze, wielkie wielkie dzięki za pomoc,
    ja bym się z tym jeszcze długo męczył,
    na szybko sprawdziłem i działa tak jak chciałem,
    później sprawdzę dokładnie i dam znać,
    dzięki też za wytłumaczenie co która funkcja robi, wiele mi to pomoże w zrozumieniu działania tych instrukcji
    pozdr
  • #12 20429668
    zbzu
    Poziom 9  
    Posty: 70
    Pomógł: 1
    Ocena: 25
    @gps79 a mam do Ciebie jeszcze jedno pytanie:
    czy orientujesz się czy dane z tej wagi dałoby się wysyłać do Domoticza i aby z nich rysował się wykres
    Generalnie używam Domoticza do różnych innych celów ale w nim samym nie znalazłem wagi jako takiej i nie wiem jakbym mógł dane z wagi tam prezentować.
    W sumie do tego dążę żeby w Domoticzu oprócz danych z czujników temperatury, wilgotności, prądów, napięć i.t.d dołożyć też pomiar odczytywany zdalnie z wagi generalnie poprzez WEMOS ESP8266 bo w ten sposób odczytuję też zdalnie część czujników temp i wilgotności.
  • #13 20429760
    gps79
    Poziom 37  
    Posty: 2212
    Pomógł: 495
    Ocena: 797
    Niestety nie znam się na automatyzacji domu. Może ktoś obyty z Domoticzem by się wypowiedział?
  • #14 20430226
    zbzu
    Poziom 9  
    Posty: 70
    Pomógł: 1
    Ocena: 25
    ok, dzięki za pomoc
    dalej będę drążył temat żeby jednak dane były przekazywane do Domoticza bo tam dane są rejestrowane i pokazywane na wykresie dobowo, pewnie można to samo zrobić na Home Asistencie ale na razie używam Domoticza.
    Akurat Domoticz ma bardzo wiele jednostek pomiarowych ale akurat KG nie ma więc być może będzie można wykorzystać inne jednostki i pod to się podczepić, będę próbował.
    Sam WEMOS ESP8266 w swojej bazie dostępnych czujników które obsługuje ma też układ HX7111 więc jest jakaś szansa.
    To następny etap mojego projektu.

    Jeśli ktoś byłby w stanie coś nakierować w tym temacie to zachęcam do pomocy

Podsumowanie tematu

LABEL_AI_GENERATED
Użytkownik pracuje nad wagą opartą na Arduino z czujnikami HX711, napotykając problemy z kompilacją kodu. Po wgraniu odpowiednich bibliotek, waga działa, ale użytkownik chce uprościć kod, co prowadzi do błędów kompilacji związanych z nieodpowiednimi odwołaniami do bibliotek. Po kilku próbach i wskazówkach od innych uczestników, użytkownik dowiaduje się, że powinien używać biblioteki HX711, a nie HX711_ADC. Udało mu się uruchomić wagę, ale po wyłączeniu zasilania waga resetuje się do stanu zerowego. Użytkownik blokuje instrukcję tarowania, co prowadzi do stałej wartości na wyświetlaczu. Ostatecznie, rozwiązaniem jest użycie funkcji set_offset() do ustawienia offsetu, co pozwala na zachowanie wartości po wyłączeniu zasilania. Użytkownik planuje również przesyłać dane z wagi do systemu Domoticz, aby rejestrować i wizualizować pomiary.
Podsumowanie AI na podstawie dyskusji. Może zawierać błędy.
REKLAMA