Ilor287 Styczeń 22, 2023 Udostępnij Styczeń 22, 2023 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 Cytuj Link do komentarza Share on other sites More sharing options...
Treker (Damian Szymański) Styczeń 23, 2023 Udostępnij Styczeń 23, 2023 @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. Cytuj Link do komentarza Share on other sites More sharing options...
tyrystor33 Styczeń 31, 2023 Udostępnij Styczeń 31, 2023 A zrobicie "Arduino|||" bo przykład mam attiny2113 i to u mnie leży i leży •~• Cytuj Link do komentarza Share on other sites More sharing options...
Treker (Damian Szymański) Luty 1, 2023 Udostępnij Luty 1, 2023 @tyrystor33 niestety na ten moment nie mam w planach kursu związanego z układami Attiny. 1 Cytuj Link do komentarza Share on other sites More sharing options...
Polecacz 101 Zarejestruj się lub zaloguj, aby ukryć tę reklamę. Zarejestruj się lub zaloguj, aby ukryć tę reklamę. 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
tomekk06 Marzec 10, 2023 Udostępnij Marzec 10, 2023 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ą? Cytuj Link do komentarza Share on other sites More sharing options...
matsobdev Marzec 10, 2023 Udostępnij Marzec 10, 2023 (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 Marzec 10, 2023 przez matsobdev Cytuj Link do komentarza Share on other sites More sharing options...
tomekk06 Marzec 10, 2023 Udostępnij Marzec 10, 2023 Znalazłem błąd - to był błąd podłączenia termometru 😂 1 Cytuj Link do komentarza Share on other sites More sharing options...
Kasesbian Kwiecień 17, 2023 Udostępnij Kwiecień 17, 2023 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? Cytuj Link do komentarza Share on other sites More sharing options...
Treker (Damian Szymański) Kwiecień 19, 2023 Udostępnij Kwiecień 19, 2023 @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. Cytuj Link do komentarza Share on other sites More sharing options...
Kasesbian Kwiecień 20, 2023 Udostępnij Kwiecień 20, 2023 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. 😄 1 Cytuj Link do komentarza Share on other sites More sharing options...
gracjuszek10 Listopad 29, 2023 Udostępnij Listopad 29, 2023 #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ł? Cytuj Link do komentarza Share on other sites More sharing options...
jand Listopad 29, 2023 Udostępnij Listopad 29, 2023 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); Cytuj Link do komentarza Share on other sites More sharing options...
gracjuszek10 Listopad 29, 2023 Udostępnij Listopad 29, 2023 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. Cytuj Link do komentarza Share on other sites More sharing options...
gracjuszek10 Listopad 29, 2023 Udostępnij Listopad 29, 2023 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); } Cytuj Link do komentarza Share on other sites More sharing options...
jand Listopad 29, 2023 Udostępnij Listopad 29, 2023 (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 Listopad 29, 2023 przez jand Cytuj Link do komentarza Share on other sites More sharing options...
Pomocna odpowiedź
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!