• 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
Powolne działanie przy czujnikach temperatury
#2
Odczyt czujników można przyspieszyć do około 20ms, do nawet poniżej 10ms przy lekkim przesterowaniu protokołu, trzeba wyłączyć czekanie na pomiar i wtedy może być nawet 12 bitowy. Cały projekt musi być zbudowany wg zasad bez delay, te drgania styków też do kosza jeśli robisz to na delay. Albo wszystko robisz prawidłowo, albo tak się to kończy jak to opisujesz, bo tu 20ms, tam 50ms i nagle pętla kręci się raz na parę sekund.
Z dsami po wyłączeniu czekania możesz zrobić tak, że w pierwszej sekundzie działania wysyłasz zlecenie pomiaru, w drugiej odczytujesz 1 czujnik, w kolejnej następny, w piątej zlecasz ponowny pomiar. Dzięki temu masz 1 odczyt linii ONEWIRE w jednej sekundzie, czyli poza tym zamrożeniem na 20ms, co stanowi 95% sekundy loop będzie biegał aż miło, w sumie z 13500 odpadnie z 5% .
Można zastąpić DS czujnikami PT100 i odczyt robić analogiem, co trwa około 300us.
Przy 4 czujnikach tym sposobem masz efektywnie odczyt co 5s, przy podgrzewaniu wody częściej nie ma potrzeby. Zamiast zmieniać czujniki na PT100 lepiej dołożyć do układu bezpiecznik temperaturowy w szereg zasilania cewki przekaźnika, bo program się zawiesi, WDT nie zadziała, to jeszcze zostanie takie mechaniczne zabezpieczenie. Są w sprzedaży takie "termiki" z krokiem co parę stopni C.
Z przyciskami nawet nie trzeba się wysilać, są gotowe biblioteki Bounce2, Onebutton, easybutton, analog buttton - do wyboru do koloru.
Kod:
// Include the libraries we need
#include <OneWire.h>
#include <DallasTemperature.h>

// Data wire is plugged into port 2 on the Arduino
#define ONE_WIRE_BUS 2

// Setup a oneWire instance to communicate with any OneWire devices (not just Maxim/Dallas temperature ICs)
OneWire oneWire(ONE_WIRE_BUS);

// Pass our oneWire reference to Dallas Temperature.
DallasTemperature sensors(&oneWire);


uint32_t czasTeraz,czasPoprzedni,tik=10, czas1,czas2,czas3,czas4,roznica,maximum,srednia;
uint8_t n10,fn10,sekundy,minuty,godziny,dni,nic;

bool fsekundy,fminuty,fgodziny,fdni;
void setup() {
//  sysClock(INT_OSC32);
  // put your setup code here, to run once:
Serial.begin(115200);
  sensors.begin();
sensors.requestTemperatures();
sensors.setWaitForConversion(0);
}

void loop() {
  czas();
  // put your main code here, to run repeatedly:
if(fsekundy)
{
  if(sekundy%2==0)
  {
    
     float odczyt=sensors.getTempCByIndex(0);//ta temperatura jest odczytana 2s temu
      Serial.println(odczyt);
     sensors.requestTemperatures(); // Send the command to get temperatures
   
  }

}


}


void czas()
{
  czasTeraz=millis();
fn10=fsekundy=fminuty=fgodziny=fdni=0;
if((uint32_t)(czasTeraz-czasPoprzedni)>=tik)
{
  czasPoprzedni=czasTeraz;
  fn10=1;
  n10++;
  if(n10>=100)
  {
    n10=0;
    sekundy++;
    fsekundy=1;
     if (sekundy>=60)
    {
      sekundy=0;
      minuty++;
      fminuty=1;
      if (minuty>=60)
      {
        minuty=0;
        godziny++;
        fgodziny=1;
        if (godziny>=24)
        {
          godziny=0;
          fdni=1;
          dni++;
   
        }
      }
    }
  }
}
}
Wysyłasz jakieś dane na ekran to też nie rób tego w każdej pętli, może ma to sens co 1s, jak klikasz przyciskami to może co 200ms.
A co 200ms w loop do powyższego przykładu wystarczy dopisać:
if(fn10 and n10%20==0) wyswietlDaneNaEkran();
Czyli jeśli  w danym obiegu loop jest nowy okres 10ms, a licznik n10 zliczył ich tyle, że reszta z dzielenia przez 20 jest 0, to odpal funkcje wyswietlDaneNaEkran(), albo cały blok programu jeśli wstawisz tam {}. Czyli raz na 200ms będzie się odpalać. Albo przyciski, nawet bez biblioteki, gdy
if(fn10) sprawdzPrzyciski(); - zadzieje się co 10ms, jak nie był wciśnięty, a jest 1, to masz wciśnięcię++, wciśnięcie doliczy do 5 ale zmieni się na 0, to przycisk został wciśnięty i puszczony=akcja. A jak nie doliczył do 5 to w else zerujesz wciśnięcie i nic się nie dzieje, bez delay, bez biblioteki. Można zrobić drabinkę ifów, że jeśli jest wciśnięcie>100 to jest długie ciśnięcie i zamiast zmieniać jakąś zmienną o 1 to zmieniasz +=10, a przy >1000 +=100, dzięki temu np. można ustawić zegar jednym przyciskiem, z krokiem 1 min w kilkanaście sekund, dla zegara 24h, bo to może być 1 zmienna o wartościach 0-1399, tyle ile doba ma minut.
Albo można się nakombinować i trzymać godzinę w godzinach, minutach, sekundach  i bawić się z menu jak matka z łobuzem. 
Ale biblioteki też robią to z długimi wciśnięciami, z podwójnym kliknięciem, tylko trzeba się nauczyć je obsługiwać.
Miło być decenianym https://buycoffee.to/kaczakat
 
Odpowiedź
  


Wiadomości w tym wątku
RE: Powolne działanie przy czujnikach temperatury - przez kaczakat - 26-09-2022, 14:52

Skocz do:


Przeglądający: 1 gości