• 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
Program pomiar temperatury
#1
Witam chce napisać program dzięki któremu będę mógł odczytywać temperaturę z czujników DS18B20 w kilku miejscach jednocześnie(powiedzmy 3 ale fajnie jakby program był dla n-czujników). Mam takie założenie aby w konsoli wyświetlało mi się np.:
"Czas 1h23min30s
Czujnik Pierwszy: 24°C
Czujnik Drugi: 23.5°C
Czujnik Trzeci 24 °C
Czas 1h23min32s
Czujnik Pierwszy: 24.5°C
Czujnik Drugi: 24°C
Czujnik Trzeci 24°C "

I tak dalej opóźnienie myślę ustawić na 2 sekundy  dokładność domyślna to 0.5 °nie będę tego zmieniał. Czas może być mierzony od momentu podłączenia ardurino. Do tego programu są potrzebne 2 biblioteki OneWire oraz DallasTemperature. Zacząłem już coś tworzyć ale słabo bardzo by mi zależało na tym czy w jakiś sposób mogę tą godzina sterować aby się tak wyświetlała. Poniżej program jaki mam (nie ma szału) Smile
Kod:
#include <OneWire.h>           //Wczytanie biblioteki
#include <DallasTemperature.h> //Wczytanie biblioteki

OneWire oneWire(2); //Komunikacja z czujnikami będzie się odbywać przez 2 port

DallasTemperature sensors(&oneWire); //Przekazywanie informacji do biblioteki za pomocą której 
                                     //lini się będziemy komunikować

void setup(void)
{
  Serial.begin(9600);
  sensors.begin(); //Uruchomienie czujników czujnikow
}

unsigned long aktualnyCzas = 0;
 
void loop(void)

  sensors.requestTemperatures(); //Pobranie temperatury czujnika
  aktualnyCzas = millis();
  Serial.println(aktualnyCzas);
  Serial.println(sensors.getTempCByIndex(0));  //Wyswietlenie informacji z czujnik 0
  delay(1000);
}
 
Odpowiedź
#2
Oczywiście, jak zwykle, jest wiele sposobów na wyświetlanie czasu. W tym przypadku, upływającego czasu od uruchomienia programu.
Można na przykład zrobić tak
Kod:
unsigned long sec = millis()/1000;
unsigned int HH = sec/3600;
unsigned int MM = (sec/60)-(HH*60);
int SS = sec - (HH*360) - (MM*60);
String godziny = String(HH);
String minuty = String(MM);
String sekundy = String(SS);
String czas = String(godziny + ":" + minuty + ":" + sekundy);
Serial.print("Czas ");
Serial.println(czas);
Ten kod zresetuje się po 49 dniach.
Można też w pętli sprawdzać czy minęła sekunda i inkrementować czas.
Kod:
int SS;
int MM;
Int HH;
unsigned long previousMillis = 0;
unsigned long currentMillis = millis();

if (currentMillis - previousMillis >= 1000){
previousMillis = currentMillis;
if (SS>=60){
       SS=0;
       MM++;
            if(MM>=60){
                  MM=0;
                  HH++;
                 }
       }
SS++;
}

Wyświetlanie tak samo jak w pierwszym przykładzie.
Różnica jest taka, że ten zegar zresetuje się za 245000 lat, a gdybyś zadeklarował HH jako unsigned long long, to program mógł by liczyć te godziny przez miliardy lat. Nie chce mi się liczyć, ale reset Wszechświata będzie wcześniej niż reset tego zegara.
Jeśli masz problem z kodem lub sprzętem, zadaj pytanie na forum. Nie odpowiadam na PW, jeśli nie dotyczą one spraw forum lub innych tematów prywatnych.

[Obrazek: SsIndaG.jpg]
 
Odpowiedź
#3
(09-05-2018, 07:58)Robson Kerman napisał(a): Można też w pętli sprawdzać czy minęła sekunda i inkrementować czas.
Czas należy odliczać na przerwaniach, do tego służą. Gdy w kodzie pojawią się delay co jest nagminna, złą praktyka Arduinowców, to sekunda może zrobię się dłuższa niżby sie wydawało. Arduino udostępnia odpowiednie mechanizmy odliczania czasu, wywoływania zdarzeń, w bibliotece timer.
 
Odpowiedź
#4
(09-05-2018, 08:25)es2 napisał(a): Czas należy odliczać na przerwaniach, do tego służą.
Arduino udostępnia odpowiednie mechanizmy odliczania czasu...

W pełni się zgadzam.
Dla tego w powyższych przykładach użyłem funkcji millis(), która to odlicza czas na przerwaniach.
Pierwszy przykład jest delay'o odporny i gdyby pogrzebać w bibliotece millis.cpp, to można by wywołać przerwanie co jedną sekundę, a reset funkcji będzie za trzynaście lat, co w zupełności wystarczy Arduinowcom.

Z drugiej jednak strony, co to była by za pomoc, widząc że dzieciak ma problem z konwersją milisekund na godziny, minuty i sekundy, czyli jest na 100% początkujący, a ja bym mu napisał "Weź se zrób na przerwaniach".
Jeśli masz problem z kodem lub sprzętem, zadaj pytanie na forum. Nie odpowiadam na PW, jeśli nie dotyczą one spraw forum lub innych tematów prywatnych.

[Obrazek: SsIndaG.jpg]
 
Odpowiedź
#5
(09-05-2018, 08:56)Robson Kerman napisał(a): Z drugiej jednak strony, co to była by za pomoc, widząc że dzieciak ma problem z konwersją milisekund na godziny, minuty i sekundy, czyli jest na 100% początkujący, a ja bym mu napisał "Weź se zrób na przerwaniach".

Dobrych nawyków trzeba uczyć od początku, zwłaszcza, jeśli kod nie jest skomplikowany. Pod linkiem https://playground.arduino.cc/Code/Timer opisane są przykłady użycia biblioteki timer. W przypadku autora w setup wystarczy dodać
Kod:
 t.every(1000, takeReading);
dodać funkcję:
Kod:
void takeReading()
{
 licznik_sekund++;
}


zadeklarować zmienną:
Kod:
uint32_t volatile licznik_sekund=0;
 
I mamy licznik sekund.

Z odczytem licznika trochę gimnastyki, bo to nie ARM i 32 bitów nie odczyta jednym rozkazem
Kod:
uint32_t CzytajLicznikSekund()
{
ATOMIC_BLOCK  //sufiks dobrać wegług potrzeb
{
uint 32_t cnt = licznik_sekund;
}
return cnt;
}



PS
Mam nadzieję, ze niczego nie pominąłem.
 
Odpowiedź
#6
Dziękuje za odpowiedzi wszystko fajnie tylko że mi nie działa :/ jakich muszę bibliotek użyć? Czy muszę określić jakiś pin czy co przeze który będzie się urządzenie komunikowało czy coś?
 
Odpowiedź
#7
(11-05-2018, 17:20)Scoti napisał(a): Dziękuje za odpowiedzi wszystko fajnie tylko że mi nie działa :/ jakich muszę bibliotek użyć? Czy muszę określić jakiś pin czy co przeze który będzie się urządzenie komunikowało czy coś?

"Oczywista, oczywistość", że trzeba skonfigurować pin. Warto pokazać też schemat, może jest błąd w połączeniach. Biblioteki Arduino, dość nieszczęśliwie obsługują 1-Wire. Zaletą (chyba jedyną) jest to, że można wybrać dowolny pin do komunikacja, reszta, to same wady. Do 1-Wire, najlepiej użyć USART. Niestety, najpopularniejsze UNO, praktycznie nie ma USART. Jedyny dostępny, jest użyty do pseudo debugowania.
 
Odpowiedź
  


Skocz do:


Przeglądający: 1 gości