Jak mierzyc temperaturę z Arduino
Jednym z czujników wchodzących w skład Arduino Starter Kit’u jest czujnik temperatury. Jest to czujnik analogowy, nie potrzebujący żadnych dodatkowych elementów do działania (dokładnie jest to MCP9700-E/TO). Czyli, krótko mówiąc podpinamy masę, zasilanie i już możemy mierzyć temperaturę. Na stronie czujnika w sklepie Nettigo, w zakładce Pliki jest PDF z danymi katalogowymi. I tak, zacznijmy od nóżek:
. Ważne – nóżki są opisane tak jak widać je patrząc od spodu czujnika. I tak: do 1 podłączamy napięcie zasilania (zarówno 3.3V lub 5V z Arduino będzie OK), do 3 podłączamy masę (GND) a 2 do pinu Analog 0 na Arduino. W tabelce w dokumentacji czujnika na stronie drugiej mamy pozycję Output Voltage, przy temperaturze 0°C – 500 mV. Z pierwszej strony PDFa wiemy że czułość wynosi 10 mV/ºC. I to wszystko co nam potrzeba aby napisać prosty program:
float temp; void setup() { Serial.begin(57600); }; void loop () { temp = analogRead(0)*5/1024.0; temp = temp - 0.5; temp = temp / 0.01; Serial.println(temp); delay(500); };
Program odczytuję temperaturę i wysyła odczyt na Serial, z którego możemy go odczytać korzystając z monitora port szeregowego w Arduino IDE. Jak liczona jest temperatura? Rozbiłem ten proces na trzy kroki tak, aby łatwiej było go prześledzić:
temp = analogRead(0)*5/1024.0;
Odczytujemy wartość z wejścia analogowego i przeliczamy na napięcie. Maksymalne napięcie mierzone przez Arduino to 5V a dokładność przetwornika A/D to 10 bitów, czyli 1024 wartości. Dlatego wartość napięcia na wejściu Analog0 to wartość zwrócona przez analogRead pomnożona przez napięcie przypadające na jeden krok przetwornika A/D. Trzeba pamiętać, że dzielenie dwóch liczb 5 i 1024 będzie przez kompilator potraktowane jako operacja na liczbach całkowitych i wynik takiego dzielenia to w takim wypadku to też liczba całkowita – zero. Dlatego w zapisie pojawia się1024.0
Dzięki temu kompilator dokona dzielenia o jakie nam chodzi i wynik będzie liczbą niecałkowitą.temp = temp - 0.5;
Skalujemy do 0°C – różnica między napięciem odczytanym z czujnika a 500 mV jest liniowo zależna od temperatury.temp = temp / 0.01;
Tą różnicę dzielimy przez 10mV na stopień i mamy temperaturę
Jak widać czujnik MCP9700 jest bardzo łatwy w zastosowaniu i przyjazny dla początkujących. Teraz już każdy może zmierzyć temperaturę z Arduino.
Proste, przyjemne i przydatne. Dzięki!
Witam
Nawiązując do czujników złożylem zestaw jak podany jest tutaj
http://www.sensor-networks.org/index.php?page=0816816827
czujnik ruchu ruszyl mi po malych korektach i działa bez problemu ale ma problem z uruchomieniem diody ktora by mi sygnalizowała o generowanym ruchu….ogolnie juz siedze nad kodem źródłowym i nie mogę znaleźć gdzie jest błąd bo sądze ze własnie tu jest przyczyna nie świecenia diody.
Zrobiłem dokładnie jak z opisem, a odczyty na serialu są koło 90-100. Dodam, że nie siedzę w saunie ;-)
Powinno działać ;)
Hmmm…. Czy zmieniałeś AREF? Czy czujnik w ogóle reaguje na zmiany temperatury? Czy dobre wejście analogowe odczytujesz?
Yyyy, AREF? Nie wiem, nie znam się. A co to?
Jedyne co zmieniłem w tym kodzie to serial na 9600.
Czujnik jakoś reaguje – jak na niego chuchnę to wartość dochodzi do 140, następnie spada do 80. Hmmm, a może to jakiś czujnik od alkotestu? ;-)
Jak nie wiesz co to AREF to pewnie nie ustawiałeś :)
Jak wrzucisz na seriala wartość odczytaną bezpośrednio z wejścia analogowego to ile pokazuje?
Masz czym zmierzyć napięcie fizycznie na czujniku? I czy zgadza się z tym co podaje Arduino? Arduino podaje odczyt_z_analog/1024*5V – jak jest różnica (spora) w odczycie z woltomierza a z analog to albo arduino trafione, albo AREF jednak ustawiony albo nie wiem co :)
Jeżeli napięcie na czujniku jest faktycznie takie wysokie – 90 st to będzie prawie 1.5V jeśli dobrze pamiętam parametry czujnika
Pomiar woltomierzem daje trochę ponad 1V. Podczas gdy arduino zwraca wartości ok. 100…
ALe 100 stopni czy wartość odczytana z wejścia analogowego?
I ile to jest trochę ponad 1V? 1.1 Czy 1.4 ?
A w ogóle prośba – czy możemy przenieść się na http://forum.nettigo.pl – wydaje mi się że to lepsze miejsce do tego rodzaju dyskusji…
OK, przeniosę się :-)
Do Arduino Duemilanove (http://nettigo.pl/product/Arduino,ARDUINO-Duemilanove) podłączyłem (a raczej wpiąłem) ekran LCD (http://nettigo.pl/product/Znakowy-shield-LCD-2×16,2×16-lcd-shield). Gdzie teraz podpiąć czujnik temperatury? Widzę, że na płytce z LCD są różne piny natomiast nie wiem pod które napięcie zasilania się podpiąć ( u dołu są wyjścia 3.3V i 5V, u góry jest AREF ), której masy użyć? – tej u góry czy u dołu? No i z tego co zrozumiałem nóżkę drugą mam podpiąć pod „ANALOG IN 0”? Proszę o pomoc…
Masy sa wszędzie wspólne.
Zasilać możesz go zarówno 3.3 jak i 5V. Wyjście czujnika podłącz do np do Analog IN 0 (może być inny tylko użyj w kodzie programu odpowiedniej wartości w analogRead()
Polecam przeczytać https://starter-kit.nettigo.pl/2010/10/co-mierzy-analogread/ jeżeli zależy na dokładniejszym pomiarze. Pamiętajcie że dla analogReference(INTERNAL) napięcie odniesienia to 1.1V ale wg datasheet ma rozrzut od 1 do 1.2V. Co prawda w całym zakresie temperatur i napięć zasilania ale nie znalazłem dobrej odpowiedzi jakiej wartości można się spodziewać w Arduino.
nie czyta wam ponieważ na schemacie jest błąd oznaczenia pinów sa źle zamieńcie 1 z 3 i bedzie działać
@Joghas
Na schemacie jest 'bottom view’ czyli patrząc na czujnik od spodu, od strony nóżek – w ten sposób się wszystko zgadza.
Te 3 punkty pomiaru rozumiem tak.
1) Pin Arduido odczytujący napięcie wyjściowe elementu odbiera je w skali 0-5V poprzez 1024 kroków. Na każdy krok pomiaru przysługuje 0,0048828125V (5V/1024). Arduino odbiera „nr. kroku” a my mnożąc go poprzez jego wartość poznajemy wynik.
Jeśli wykonamy operację dzieląc przez 1024 mam wynik „0.00” a dzieląc przez 1024.0 mam „0.72” gdyż mówimy że interesują nas też „cyfry po przecinku”.
2) Kalibrujemy nasz odczyt. Z treści posta wiemy że „0°C = 500 mV” czyli poniżej 500mV są temperatury ujemne a powyżej dodatnie. Obecnie nasze 0.72 Obecnie wszystkie wyniki są za duże o te 0.500V więc tyle odejmujemy i wyniki są wyświetlane jako „0.22”.
3) Mnożymy wynik przez 100 i mamy ładą informację np „22.27”. U mnie otwarcie okna, chuchnięcie na czytnik itp. zmieniają temperaturę.
————–
Porównałem wynik z termometrami:
Licznik rowerowy 21.6
Miernik Kemot 20
Arduino 21.78
Bardzo przydatny post do zabawy ze starterem.
Na początku nie działało(zagapiłem się i użyłem tranzystora zamiast czujnika temp ;) ale teraz działa
Nie wiem czy wszystkie, ale mój czujnik lubi czasem rzucić temperaturą z czapy. Rozwiązałem ten problem wyciągając średnią z 1000 pomiarów :)
DPP: Możesz spróbować też podłączyć kondensator między wejście analogowe i GND :-)
Mam pytanie. Podłączyłem wszystko. Załadowałem. Kiedy daje monitor portu szeregowego to wyświetla mi same śmieci.
Czy prędkość w monitorze (w menu) ustawiona jest na taką samą wartość jak w Serial.begin?
Witam,
Ja mam nieco dziwny problem. Po sprawdzeniu czujnika woltomierzem otrzymuje wartości około 0,8 V natomiast arduino pokazuje mi odczyty na poziomie 1V. Gdy do wejścia analogowego podłączyłem napięcie 5V odczyt był poprawny tj 1023, podłączenie do masy daje 0, ale przy 3.3 otrzymywałem wskazanie około 700 czyli jakieś 3.4-3.5 V…odczyt z temperatury to od 35 do 40 stopni ( duże wahania ) co jest oczywistą bzdurą. Ktoś ma jakiś pomysł co może być tego przyczyną i jak to naprawić?
Witam,
a mi pokazyje 440 :)
moj kod jest taki:
#include „etherShield.h”
#include „ETHER_28J60.h”
int Pin6 = 6;
int Pin7 = 7;
int Pin8 = 8;
static uint8_t mac[6] = {
0x54, 0x55, 0x58, 0x10, 0x00, 0x24};
static uint8_t ip[4] = {
192, 168, 0, 23};
static uint16_t port = 80;
ETHER_28J60 e;
float sygnal;
float temp;
void showTemp(){
// odczyt wartości z wejscia Analog0
// i przeliczenie napiecia V na wartosc C
sygnal = analogRead(0)*5/1024.0;
sygnal = sygnal-0.5;
temp = sygnal/0.01;
//wyswietlenie wartosci temperatury
e.print(temp);
delay(100);
}
void loop(){
char* params;
if (params = e.serviceRequest())
{
showTemp();
}
e.respond();}
}
@JAcek
Czy jeżeli wrzucisz do kodu do showTemp
Serial.println(temp);
To dostajesz jakieś sensowne wyniki na monitorze portu?
Druga rzecz – z kodu wynika, że masz jakiegoś shielda ethernetowego. Czy ma on na sobie gniazdo microSD? Jeżeli tak to czasami A0 jest używane np jako sygnalizator obecności karty w slocie – wyjęcie shielda zmienia coś co pokazuje Serial.println?
Bez zmian, ethrernet shield nie ma gniazda, jak przepne do A1 to wyniki takie same i w monitorze tez takie same jak na www
OK udało się, mianowicie potrzebował SPACJI w poniższej czesci kodu:
sygnal = analogRead(0) * 5 / 1024.0;
sygnal = sygnal – 0.5;
temp = sygnal / 0.01;
taki zapis pokazał wynik 29 podczas gdy na termometrze analogowym jest 28 z hakiem.
Tak się zastanawiam dlaczego nie pokazuje mi co jest po przecinku tylko zaokragla do całkowitych ?
Witam all
Pytanko mam do kolegow czy mozna podlaczyc kilka czujnikow pomiaru temperatury ? A dokladnie 8. Pozdrawiam kz
Generalnie tak, w przypadku Arduino UNO ograniczeniem w pierwszym kroku jest liczb wejść analogowych (6). Jeżeli to jest za mało, można skorzystać np z multipleksera wejść:
https://nettigo.pl/products/102
https://nettigo.pl/products/304
(ten sam układ w dwóch formatach)
Jednak przy większej liczbie czujników zdecydowanie lepszym rozwiązaniem jest użycie DS18B20 https://nettigo.pl/products/321 – cyfrowego czujnika temperatury, które można podłączyć do mikrokontrolera na jednym wejściu cyfrowym. Korzystają one z protokołu 1Wire http://pl.wikipedia.org/wiki/1-Wire dzięki czemu jest możliwa komunikacja z każdym z osobna, choć są na jednej linii.
Zqadałem pytanie wyżej ale nikt mi nie odpowiedział. Doszedłem co powodowało problem, ale nie wiem jaka jest przyczyna problemu. Odczyt temteratury jest błędny po podłączeniu modułu ethernet. Pod arduiono podpięty się 12 V zasilacz, generalnie, albo jest zwalony ten czujnik i powinniście przestać go sprzedawać, albo wyjaśnić dlaczego ludzie uzyskują złe wskazania i co może być tego przyczyną
Kochani, mam problem, mój czujnik pokazuje mi wartości ujemne i zupełnie nie wiem jak to zmienić :(
robię jak tutaj: http://arduino.gsoftware.pl/obsluga-czujnika-temperatury-mcp9700/
Może odwrotnie podłączyłaś.