• 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
#1
Cześć, zastanawiam się czy w ogóle jest możliwe aby jakoś podzielić odczyt z temperatury bądź wykorzystać jakieś metody aby wykrzesać jeszcze trochę prędkości z mikrokontrolera. Mianowicie chodzi o to że mam sterownik pomp 2 przekaźniki 3 czujniki ds18b20 enkoder, wyświetlacz i buzzer działanie proste załączanie wyłączanie pomp w zależności od różnych sytuacji oraz histerezy różne powiadomienia dzwiękowe i alarmy wszystko podgląd na wyświetlaczu i całe menu przeróżnych ustawień, program napisany na timerkach jedynie krótkie delaye do wyeliminowania drgań styków i chodzi o to że pętla przelatuje 13500 razy na sekundę a kiedy włącze odczyty z 3 termometrów zwalnia do 2 razy na sekunde wszystko byłoby dobrze bo to wystarczająca prędkość lecz chciałbym chociaż co 100ms zmieniać ton na buzzerze kiedy jest skrajna temperatura (po prostu włączyć syrene) lecz wolna pętla mi na to nie pozwala i efekt syreny jest słaby. Mimo iż funkcje alarmu nie mam w loopie nawet dane tylko bezpośrednio działa na nią timer.  I teraz pytanie czy idzie jakoś przyśpieszyć odczyt temperatury z czujników albo wykombinować to w inny sposób aby szło takie operacje robić? dodam że dokładność termometru mam ustawione dosyć nisko więc już w ten sposób nie przyśpieszymy pracy. Nie jest to aż tak potrzebne lecz jakbym chciał budować urządzenie bardziej szybsze jedyną opcją przychodzi mi do głowy drugi mikrokontroler tylko i wyłącznie do odczytu temperatury który wysyłałby na główny mikrokontroler gdzie działa by się reszta szybszych rzeczy.
 
Odpowiedź
#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ź
#3
ojeny ale się rozpisałeś, dzięki za masę cennych informacji musze po kolei sobie przeanalizować wszystko jeszcze raz i przećwiczyć z tym przykładem o dsach następny program postaram się zrobić bez delayów chociaż mega robią droge na skróty do szybkich projektów lub mało znaczących sekwencji programu lecz lepiej się od nich od uzależnić
 
Odpowiedź
#4
a tak się zastanawiam z tymi bezpiecznikami (termikami) mam nawet jakieś rodzaje u siebie ale one przecież są na wysoką temperature rzędu ponad 100 stopni i one rozłączają obwód, a to nie zaszkodzi jak pompa będzie włączona a lepiej na odwrót jak WDT nie zadziała to to ma załączyć czy jak mam to rozumieć? Chyba że są jeszcze inne takie podzespoły. Dodam że raczej będe stosował przekaźniki półprzeowdnikowe SSR a nie zwykłe z cekwami. Nigdy ich nie testowałem ale zdają się być lepsze w praktyce i nie indukują tak zakłóceń jak zwykłe mechaniczne z cewką
 
Odpowiedź
  


Skocz do:


Przeglądający: 1 gości