Jak dodać strefę histerezy do bieżącego kodu?

0

Witam. Posiadam takowy kod , jak widać jest uwzględniona w nim strefa nieczułości wynosząca 2%. Czyli przykładowo wilgotność zadana jest ustawiona na 50% więc strefą nieczułości będzie zakres od 49 do 51 %. Jednak moim pytaniem jest jak dodać strefę histerezy do tego kodu? W jaki sposób trzeba to napisać?
Kod jest następujący :

if(wartosc>(WILG+2)) { 
digitalWrite(relay_pin3, HIGH);  
digitalWrite(relay_pin4, HIGH);  
.
.
.
}
else if(wartosc<(WILG-2)){ 
digitalWrite(relay_pin2, HIGH); 
digitalWrite(relay_pin3, LOW); 
.
.
.
}
else { 
digitalWrite(relay_pin, HIGH);
.
.
.
}

Ogólny schemat regulacji jest następujący :
title
gdzie właśnie N to strefa nieczułości , a H strefa histerezy nad którą zastanawiam się w jaki sposób ją dodać do kodu - czy jest to w ogóle możliwe do wykonania?
Z góry dziękuje za zainteresowanie :)

0

Jest taki problem iż kod podesłany przez Ciebie jest napisany na konkretną wartość a w moim przypadku wartość ta nie jest konkretna bo ulega zmianie wraz z kręceniem potencjometrem - wartość zadana jest różna, nie stała.

Ktoś wie może jak rozwiązać ten problem? :)

2
avabuy napisał(a):

Czyli przykładowo wilgotność zadana jest ustawiona na 50% więc strefą nieczułości będzie zakres od 49 do 51 %.

Twój kod mówi coś innego. ;)

if(wartosc>(WILG+2)) { 
  // ..
else if(wartosc<(WILG-2)){ 
  // ..

Jeśli WILG ma wartość 50, to pierwszy warunek zostanie spełniony gdy wartosc wyniesie co najmniej 53, a drugi gdy wyniesie co najwyżej 47. Tak więc Twoja strefa nieczułości wynosi dokładnie 4, a nie 2.

Ten przypadek można naprawić zmieniając operator < na <= oraz > na >=, ale przy innym zakresie nieczułości też będzie kłamał. Dlatego rozmiar strefy nieczułości powinieneś podzielić na 2, wynik odjąć od/dodać do WILG i skorzystać z operatorów < i >. Ale to tak nawiasem.

Z czym konkretnie masz problem, jeśli o histerezę chodzi?

0

To znaczy strefa nieczułości wynosi 4% racja bo wyłączają się urządzenia gdy jest 48 badz 52%. Problem w tym leży , że jak przerobić kod aby była i strefa nieczułości ale również histereza? Tak jak to jest ukazane na tym obrazie co wstawiłem w pierwszym poście. Czy jest to w ogóle możliwe?
PS. Czyli uważasz że obecne warunki są źle napisane ? Bo wcześniej miały one inną składnie lecz coś nie działało jak należy. Według Ciebie jak najlepiej powinny zostać napisane te warunki? ;)

0

Warunki są dobre, jeśli chciałeś mieć strefę nieczułości wynoszącą 4% – w przeciwnym razie trzeba zmienić nagłówki, bo dwukrotnie zwiększają zakres. O ile w ogóle potrzebujesz tej strefy – coś mi się wydaje, że nie jest ona potrzebna, a że dodałeś ją w zastępstwie histerezy. Zgadza się? ;)

0

Tzn strefa nieczułości jest potrzebna bo ona jest niezbędna w przypadku regulatorów trójpołożeniowych ;) chciałem jeszcze do tego kodu dodać histereze według obrazka z pierwszego postu lecz tak sie zastanawiam - w tym przypadku strefa nieczułości jest jakby równoznaczna z histereza- nie wiem czy dobrze to rozumuje? ;) bo jeśli tak to histerezy się nie doda do obecnego kodu chyba ;)

2
avabuy napisał(a):

Tzn strefa nieczułości jest potrzebna bo ona jest niezbędna w przypadku regulatorów trójpołożeniowych ;)

Ok, ok. ;)

chciałem jeszcze do tego kodu dodać histereze według obrazka z pierwszego postu lecz tak sie zastanawiam - w tym przypadku strefa nieczułości jest jakby równoznaczna z histereza- nie wiem czy dobrze to rozumuje?

IMO z tego obrazka wynika, że w pewnym sensie tak – była by to strefa nieczułości na zmianę stanu.

Może inaczej, mamy trzy bazowe zakresy – A, jeśli wartość jest mniejsza od strefy nieczułości; B, jeśli znajduje się w strefie niczułości i C, jeśli jest większa od maksimum strefy nieczułości. Dodatkowo, wyznaczmy dwa zakresy X, gdy wartość znajduje się w okolicach histerezy. Zilustrujmy to prostym rysunkiem:

zakresy.png

Teraz jeśli bieżący stan to A i kolejne wartości pomiaru zawierają się w zbiorze A, to stan się nie zmienia. Wartości pomiarów rosną i zaczynają pasować do zbioru X. Dopóki kolejne pomiary znajdują się w zbiorze X to stan pozostaje bez zmian. Jeśli kolejna wartość pomiaru wykroczy poza zbiór X i będzie pasować do B to wtedy zmieniamy stan z A na stan B.

Analogicznie w sytuacji odwrotnej. Mamy stan B, wartości pomiarów maleją i zaczynają pasować do zbioru X – nie zmieniamy jeszcze stanu. Dopiero kiedy kolejny pomiar da wartość ze zbioru A to zmieniamy stan z B na A. I analogicznie dla przejścia ze stanu B do stanu C i z C do B.

Aby móc obsłużyć histerezę, musisz po prostu nie reagować na wartości dla obu zakresów X.

0

Hmmm rozumiem, dziękuje za naprawdę jasne wytłumaczenie - tylko nie wiem jak to wyjdzie w praktyce jeżeli chodzi o przekaźnik itd ;) czy mógłbyś mi pomóc napisać taki kod? Bo szczerze powiedziawszy sam sobie nie poradzę ;)

3

Nie jestem specem od systemów embedded, ani też od elektroniki, ale Twój program w działaniu przypomina mi sterownik do pompy przeznaczonej do kotła CO, z którym zaprzyjaźniam się każdej jesieni. Tyle że ten obsługuje dwa stany – włącza pompę gdy temperatura wody w kotle osiągnie 40°C, a wyłącza się gdy spadnie do 35°C. Zakres tych 5°C pozwala uniknąć ciągłego włączania i wyłączania pompy w okolicach 40°C, a tym samym utknięcia w martwym punkcie (ni grzeje, ni stygnie). Twój program natomisat przewiduje dwa takie zakresy, bo obsługuje trzy stany zamiast dwóch.


No dobrze, moja propozycja niżej. Żeby łatwiej było manipulować rozmiarami zakresów, kilka stałych na początek:

const int humidity = 50;

const int size_range_x = 2;
const int size_range_b = 2;

const int state_x_left_min = humidity - size_range_b - size_range_x;
const int state_x_left_max = humidity - size_range_b;

const int state_x_right_min = humidity + size_range_b;
const int state_x_right_max = munidity + size_range_b + size_range_x;

const int state_x = 0;
const int state_a = 1;
const int state_b = 2;
const int state_c = 3;

Przyda się też zmienna przechowująca indeks bieżącego stanu (domyślnie stan a):

int state = state_a;

Teraz funkcja pobierająca bieżącą wartość z czujnika:

int getCurrentState()
{
  int value = // tu pobierz bieżącą wartość czujnika i ją zmapuj
  
  if (value >= state_x_left_min  && value <= state_x_left_max)  return state_x;
  if (value >= state_x_right_min && value <= state_x_right_max) return state_x;
  
  if (value < state_x_left_min)  return state_a;
  if (value > state_x_right_max) return state_c;
  
  return state_b;
}

Zwraca jedną z czterech wartości – od state_x do state_c. Przydadzą się jeszcze trzy funkcje służące do włączenia konkretnego stanu:

void setStateA()
{
  if (state == state_a) return;
  
  // tu wywołaj odpowiednie "digitalWrite" dla stanu A
}

void setStateB()
{
  if (state == state_b) return;
  
  // tu wywołaj odpowiednie "digitalWrite" dla stanu B
}

void setStateC()
{
  if (state == state_c) return;
  
  // tu wywołaj odpowiednie "digitalWrite" dla stanu C
}

I ostatnia część kodu, czyli główny walidator:

int newState = getCurrentState();

switch (newState)
{
  case state_a: setStateA(); break;
  case state_b: setStateB(); break;
  case state_c: setStateC(); break;
}

Najpierw do zmiennej newState pobierany jest nowy stan za pomocą getCurrentState. Jeśli getCurrentState zwróci state_x to nic się nie dzieje – żadna operacja nie jest wykonywana. Natomiast jeśli zwróci stan od state_a do state_c, to odpalana jest odpowiednia funkcja setState*. Warunki w tych funkcjach powodują, że funkcje te są idempotentne – nie robią nic, jeśli nowy stan jest taki sam jak wcześniejszy.

Tak więc program będzie pomijał aktualizację stanu, jeśli bieżąca wartość po zmapowaniu znajdzie się w zakresie [46 .. 48] lub od [52 .. 54]. Jeśli wartość będzie mniejsza od 46 to ustawi stan A, jeśli większa od 54 to stan C, a jeśli wartość znajdzie się w przedziale [49 .. 51] to ustawi stan B.

Mam nadzieję, że kod jest składniowo poprawny – nie testowałem go. ;)


Jedno trzeba wyjaśnić – stała size_range_b określaja połowę rozmiaru zakresu dla stanu B, a stała size_range_x określa pełny rozmiar zakresu wartości histerezy. Dlatego pierwsze cztery instrukcje warunkowe w funkcji getCurrentState wyglądają tak a nie inaczej. Jeśli w stałej state_range_b chciałbyś przechowywać pełen rozmiar zakresu stanu B, to musiałbyś zmienić warunki w getCurrentState.

Poniższy obrazek ilustruje znaczenie poszczegółnych stałych:

constants.png

0

Hmmm powiem szczerze że kod dosyć skomplikowany jak dla mnie ale dam rade ;) takie pytanie mam - czyli wilgotność początkową należy przyjąć odgórnie w zmiennej? Bez przyjęcia się inaczej tego nie zrobi? ;)

0

Kod nie jest skomplikowany – stałe oraz dodatkowe funkcje stworzyłem tylko dla ułatwienia obliczeń i wprowadzania modyfikacji, a także do zwiększenia uniwersalizmu i czytelności. Równie dobrze możesz z nich nie korzystać i wszystko napisać w funkcji loop bezpośrednio. Ale to będzie rozwiązanie mniej czytelne od zasugerowanego i czasochłonne w modyfikacji (jeśli zajdzie taka potrzeba).

Sam przyjąłem stałą wartość wilgotności dla środka zakresu stanu B – równie dobrze możesz ją wymienić na zmienną i jej wartość też modyfikować (np. odczytując i mapując wskazanie potencjometru). Wszystko zależy od wymagań.

Jak czegoś nie rozumiesz to pytaj – byle precyzyjnie, żebym nie musiał zgadywać.

0

Hmm bo tutaj jest kod odpowiadający za potencjometr- oblicza średnią 5 pomiarów ( w celu zapobiegnięcia wahań potencjometru) i wyświetla wilgotność zadaną:

dane[i] = analogRead(A0);
 wartosc = map(dane[i], 0, 1023, 0, 100);
 
  i = (i + 1) % 5;
  srednia = 0;
 
  for(int j = 0; j < 5; j++)
    srednia += dane[j];
 
  srednia /= 5.0;

const int humidity = 50; - hmm czyli jak miało by to wyglądać? :D Pogubiłem się :D

1

Zamiast humidity używasz zmiennej srednia, skoro na podstawie tej średniej chcesz podejmować akcję.

Przy czym jeśli zadana wilgotność ma być ustalana za pomocą potencjometru, to cała kupka stałych nie będzie już potrzebna, a warunki w funkcji getCurrentState trzeba będzie zmienić. Szkoda że nie wiedziałem o tym wcześniej.

0

Hmm przepraszam bardzo że tego nie powiedziałem - ogólnie cały kod obecny wygląda następująco :

#include "DHT.h"                          // Biblioteka czujnika DHT 22
#include "U8glib.h"                       // Bibioteka OLED I2C

U8GLIB_SSD1306_128X64 u8g(U8G_I2C_OPT_NONE|U8G_I2C_OPT_DEV_0);  // I2C(TWI)  

#define DHTPIN 2                          // Definicja PINu sygnałowego 
#define DHTTYPE DHT22                     // Wybór typu czujnika : DHT 22
DHT dht(DHTPIN, DHTTYPE, 6);                  // Definicja czujnika
char str[10];                         // znak stopni celsujsza i procent
int WILG;                           // Zmienna wilgotność
float TEMP;  // Zmienna temperatura 

unsigned long aktualnyCzas = 0; // do millis
unsigned long zapamietanyCzas = 0;  // do millis


int relay_pin = 8;                // przekaznik
int relay_pin2 = 12;              // przekaznik
int relay_pin3 = 7;                // przekaznik
int relay_pin4 = 9;
#define led_info_promiennik 4         // dioda od promiennika
#define led_info_generator 13      // dioda od generatora pary
#define led_info_nic 1



int potencjometr = A0;                // Odczyt napiecia z potencjometru pinem analogowym 0
int wartosc = 0;                       // Zmienna przechowujaca wartość napięcia odczytanego
int dane[5]; // Uśrednienie odczytu wartości z potencjometru 
int i=0;  // Uśrednienie odczytu wartości z potencjometru
int srednia;  // Uśrednienie odczytu wartości z potencjometru
void setup()
{
  dht.begin();                          // inicjalizacja DHT
pinMode(potencjometr, INPUT); //pin A0 (pot) jako wejście
pinMode(relay_pin, OUTPUT);
pinMode(relay_pin2, OUTPUT); // Ustawienie PINu jako wyjście
pinMode(relay_pin3, OUTPUT); // Ustawienie PINu jako wyjście
pinMode(relay_pin4, OUTPUT);
digitalWrite(relay_pin, HIGH);
digitalWrite(relay_pin2, HIGH);
digitalWrite(relay_pin3, HIGH);
digitalWrite(relay_pin4, HIGH);
pinMode(led_info_promiennik, OUTPUT);
pinMode(led_info_generator, OUTPUT);
pinMode(led_info_nic, OUTPUT);

}

void draw(void){
 u8g.firstPage();    // Rozpoczęcie pętli obrazu          
 do {
 u8g.setFont(u8g_font_helvB08);               // Wybór czcionki 
 u8g.drawStr( 2, 27, "Zmniejszanie wilgotnosci!");  // Definicja pozycji na ekranie oraz wyświetlanie tekstu            
                     
 
 u8g.drawStr( 2, 42, "Wilgotnosc :");            
 u8g.drawStr( 80, 42, dtostrf(WILG, 5, 2, str));
 u8g.drawStr( 110, 42, "%");

 u8g.drawStr( 2, 57, "Wilg. zad.:");            
 u8g.drawStr( 80, 57, dtostrf(wartosc, 5, 2, str));
 u8g.drawStr( 110, 57, "%");
 } while( u8g.nextPage() );                       // Zakończenie pętli obrazu
 
}
void draw2(void){
 u8g.firstPage();              
 do {
 u8g.setFont(u8g_font_helvB08);               // czcionka
 u8g.drawStr( 2, 27, "Zwiekszanie wilgotnosci!");             
                     
 
 u8g.drawStr( 2, 42, "Wilgotnosc :");            
 u8g.drawStr( 80, 42, dtostrf(WILG, 5, 2, str));
 u8g.drawStr( 110, 42, "%");

 u8g.drawStr( 2, 57, "Wilg. zad.:");            
 u8g.drawStr( 80, 57, dtostrf(wartosc, 5, 2, str));
 u8g.drawStr( 110, 57, "%");
 } while( u8g.nextPage() );                       // koniec petli obrazu

}
void draw3(void){
 u8g.firstPage();              
 do {
 u8g.setFont(u8g_font_helvB08);               // czcionka
 u8g.drawStr( 2, 27, "Strefa Nieczulosci");             
                     
 
 u8g.drawStr( 2, 42, "Wilgotnosc :");            
 u8g.drawStr( 80, 42, dtostrf(WILG, 5, 2, str));
 u8g.drawStr( 110, 42, "%");

 u8g.drawStr( 2, 57, "Wilg. zad.:");            
 u8g.drawStr( 80, 57, dtostrf(wartosc, 5, 2, str));
 u8g.drawStr( 110, 57, "%");
 } while( u8g.nextPage() );                       // koniec petli obrazu

}
 void loop() {
aktualnyCzas = millis();

if (aktualnyCzas - zapamietanyCzas >= 50UL) {
    //Zapamietaj aktualny czas
    zapamietanyCzas = aktualnyCzas;
 }
                      
 WILG = dht.readHumidity();                     // Funkcja odczytująca aktualną wartość wilgotności
 TEMP = dht.readTemperature();                  // Funkcja odczytująca aktualną wartość temperatury
 
 dane[i] = analogRead(A0);
 wartosc = map(dane[i], 0, 1023, 0, 100);
 
  i = (i + 1) % 5;
  srednia = 0;
 
  for(int j = 0; j < 5; j++)
    srednia += dane[j];
 
  srednia /= 5.0;


 
 // PETLA OD WARUNKOW 
if(wartosc>(WILG+2)) {
 u8g.firstPage();
  do {
    draw2();
  } while (u8g.nextPage() ); 
digitalWrite(relay_pin3, HIGH);  // Wyłączenie wentylatora
digitalWrite(relay_pin4, HIGH);  // Wyłączenie wentylatora
digitalWrite(relay_pin, HIGH);  // Wyłączenie generatora pary 
digitalWrite(relay_pin2, LOW); // Włączenie promiennika podczerwieni
digitalWrite(led_info_promiennik, HIGH); // Włączenie diody od promiennika podczerwieni
digitalWrite(led_info_generator, LOW); // Wyłączenie diody od generatora pary
digitalWrite(led_info_nic, LOW); // Wyłączenie diody od Strefy Nieczułosci(Strefy Histerezy)
}
else if(wartosc<(WILG-2)){ 
  do {
    draw();
  } while (u8g.nextPage() ); 
digitalWrite(relay_pin2, HIGH); //Wyłączenie promiennika podczerwieni
digitalWrite(relay_pin3, LOW); // Włączenie wentylatora
digitalWrite(relay_pin4, LOW);  //Włączenie wentylatora
digitalWrite(relay_pin, LOW);  // Włączenie generatora pary  
digitalWrite(led_info_generator, HIGH); //Włączenie diody od generatora pary
digitalWrite(led_info_promiennik, LOW); //Wyłączenie diody od promiennika podczerwieni
digitalWrite(led_info_nic, LOW); // Wyłączenie diody od Strefy Nieczułosci(Strefy Histerezy)
}
else { 
 u8g.firstPage();
  do {
    draw3();
  } while (u8g.nextPage() ); 
digitalWrite(relay_pin, HIGH); // Wyłaczenie generatora pary 
digitalWrite(relay_pin2, HIGH); // Wyłączenie promiennika podczerwieni
digitalWrite(relay_pin3, HIGH);  // Wyłączenie wentylatora
digitalWrite(relay_pin4, HIGH);  // Wyłączenie wentylatora
digitalWrite(led_info_promiennik, LOW); // Wyłączenie diody od promiennika podczerwieni
digitalWrite(led_info_generator, LOW); // Wyłączenie diody od generatora pary
digitalWrite(led_info_nic, HIGH); // Włączenie diody od Strefy Nieczułosci(Strefy Histerezy)
}
}
1

Podziel sobie ten kod na mniejsze części (funkcje), bo w obecnej postaci w funkcji loop dzieje się za dużo. Wszystkie include wywal na samą górę, niżej podaj wszystkie define, następnie zadeklaruj zmienne i dalej funkcje. Poza tym kod jest napisany niedbale, formatowanie kodu jest słabe, a identyfikatory nie dość że niewiele/nic nie mówią o swoim przeznaczeniu, to jeszcze używasz różnego stylu nazewnictwa. Ostatnia rada to pisz kod w całości po angielsku – przyda Ci się to w przyszłości.

Uporządkuj ten kod – łatwiej będzie wprowadzać zmiany.

0

Czy takie uporządkowanie może być? :) nie pisałem jeszcze według Twojej rady po angielsku ponieważ po polsku łatwiej jest dojść "co do czego" oraz wspomniałeś o funkcji loop więc "wyrzuciłem" z niej kod od potencjometru i wstawiłem w osobną funkcje :D

// biblioteki
#include "DHT.h"                          // Biblioteka czujnika DHT 22
#include "U8glib.h"                       // Bibioteka OLED I2C

// stałe
#define led_info_promiennik 4         // dioda od promiennika
#define led_info_generator 13      // dioda od generatora pary
#define led_info_nic 1             // dioda od stefy nieczulosci
#define DHTPIN 2                          // Definicja PINu sygnałowego 
#define DHTTYPE DHT22                     // Wybór typu czujnika : DHT 22

// zmienne
int WILG;                           // Zmienna wilgotność
float TEMP;  // Zmienna temperatura 

unsigned long aktualnyCzas = 0; // do millis
unsigned long zapamietanyCzas = 0;  // do millis

int relay_pin = 8;                // przekaznik nr 1 
int relay_pin2 = 12;              // przekaznik nr 2
int relay_pin3 = 7;                // przekaznik nr 3
int relay_pin4 = 9;                //  przekaznik nr 3

int potencjometr = A0;                // Odczyt napiecia z potencjometru pinem analogowym 0
int wartosc = 0;                       // Zmienna przechowujaca wartość napięcia odczytanego
int dane[5]; // Uśrednienie odczytu wartości z potencjometru 
int i=0;  // Uśrednienie odczytu wartości z potencjometru
int srednia;  // Uśrednienie odczytu wartości z potencjometru

// Pozostałe
U8GLIB_SSD1306_128X64 u8g(U8G_I2C_OPT_NONE|U8G_I2C_OPT_DEV_0);  // I2C(TWI) 
DHT dht(DHTPIN, DHTTYPE, 6);                  // Definicja czujnika
char str[10];                         // znak stopni celsujsza i procent

// Funkcje
void zmniejszanie(void)
{
 u8g.firstPage();    // Rozpoczęcie pętli obrazu          
 do {
 u8g.setFont(u8g_font_helvB08);               // Wybór czcionki 
 u8g.drawStr( 2, 27, "Zmniejszanie wilgotnosci!");  // Definicja pozycji na ekranie oraz wyświetlanie tekstu            
                     
 
 u8g.drawStr( 2, 42, "Wilgotnosc :");            
 u8g.drawStr( 80, 42, dtostrf(WILG, 5, 2, str));
 u8g.drawStr( 110, 42, "%");

 u8g.drawStr( 2, 57, "Wilg. zad.:");            
 u8g.drawStr( 80, 57, dtostrf(wartosc, 5, 2, str));
 u8g.drawStr( 110, 57, "%");
 } while( u8g.nextPage() );                       // Zakończenie pętli obrazu
}
 
void zwiekszanie(void)
{
 u8g.firstPage();              
 do {
 u8g.setFont(u8g_font_helvB08);               // czcionka
 u8g.drawStr( 2, 27, "Zwiekszanie wilgotnosci!");             
                     
 
 u8g.drawStr( 2, 42, "Wilgotnosc :");            
 u8g.drawStr( 80, 42, dtostrf(WILG, 5, 2, str));
 u8g.drawStr( 110, 42, "%");

 u8g.drawStr( 2, 57, "Wilg. zad.:");            
 u8g.drawStr( 80, 57, dtostrf(wartosc, 5, 2, str));
 u8g.drawStr( 110, 57, "%");
 } while( u8g.nextPage() );                       // koniec petli obrazu
}

void strefa_nieczulosci(void)
{
 u8g.firstPage();              
 do {
 u8g.setFont(u8g_font_helvB08);               // czcionka
 u8g.drawStr( 2, 27, "Strefa Nieczulosci");             
                     
 
 u8g.drawStr( 2, 42, "Wilgotnosc :");            
 u8g.drawStr( 80, 42, dtostrf(WILG, 5, 2, str));
 u8g.drawStr( 110, 42, "%");

 u8g.drawStr( 2, 57, "Wilg. zad.:");            
 u8g.drawStr( 80, 57, dtostrf(wartosc, 5, 2, str));
 u8g.drawStr( 110, 57, "%");
 } while( u8g.nextPage() );                       // koniec petli obrazu
}

void srednia_pot(void)
{
 dane[i] = analogRead(A0);
 wartosc = map(dane[i], 0, 1023, 0, 100);
 i = (i + 1) % 5;
 srednia = 0;
 
 for(int j = 0; j < 5; j++)
 srednia += dane[j];
 srednia /= 5.0;
}



void setup()
 {
dht.begin();                          // inicjalizacja DHT
// ustawienie wejsc/wyjsc
pinMode(potencjometr, INPUT); //pin A0 (pot) jako wejście
pinMode(relay_pin, OUTPUT);
pinMode(relay_pin2, OUTPUT); 
pinMode(relay_pin3, OUTPUT); 
pinMode(relay_pin4, OUTPUT);
digitalWrite(relay_pin, HIGH);
digitalWrite(relay_pin2, HIGH);
digitalWrite(relay_pin3, HIGH);
digitalWrite(relay_pin4, HIGH);
pinMode(led_info_promiennik, OUTPUT);
pinMode(led_info_generator, OUTPUT);
pinMode(led_info_nic, OUTPUT);
 }

void loop() 
{
  
aktualnyCzas = millis();

if (aktualnyCzas - zapamietanyCzas >= 50UL) {
    //Zapamietaj aktualny czas
    zapamietanyCzas = aktualnyCzas;
 }
                      
 WILG = dht.readHumidity();                     // Funkcja odczytująca aktualną wartość wilgotności
 TEMP = dht.readTemperature();                  // Funkcja odczytująca aktualną wartość temperatury

 
 srednia_pot();


// PETLA OD WARUNKOW 
if(wartosc>(WILG+2)) 
{ 
 u8g.firstPage();
  do {
    zwiekszanie();
  } while (u8g.nextPage() ); 
digitalWrite(relay_pin3, HIGH);  // Wyłączenie wentylatora
digitalWrite(relay_pin4, HIGH);  // Wyłączenie wentylatora
digitalWrite(relay_pin, HIGH);  // Wyłączenie generatora pary 
digitalWrite(relay_pin2, LOW); // Włączenie promiennika podczerwieni
digitalWrite(led_info_promiennik, HIGH); // Włączenie diody od promiennika podczerwieni
digitalWrite(led_info_generator, LOW); // Wyłączenie diody od generatora pary
digitalWrite(led_info_nic, LOW); // Wyłączenie diody od Strefy Nieczułosci(Strefy Histerezy)
}

else if(wartosc<(WILG-2))
{ 
  do {
    zmniejszanie();
  } while (u8g.nextPage() ); 
digitalWrite(relay_pin2, HIGH); //Wyłączenie promiennika podczerwieni
digitalWrite(relay_pin3, LOW); // Włączenie wentylatora
digitalWrite(relay_pin4, LOW);  //Włączenie wentylatora
digitalWrite(relay_pin, LOW);  // Włączenie generatora pary  
digitalWrite(led_info_generator, HIGH); //Włączenie diody od generatora pary
digitalWrite(led_info_promiennik, LOW); //Wyłączenie diody od promiennika podczerwieni
digitalWrite(led_info_nic, LOW); // Wyłączenie diody od Strefy Nieczułosci(Strefy Histerezy)
}

else 
{ 
 u8g.firstPage();
  do {
    strefa_nieczulosci();
  } while (u8g.nextPage() ); 
digitalWrite(relay_pin, HIGH); // Wyłaczenie generatora pary 
digitalWrite(relay_pin2, HIGH); // Wyłączenie promiennika podczerwieni
digitalWrite(relay_pin3, HIGH);  // Wyłączenie wentylatora
digitalWrite(relay_pin4, HIGH);  // Wyłączenie wentylatora
digitalWrite(led_info_promiennik, LOW); // Wyłączenie diody od promiennika podczerwieni
digitalWrite(led_info_generator, LOW); // Wyłączenie diody od generatora pary
digitalWrite(led_info_nic, HIGH); // Włączenie diody od Strefy Nieczułosci(Strefy Histerezy)
}
}
2

Przede wszystkim nadmiarowe komentarze to chyba najczęstszy błąd u początkujących.
Taki błąd często prowadzi do kolejnych błędów, bo mając komentarz zbędny/nadmiarowy często pomija się prawidłowe nazewnictwo zmiennych (bo błędnie zakłada się, że skoro skomentowałem zmienną przy jej tworzeniu, to wszędzie będę wiedział co to za zmienna...)
Przykład:

float TEMP;  // Zmienna temperatura 

Tutaj utworzyłeś zmienną TEMP ale nazwałeś ją masakrycznie myląco! Z reguły WIELKIE_LITERY oznaczają stałą (najczęściej stworzoną przez #define). W dodatku nie wiem dlaczego skrót TEMP zamiast pełnej nazwy temperature. Przecież TEMP może nawet oznaczać coś tymczasowego (od temporary, mimo że najczęściej jest to tmp).
Takich przykładów jest wiele.
Gdybyś uparł się, że nie napiszesz w swoim kodzie ani jednego komentarza, wtedy siłą rzeczy Twój kod stałby się bardziej czytelny. Choćby dlatego, że starałbyś się tworzyć kod, który sam w sobie mówi co robi.
Dla przykładu przerobię kawałek Twojego kodu:

else if(wartosc<(WILG-2))
{ 
  do {
    zmniejszanie();
  } while (u8g.nextPage() ); 
digitalWrite(relay_pin2, HIGH); //Wyłączenie promiennika podczerwieni
digitalWrite(relay_pin3, LOW); // Włączenie wentylatora
digitalWrite(relay_pin4, LOW);  //Włączenie wentylatora
digitalWrite(relay_pin, LOW);  // Włączenie generatora pary  
digitalWrite(led_info_generator, HIGH); //Włączenie diody od generatora pary
digitalWrite(led_info_promiennik, LOW); //Wyłączenie diody od promiennika podczerwieni
digitalWrite(led_info_nic, LOW); // Wyłączenie diody od Strefy Nieczułosci(Strefy Histerezy)
}

na poniższy kod, robiący dokładnie to samo:

static void TurnOffRadiator()
{
    digitalWrite(relay_pin2, HIGH);
    digitalWrite(led_info_promiennik, LOW);
}

static void TurnOnFan()
{
    digitalWrite(relay_pin3, LOW);
    digitalWrite(relay_pin4, LOW);
}

static void TurnOnVaporGenerator()
{
    digitalWrite(relay_pin, LOW);
    digitalWrite(led_info_generator, HIGH);
}

// ...
else if( value < (humidity-2) )
{
    do
    {
        logDecrease();
    } while( u8g.nextPage() );

    TurnOffRadiator();
    TurnOnFan();
    TurnOnVaporGenerator();
}

pominąłem jedynie diodę od strefy nieczułości. Nie miałem pojęcia pod co ją podpiąć i czemu ona rzeczywiście służy. Zostawiłem także magiczną wartość 2, chociaż należy ją gdzieś solidnie zdefiniować. Obecnie będziesz musiał zmieniać to samo w paru miejscach, a to wprowadza ryzyko błędów/pominięć.
Możesz jednak przerobić swój kod na podstawie powyższego.
Zauważ, że dodałem też wcięcia (i znaczniki kodu...) co znacznie ułatwia czytanie.

!! Co jeszcze możesz zrobić, to sprawdzić, czy urządzenie, które obsługujesz rzeczywiście zostało wyłączone i dopiero wtedy zmieniać stan diody informującej. Obecnie robimy to "na wiarę" więc może się okazać, że urządzenie nadal działa, a dioda mówi coś zupełnie odwrotnego.

0

Dziękuję za wyczerpującą odpowiedź, postaram się poprawić kod jak tylko wrócę z uczelni według tego co napisałeś oraz napisał mi furious programming :) na obecną chwilę nie wiem jak zrobić sprawdzenie czy urządzenie działa czy nie lecz nie chce odbiegać obecnie od głównego problemu dyskusji nad którym pomaga mi właśnie furious programming za co mu serdecznie dziękuję :)

1

@avabuy: kod widzę podzieliłeś na funkcje, ale nadal masz to:

// PETLA OD WARUNKOW 
if(wartosc>(WILG+2)) 
{ 
 u8g.firstPage();
  do {
    zwiekszanie();
  } while (u8g.nextPage() ); 
digitalWrite(relay_pin3, HIGH);  // Wyłączenie wentylatora
digitalWrite(relay_pin4, HIGH);  // Wyłączenie wentylatora
digitalWrite(relay_pin, HIGH);  // Wyłączenie generatora pary 
digitalWrite(relay_pin2, LOW); // Włączenie promiennika podczerwieni
digitalWrite(led_info_promiennik, HIGH); // Włączenie diody od promiennika podczerwieni
digitalWrite(led_info_generator, LOW); // Wyłączenie diody od generatora pary
digitalWrite(led_info_nic, LOW); // Wyłączenie diody od Strefy Nieczułosci(Strefy Histerezy)
}
 
else if(wartosc<(WILG-2))
{ 
  do {
    zmniejszanie();
  } while (u8g.nextPage() ); 
digitalWrite(relay_pin2, HIGH); //Wyłączenie promiennika podczerwieni
digitalWrite(relay_pin3, LOW); // Włączenie wentylatora
digitalWrite(relay_pin4, LOW);  //Włączenie wentylatora
digitalWrite(relay_pin, LOW);  // Włączenie generatora pary  
digitalWrite(led_info_generator, HIGH); //Włączenie diody od generatora pary
digitalWrite(led_info_promiennik, LOW); //Wyłączenie diody od promiennika podczerwieni
digitalWrite(led_info_nic, LOW); // Wyłączenie diody od Strefy Nieczułosci(Strefy Histerezy)
}
 
else 
{ 
 u8g.firstPage();
  do {
    strefa_nieczulosci();
  } while (u8g.nextPage() ); 
digitalWrite(relay_pin, HIGH); // Wyłaczenie generatora pary 
digitalWrite(relay_pin2, HIGH); // Wyłączenie promiennika podczerwieni
digitalWrite(relay_pin3, HIGH);  // Wyłączenie wentylatora
digitalWrite(relay_pin4, HIGH);  // Wyłączenie wentylatora
digitalWrite(led_info_promiennik, LOW); // Wyłączenie diody od promiennika podczerwieni
digitalWrite(led_info_generator, LOW); // Wyłączenie diody od generatora pary
digitalWrite(led_info_nic, HIGH); // Włączenie diody od Strefy Nieczułosci(Strefy Histerezy)
}
}

Tu właśnie o to z tym podziałem na funkcje chodziło, żebyś nie miał tak dużych drabinek. Twój program raczej nie będzie wykorzystywał stosu do granic wytrzymałości, więc nie musisz oszczędzać na wywołaniach. Dobry kod to taki, który jest dobrze zorganizowany, podzielony na małe funkcje i odpowiednio sformatowany. Dlatego musisz jeszcze trochę nad nim popracować, a do wyrównania wcięć możesz skorzystać z formattera http://format.krzaq.cc/

Jeszcze jedna uwaga – te komentarze są naprawdę zbędne. Problem polega na tym, że po ich usunięciu sam pewnie nie wiedziałbyś co dany kod robi. Dlatego powinieneś sensownie nazywać zmienne, stałe i funkcje, abyś sam sobie nie musiał w komentarzach tłumaczyć poszczególnych instrukcji.

0

Czy tak może być? :)

#include "DHT.h" 
#include "U8glib.h" 

#define LED_INFO_PROMIENNIK 4 
#define LED_INFO_GENERATOR 13 
#define LED_INFO_STREFA_NIECZULOSCI 1 
#define DHTPIN 2 
#define DHTTYPE DHT22 

int wilgotnosc; 
float temperatura;

unsigned long aktualnyCzas = 0; 
unsigned long zapamietanyCzas = 0; 

int przekaznik_pin = 8; 
int przekaznik_pin2 = 12; 
int przekaznik_pin3 = 7; 
int przekaznik_pin4 = 9; 

int potencjometr = A0; 
int wartosc = 0;
int dane[5]; 
int i = 0; 
int srednia; 

U8GLIB_SSD1306_128X64 u8g(U8G_I2C_OPT_NONE | U8G_I2C_OPT_DEV_0); // I2C(TWI)
DHT dht(DHTPIN, DHTTYPE, 6); 
char str[10]; 

void setup()
{
    dht.begin(); 
    pinMode(potencjometr, INPUT); 
    pinMode(przekaznik_pin, OUTPUT);
    pinMode(przekaznik_pin2, OUTPUT); 
    pinMode(przekaznik_pin3, OUTPUT); 
    pinMode(przekaznik_pin4, OUTPUT);
    digitalWrite(przekaznik_pin, HIGH);
    digitalWrite(przekaznik_pin2, HIGH);
    digitalWrite(przekaznik_pin3, HIGH);
    digitalWrite(przekaznik_pin4, HIGH);
    pinMode(LED_INFO_PROMIENNIK, OUTPUT);
    pinMode(LED_INFO_GENERATOR, OUTPUT);
    pinMode(LED_INFO_STREFA_NIECZULOSCI, OUTPUT);
}

void zmniejszanie_wilgotnosci(void)
{
    u8g.firstPage();
    do {
        u8g.setFont(u8g_font_helvB08); 
        u8g.drawStr(2, 27, "Zmniejszanie wilgotnosci!"); 

        u8g.drawStr(2, 42, "Wilgotnosc :");
        u8g.drawStr(80, 42, dtostrf(wilgotnosc, 5, 2, str));
        u8g.drawStr(110, 42, "%");

        u8g.drawStr(2, 57, "Wilg. zad.:");
        u8g.drawStr(80, 57, dtostrf(wartosc, 5, 2, str));
        u8g.drawStr(110, 57, "%");
    } while (u8g.nextPage()); 

void zwiekszanie_wilgotnosci(void)
{
    u8g.firstPage();
    do {
        u8g.setFont(u8g_font_helvB08); 
        u8g.drawStr(2, 27, "Zwiekszanie wilgotnosci!");

        u8g.drawStr(2, 42, "Wilgotnosc :");
        u8g.drawStr(80, 42, dtostrf(wilgotnosc, 5, 2, str));
        u8g.drawStr(110, 42, "%");

        u8g.drawStr(2, 57, "Wilg. zad.:");
        u8g.drawStr(80, 57, dtostrf(wartosc, 5, 2, str));
        u8g.drawStr(110, 57, "%");
    } while (u8g.nextPage()); 
}
void strefa_nieczulosci(void)
{
    u8g.firstPage();
    do {
        u8g.setFont(u8g_font_helvB08); 
        u8g.drawStr(2, 27, "Strefa Nieczulosci");

        u8g.drawStr(2, 42, "Wilgotnosc :");
        u8g.drawStr(80, 42, dtostrf(wilgotnosc, 5, 2, str));
        u8g.drawStr(110, 42, "%");

        u8g.drawStr(2, 57, "Wilg. zad.:");
        u8g.drawStr(80, 57, dtostrf(wartosc, 5, 2, str));
        u8g.drawStr(110, 57, "%");
    } while (u8g.nextPage()); 
}

static void WlaczPromiennik()
{
    digitalWrite(przekaznik_pin2, LOW);
    digitalWrite(LED_INFO_PROMIENNIK, HIGH);
}
static void WylaczPromiennik()
{
    digitalWrite(przekaznik_pin2, HIGH);
    digitalWrite(LED_INFO_PROMIENNIK, LOW);
}
static void WlaczWentylatory()
{
    digitalWrite(przekaznik_pin3, LOW);
    digitalWrite(przekaznik_pin4, LOW);
}
static void WylaczWentylatory()
{
    digitalWrite(przekaznik_pin3, HIGH);
    digitalWrite(przekaznik_pin4, HIGH);
}

static void WlaczGeneratorPary()
{
    digitalWrite(przekaznik_pin, LOW);
    digitalWrite(LED_INFO_GENERATOR, HIGH);
}

static void WylaczGeneratorPary()
{
    digitalWrite(przekaznik_pin, HIGH);
    digitalWrite(LED_INFO_GENERATOR, LOW);
}
static void WylaczStrefaNieczulosci()
{
    digitalWrite(LED_INFO_STREFA_NIECZULOSCI, LOW);
}
static void WlaczStrefaNieczulosci()
{
    digitalWrite(LED_INFO_STREFA_NIECZULOSCI, HIGH);
}

void srednia_pot()
{
    dane[i] = analogRead(A0);
    wartosc = map(dane[i], 0, 1023, 0, 100);

    i = (i + 1) % 5;
    srednia = 0;

    for (int j = 0; j < 5; j++)
        srednia += dane[j];

    srednia /= 5.0;
}

void loop()
{

    aktualnyCzas = millis();

    if (aktualnyCzas - zapamietanyCzas >= 50UL) {
        
        zapamietanyCzas = aktualnyCzas;
    }

    wilgotnosc = dht.readHumidity(); 
    temperatura = dht.readTemperature(); 

    srednia_pot();

    
    if (wartosc > (wilgotnosc + 2)) {
        u8g.firstPage();
        do {
            zwiekszanie_wilgotnosci();
        } while (u8g.nextPage());
        WylaczWentylatory();
        WlaczPromiennik();
        WylaczGeneratorPary();
        WylaczStrefaNieczulosci();
    }

    else if (wartosc < (wilgotnosc - 2)) {
        do {
            zmniejszanie_wilgotnosci();
        } while (u8g.nextPage());
        WlaczWentylatory();
        WylaczPromiennik();
        WlaczGeneratorPary();
        WylaczStrefaNieczulosci();
    }

    else {
        u8g.firstPage();
        do {
            strefa_nieczulosci();
        } while (u8g.nextPage());

        WylaczGeneratorPary();
        WylaczPromiennik();
        WylaczWentylatory();
        WlaczStrefaNieczulosci();
    }
}
1

Nie, to jeszcze nie wszystko. Początek funkcji loop, czyli to:

aktualnyCzas = millis();
 
if (aktualnyCzas - zapamietanyCzas >= 50UL) {

    zapamietanyCzas = aktualnyCzas;
}

wydziel do osobnej funkcji. No i podziel tę drabinkę ifów:

if (wartosc > (wilgotnosc + 2)) {
    u8g.firstPage();
    do {
        zwiekszanie_wilgotnosci();
    } while (u8g.nextPage());
    WylaczWentylatory();
    WlaczPromiennik();
    WylaczGeneratorPary();
    WylaczStrefaNieczulosci();
}

else if (wartosc < (wilgotnosc - 2)) {
    do {
        zmniejszanie_wilgotnosci();
    } while (u8g.nextPage());
    WlaczWentylatory();
    WylaczPromiennik();
    WlaczGeneratorPary();
    WylaczStrefaNieczulosci();
}

else {
    u8g.firstPage();
    do {
        strefa_nieczulosci();
    } while (u8g.nextPage());

    WylaczGeneratorPary();
    WylaczPromiennik();
    WylaczWentylatory();
    WlaczStrefaNieczulosci();
}

na mniejsze funkcje.

Główna funkcja loop ma być czysta – wołać funkcje i posiadać podstawowe instrukcje sterujące. No i popraw też nazwy zmiennych, bo jak np. nie mam pojęcia czym jest srednia_pot – co za pot i czego to średnia? Poza tym używasz wielu różnych stylów nazewnictwa dla funkcji – raz korzystasz z camelCase, a raz z snake_case. Zastanów się i korzystaj z jednego, a najlepiej tego, który jest globalnie przyjętym standardem.

Wolałbym tylko nazwy angielskie, ale cóż… to Twój program. ;)

0

Czy możesz mi napisać o co chodzi abym podzielił drabinkę if'ów na jeszcze mniejsze funkcje? :) oj z tymi nazwami funkcji to nie wiedziałem iż są takie pojęcia - jednak czytając tematy o tym w Internecie na różnych forach jest różnie sprecyzowane jakiego standardu używać - którego należy używać według Ciebie? :)

0

Czy taki kod spełnia Twoje wyznaczniki? :) (bez uwzględnienia angielskiego nazewnictwa)

#include "DHT.h"
#include "U8glib.h"

#define LED_INFO_PROMIENNIK 4
#define LED_INFO_GENERATOR 13
#define LED_INFO_STREFA_NIECZULOSCI 1
#define DHTPIN 2
#define DHTTYPE DHT22

int wilgotnosc;
float temperatura;

unsigned long aktualnyCzas = 0;
unsigned long zapamietanyCzas = 0;

int przekaznikPin = 8;
int przekaznikPin2 = 12;
int przekaznikPin3 = 7;
int przekaznikPin4 = 9;

int potencjometr = A0;
int wartosc = 0;
int dane[5];
int i = 0;
int srednia;

U8GLIB_SSD1306_128X64 u8g(U8G_I2C_OPT_NONE | U8G_I2C_OPT_DEV_0); // I2C(TWI)
DHT dht(DHTPIN, DHTTYPE, 6);
char str[10];

void setup()
{
    dht.begin();
    pinMode(potencjometr, INPUT);
    pinMode(przekaznikPin, OUTPUT);
    pinMode(przekaznikPin2, OUTPUT);
    pinMode(przekaznikPin3, OUTPUT);
    pinMode(przekaznikPin4, OUTPUT);
    digitalWrite(przekaznikPin, HIGH);
    digitalWrite(przekaznikPin2, HIGH);
    digitalWrite(przekaznikPin3, HIGH);
    digitalWrite(przekaznikPin4, HIGH);
    pinMode(LED_INFO_PROMIENNIK, OUTPUT);
    pinMode(LED_INFO_GENERATOR, OUTPUT);
    pinMode(LED_INFO_STREFA_NIECZULOSCI, OUTPUT);
}

void zmniejszanieWilgotnosci(void)
{
    u8g.firstPage();
    do {
        u8g.setFont(u8g_font_helvB08);
        u8g.drawStr(2, 27, "Zmniejszanie wilgotnosci!");

        u8g.drawStr(2, 42, "Wilgotnosc :");
        u8g.drawStr(80, 42, dtostrf(wilgotnosc, 5, 2, str));
        u8g.drawStr(110, 42, "%");

        u8g.drawStr(2, 57, "Wilg. zad.:");
        u8g.drawStr(80, 57, dtostrf(wartosc, 5, 2, str));
        u8g.drawStr(110, 57, "%");
    } while (u8g.nextPage());
}

void zwiekszanieWilgotnosci(void)
{
    u8g.firstPage();
    do {
        u8g.setFont(u8g_font_helvB08);
        u8g.drawStr(2, 27, "Zwiekszanie wilgotnosci!");

        u8g.drawStr(2, 42, "Wilgotnosc :");
        u8g.drawStr(80, 42, dtostrf(wilgotnosc, 5, 2, str));
        u8g.drawStr(110, 42, "%");

        u8g.drawStr(2, 57, "Wilg. zad.:");
        u8g.drawStr(80, 57, dtostrf(wartosc, 5, 2, str));
        u8g.drawStr(110, 57, "%");
    } while (u8g.nextPage());
}
void strefaNieczulosci(void)
{
    u8g.firstPage();
    do {
        u8g.setFont(u8g_font_helvB08);
        u8g.drawStr(2, 27, "Strefa Nieczulosci");

        u8g.drawStr(2, 42, "Wilgotnosc :");
        u8g.drawStr(80, 42, dtostrf(wilgotnosc, 5, 2, str));
        u8g.drawStr(110, 42, "%");

        u8g.drawStr(2, 57, "Wilg. zad.:");
        u8g.drawStr(80, 57, dtostrf(wartosc, 5, 2, str));
        u8g.drawStr(110, 57, "%");
    } while (u8g.nextPage());
}

static void wlaczPromiennik()
{
    digitalWrite(przekaznikPin2, LOW);
    digitalWrite(LED_INFO_PROMIENNIK, HIGH);
}
static void wylaczPromiennik()
{
    digitalWrite(przekaznikPin2, HIGH);
    digitalWrite(LED_INFO_PROMIENNIK, LOW);
}
static void wlaczWentylatory()
{
    digitalWrite(przekaznikPin3, LOW);
    digitalWrite(przekaznikPin4, LOW);
}
static void wylaczWentylatory()
{
    digitalWrite(przekaznikPin3, HIGH);
    digitalWrite(przekaznikPin4, HIGH);
}

static void wlaczGeneratorPary()
{
    digitalWrite(przekaznikPin, LOW);
    digitalWrite(LED_INFO_GENERATOR, HIGH);
}

static void wylaczGeneratorPary()
{
    digitalWrite(przekaznikPin, HIGH);
    digitalWrite(LED_INFO_GENERATOR, LOW);
}
static void wylaczStrefaNieczulosci()
{
    digitalWrite(LED_INFO_STREFA_NIECZULOSCI, LOW);
}
static void wlaczStrefaNieczulosci()
{
    digitalWrite(LED_INFO_STREFA_NIECZULOSCI, HIGH);
}

void usrednianieSkalowaniePomiaruPotencjometru()
{
    dane[i] = analogRead(A0);
    wartosc = map(dane[i], 0, 1023, 0, 100);

    i = (i + 1) % 5;
    srednia = 0;

    for (int j = 0; j < 5; j++)
        srednia += dane[j];

    srednia /= 5.0;
}

void odmierzanieCzasu()
{
    aktualnyCzas = millis();

    if (aktualnyCzas - zapamietanyCzas >= 50UL) {

        zapamietanyCzas = aktualnyCzas;
    }
}

void warunekZwiekszanieWilgotnosci()
{
    wylaczWentylatory();
    wlaczPromiennik();
    wylaczGeneratorPary();
    wylaczStrefaNieczulosci();
}
void warunekZmniejszanieWilgotnosci()
{
    wlaczWentylatory();
    wylaczPromiennik();
    wlaczGeneratorPary();
    wylaczStrefaNieczulosci();
}
void warunekStrefaNieczulosci()
{
    wylaczGeneratorPary();
    wylaczPromiennik();
    wylaczWentylatory();
    wlaczStrefaNieczulosci();
}

void loop()
{

    wilgotnosc = dht.readHumidity();
    temperatura = dht.readTemperature();

    odmierzanieCzasu();
    usrednianieSkalowaniePomiaruPotencjometru();

    if (wartosc > (wilgotnosc + 2)) {
        u8g.firstPage();
        do {
            zwiekszanieWilgotnosci();
        } while (u8g.nextPage());

        warunekZwiekszanieWilgotnosci();
    }

    else if (wartosc < (wilgotnosc - 2)) {
        do {
            zmniejszanieWilgotnosci();
        } while (u8g.nextPage());

        warunekZmniejszanieWilgotnosci();
    }

    else {
        u8g.firstPage();
        do {
            strefaNieczulosci();
        } while (u8g.nextPage());

        warunekStrefaNieczulosci();
    }
}
1

Według mnie jest znacznie, znacznie lepiej niż było na początku.

Co prawda nie podobają mi się nazwy metod w stylu usrednianieSkalowaniePomiaruPotencjometru (stanowczo za długa) czy warunekZwiekszanieWilgotnosci (prefiks warunek jest paskudny i mylący) – wystarczyłyby nazwy updatePotentiometer (a jeszcze lepiej update to, co faktycznie jest aktualizowane) oraz increaseHumidity, ale to już kwestia drugorzędna.

No i w dalszym ciągu nie widzę kodu odpowiedzialnego za obsługę histerezy – co z nim? ;)

0

Hmm mam mały problem jak ten kod co wstawiłeś na pierwszej stronie "wkomponować" w ten kod :D czy zechciałbyś mi pomóc? :D

1

Napisałem Ci jak to zrobić, jak to wszystko policzyć, dałem nawet gotowca – czego jeszcze oczekujesz?

0

Tylko tam napisałeś w jednym poście że "Przy czym jeśli zadana wilgotność ma być ustalana za pomocą potencjometru, to cała kupka stałych nie będzie już potrzebna, a warunki w funkcji getCurrentState trzeba będzie zmienić. Szkoda że nie wiedziałem o tym wcześniej." - nie wiem jak zmienić warunki w tej funkcji :/

0

Bo w moim kodzie zadeklarowałem zestaw stałych po to, aby nie musieć przeprowadzać obliczeń wewnątrz funkcji.

Jeśli wartość wilgotności jest zmienna, bo mapowana z położenia potencjometru, to wszystkie obliczenia użyte do określenia wartości stałych należy przenieść do funkcji. Po prostu zamiast odejmować od/dodawać do stałej humidity, dodaje się do/odejmuje od wartości np. przekazanej w parametrze (tej odczytanej z potencjometru).

Poradzisz sobie z tym?

0

Przepraszam za te ptaszki - chciałem po prostu podziękować chociaż w ten sposób za zainteresowanie tematem i udzielaną mi pomoc i porady :) rozumuje to tak , że wystarczy zastąpić stałą zmienną "humidity" na funkcję odnośnie odczytywania i mapowania wartości potencjometru czyli : humidity=usrednianieSkalowaniePomiaruPotencjometru() ? Hmm w sumie to nie wiem czy myślę o tym należycie tak jak spróbowałeś mi przekazać :D Niestety pomimo przeczytania książki "Od zera do gier kodera" mój poziom znajomości języka C++ wygląda tragicznie :D

1 użytkowników online, w tym zalogowanych: 0, gości: 1