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?
#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]
#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]