• Witaj na Forum Arduino Polska! Zapraszamy do rejestracji!
  • Znajdziesz tutaj wiele informacji na temat hardware / software.
Witaj! Logowanie Rejestracja


Ocena wątku:
  • 0 głosów - średnia: 0
  • 1
  • 2
  • 3
  • 4
  • 5
Ciekawy problem z kodem
#1
Cześć, to mój pierwszy post więc witam Was. 

Mam dość ciekawy- aczkolwiek wystawiąjący na niezłą próbę moje nerwy i cierpliwość - problem. płytka Arduino UNO.

Jestem początkujący, nawet bardzo.

Napisałem program sterujący pracą ogrzewania w kamperze. Postanowiłem dodać (raczej z ciekawości i chęci nauki) zapis temperatury maksymalnej i minimalnej, tak by wyświetlał mi się na monitorze. I niestety nie działa. Odczyt temperatury minimalnej to "0". Przeglądnąłem cały internet i w kilku znalezionych przykładach przykładach kod wygląda identycznie jak u mnie. I podobno działa. Tylko, że nie u mnie. Temperatura maksymalna działa jak należy, natomiast minimalna nie.

Próbowałem już na milion sposobów zmieniać kod ale bez skutku. "Odseparowałem nieistotną (sterującą ogrzewaniem) część kodu, zostawiając tylko tą dotyczącą temperatury. Bez efektu.

Pomóżcie, proszę, bo nerwicy dostanę Wink

Kod:
#include "DHT.h"
#define DHT11_PIN 2
DHT dht;
int TempMax = 15;
int TempM = 20;

void setup() {
Serial.begin(9600);
dht.setup(DHT11_PIN);// komunikacja przez pin 2
}

void loop()
{
int temperatura = dht.getTemperature();
Serial.print("temperatura: ");
  Serial.print(temperatura);
  Serial.println("*C");
delay(500);
if(temperatura > TempMax){TempMax = temperatura;}
Serial.print("TempMax: ");
Serial.println(TempMax);
delay(500);
if(temperatura < TempM){TempM = temperatura;}
Serial.print("TempM: ");
Serial.println(TempM);

Serial.println("");
delay(2000);
}
 
Odpowiedź
#2
Kod wygląda na poprawny, jednak pamiętaj, że obliczanie wartości max/min jest wrażliwe na wszelkie niepoprawne odczyty. Jeśli choć raz odczyta się np. wartość 0 to zostanie zapamiętane jako wartosc minimalna i już tak zostanie. Jednocześnie pomiary wartości fizycznych zawsze mają tolerancje, niepewności i zakłócenia. Ja np. w mojej "stacji meteo" każdą wielkość (a pomiary dotyczą temperatury, wilgotności i ciśnienia) czytam co sekundę, 10 wyników chwilowo pamiętam, z tych 10 dwa skrajne odrzucam a z pozostałych 8 liczę średnią. W ten sposób co 10 sekund mam lekko uśredniony wynik, który zapisuje. Akurat DHT11 nigdy nie używałem, więc nie wiem jakie robi numery, ale być może np. pierwszy pomiar jest 'niegotowy' i w wyniku wychodzi 0, albo coś podobnego? Szczególnie, że pierwszy pomiar robisz natychmiast po setup(), gdzie konfigurujesz czujnik. Może to jakiś problem elektryczny?
Każdy wynik wysyłasz więc możesz wszystko zapisać i sprawdzić, czy to zero faktycznie wystąpiło.

Nie przykładał bym większego znaczenia do pojedynczego pomiaru - zapamiętuj min i max dopiero jak wynik się kilkukrotnie powtórzy.


Nie bardzo widzę sens tych delay(500) w środku. One są pomiędzy printami i obliczeniami.
 
Odpowiedź
#3
(30-11-2023, 08:03)oscarX napisał(a): Kod wygląda na poprawny, jednak pamiętaj, że (...)

Dziękuję za odpowiedź, bardzo mi pomogłeś.

Tak jak napisałeś - po każdym resecie czujnik temperatury dawał przez chwilę wynik "0", więc temperatura minimalna zgodnie z napisanym kodem zmieniała się na zero. Wystarczyło w setup() dodać przerwę 3 sekundową aby czujnik miał czas dojść do siebie. 

A te "delay(500)" wstawiłem bo gdzieś przeczytałem i widziałem, że w pewnych miejscach "dobrze ich użyć, by polepszyć działanie programu". Pomyślałem, że może i u mnie za dużo rzeczy na raz się dzieje i warto spróbować. 

Dziękuję!!!
 
Odpowiedź
#4
przeczytaj sobie ten artykuł. dokładnie to samo co z przyciskiem mozna zrobic z odczytywaniem wartości z czujników. wtedy delaye nie beda Ci blokować loopa.
też jestem początkujący ale wydaje mi sie to dobrą praktyką.
 
Odpowiedź
  


Skocz do:


Przeglądający: 1 gości