Skocz do zawartości

Czujnik DHT 22 i millis() zamiast delay


Albert1972

Pomocna odpowiedź

Mam pytanie. Czy da się ustawić ten kod którym dyryguje delay

// Reading temperature or humidity takes about 250 milliseconds!
  // Sensor readings may also be up to 2 seconds 'old' (its a very slow sensor)
  float h = dht.readHumidity();
  float t = dht.readTemperature();
  // check if returns are valid, if they are NaN (not a number) then something went wrong!
  if (isnan(t) || isnan(h)) {
   Serial.println("Błędny odczyt czujnika DHT");
   } else {
    Serial.print("Wilgotność: "); 
    Serial.print(h);
    Serial.print(" %\t");
    Serial.print("Temperatura: "); 
    Serial.print(t);
    Serial.print(" *C ");
   
    delay(5000);  

Na kod którym taktuje  millis() ? Jeśli tak to jak?

Link do komentarza
Share on other sites

(edytowany)

Może opiszę to szerzej. Już przebrnąłem przez dwa przekaźniki sterowane trzecim na wejściu. Działa.  Teraz dodałem czujnik DHT22 i okazało się że potrzebuje 2 sekund na odświeżenie odczytu. Do tego doszły dwa  czujniki przepływu z których każdy potrzebuje 1000 ms.  Dojdzie jeszcze konduktometr wysyłający sygnał 4-20mA i czujnik ciśnienia. Na dziś nie mam pojęcia jak to ogarnąć i jakim cudem mój  PC robi milion rzeczy w ciągu chwili jeśli ja nie jestem w stanie tych kilku zmiennych  ogarnąć by się na wzajem nie blokowały w DELAY

Edytowano przez Albert1972
Link do komentarza
Share on other sites

ok, może powiem tak, kiedyś też ciężko bylo mi zrozumieć o co chodzi z tymi millisami:-), z uporem maniaka próbował wbić mi to do głowy @Elvis:

poczytaj, może to Ci pomoże zrozumieć o co chodzi.

Generalnie to łatwizna, jak stoper, kluczowe jest załapanie kiedy go włączyć i kiedy zresetować.... ale trzeba na początek zrozumieć ideę, że arduino może robic jedną rzecz na raz, ale że ten "raz" to bardzo mała część sekundy, to może się nam po ludzku wydawać, że robi kilka rzeczy jednocześnie. 

Prosto(?): każemy arduino, np. zapalić dwie diody, więc ono zapala, ale jednocześnie każemy mu na okrągło sprawdzać czy czy ta pierwsza dioda pali sie juz np. sekundę, a druga dwie sekundy, więc to arduino robi cały czas swoje, jednak za każdym obiegiem pętli sprawdza mijający czas. Jeśli tenże minął, robi co mu  napisaliśmy, np. wyłącza diodę i znowu, jeśli mu zrestartujemy czas stopera, za każdym obiegiem petli, sprawdza ile czasu upłynęło, by po upływie kolejnego ustawionego okresu znowu zareagować. 

Jeśli byłoby delay, to arduino zapaliło by diodę i czekało ustawiony czas, kompletnie nic nie robiąc, na wykonanie kolejnego ruchu.

Twój PC potrafi robić wiele rzeczy na raz, arduino tego nie potrafi, jednak dlatego, że robi wszystko bardzo szybko( w porownaniu do Twojego PC, slimaczo wolno), to potrafi w "miedzyczasie" sprawdzać mijający czas i na ten mijający czas, odpowiednio do napisanego programu, reagować....

  • Pomogłeś! 1
Link do komentarza
Share on other sites

Zarejestruj się lub zaloguj, aby ukryć tę reklamę.
Zarejestruj się lub zaloguj, aby ukryć tę reklamę.

jlcpcb.jpg

jlcpcb.jpg

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

Idea jednej dużej pętli i sprawdzania w niej czy coś już się wydarzyło (łącznie z upływem czasu lub wielu czasów) owszem, może był łatwizną, ale nie musi. Na pewno przełomem w myśleniu jest zrozumienie jak to się robi i wtedy z marszu wiele problemów znika. W ten sposób można prosto zrobić mruganie wieloma diodami, sterowanie kilkoma niezleżnymi serwami jadącymi równocześnie, szybkie reakcje na przyciski  czy nawet jakiś automat stanów związany z interfejsem I/O typu LCD. Generalnie prostych rzeczy można robić wiele na raz powielając prosty schemat. Jednak gdy korzystasz z obcych bibliotek robiących wewnątrz jakąś magię a na dodatek blokujących wykonywanie Twojego kodu, to już łatwizna się kończy. Nie wiem jak działa biblioteka której Albert1972 używa do komunikacji z DHT22, ale jeśli nawet w przykładzie piszą o kilkuset ms opóźnienia a on sam widzi, że program utyka mu tam na 2s, to to nie rokuje dobrze. Oczywiście w ogólności prawie wszystko da się zrobić tak, by procesor nie był tą czynnością zajęty na 100% i mógł robić ten przysłowiowy "milion rzeczy na raz", ale być może trzeba wniknąć głębiej i albo poszukać biblioteki napisanej lepiej, albo przeorganizować cały kod i napisać coś własnego. Przykład? Załóżmy, że:

  1. Czujniki nie powinny być czytane częściej niż co 2s
  2. Transmisja danych do/z czujnika zajmuje 200ms.

Pierwsze jest do spełnienia prosto, wystarczy zrobić własny timer i poprzez zliczanie upływu milisekund systemowych odpalać komunikację nie częściej niż raz na 2s. To faktycznie jets łatwizna (i znów: kiedy już się załapie ideę). No ale drugie? Jeśli nie chcesz, by Twoja wielka pętla skisła na 1/5 sekundy w obcej (ale gotowej i sprawdzonej!) funkcji bibliotecznej zawłaszaczającej cały procesor na ten czas, musisz niestety zajrzeć do opisu czujnika i zastanowić się czy można komunikację zrobić lepiej, np. w sposób nieblokujący. Jeśli jesteś dobry to od razu stwierdzisz: tak czy nie. Załóżmy, że tak. Piszesz wtedy własną obsługę komunikacji, ale skoro nie może to być blokujące, to musi wykonywac się "samo" - albo korzystać z timera systemowego albo z własnego timera i ew. przerwań od niego i/lub od pinów I/O lub innych peryferiów (np. SPI czy I2C). Załóżmy, że nawet i to pokonałeś i musisz teraz sprząc swoją główna pętlę z czymś co może wykonywać się tylko chwilę, nie dłużej. Interfejs od strony reszty programu zmieni się zatem diametralnie. Zamiast jednego prostego wywołania funkcji "Odczytaj temperaturę czy co tam innego czujnik mierzy" musisz:

  1. Zlecić start pomiaru/transmisjii i tym samym odpalić równoległy proces (wykonywany na timerze lub na przerwaniach I/O lub prawdopodobnie na tym i na tym).
  2. Poczekać na koniec komunikacji i gotowość nowych danych.
  3. Wczytać dane z zgromadzone już gdzieś w buforze.

A to wszystko w ciągle obracającej się dużej pętli głównej, która pewnie będzie wywoływać teraz jakąś funkcję typu "Nowy czujnik, zrób co trzeba" i w której musisz zawrzeć automat stanów kontrolujący kontekst, czyli co się z komunikacją dzieje oraz co i kiedy można robić.

Tak więc to nie jest tylko proste usunięcie opóźnień, ale zupełna zmiana sposobu myślenia oraz planowania i pisania oprogramowania. A tego już łatwizną bym nie nazwał. Czasem trzeba się naprawdę nakombinować by przy pomocy ograniczonej mocy obliczeniowej, małej pamięci RAM i słabych peryferiów bez wsparcia np. DMA zrobić ten "milion rzeczy na raz". Doświadczony programista embedded w 95% przypadków po krótkim namyśle i paru obliczeniach powie "to się da" lub "weźmy coś większego", no ale trzeba nim być... Tutaj ułatwiają życie gotowe systemy operacyjne dla małych procesorków, które oferują gotowe wzorce i wsparcie dla tego typu architektur oprogramowania, no ale jeśli nie znajdziesz tam gotowej komunikacji wg potrzebnego protokołu (a przykładowy DHT22 jest wystarczjąco dziwny by był rzadkością), to tak czy tak tę najniższą warstwę musisz napisać samemu. 

  • Lubię! 1
Link do komentarza
Share on other sites

Anonim

Nie tak dawno ktoś inny miał podobny "problem" ze sterowaniem serw. Pomógł mu taki kod:

class 
msDelay{
public: 
  inline void
  delay(unsigned long del){
    delay_cnt = del + millis();
  }
  inline bool 
  expire(void){
    if(delay_cnt > millis()) return false;
    else return true;   
  }
private:
  unsigned long delay_cnt;
};

czyli timers.h w skrócie. W jednym miejscu ustawiasz długość delaya funkcją delay(ms) w innym sprawdzasz czy czas upłynął np. if(t.expire()){...}

msDelay timer;
/*
.
jakiś kod
.
*/
timer.delay(5000);
/*
.
jakiś kod
.
*/
if(timer.expire()){
  //.
  //twój kod
  //.
  timer.delay(5000); // odnowienie delaya
}

Działa to z dokładnością zależną od częstotliwości sprawdzania.

U Ciebie może to wyglądać tak:

msDelay timer;
// Reading temperature or humidity takes about 250 milliseconds!
  // Sensor readings may also be up to 2 seconds 'old' (its a very slow sensor)
  float h = dht.readHumidity();
  float t = dht.readTemperature();
  // check if returns are valid, if they are NaN (not a number) then something went wrong!
if(timer.expire()){
  if (isnan(t) || isnan(h)) {
   Serial.println("Błędny odczyt czujnika DHT");
   } else {
    Serial.print("Wilgotność: "); 
    Serial.print(h);
    Serial.print(" %\t");
    Serial.print("Temperatura: "); 
    Serial.print(t);
    Serial.print(" *C ");
   
    timer.delay(5000);  

w czasie trwania delay program ominie blok if i będzie robił coś innego.

Edytowano przez Anonim
Link do komentarza
Share on other sites

No tak i natrafiłem na podstawowe braki w edukacji. Jak to wpisać? Tzn pierwsze okno myślę że do void setup() Ale pokazuje mi błąd kompilacji 

 

error: stray '357' in program

poza tym wyskakuje mi komunikat o braku deklaracji w scope.

Zakładam że to scope to to.

#include "DHT.h"
#define DHTPIN 6                                     // przypisany pin
#define DHTTYPE DHT22                                // typ czujnika DHT
DHT dht(DHTPIN, DHTTYPE);
const int RELAY1 = 7;                                   // Pin miernika poziomu cieczy - wejście 3
const int POMPA = 8;                                    // Pin pompy napełniającej - wyjście 4
const int POMPA2 = 9;                                   // Pin pompy mieszającej - wyjście 5
const int POMPA3 = 10;                                   // Pin pompy mineralizującej - wyjście 6
int stanRELAY1 = LOW;
int stanPOMPY = LOW;
int stanPOMPY1 = LOW;
int stanPOMPY2 = LOW;


//unsigned long pracaPOMPY = 60000;
//unsigned long pracaPOMPY2 = 60000;
unsigned long aktualnyCzas = 0;
unsigned long zapamietanyCzasPOMPY = 0;
unsigned long zapamietanyCzasPOMPY2 = 0; 
unsigned long opoznienie = 60000;

na razie jestem na takim działającym etapie.

#include "DHT.h"
#define DHTPIN 6                                     // przypisany pin
#define DHTTYPE DHT22                                // typ czujnika DHT
DHT dht(DHTPIN, DHTTYPE);
const int RELAY1 = 7;                                   // Pin miernika poziomu cieczy - wejście 3
const int POMPA = 8;                                    // Pin pompy napełniającej - wyjście 4
const int POMPA2 = 9;                                   // Pin pompy mieszającej - wyjście 5
const int POMPA3 = 10;                                   // Pin pompy mineralizującej - wyjście 6
int stanRELAY1 = LOW;
int stanPOMPY = LOW;
int stanPOMPY2 = LOW;
int stanPOMPY3 = LOW;


//unsigned long pracaPOMPY = 60000;
//unsigned long pracaPOMPY2 = 60000;
unsigned long aktualnyCzas = 0;
unsigned long zapamietanyCzasPOMPY = 0;
unsigned long zapamietanyCzasPOMPY2 = 0; 
unsigned long opoznienie = 60000;


void setup() {
 //otwarcie portu i ustawienie prędkości na 9600 bodów
  Serial.begin(9600);
  //dopóki serial monitor nie jest otwarty NIE rób nic
  //while (!Serial) ;
  // Testuj czujnik DHT 22 (Ciągnie z biblioteki)
  Serial.println("DHTxx test!");
  dht.begin();
    pinMode(RELAY1, INPUT_PULLUP);
    pinMode(POMPA, OUTPUT);
    pinMode(POMPA2, OUTPUT);
    pinMode(POMPA3, OUTPUT);
    
}

void loop() {
       unsigned long aktualnyCzas = millis();                            //Pobierz liczbe milisekund od startu
       stanRELAY1 = digitalRead(RELAY1);                   // Odczyt stanu przekaźnika miernika poziomu cieczy:
       if (stanRELAY1 == LOW) {                           // Sprawdź czy przekaźnik poziomu cieczy jest zwarty. Jeśli tak zbiornik nie jest pełny, więc ustaw stanRELAY1 na HIGH:
       
    digitalWrite(POMPA, stanPOMPY);
    digitalWrite(POMPA2, !stanPOMPY);
 
  if (aktualnyCzas - zapamietanyCzasPOMPY > opoznienie) {
 
    zapamietanyCzasPOMPY = aktualnyCzas;
    if (stanPOMPY  == LOW)
      stanPOMPY  = HIGH;
    else
      stanPOMPY  = LOW;
   
  
  }
}else{
   digitalWrite(POMPA, HIGH);
    digitalWrite(POMPA2, HIGH);
}
 if(stanRELAY1){
       Serial.print("Zbiornik pełny");
       } else {Serial.print("Napełnianie");
       }
       
        Serial.println("");
  // Reading temperature or humidity takes about 250 milliseconds!
  // Sensor readings may also be up to 2 seconds 'old' (its a very slow sensor)
  float h = dht.readHumidity();
  float t = dht.readTemperature();
  // check if returns are valid, if they are NaN (not a number) then something went wrong!
  if (isnan(t) || isnan(h)) {
   Serial.println("Błędny odczyt czujnika DHT");
   } else {
    Serial.print("Wilgotność: "); 
    Serial.print(h);
    Serial.print(" %\t");
    Serial.print("Temperatura: "); 
    Serial.print(t);
    Serial.print(" *C ");
   
          
    }
    delay(5000);
 }
 

Gdyby ktoś pokazał mi jakie zmiany wprowadzić by ten timer działał - byłbym wdzięczny. Pewnie zresztą nie tylko ja.

Link do komentarza
Share on other sites

@Albert1972 zrób jak napisałem wcześniej, wywal naradzie wszystkie dodatkowe rzeczy jak DHT, kolejne pompy etc. i zrób ten działający stoper na jednej pompie/diodzie, jeśli to już nie problem dla Ciebie, to zrób na dwóch diodach migających z różnym interwałem... 

Link do komentarza
Share on other sites

Anonim

SOYER ma rację, popróbuj z minimum kodu. Możesz to wpisać nawet tak:

#include "DHT.h"

class 
msDelay{
public: 
  inline void
  delay(unsigned long del){
    delay_cnt = del + millis();
  }
  inline bool 
  expire(void){
    if(delay_cnt > millis()) return false;
    else return true;   
  }
private:
  unsigned long delay_cnt;
};

#define DHTPIN 6                                     // przypisany pin
#define DHTTYPE DHT22                                // typ czujnika DHT
DHT dht(DHTPIN, DHTTYPE);
const int RELAY1 = 7;                                   // Pin miernika poziomu cieczy - wejście 3
const int POMPA = 8;                                    // Pin pompy napełniającej - wyjście 4
const int POMPA2 = 9;                                   // Pin pompy mieszającej - wyjście 5
const int POMPA3 = 10;                                   // Pin pompy mineralizującej - wyjście 6
int stanRELAY1 = LOW;
int stanPOMPY = LOW;
int stanPOMPY2 = LOW;
int stanPOMPY3 = LOW;

float h;
float t;


//unsigned long pracaPOMPY = 60000;
//unsigned long pracaPOMPY2 = 60000;
//unsigned long aktualnyCzas = 0;
//unsigned long zapamietanyCzasPOMPY = 0;
//unsigned long zapamietanyCzasPOMPY2 = 0; 
unsigned long opoznienie = 60000;


void setup() {
 //otwarcie portu i ustawienie prędkości na 9600 bodów
  Serial.begin(9600);
//dopóki serial monitor nie jest otwarty NIE rób nic
 //while (!Serial) ;
// Testuj czujnik DHT 22 (Ciągnie z biblioteki)

  Serial.println("DHTxx test!");
  dht.begin();

  pinMode(RELAY1, INPUT_PULLUP);
  pinMode(POMPA, OUTPUT);
  pinMode(POMPA2, OUTPUT);
  pinMode(POMPA3, OUTPUT);

   
    
}

msDelay CzasPOMPY, odczytDHT;  // utworzenie obiektów delay
CzasPOMPY.delay(opoznienie);  // wstępna inicjalizacja delay
odczytDHT.delay(5000);

void loop() {
//    unsigned long aktualnyCzas = millis();            // Pobierz liczbe milisekund od startu
    
    stanRELAY1 = digitalRead(RELAY1);                   // Odczyt stanu przekaźnika miernika poziomu cieczy:
    if (stanRELAY1 == LOW) {                            // Sprawdź czy przekaźnik poziomu cieczy jest zwarty. 
                                                        // Jeśli tak  zbiornik nie jest pełny, więc ustaw stanRELAY1 na HIGH:
            digitalWrite(POMPA, stanPOMPY);
            digitalWrite(POMPA2, !stanPOMPY);           // <- (?)   
                                 
            
        if(CzasPOMPY.expire()) {
            // Nie wchodzi tu wczale przed upływem zadanego czasu

            //zapamietanyCzasPOMPY = aktualnyCzas;
            if (stanPOMPY  == LOW) stanPOMPY  = HIGH;
            else stanPOMPY  = LOW;

            Serial.print("Napełnianie");

            CzasPOMPY.delay(opoznienie); // odnowienie delaya na kolejny cykl
        }
    }else{

        digitalWrite(POMPA, HIGH);
        digitalWrite(POMPA2, HIGH);
        Serial.print("Zbiornik pełny");
    }

   // if(stanRELAY1) Serial.print("Zbiornik pełny");    
   // else Serial.print("Napełnianie");

    if(odczytDHT.expire()){  
        // Nie wchodzi tu wczale przed upływem zadanego czasu

        Serial.println("");
// Reading temperature or humidity takes about 250 milliseconds!
// Sensor readings may also be up to 2 seconds 'old' (its a very slow sensor)

        h = dht.readHumidity();    
        t = dht.readTemperature();
// check if returns are valid, if they are NaN (not a number) then something went wrong!

        if (isnan(t) || isnan(h)){ 
            Serial.println("Błędny odczyt czujnika DHT");
            odczytDHT.delay(500); // sprawdź za pół sekundy
        else{

            Serial.print("Wilgotność: "); 
            Serial.print(h);
            Serial.print(" %\t");
            Serial.print("Temperatura: "); 
            Serial.print(t);
            Serial.print(" *C ");
            
            odczytDHT.delay(5000);  // odnowienie opóźnienia
        }

   }
    
}
 

Posprawdzaj czy nie ma błędów logicznych, nie wiem jak ma to finalnie działać w każdym szczególe.

Link do komentarza
Share on other sites

już się za to biorę - dzięki

 

przy kompilacji wyrzuciło mi takie błędy

Cytat

Arduino:1.8.9 (Windows 10), Płytka:"Arduino Yún"

 

sketch_may30a:63:1: error: 'CzasPOMPY' does not name a type

 

 CzasPOMPY.delay(opoznienie);  // wstępna inicjalizacja delay

 

 ^

 

sketch_may30a:64:1: error: 'odczytDHT' does not name a type

 

 odczytDHT.delay(5000);

 

 ^

 

C:\Users\marek\AppData\Local\Temp\arduino_modified_sketch_115850\sketch_may30a.ino: In function 'void loop()':

 

sketch_may30a:111:9: error: expected '}' before 'else'

 

         else{

 

         ^

 

exit status 1

'CzasPOMPY' does not name a type

 

Link do komentarza
Share on other sites

Anonim

Musiałem odkurzyć arduino IDE. Mój błąd, powinno być tak 😜

#include <DHT.h>

class 
msDelay{
public: 
  inline void
  delay(unsigned long del){
    this->delay_cnt = del + millis();
  }
  inline bool 
  expire(void){
    if(this->delay_cnt > millis()) return false;
    else return true;   
  }
private:
  unsigned long delay_cnt;
};



#define DHTPIN 6                                     // przypisany pin
#define DHTTYPE DHT22                                // typ czujnika DHT
DHT dht(DHTPIN, DHTTYPE);
const int RELAY1 = 7;                                   // Pin miernika poziomu cieczy - wejście 3
const int POMPA = 8;                                    // Pin pompy napełniającej - wyjście 4
const int POMPA2 = 9;                                   // Pin pompy mieszającej - wyjście 5
const int POMPA3 = 10;                                   // Pin pompy mineralizującej - wyjście 6
int stanRELAY1 = LOW;
int stanPOMPY = LOW;
int stanPOMPY2 = LOW;
int stanPOMPY3 = LOW;

float h;
float t;


//unsigned long pracaPOMPY = 60000;
//unsigned long pracaPOMPY2 = 60000;
//unsigned long aktualnyCzas = 0;
//unsigned long zapamietanyCzasPOMPY = 0;
//unsigned long zapamietanyCzasPOMPY2 = 0; 
unsigned long opoznienie = 60000;


msDelay CzasPOMPY;
msDelay odczytDHT;  // utworzenie obiektów delay



void setup() {
 //otwarcie portu i ustawienie prędkości na 9600 bodów
  Serial.begin(9600);
//dopóki serial monitor nie jest otwarty NIE rób nic
 //while (!Serial) ;
// Testuj czujnik DHT 22 (Ciągnie z biblioteki)

  Serial.println("DHTxx test!");
  dht.begin();

  pinMode(RELAY1, INPUT_PULLUP);
  pinMode(POMPA, OUTPUT);
  pinMode(POMPA2, OUTPUT);
  pinMode(POMPA3, OUTPUT);

  CzasPOMPY.delay(opoznienie);  // wstępna inicjalizacja delay
  odczytDHT.delay(5000);
}



void loop() {
//    unsigned long aktualnyCzas = millis();            // Pobierz liczbe milisekund od startu



    
    stanRELAY1 = digitalRead(RELAY1);                   // Odczyt stanu przekaźnika miernika poziomu cieczy:
    if (stanRELAY1 == LOW) {                            // Sprawdź czy przekaźnik poziomu cieczy jest zwarty. 
                                                        // Jeśli tak  zbiornik nie jest pełny, więc ustaw stanRELAY1 na HIGH:
            digitalWrite(POMPA, stanPOMPY);
            digitalWrite(POMPA2, !stanPOMPY);           // <- (?)   
                                 
            
        if(CzasPOMPY.expire()) {
            // Nie wchodzi tu wczale przed upływem zadanego czasu

            //zapamietanyCzasPOMPY = aktualnyCzas;
            if (stanPOMPY  == LOW) stanPOMPY  = HIGH;
            else stanPOMPY  = LOW;

            Serial.print("Napełnianie");

            CzasPOMPY.delay(opoznienie); // odnowienie delaya na kolejny cykl
        }
    }else{

        digitalWrite(POMPA, HIGH);
        digitalWrite(POMPA2, HIGH);
        Serial.print("Zbiornik pełny");
    }

   // if(stanRELAY1) Serial.print("Zbiornik pełny");    
   // else Serial.print("Napełnianie");

    if(odczytDHT.expire()){  
        // Nie wchodzi tu wczale przed upływem zadanego czasu

        Serial.println("");
// Reading temperature or humidity takes about 250 milliseconds!
// Sensor readings may also be up to 2 seconds 'old' (its a very slow sensor)

        h = dht.readHumidity();    
        t = dht.readTemperature();
// check if returns are valid, if they are NaN (not a number) then something went wrong!

        if (isnan(t) || isnan(h)){ 
            Serial.println("Błędny odczyt czujnika DHT");
            odczytDHT.delay(500); // sprawdź za pół sekundy
        }else{

            Serial.print("Wilgotność: "); 
            Serial.print(h);
            Serial.print(" %\t");
            Serial.print("Temperatura: "); 
            Serial.print(t);
            Serial.print(" *C ");
            
            odczytDHT.delay(5000);  // odnowienie opóźnienia
        }

   }
    
}

 



Szkic używa 5728 bajtów (17%) pamięci programu. Maksimum to 32256 bajtów.
Zmienne globalne używają 345 bajtów (16%) pamięci dynamicznej, pozostawiając 1703 bajtów dla zmiennych lokalnych. Maksimum to 2048 bajtów.

 

Link do komentarza
Share on other sites

Kompilacja przeszła już wgrane. Podpinam czujniki i testuje

 

Działa prawie dobrze. Logicznie jest kilka błędów choć drobnych. W czasie  kiedy  monitor PR wysyła napis  "Zbiornik pełny" jest on w takiej formie

14:17:16.769 -> Zbiornik pełnyZbiornik pełnyZbiornik pełnyZbiornik pełnyZbio

i tak w nieskończoność


Pewnie dlatego nie pokazuje odczytu temperatury i wilgotności.

W czasie napełniania jest idealnie

14:17:16.769 -> Wilgotność: 85.00 %    Temperatura: 22.40 *C 
14:17:46.738 -> Wilgotność: 87.70 %    Temperatura: 21.90 *C Napełnianie
14:18:16.784 -> Wilgotność: 90.80 %    Temperatura: 22.30 *C 
14:18:46.794 -> Wilgotność: 91.10 %    Temperatura: 21.80 *C Napełnianie
14:19:16.776 -> Wilgotność: 92.00 %    Temperatura: 22.00 *C 
14:19:46.784 -> Wilgotność: 91.30 %    Temperatura: 22.00 *C Napełnianie
14:20:16.781 -> Wilgotność: 90.10 %    Temperatura: 21.70 *C 
14:20:46.787 -> Wilgotność: 87.70 %    Temperatura: 20.60 *C Napełnianie
14:21:16.803 -> Wilgotność: 88.20 %    Temperatura: 22.30 *C 
14:21:46.816 -> Wilgotność: 88.80 %    Temperatura: 22.40 *C Napełnianie
14:22:16.817 -> Wilgotność: 90.30 %    Temperatura: 22.40 *C 
14:22:46.842 -> Wilgotność: 86.40 %    Temperatura: 21.90 *C 

Przestawiłem czas pomiaru na pół minuty

Zdaje się że tu jest problem


            //zapamietanyCzasPOMPY = aktualnyCzas;
            if (stanPOMPY  == LOW) stanPOMPY  = HIGH;
            else stanPOMPY  = LOW;

            Serial.print("Napełnianie");

            CzasPOMPY.delay(opoznienie); // odnowienie delaya na kolejny cykl
        }
    }else{

        digitalWrite(POMPA, HIGH);
        digitalWrite(POMPA2, HIGH);
         Serial.print("Zbiornik pełny");
    }

   // if(stanRELAY1) Serial.print("Zbiornik pełny");    
   // else Serial.print("Napełnianie");

Napełnianie jest objęte timerem a  Zbiornik pełny nie

 

Dzięki wielkie za pomoc teraz mogę nauczyć się jak to działa na bazie Twojego kodu!`

Link do komentarza
Share on other sites

Anonim
float h;
float t;
bool state;
// stanRELAY1 = digitalRead(RELAY1);                   // Odczyt stanu przekaźnika miernika poziomu cieczy:
    if(!digitalRead(RELAY1)) {                            // Sprawdź czy przekaźnik poziomu cieczy jest zwarty. 
        state = true;                                                    // Jeśli tak  zbiornik nie jest pełny, więc ustaw stanRELAY1 na HIGH:
        digitalWrite(POMPA, stanPOMPY);
        digitalWrite(POMPA2, !stanPOMPY);           // <- (?)   
                                 
            
      if(CzasPOMPY.expire()) {
        // Nie wchodzi tu wczale przed upływem zadanego czasu

        //zapamietanyCzasPOMPY = aktualnyCzas;
        if (stanPOMPY  == LOW) stanPOMPY  = HIGH;
        else stanPOMPY  = LOW;

        Serial.print("Napełnianie");

        CzasPOMPY.delay(opoznienie); // odnowienie delaya na kolejny cykl
            
        }
    }else{
        if(state){
          digitalWrite(POMPA, HIGH);
          digitalWrite(POMPA2, HIGH);
          Serial.print("Zbiornik pełny");
          state = false;
        }
    }

 

Pół minuty może być za mało.  Ale jeśli wystarczy to zmniejsz też

        if (isnan(t) || isnan(h)){ 
            Serial.println("Błędny odczyt czujnika DHT");
            odczytDHT.delay(100); // sprawdź za pół sekundy
        }else{

inaczej będzie bez sensu.

Edytowano przez Anonim
tak lepiej
Link do komentarza
Share on other sites

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!

Anonim
Dołącz do dyskusji! Kliknij i zacznij pisać...

×   Wklejony jako tekst z formatowaniem.   Przywróć formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Twój link będzie automatycznie osadzony.   Wyświetlać jako link

×   Twoja poprzednia zawartość została przywrócona.   Wyczyść edytor

×   Nie możesz wkleić zdjęć bezpośrednio. Prześlij lub wstaw obrazy z adresu URL.

×
×
  • Utwórz nowe...

Ważne informacje

Ta strona używa ciasteczek (cookies), dzięki którym może działać lepiej. Więcej na ten temat znajdziesz w Polityce Prywatności.