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

Link do komentarza
Share on other sites

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

Link do komentarza
Share on other sites

Zarejestruj się lub zaloguj, aby ukryć tę reklamę.
Zarejestruj się lub zaloguj, aby ukryć tę reklamę.

jlcpcb.jpg

jlcpcb.jpg

Produkcja i montaż PCB - wybierz sprawdzone PCBWay!
   • Darmowe płytki dla studentów i projektów non-profit
   • Tylko 5$ za 10 prototypów PCB w 24 godziny
   • Usługa projektowania PCB na zlecenie
   • Montaż PCB od 30$ + bezpłatna dostawa i szablony
   • Darmowe narzędzie do podglądu plików Gerber
Zobacz również » Film z fabryki PCBWay

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ą?

 

Link do komentarza
Share on other sites

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
Link do komentarza
Share on other sites

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? 

Link do komentarza
Share on other sites

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
Link do komentarza
Share on other sites

#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ł? 

Link do komentarza
Share on other sites

 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);

 

Link do komentarza
Share on other sites

    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.

Link do komentarza
Share on other sites

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);
}

 

Link do komentarza
Share on other sites

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
Link do komentarza
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!

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

Ważne informacje

Ta strona używa ciasteczek (cookies), dzięki którym może działać lepiej. Więcej na ten temat znajdziesz w Polityce Prywatności.