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

Prosty program do wyświetlania wilgotności gleby w doniczce - prośba o porady

DeadGen 13 Maj 2022 20:58 735 3
REKLAMA
  • #1 20018184
    DeadGen
    Poziom 3  
    Dzień dobry, na studiach skończyły mi się przedmioty związane z programowaniem mikrokontrolerów ATmega328P więc klon arduino nano leży tylko i kurzy się na szafce. Miałem wszystkie części do wykonania malutkiego projektu - układu, który sprawdzał by wilgotność gleby w doniczce i wyświetlał go na ekranie LCD 16x2. Napotkałem dwie małe przeszkody w perfekcyjnym działaniu projektu - pomimo zastosowania uśredniania kolejnych wartości tablicy, otrzymywana wilgotność ciągle "pływa" - czasami o setne procenta co jest całkiem niezłym wynikiem, czasami o jedną czy dwie dziesiąte procenta, a czasami potrafi przeskoczyć z 78,5 na 75,5%. Drugą przypadłością najprawdopodobniej kodu jest pomiar wilgoci tuż po załączeniu zasilania - okej, pierwszy pomiar może faktycznie być odrobinę zakłamany bo następuje gwałtowny pobór prądu, który powinien się chwilę później ustabilizować a przez to napięcie na czujniku jednak dopiero za trzecim lub czwartym przetworzeniem pobranych próbek można uznać je za prawdopodobne - wygląda to następująco: 59%, 67%, 74%, 74%, 74%. Wyleczyłem tylko objawy a nie problem - na samym starcie mikrokontroler na szybko wykonuje trzykrotne pobranie próbek, uśrednienie ich i przekonwertowanie, a dopiero po tym zaczynają się pokazywać na ekranie LCD poprawne wyniki pomiarów. Poniżej zamieszczam schemat podłączeń, chociaż wątpię aby był potrzebny, oraz kod z Arduino IDE. Dodatkowo jeszcze pytanie - zmierzyłem minimalną wartość - czujnik w powietrzu i otrzymałem wartość minimalną 0 na pinie analogowym arduino, jednak po zwarciu ścieżek na czujniku drucikiem wskazuje on około 858-859. Na stronach internetowych czujnik ten służy do pomiaru wilgoci i w wodzie wskazuje około 520. Czy muszę go skalibrować na pomiar wody w glebie w zakresie 0-520 czy tak jak mam aktualnie 0-859?

    Prosty program do wyświetlania wilgotności gleby w doniczce - prośba o porady

    #include <LiquidCrystal.h>

    float odczytane_wartosci_z_pinu_analogowego[200];
    float usrednianie_odczytu_z_pinu_analogowego[200];
    float wilgoc_w_procentach=0;
    float odczyt_z_pinu_analogowego=0;// zakres 0-859
    float srednia=0;
    int szybkosc_czytania_probek;

    LiquidCrystal lcd(2, 3, 4, 5, 6, 7);

    void pomiarWilgoci(){
    for(int i=0; i<200; i++)
    {
    odczyt_z_pinu_analogowego=analogRead(0);
    delay(szybkosc_czytania_probek);
    odczytane_wartosci_z_pinu_analogowego=odczyt_z_pinu_analogowego;
    }
    }

    void usrednianie(){
    for(int i=5;i<195;i++){
    for(int j=0;j<5;j++){
    usrednianie_odczytu_z_pinu_analogowego[i]=odczytane_wartosci_z_pinu_analogowego[i+j]+usrednianie_odczytu_z_pinu_analogowego[i];
    }
    usrednianie_odczytu_z_pinu_analogowego[i]=usrednianie_odczytu_z_pinu_analogowego[i]/5;
    srednia=srednia+usrednianie_odczytu_z_pinu_analogowego[i];
    }
    srednia=srednia/191;
    }

    void przeksztalcanie(){
    srednia=srednia*100/859;
    }

    void wyswietl_wilgotnosc_w_procentach(){
    lcd.print(" ");
    lcd.setCursor(5, 1);
    lcd.print(srednia);
    lcd.setCursor(10, 1);
    lcd.print("%");
    lcd.setCursor(0, 1);
    }

    void setup() {
    szybkosc_czytania_probek=1;
    lcd.begin(16, 2);
    lcd.setCursor(0, 0);
    lcd.print(" Kalibrowanie");
    lcd.setCursor(0, 1);
    lcd.print(" czujnika");
    for(int i=0;i<4;i++){
    pomiarWilgoci();
    usrednianie();
    przeksztalcanie();
    }
    szybkosc_czytania_probek=50;
    lcd.clear();
    lcd.print(" Wilgotnosc ");
    lcd.setCursor(0, 1);
    }

    void loop() {
    pomiarWilgoci();
    usrednianie();
    przeksztalcanie();
    wyswietl_wilgotnosc_w_procentach();
    }
    [/i][/i][/i][/i][/i]
  • REKLAMA
  • #2 20018405
    gps79
    Poziom 35  
    O jakim modelu sensora jest tu mowa?
  • REKLAMA
  • #3 20018495
    DeadGen
    Poziom 3  
    Nie potrafię nigdzie znaleźć oznaczenia/modelu - jedyne co to poradnik jak używać taki czujnik. Wygląda on następująco: Prosty program do wyświetlania wilgotności gleby w doniczce - prośba o porady
  • #4 20018602
    gps79
    Poziom 35  
    To jest czujnik poziomu cieczy. Wilgotności nim nie zmierzysz.

    Dodano po 5 [godziny] 15 [minuty]:

    Abstrahując od tego, jaką wartość mierzysz, ważne jest, aby napięcie na nodze AVCC mikrokontrolera było stabilne. Poprawnie stabilizowane zasilanie pokazane jest w datasheet-ie mikrokontrolera:
    Prosty program do wyświetlania wilgotności gleby w doniczce - prośba o porady
    Aby uzyskać dokładne wyniki konwersji ADC należałoby zatrzymać procesor na czas konwersji. Więcej znajdziesz w rozdziale "23.6 ADC Noise Canceler" datasheet-u.
    Ostatecznie otrzymasz wynik z dokładnością 8 bitów:
    Prosty program do wyświetlania wilgotności gleby w doniczce - prośba o porady

    Mierzenie wartości napięć przy wymuszonym zwarciu na sensorze nie ma sensu. Zakres należy oszacować podczas symulacji skrajnych warunków prazy (dla czujnika poziomu cieczy: czujnik suchy vs. czujnik w pełni zanurzony w wodzie, a dla czujnika wilgotności: czujnik umieszczony w zamrażalniku vs. czujnik nad garnkiem z gotującą się wodą).
    Zakresy można mierzyć takim oto prostym kodem Arduino przez port UART:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    Umieszczając kod na forum zawrzyj je w klamrach SYNTAX, aby zwiększyć czytelność kodu i nie zgubić części kodu (tak jak to się zadziało w Twoim poście).

    Jedną z metod stabilizacji danych wejściowych w sposób programowy jest użycie filtra dolnoprzepustowego PT1 (odpowiednik filtra RC w elektronice).
    https://de.zxc.wiki/wiki/PT1-Glied
    Jedną z zalet jest brak konieczności przechowywania dużej liczby historycznych próbek, co jest istotne przy programowaniu systemów wbudowanych. Parametrem filtra PT1 jest stała czasowa T, która określa, po jakim czasie wyjście uzyska 2/3 wartości stanu wejściowego, a po czasie 3T 95% wartości stanu wejściowego (odpowiedź impulsowa).

    Warto korzystać ze zdobyczy nauki i nie odkrywać koła na nowo.
REKLAMA