Skocz do zawartości
Komentator

Kurs Arduino II - #7 - termometry analogowe i cyfrowe

Pomocna odpowiedź

html_mig_img
Podczas tej części kursu Arduino porównamy dwa podejścia do czujników. Sprawdzimy w praktyce termometry w wersji analogowej i cyfrowej!W tym celu skorzystamy z bardzo popularnych czujników LM35 oraz DS18B20. Połączenie tych układów z poznanymi diodami programowalnymi pozwoli zbudować ciekawy termometr domowy!

UWAGA, to tylko wstęp! Dalsza część artykułu dostępna jest na blogu.

Przeczytaj całość »

Poniżej znajdują się komentarze powiązane z tym wpisem.

Udostępnij ten post


Link to post
Share on other sites

Trzeba sprawdzić jeszcze raz czy opis wyprowadzeń LM35 jest zgodny z późniejszym jego podłączeniem.

Udostępnij ten post


Link to post
Share on other sites

Wrona wydaje mi się, że jest zgodny. Tylko, że to rzut z dołu (bottom), wtedy +Vs i masa będzie na odwrót. Też podłączyłem na odwrót i chwilę zajęło mi dostrzeżenie słowa bottom.

Dzięki Treker za artykuł. W ostatnich dniach ciągle sprawdzałem, czy już się pojawił 🙄

Udostępnij ten post


Link to post
Share on other sites

Nie czytałem artykułu o diodach RGB, ale 1-Wire to nazwa bardzo konkretnego protokołu (dawnej) f-my Dallas Semiconductors.

O ile DS18B20 rzeczywiście się nim posługuje, o tyle diodki WS2812 i ich pochodne już nie, bo nie każdy jeden drucik to 1-Wire.

Z artykułu można wyciągnąć wniosek (takie jest moje wrażenie), że czujniki analogowe mają problem z temperaturami ujemnymi a to nieprawda. Wiele z nich ma dodany pewien offset (przesunięcie) napięcia wyjściowego i dla 0°C oddaje np. 500mV. Wtedy spokojnie pracują od -40 do +125. Ja często używam dużo tańszego niż oryginalny LM35 czujnika Microchipa produkowanego w wielu obudowach:

www.tme.eu/pl/katalog/#search=mcp9700

Zabrakło mi czegoś o zwykłych termistorach. Popularne KTY81/82 są w cenach porównywalnych z 9700 a perełki NTC jeszcze tańsze:

http://www.tme.eu/pl/details/ntcm-hp-100k-1%25/termistory-ntc-pomiarowe-tht/sr-passives/

Było kilka zapytań jak tego używać a myślę, że pomiary i linearyzacja NTC to fajny temat na kolejny artykuł 🙂

Przy okazji "termometrów", z kronikarskiego obowiązku warto było chociaż wspomnieć o istnieniu PT100 i jemu podobnych czy o termoparach. Chociażby wymienienie tego w punktach + jedno zdanie o każdym dawałoby jakiś przegląd.

Wszystko powyższe absolutnie nie jest krytyką. To tylko kilka rzeczy których mi zabrakło po dotarciu do końca fajnego tekstu 🙂

Acha, film z podgrzewaniem czujnika półprzewodnikowego zapalniczką jednak bym zmienił. Ludzie biorą dziś wszystko dosłownie...

Udostępnij ten post


Link to post
Share on other sites

Jarzyn, Taki ze mnie "anglistyk" 😉 a generalnie gamoń jestem więc wyłapuje wszystkie takie punkty gdzie gamoń się gubi. Ale żeby na całkowitego głupka mnie wyjść to wskazuje poniżej miejsce do poprawki. To tylko mały drobiazg i kosmetyka ale ...

linijka.setPixelColor(i, linijka.Color(0, 0, 255)); //Dioda nr i świeci na czerwono

ma być na niebiesko

Tak czy inaczej fajny odcinek i z niecierpliwością czekam na kolejne oraz etap III 🙂

Udostępnij ten post


Link to post
Share on other sites

Wrona, wszystko się zgadza, tak jak zostało już wspomniane - widok w dokumentacji jest "od dołu" 🙂 Dzięki za uwagę, co do komentarza - już poprawiam!

Jarzyn, zachęcam w takim razie do czytania i programowania 🙂

marek1707, dziękuję za słuszną uwagę na temat 1-wire. Nie wiem dlaczego, ale miałem w głowie zakodowane teraz, że diody korzystają również z tego konkretnego "1-wire". Sam złapałem się w pułapkę korzystania z gotowych bibliotek Arduino... Już nanoszę poprawki na blogu. Jeśli chodzi o pozostałe temat, to pomyślę co z tym zrobić. Oczywiście moje uwagi o ujemnych temperaturach nie odnosiły się do ogółu. Po prostu najwięcej osób chwytających za LM35 podpina go w podstawowej konfiguracji i chciałem tylko wszystkich uprzedzić o braku wartości ujemnych w takiej wersji 😉 O termistorach było trochę w kursie elektroniki i (Kurs elektroniki II – #11 – czujniki analogowe) jakoś dużo osób nie podejmowało tego tematu, więc skupiłem się na LM'ie.

Acha, film z podgrzewaniem czujnika półprzewodnikowego zapalniczką jednak bym zmienił. Ludzie biorą dziś wszystko dosłownie...

Ale od razu wiadomo przynajmniej, że chodzi o podgrzewanie 😃

Udostępnij ten post


Link to post
Share on other sites

To i ja wrzucę coś od siebie.

Zadanie 7.1 widzę tak:

#define LM35 A3
#define LM35_1 A2

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

void loop(){
 //Przeliczenie odczytu ADC na temperaturę zgodnie z opisem z kursu
 float temperatura = ((analogRead(LM35) * 5.0) / 1023.0) * 100;
 float temperatura1 = ((analogRead(LM35_1) * 5.0) / 1023.0) * 100;
 float roznica = 0.0;
 if(temperatura - temperatura1 > 0){
   roznica = temperatura - temperatura1;
 }else{
   roznica = temperatura1 - temperatura;
 }

 //Wyslanie przez UART aktualnej temperatury
 Serial.print("Temp 1: ");
 Serial.print(temperatura);
 Serial.print("*C \t");
 Serial.print("Temp 2: ");
 Serial.print(temperatura1);
 Serial.print("*C \t");
 Serial.print("Roznica: ");
 Serial.print(roznica);
 Serial.println("*C");

 delay(3000);
}

No i jeszcze termometr z funkcją MIN/MAX. Na płytce mam jeszcze wyświetlacz 7 seg z poprzedniej lekcji więc wykorzystałem go 🙂 Millis to już mi po nocach się śni - strasznie słabo z przykładami w tym temacie po polskiej stronie internetów, a słabo się czegoś uczy nie znając eng od technicznej strony. No więc mamy kod - może komuś się przyda jakaś jego część:

#include "SevSeg.h"
SevSeg sevseg; //Instantiate a seven segment controller object

#define LM35 A3

#define przMIN 9
#define przMAX 10 

float tempMAX = 0; //Aktualna temperatura maksymalna
float tempMIN = 150; //Aktualna temperatura minimalna

int tempMAXI;
int tempMINI;

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

 byte numDigits = 2;   //Ilosc wyswietlaczy
 byte digitPins[] = {A5, A4};  //Piny sterujace wyswiet ---> tranzystory
 byte segmentPins[] = {7, 5, 2, 4, 3, 8, 6}; //Piny <---> segmenty
 bool resistorsOnSegments = true; // Use 'true' if on digit pins
 byte hardwareConfig = N_TRANSISTORS; // See README.md for options
 sevseg.begin(hardwareConfig, numDigits, digitPins, segmentPins, resistorsOnSegments);

 //Konfiguracja przyciskow
 pinMode(przMIN, INPUT_PULLUP);
 pinMode(przMAX, INPUT_PULLUP);
}

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

 if (temperatura > tempMAX) { //Jesli aktualna temperatura jest wyzsza od maksymalnej
   tempMAX = temperatura; //to ustaw aktualną, jako maksymalną.

   //Wyslanie przez UART temperatury maksymalnej
   Serial.print("Nowa wartosc max: ");
   Serial.print(tempMAX);
   Serial.println("*C");    
 }

 if (temperatura < tempMIN) { //Jesli aktualna temperatura jest niższa od minimalnej
   tempMIN = temperatura; //to ustaw aktualną, jako minimalną.

   //Wyslanie przez UART temperatury minimalnej
   Serial.print("Nowa wartosc min: ");
   Serial.print(tempMIN);
   Serial.println("*C");
 }
 // Wyswietl na 7 segmentowym

 if(digitalRead(przMAX) == LOW){//Podglad tem przy wcisnietym przycisku
 tempMAXI=tempMAX;
 sevseg.setNumber(tempMAXI, 2); //Wyswietl temp MAX, korzystając z dwóch wyswietlaczy
 sevseg.refreshDisplay();
 }else{
   //Przyklad uzycia millis w wyswietlaczach 7 segm (bez delay) --> DEMO

   static unsigned long timer = millis();
   static int deciSeconds = 0;

 if (millis() >= timer + 1000) {
   deciSeconds++;
   timer = millis();
   if (deciSeconds == 60) { //Prawie jak minuta ;)
     deciSeconds = 0;
   }
   sevseg.setNumber(deciSeconds, 1);
 }

 sevseg.refreshDisplay();

 }

 if(digitalRead(przMIN) == LOW){
   tempMINI=tempMIN;
   sevseg.setNumber(tempMINI, 2); //Wyswietl temp MIN, korzystając z dwóch wyswietlaczy
   sevseg.refreshDisplay();
 }
}

CDN.

Udostępnij ten post


Link to post
Share on other sites

Dzięki Treker za wszystkie odpowiedzi i pomoc. W związku z tym odcinkiem o termometrach zastanawia mnie co miałeś na myśli pisząc "Podczas tego testu omawiam tylko jedną z kilku możliwości wykorzystania czujnika DS18B20!" i dając to w ramkę. Jak inaczej niż do pomiaru temperatury można wykorzystać czujniki temperatury? 😋

pytanie do czujnika cyfrowego, wyświetla ciągle -127 stopni... Uszkodzony? Możliwe, że puściłem na niego przez chwilę 12V, to mogło go uszkodzić...

Udostępnij ten post


Link to post
Share on other sites

SOYER, DS18B20 w kursie był wykorzystany w podstawowej konfiguracji. Tak jak napisałem w artykule możliwe jest przykładowo regulowanie rozdzielczości pomiaru temperatury. Można są również inne sposoby podłączania czujników np. z użyciem tylko dwóch przewodów. Zachęcam do "przewertowania" dokumentacji 🙂

Udostępnij ten post


Link to post
Share on other sites

Cześć, temperaturę zapisuję jako float, jak ograniczyć wyświetlanie np. na LCD do tylko jednego miejsca po przecinku?

Udostępnij ten post


Link to post
Share on other sites

W kursie jest pewien błąd. W pierwszym przykładzie dla LM35 temperaturę obliczasz ze wzoru "float temperatura = ((analogRead(LM35) * 5.0) / 1023.0) * 100;" i jest to poprawna formuła. Natomiast w kolejnych przykładach do wzoru wkradła się wartość 1024:

"float temperatura = ((analogRead(LM35) * 5.0) / 1024.0) * 100;" i to jest błędne. Niestety jest to powielane przez wiele stron.

Ogólnie kurs jest super 🙂

  • Lubię! 1

Udostępnij ten post


Link to post
Share on other sites

WRata, dziękuję za zgłoszenie błędu wzory zostały ujednolicone w całym kursie do wersji z dzieleniem przez 1024. Więcej informacji na ten temat znaleźć można w postach wydzielonych do osobnego tematu: Przeliczanie ADC na V - dzielenie przez 1023 czy 1024?.

Udostępnij ten post


Link to post
Share on other sites

Chciałbym poinformować i również ostrzec, że przy złym połączeniu pinów czujnika LM35 temperatura bardzo rośnie do wysokiej wartości 80-500 *C! Przez co można się oparzyć dotykając samego czujnika. 😳 Poniżej zdjęcia pomiarów jakie zobaczyłem w porcie szereg. 🤣

Udostępnij ten post


Link to post
Share on other sites

Philip, słuszna uwaga, na szczęście to po prostu błąd pomiaru, bo 500* to ten czujnik by sam z siebie nie wytrzymał 😉 Ale fakt, faktem, że elementy elektroniczne nie lubią jak się je odwrotnie podłącza.

Udostępnij ten post


Link to post
Share on other sites

Pomocy, czujnik analogowy z przyzwyczajenia podłączyłem jak tranzystor używany w kursie i podłączyłem zasilanie. Po poprawieniu podłączeń czujnik zaczął się grzać, stwierdziłem, że się przepalił więc się z nim pożegnałem. Czujnik cyfrowy podłączyłem już dobrze, a mimo to pokazywał -127*C, a gdy go dotknąłem, to myślałem, że moje palce zamieniły się w pieczeń i ułyszałem syczenie (chyba czujnik, a nie płytka). Wolę zaczerpnąć opinii profesjonalisty przed kolejnym podłączeniem arudino, czy mogło dojść do uszkodzenia płytki, czy czujnik cyfowy był uszkodzony fabrycznie itd. 

Udostępnij ten post


Link to post
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!

Gość
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...