Skocz do zawartości

Kurs Arduino II - #7 - termometry analogowe i cyfrowe


Pomocna odpowiedź

Napisano
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.

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ł 🙄

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...

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 🙂

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 😃

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.

  • 9 miesiące później...

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

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 🙂

  • 2 tygodnie później...
  • 6 miesiące później...

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
  • 3 tygodnie później...

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. 🤣

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.

  • 3 miesiące później...

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. 

Bądź aktywny - zaloguj się lub utwórz konto!

Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony

Utwórz konto w ~20 sekund!

Zarejestruj nowe konto, to proste!

Zarejestruj się »

Zaloguj się

Posiadasz własne konto? Użyj go!

Zaloguj się »
×
×
  • Utwórz nowe...