Skocz do zawartości

Kurs Arduino II - #7 - termometry analogowe i cyfrowe


Pomocna odpowiedź

Mam takie pytanie - być może nie do końca istotne praktycznie, ale chcę mieć pewność że dobrze rozumiem temat. 

Odczytując analogowo napięcie np. z A5 dostajemy liczbę od 0 do 1023. Zgodnie z instrukcją, żeby przeliczyć to na napięcie, mnożymy przez 5 a potem dzielimy przez 1024.

Nie za bardzo rozumiem dlaczego przez 1024 a nie 1023. Dzieląc przez 1024, maksymalnie możemy otrzymać 5*1023/1024 = 4,995 V. Czy to oznacza, że Arduino nie radzi sobie z odczytem napięcia dokładnie 5V i napięcie musi być odrobinę niższe by je dobrze zidentyfikować? Czy jednak powinniśmy podzielić przez 1023 zamiast 1024, by dostać pełen zakres wartości, tzn. dokładnie od 0V do 5V?

Link do komentarza
Share on other sites

16 minut temu, adamnar napisał:

Nie za bardzo rozumiem dlaczego przez 1024 a nie 1023.

Była na ten temat swego czasu długa i zacięta dyskusja z której nic nie wynikło bo każdy miał rację 🙂

Ogólnie możesz przyjąć, że ADC nie podaje dokładnej wartości napięcia na wejściu, a informuje, że owo napięcie mieści się w pewnym zakresie. Przykładowo - jeśli otrzymasz wynik 7 to oznacza, że napięcie jest gdzieś między 7 * 5/ 1024 a (7+1) * 5 /1024. Stąd wynik 1023 oznacza, że napięcie jest nie mniejsze niż  (5* 1023)/1024 V (czyli równie dobrze może to być 5V).

Jeśli Ci zależy na otrzymaniu sztywnego zakresu 0..5 - dzielisz przez 1023. Różnica między dzieleniem przez 1023 a 1024 jest na poziomie jedenastego bitu (czyli poza rozdzielczością ADC). Jeśli mierzysz napięcie np. od 3 do 4 V - możesz spokojnie dzielić przez 1024 (co jest dużo szybsze). W wielu zastosowaniach potrzebujesz tylko informacji, czy napięcie nie przekracza jakiejś tam ustalonej wartości, wtedy nawet dzielić nie musisz tylko sprawdzasz czy wynik jest większy niż X (gdzie X to jakaś tam wstępnie wyliczona wartość).

  • Lubię! 1
  • Pomogłeś! 1
Link do komentarza
Share on other sites

59 minut temu, ethanak napisał:

Ogólnie możesz przyjąć, że ADC nie podaje dokładnej wartości napięcia na wejściu, a informuje, że owo napięcie mieści się w pewnym zakresie. Przykładowo - jeśli otrzymasz wynik 7 to oznacza, że napięcie jest gdzieś między 7 * 5/ 1024 a (7+1) * 5 /1024. Stąd wynik 1023 oznacza, że napięcie jest nie mniejsze niż  (5* 1023)/1024 V (czyli równie dobrze może to być 5V).

Dzięki. Trochę jeszcze poczytałem na ten temat i wyszło mi, że jeśli chcę mieć jak najmniejszy absolutny błąd, to muszę użyć formuły

float v = (analogRead(pin) + 0.5) * 5.0 / 1024.0;

bo to mi daje środek przedziału znalezionego przez analogRead().

Link do komentarza
Share on other sites

Zarejestruj się lub zaloguj, aby ukryć tę reklamę.
Zarejestruj się lub zaloguj, aby ukryć tę reklamę.

jlcpcb.jpg

jlcpcb.jpg

Produkcja i montaż PCB - wybierz sprawdzone PCBWay!
   • Darmowe płytki dla studentów i projektów non-profit
   • Tylko 5$ za 10 prototypów PCB w 24 godziny
   • Usługa projektowania PCB na zlecenie
   • Montaż PCB od 30$ + bezpłatna dostawa i szablony
   • Darmowe narzędzie do podglądu plików Gerber
Zobacz również » Film z fabryki PCBWay

@JerzyO dziękujemy za zwrócenie uwagi, jak najbardziej się zgadzam, w dokumentacji jest wyraźnie zaznaczone:

Cytat

The LM35 device does not require any external calibration or trimming to provide typical accuracies of ±¼°C at room temperature and ±¾°C over a full −55°C to 150°C temperature range.

Kursy Arduino czekają na odświeżenie więc poprawimy 🙂 

Link do komentarza
Share on other sites

Tutaj moje rozwiązanie zadania 7.1 😃

#define LM35 A5
#define LM352 A4

void setup(){
  Serial.begin(9600);
}

void loop(){
  //Przeliczenie odczytu ADC na temperaturę zgodnie z opisem z kursu
  float temperatura = ((analogRead(LM35) * 5.0) / 1024.0) * 100;
  float temperatura2 = ((analogRead(LM352) * 5.0) / 1024.0) * 100;

  float roznica = temperatura2 - temperatura;

  //Wyslanie przez UART aktualnej temperatury
   Serial.print("Temperatura pierwszego: ");
  Serial.print(temperatura2);
  Serial.print("*C\t");
  Serial.print("Temperatura drugiego: ");
  Serial.print(temperatura);
  Serial.print("*C\t");
  Serial.println();
  Serial.print("Różnica: ");
  Serial.print(roznica);
  Serial.print("*C\t");
  Serial.println();
  Serial.println();
 
  delay(2000);
}

 

  • Lubię! 2
Link do komentarza
Share on other sites

Cześć, chcę tylko powiedzieć, że miałem problem z czujnikiem DS18B20, od początku nie popatrzyłem na zdjęcie jak go podłączyć, oraz nie zwróciłem na bottom wiew (niestety nie wiedziałem że to od dołu) i niestety za pierwszym razem spaliłem czujnik 😒 na monitorze pokazywało -127 stopni. Sprawdzałem także na innych pinach czy działa, i niestety dalej to samo. W zestawie miałem drugi i podłączyłem przez przypadek i spaliłem znowu 😑 Szkoda, ale przynajmniej trochę się nauczyłem czytać notę katalogową. Zamówię nowe czujniki, w tym momencie pominę ten rozdział i przejdę do następnego 😃 Kiedy dostanę w ręce czujnik od razu wrócę do tego rozdziału 🙂 Cuż, przynajmniej się czegoś nauczyłem. Do zobaczenia, Forbot! 😃  

  • Lubię! 1
Link do komentarza
Share on other sites

@Dustek no niestety, czasami podczas nauki trzeba coś spalić 😉 Masz szczęście, że stało się to przy stosunkowo tanich czujnikach. Mam nadzieję, że kolejne próby przebiegną już poprawnie. Powodzenia!

  • Lubię! 1
Link do komentarza
Share on other sites

@Dustek te czujniki wytrzymają odwrotne podłączenie, ale tylko przez chwilę. Jeśli czujnik po podłaczeniu robi się ciepły natychmiast go odłaczasz (mam taki jeden co to przeżył i chodzi parę lat bezawaryjnie w charakterze termometru w pokoju).

Wiem, niezbyt to fachowe, ale zawsze dobrze wiedzieć.

  • Lubię! 1
Link do komentarza
Share on other sites

11 godzin temu, ethanak napisał:

@Dustek te czujniki wytrzymają odwrotne podłączenie, ale tylko przez chwilę. Jeśli czujnik po podłaczeniu robi się ciepły natychmiast go odłaczasz (mam taki jeden co to przeżył i chodzi parę lat bezawaryjnie w charakterze termometru w pokoju).

Wiem, niezbyt to fachowe, ale zawsze dobrze wiedzieć.

Dobrze, dziękuję za informację, na pewno się przyda 😃

Link do komentarza
Share on other sites

Hej,

Super kurs! Ale mam jedno pytanie odnośnie podłączenia czujnika temperatury. Czy mógłby ktoś wytłumaczyć dlaczego wymagany jest rezystor 4,7 kΩ oraz dlaczego dokładnie taki rezystor?

Przed przeczytaniem tej lekcji, na własną rękę podłączyłem taki sam czujnik pod moje Pico Pi i nie zauważyłem żadnych problemów.

Z góry dzięki!

  • Lubię! 1
Link do komentarza
Share on other sites

@Buba2 witam na forum 🙂 Wynika to bezpośrednio z zaleceń producenta, który w dokumentacji technicznej pokazał, że element ten należy podłączać właśnie w taki sposób. Jeśli nie korzystałeś wcześniej z takich dokumentów to zachęcam do lektury tego artykułu: https://forbot.pl/blog/czym-jest-dokumentacja-techniczna-datasheet-id53134 Ogólna zasada (nie tylko w tym przypadku) jest taka, że jeśli nie podłącza się elementów zgodnie z zaleceniem producenta to mogą działać, ale nie muszą, mogą też podawać błędne wyniki itd.

  • Lubię! 1
  • Pomogłeś! 1
Link do komentarza
Share on other sites

Dołącz do dyskusji, napisz odpowiedź!

Jeśli masz już konto to zaloguj się teraz, aby opublikować wiadomość jako Ty. Możesz też napisać teraz i zarejestrować się później.
Uwaga: wgrywanie zdjęć i załączników dostępne jest po zalogowaniu!

Anonim
Dołącz do dyskusji! Kliknij i zacznij pisać...

×   Wklejony jako tekst z formatowaniem.   Przywróć formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Twój link będzie automatycznie osadzony.   Wyświetlać jako link

×   Twoja poprzednia zawartość została przywrócona.   Wyczyść edytor

×   Nie możesz wkleić zdjęć bezpośrednio. Prześlij lub wstaw obrazy z adresu URL.

×
×
  • Utwórz nowe...

Ważne informacje

Ta strona używa ciasteczek (cookies), dzięki którym może działać lepiej. Więcej na ten temat znajdziesz w Polityce Prywatności.