Skocz do zawartości

Kurs Arduino II - #7 - termometry analogowe i cyfrowe


Pomocna odpowiedź

Witam. 

Pytanie odnośnie odczytania obliczonej temperatury z czujnika LM35,

#define LM35 A5
 
void setup(){
  Serial.begin(9600);
}
 
void loop(){
  //Przeliczenie odczytu ADC na temperaturę zgodnie z opisem z kursu
  float temperatura = ((analogRead(LM35) / 2);
 
  //Wyslanie przez UART aktualnej temperatury
  Serial.print("Aktualna temperatura: ");
  Serial.print(temperatura);
  Serial.println("*C");
 
  delay(200);
}

można by zamiast operacji  float temperatura = ((analogRead(LM35) * 5.0) / 1024.0) * 100;

wykonać tą powyżej, ponieważ nie potrzebujemy takiego dokładnego wyniku który w rzeczywistości nie jest aż tak dokładny  

przyjmijmy że temperatura_re wynosi 100*C :

temperatura_obl1 = ((analogRead(LM35) * 5.0) / 1024.0) * 100 = ~ 97,65*C

temperatura_obl2 = ((analogRead(LM35)  /  2) = 100*C

@Ilor287 witam na forum 🙂 Pomiar opisany w kursie wynika wprost z zaleceń producenta czujnika. Wszelkie inne sposoby obliczenia to już "Twoja" sprawa. Nic się nie zepsuje, jeśli taka "dokładność" Ci wystarczy to dobrze, chociaż oszczędność na takich działaniach matematycznych będzie raczej znikoma.

  • 2 tygodnie później...
  • 1 miesiąc później...

Witam

Po podłączeniu termometru  cyfrowego: DS18B20 do arduino  na porcie szeregowym wyświetla mi się cały czas temperatura - 127.00, czy może być uszkodzony termometr ? A co ciekawe po wyjęciu termometru z układu nadal pokazuje też    -127,00. Co może być przyczyną?

 

(edytowany)

To biblioteka pewnie zwraca taką wartość jak jest błąd komunikacji (nie ma jej) z termometrem. Więc może być uszkodzony albo może też to być klon/podróba, szczególnie jakby do kilku oryginałów dorzucić klona, to wszystkie mogą tak się zachowywać. To jest "goły" TO-92, czy w jakiejś wodoszczelnej obudowie?

Edytowano przez matsobdev
  • 1 miesiąc później...

Dzień dobry.
Szukam czujnika do projektu. Posiadam DHT22. Jednak zauważyłem, że jest on bardzo słabo responsywny "w dół". Tzn. nagrzewam go suszarką, jest wyraźny skok temperatury, np. z 23 do 30. Ale gdy wyłączę suszarę, to temperatura spada bardzo powoli. Na gifie w tym kursie widziałem czujnik LM35 i zauważyłem, że ma bardzo dobra odpowiedź na temperaturę. Chociaż zastanawia mnie, czy ta responsywność sprawia również, ze wahania temperatury są duże. W każdym razie, czy mógłby ktoś mi polecić czujnik, który jest responsywny, czyli wraz z upływem czasu, pokazuje temperaturę otoczenia (w przybliżeniu), a nie, że musze czekać 5 minut aż wystygnie? 

@Kasesbian witam na forum 🙂 DHT22 nie jest najlepszym termometrem, raczej wykorzystuje się go jako czujnik wilgotności. Na pewno lepsze efekty uzyskasz, jeśli wykorzystasz wspomniany LM35 lub cyfrowe termometry DS18B20.

Dnia 19.04.2023 o 09:42, Treker napisał:

@Kasesbian witam na forum 🙂 DHT22 nie jest najlepszym termometrem, raczej wykorzystuje się go jako czujnik wilgotności. Na pewno lepsze efekty uzyskasz, jeśli wykorzystasz wspomniany LM35 lub cyfrowe termometry DS18B20.

Tak, to prawda. Dorwałem DS18B20 i jest o niebo lepiej. 😄

  • Lubię! 1
  • 7 miesiące później...
#include <virtuabotixRTC.h>// dodanie biblioteki zegara RTC
virtuabotixRTC myRTC(8, 9, 10); //Piny zegara RTC
#include "DHT.h"//termometr poczatek
#define DHT11_PIN 2
DHT dht;//termometr koniec
int status = 0; //ustawienie blokady
int TempMax = dht.getTemperature();
int TempMin = dht.getTemperature();


void setup() {
 Serial.begin(9600);
//myRTC.setDS1302Time(30, 43, 20, 5, 25, 11, 2023);
pinMode(12, OUTPUT);// sterowanieprzekaznikiem 4/ wlaczanie/wylaczanie webasto
pinMode(11, OUTPUT);// sterowanie przekaznikiem 3/ zwiekszanie temperatury
pinMode(7, OUTPUT);// sterowanie przekaznikiem 2/ zmniejszenie temperatury
digitalWrite(12, HIGH);
digitalWrite(11, HIGH);
digitalWrite(7, HIGH);
 Serial.begin(9600);//temperatura
  dht.setup(DHT11_PIN);// komunikacja przez pin 2

}

void loop() {


int temperatura = dht.getTemperature();


myRTC.updateTime();
Serial.print("Data / Godzina : ");
 Serial.print(myRTC.dayofmonth); 
 Serial.print("/");
 Serial.print(myRTC.month);
 Serial.print("/");
 Serial.print(myRTC.year);
 Serial.print(" ");
 Serial.print(myRTC.hours);
 Serial.print(":");
 Serial.print(myRTC.minutes);
 Serial.print(":");
 Serial.println(myRTC.seconds); // put your main code here, to run repeatedly:
 Serial.print("status: ");
 Serial.println(status);
 Serial.print("temperatura: ");
  Serial.print(temperatura);
  Serial.println("*C");

if(temperatura > TempMax){TempMax = temperatura;}
Serial.print("TempMax: ");
Serial.println(TempMax);
 
if(temperatura < TempMin){TempMin = temperatura;}
delay(200);
Serial.print("TempMin: ");
Serial.println(TempMin);

Serial.println("");
delay(200);
  

if(myRTC.hours >= 3 && myRTC.hours <= 8 && myRTC.minutes >= 00 && myRTC.seconds >=00 && temperatura <= 12 && temperatura > 0 && status == 0)
{
  digitalWrite(12, LOW);//wlaczanie webasto
  delay(1500);
  digitalWrite(12, HIGH);
  delay(200);
  status = 1;
}
  else if(myRTC.hours >= 7 && myRTC.minutes >= 30 && myRTC.seconds >=00 && status == 1)
  {
    digitalWrite(11,LOW);//podnoszenie temperatury o 5 stopni
    delay(500);
    digitalWrite(11,HIGH);
    delay(500);
    digitalWrite(11,LOW);
    delay(500);
    digitalWrite(11,HIGH);
    delay(500);
    digitalWrite(11,LOW);
    delay(500);
    digitalWrite(11,HIGH);
    delay(500);
    digitalWrite(11,LOW);
    delay(500);
    digitalWrite(11,HIGH);
    delay(500);
    digitalWrite(11,LOW);
    delay(500);
    digitalWrite(11,HIGH);
    delay(500);
    status = 2;
  }
else if(myRTC.hours >= 3 && myRTC.hours <= 8 && myRTC.minutes >= 00 && temperatura >=23 && status >0 && status <3)
{
    digitalWrite(12,LOW);//wylaczanie webasta gdy temperatura wysoka
    delay(5500);
    digitalWrite(12,HIGH);
    delay(200);
     
    status = 3;
}
  else if(myRTC.hours >= 19 && myRTC.minutes >= 0 && status > 1 && status < 4)
  {
 digitalWrite(7,LOW);//obnizanie nastaw temperatury/zbrojenie ustawien
 delay(500);
 digitalWrite(7,HIGH);
    delay(500);
    digitalWrite(7,LOW);
    delay(500);
    digitalWrite(7,HIGH);
    delay(500);
    digitalWrite(7,LOW);
    delay(500);
    digitalWrite(7,HIGH);
    delay(500);
    digitalWrite(7,LOW);
    delay(500);
    digitalWrite(7,HIGH);
    delay(500);
    digitalWrite(7,LOW);
    delay(500);
    digitalWrite(7,HIGH);
    delay(500);
    status = 4;
  }
else if(myRTC.hours == 19 && myRTC.minutes == 1 && status > 0 && status <= 4)
{
  status = 0;
  delay(200);
}
  else
  {digitalWrite(13, HIGH);
  }

  

delay(3000);
}

To mój pierwszy post więc witam Was wszystkich.

 

Potrzebuję pomocy odnośnie odczytów temperatur maksymalnych i minimalnych. Mimo, że mam identyczny kod jak w artykule to nie działa u mnie wyświetlanie temperatury minimalnej. Maksymalna działa jak należy, minimalna za nic w świecie nie chce, a próbowałem już kilkadziesiąt różnych zmian. Generalnie - temperatura minimalna zawsze wyświetla mi "0". Bez względu jaką wartość ustawię jako początkową.

 

Jeśli w miejscu "{TempMin = temperatura;}" w 54 linijce kodu zamiast "temperatura" wstawię dowolną liczbę, to na monitorze wyświetla mi tą  liczbę, ale za nic nie chce mi wstawić tam aktualnej temperatury. Wyświetla wartość "0". Co ciekawe identycznie napisany kod do temperatury maksymalnej działa pięknie (oczywiście jego jakby lustrzane odbicie). Kod jest częścią większego kodu, który steruje ogrzewaniem.

Czy ktoś ma jakiś pomysł? 

 Pozostawiamy deklaracje (na razie jeszcze bez pomiaru):

int TempMax = 0;
int TempMin = 0;

a pierwsze pomiary powinny być w setup(), już po zainicjowaniu modułu DHT:

dht.setup(DHT11_PIN);
TempMax = dht.getTemperature();
TempMin = dht.getTemperature();

Niepotrzebnie też dwukrotne:

Serial.begin(9600);

 

    digitalWrite(11,LOW);
    delay(500);
    digitalWrite(11,HIGH);
    delay(500);
    digitalWrite(11,LOW);
    delay(500);
    digitalWrite(11,HIGH);
    delay(500);
    digitalWrite(11,LOW);
    delay(500);
    digitalWrite(11,HIGH);
    delay(500);
    status = 2;
  }
else if(myRTC.hours >= 3 && myRTC.hours <= 8 && myRTC.minutes >= 00 && temperatura >=23 && status >0 && status <3)
{
    digitalWrite(12,LOW);//wylaczanie webasta gdy temperatura wysoka
    delay(5500);
    digitalWrite(12,HIGH);
    delay(200);
     
    status = 3;
}
  else if(myRTC.hours >= 19 && myRTC.minutes >= 0 && status > 1 && status < 4)
  {
 digitalWrite(7,LOW);//obnizanie nastaw temperatury/zbrojenie ustawien
 delay(500);
 digitalWrite(7,HIGH);
    delay(500);
    digitalWrite(7,LOW);
    delay(500);
    digitalWrite(7,HIGH);
    delay(500);
    digitalWrite(7,LOW);
    delay(500);
    digitalWrite(7,HIGH);
    delay(500);
    digitalWrite(7,LOW);
    delay(500);
    digitalWrite(7,HIGH);
    delay(500);
    digitalWrite(7,LOW);
    delay(500);
    digitalWrite(7,HIGH);
    delay(500);
    status = 4;
  }
else if(myRTC.hours == 19 && myRTC.minutes == 1 && status > 0 && status <= 4)
{
  status = 0;
  delay(200);
}
  else
  {digitalWrite(13, HIGH);
  }

  

Dziękuje za odpowiedź. Niestety nie działa. Zrobiłem zgodnie z instrukcją, przynajmniej tak mi się wydaje. Wrzucam kod. W tej chwili TempMax podaje wartość "nan" a TempMin nadal wartość "0". I kompletnie nie rozumiem dlaczego ( w przypadku pierwszej sesji programu która dodałem)jeden pomiar działa a drugi - bliźniaczy przecież - nie działa.

Dodałem tylko część kodu. Przepraszam. Tutaj jest w całości.

#include <virtuabotixRTC.h>// dodanie biblioteki zegara RTC
virtuabotixRTC myRTC(8, 9, 10); //Piny zegara RTC
#include "DHT.h"//termometr poczatek
#define DHT11_PIN 2
DHT dht;//termometr koniec
int status = 0; //ustawienie blokady
float TempMax = 0;
int TempMin = 0;


void setup() {
 Serial.begin(9600);
//myRTC.setDS1302Time(30, 43, 20, 5, 25, 11, 2023);

pinMode(12, OUTPUT);// sterowanieprzekaznikiem 4/ wlaczanie/wylaczanie webasto
pinMode(11, OUTPUT);// sterowanie przekaznikiem 3/ zwiekszanie temperatury
pinMode(7, OUTPUT);// sterowanie przekaznikiem 2/ zmniejszenie temperatury
digitalWrite(12, HIGH);
digitalWrite(11, HIGH);
digitalWrite(7, HIGH);
 Serial.begin(9600);//temperatura
  dht.setup(DHT11_PIN);// komunikacja przez pin 2
TempMax = dht.getTemperature();
TempMin = dht.getTemperature();

}

void loop() {


int temperatura = dht.getTemperature();


myRTC.updateTime();
Serial.print("Data / Godzina : ");
 Serial.print(myRTC.dayofmonth); 
 Serial.print("/");
 Serial.print(myRTC.month);
 Serial.print("/");
 Serial.print(myRTC.year);
 Serial.print(" ");
 Serial.print(myRTC.hours);
 Serial.print(":");
 Serial.print(myRTC.minutes);
 Serial.print(":");
 Serial.println(myRTC.seconds); // put your main code here, to run repeatedly:
 Serial.print("status: ");
 Serial.println(status);
 Serial.print("temperatura: ");
  Serial.print(temperatura);
  Serial.println("*C");

if(temperatura > TempMax){TempMax = temperatura;}
Serial.print("TempMax: ");
Serial.println(TempMax);
 
if(temperatura < TempMin){TempMin = temperatura;}
delay(200);
Serial.print("TempMin: ");
Serial.println(TempMin);

Serial.println("");
delay(200);
  

if(myRTC.hours >= 3 && myRTC.hours <= 8 && myRTC.minutes >= 00 && myRTC.seconds >=00 && temperatura <= 12 && temperatura > 0 && status == 0)
{
  digitalWrite(12, LOW);//wlaczanie webasto
  delay(1500);
  digitalWrite(12, HIGH);
  delay(200);
  status = 1;
}
  else if(myRTC.hours >= 7 && myRTC.minutes >= 30 && myRTC.seconds >=00 && status == 1)
  {
    digitalWrite(11,LOW);//podnoszenie temperatury o 5 stopni
    delay(500);
    digitalWrite(11,HIGH);
    delay(500);
    digitalWrite(11,LOW);
    delay(500);
    digitalWrite(11,HIGH);
    delay(500);
    digitalWrite(11,LOW);
    delay(500);
    digitalWrite(11,HIGH);
    delay(500);
    digitalWrite(11,LOW);
    delay(500);
    digitalWrite(11,HIGH);
    delay(500);
    digitalWrite(11,LOW);
    delay(500);
    digitalWrite(11,HIGH);
    delay(500);
    status = 2;
  }
else if(myRTC.hours >= 3 && myRTC.hours <= 8 && myRTC.minutes >= 00 && temperatura >=23 && status >0 && status <3)
{
    digitalWrite(12,LOW);//wylaczanie webasta gdy temperatura wysoka
    delay(5500);
    digitalWrite(12,HIGH);
    delay(200);
     
    status = 3;
}
  else if(myRTC.hours >= 19 && myRTC.minutes >= 0 && status > 1 && status < 4)
  {
 digitalWrite(7,LOW);//obnizanie nastaw temperatury/zbrojenie ustawien
 delay(500);
 digitalWrite(7,HIGH);
    delay(500);
    digitalWrite(7,LOW);
    delay(500);
    digitalWrite(7,HIGH);
    delay(500);
    digitalWrite(7,LOW);
    delay(500);
    digitalWrite(7,HIGH);
    delay(500);
    digitalWrite(7,LOW);
    delay(500);
    digitalWrite(7,HIGH);
    delay(500);
    digitalWrite(7,LOW);
    delay(500);
    digitalWrite(7,HIGH);
    delay(500);
    status = 4;
  }
else if(myRTC.hours == 19 && myRTC.minutes == 1 && status > 0 && status <= 4)
{
  status = 0;
  delay(200);
}
  else
  {digitalWrite(13, HIGH);
  }

  

delay(3000);
}

 

(edytowany)

Akurat ten zamieszczony fragment programu nie dotyczy pomiaru temperatury.

Trzeba też pamiętać, że czujnik ten może dostarczać wynik z częstotliwością ok. 1Hz (czyli jeden na sekundę) - nie można go więc odpytywać zbyt często.

Lepiej więc będzie tak:

dht.setup(DHT11_PIN);
delay(2000);
TempMax = dht.getTemperature();
TempMin = TempMax;

W loop() jest opóźnienie 3 sek., więc powinno być ok.

 

I kosmetyka - funkcja dht.getTemperature() zwraca wartość typu float.

Edytowano przez jand

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