W tym artykule przedstawię jak możemy wykorzystać czujnik temperatury jako włącznik napięcia na przekaźniku. Omówię po krótce jego działanie. Projekt zostanie wykonany na Arduino Nano.
Spis treści
- Krótki opis
- Specyfikacja
- Projekt
- Pliki do pobrania
Krótki opis
Czujnik MLX90614ESF-BAA pozwala na pobieranie informacji o temperaturze otoczenia jak i temperatury zbliżonego do niego obiektu. Dzięki bibliotece w Arduino możemy jednocześnie korzystając z wielu czujników pobierać temperatury wielu obiektów.
Speyfikacja
- Wersja: MLX90614ESF – BAA
- Napięcie zasilania: od 3,0 do 3,6 V
- Zakres pomiarowy:
- od -70 °C do 380 °C dla temperatury obiektu
- od -40 °C do 85 °C dla temperatury czujnika
- Rozdzielczość:
- 0,02 °C dla interfejsu I2C, SMBus, TWI
- 0,14 °C dla interfejsu PWM
- Komunikacja: PWM lub I2C (SMBus, TWI)
- Dokładność: do 0,5 °C w zakresie od 0 do 50 °C
PROJECT : z użyciem 2 czujników i przekaźnika
Elementy:
- czujnik MLX90614ESF – BAA
- Arduino Nano (+ kabel microUSB)
- Arduino Mega/ Uno
- Moduł 2 przekaźników 5V – 10A/250V – Arduino
- NANO 3.0 Terminal Shield Adapter Przejściówka na złącza ARK
- 2x Kable stykowe (męs)
- 10x Kable stykowe (męsko-żeń)
- Płytka stykowa
Zmiana adresu I2c
Podłączenie :
Arduino Mega/Uno-> czujnik
GND – GND
5V – VIN
SDA /A4 – SDA
SCL/A5 – SCL
Program scanerI2c i changeAdress.
Niestety ale w podstawowej wersji nasze czujniki mają taki sam adres, aby go zmienić program odtworzyć przykład 4 z bibliotece Sparkfun (znajdującej się poniżej)(Jeżeli nie wiesz jak dołączyć biblioteki do IDE odsyłam do artykułu – https://ajmaker.pl/2021/10/28/wyswietlacze-oled-0-91-0-96-2). Najpierw jednak powinniśmy się upewnić czy czujniki na pewno mają ten sam adres. Skorzystajmy z przykładu niżej(). Po pobraniu wgrywamy go do naszej płytki i czekamy na wynik. Jeżeli skaner nie znajduje urządzeń, musimy sprawdzić czy urządzenia nie są zepsute i czy dobrze podłączyliśmy nasz czujnik.
Po sprawdzeniu czy na pewno adresy urządzeń są identyczne. Podłączamy jeden z czujników i wgrywamy przykład.
Przed wgraniem musimy ustawić boundRange na 115200 oraz NC i CL na naszym monitorze potu szeregowego.
Po informacji że nasze urządzenie zostało znalezione wpisujemy “5B” w terminalu. Po załadowaniu się programu, otwieramy ponownie i2cScaner i sprawdzamy czy adres rzeczywiście uległ zmianie.
Przełącznik przesyłający napięcie na podstawie podanej temperatury
Podłączenie
Arduino Nano wpinamy do adaptera
- Adapter – czujniki
- Kable od A4(SDA) i A5(SCL) wpinamy do “-” i “+” wejść na płytce stykowej
- Adekwatnie wpinamy do tych samych wejść kable od pin-ów SDA i SCL z czujników do równoległych wejść na płytce stykowej.
- 5V do VIN jednego z czujników
- D2 do VIN drugiego czujnika
- D6 do IN1 na przekaźnika
- D5 do IN2 na przekaźnika
- 2x GND do GND na czujnikach
- GND na przekaźniku do GND na Arduino Mega/Uno
- VCC z przekaźnika do 5V na Arduino Mega/Uno
Kod
Na początku definiujemy biblioteki, obiekt dla MLX oraz adresy czujników
#include <Wire.h> #include <Adafruit_MLX90614.h> Adafruit_MLX90614 mlx; #define IR1 0x5A #define IR2 0x5B
Potem w funkcji void setup() ustawiamy tryb wyjścia dla pin-ów 2,6 i 5, i dla pin-u 2 od razu ustawiamy stan wysoki, ponieważ będzie on nam służył jako dodatkowe wyjście 5V. Musimy rozpocząć również komunikacje dla portu szeregowego i mlx.
void setup() { pinMode(2, OUTPUT); digitalWrite(2, HIGH); pinMode(5, OUTPUT); pinMode(6, OUTPUT); Serial.begin(9600); mlx.begin(); }
Ostatnim krokiem jest ustawienie funkcji void loop(). Mając 2 czujniki potrzebujemy zdefiniować z którego z nich chcemy pobrać informacje. Dzięki bibliotece MLX, którą zamieściłem poniżej możemy w tym i innych projektach wykorzystać dowolną liczbę tego typu czujników. Jedyne co musimy zrobić to zdefiniować adres urządzenia z którego chcemy skorzystać. Dla ułatwienia korzystania z czujnika wykorzystałem 2 if-y których zadaniem jest informowanie nas jak dobrze ustawić rękę dla dokładnego odczytu. Jeżeli temperatura zbadanego obiektu znajduje się w przedziale 36 stopni, przekaźnik aktywuje się. Następnie ten sam program jest wykonany na kolejnym czujniku.
void loop() { mlx.AddrSet(IR1); Serial.print("IR1: "); Serial.println("Target-> "); Serial.println(mlx.readObjectTempC()); Serial.println(" C"); mlx.temp1 = mlx.readObjectTempC(); if(mlx.temp1 > 42.0){ Serial.println("Za blisko"); } if(mlx.temp1 < 35.0) { Serial.println("Za daleko"); } if(mlx.temp1 > 36.0 && mlx.temp1 < 37.0){ Serial.println("Dane wysłane do In1"); if(digitalRead(6) == LOW){ digitalWrite(6, HIGH); } else { digitalWrite(6, LOW); } delay(2000); } mlx.AddrSet(IR2); Serial.print("IR2: "); Serial.print("Target->"); Serial.println(" C"); Serial.println(mlx.readObjectTempC()); mlx.temp2 = mlx.readObjectTempC(); if(mlx.temp2 > 42.0){ Serial.println("Za blisko"); } if(mlx.temp2 < 35.0) { Serial.println("Za daleko"); } if(mlx.temp2 > 36.0 && mlx.temp2 < 37.0){ Serial.println("Dane wysłane do In2"); if(digitalRead(5) == LOW){ digitalWrite(5, HIGH); } else { digitalWrite(5, LOW); } delay(5000); } delay(1000); }