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

Odpowiedz Nowy wątek
2018-12-15 12:08
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 :)

edytowany 1x, ostatnio: furious programming, 2018-12-15 17:59

Pozostało 580 znaków

2018-12-25 19:48
0

Ale w konsoli te zmienne nie wyświetlają się ale po dodaniu tej funckji program " siada" ;)
PS. Spróbuję napisać post na forum dotyczącym konkretnie Arduino - może ktoś tam "wpadnie" na pomysł co jest nie tak :D

edytowany 1x, ostatnio: avabuy, 2018-12-26 13:26

Pozostało 580 znaków

2018-12-27 16:18
2

Sprawdziłem wszystkie obliczenia związane z wyznaczaniem bieżącego stanu i jego zmiany – ostatecznie potwierdzam ich poprawność. Do tego celu napisałem sobie prostą aplikację okienkową z dwoma suwakami – jeden imituje czujnik wilgotności, a drugi imituje położenie potencjometru.

Tego małego bufora cyklicznego do przechowywania pięciu ostatnich odczytów nie implementowałem, bo jego istnienie nie wpływa na ostateczne działanie programu (nie ma on związku z obecnym problemem).

app.png

Stan ”urządzenia” prawidłowo zmienia się zarówno podczas zmiany wartości wilgotności (górny suwak aka czujnik), jak i podczas zmiany wartości środka zakresu stanu B (dolny suwak aka potencjometr).

Tak więc jeśli Twój program nie działa prawidłowo, to musiałeś w drodze przenoszenia i spolszczania mojego kodu popełnić gdzieś błąd. Do załączników dorzucam aplikację testową wraz ze źródłami – pobaw się i zobacz jak to powinno działać.

  • app.png (0,01 MB) - ściągnięć: 5
  • app.zip (0,78 MB) - ściągnięć: 7

edytowany 3x, ostatnio: furious programming, 2018-12-27 16:20

Pozostało 580 znaków

2018-12-27 18:26
1

Twoja funkcja getNewState powinna posiadać mniej więcej taki kształt:

int getNewState()
{
  /* tu pobieramy bieżące odczyty */    

  int humidity      = // tu wpisz zmapowaną wartość wilgotności
  int potentiometer = // tu wpisz zmapowane położenie potencjometru

  /* tu wyznaczamy wartości przedziałów na podstawie wskazania potencjometru */

  int stateXLeftMin = potentiometer - sizeRangeB - sizeRangeX;
  int stateXLeftMax = potentiometer - sizeRangeB;

  int stateXRightMin = potentiometer + sizeRangeB;
  int stateXRightMax = potentiometer + sizeRangeB + sizeRangeX;

  /* tu porówujemy wartość wilgotności z ustalonymi zakresami stanów i histerezy */

  if (humidity >= stateXLeftMin  && humidity <= stateXLeftMax)  return stateX;
  if (humidity >= stateXRightMin && humidity <= stateXRightMax) return stateX;

  if (humidity < stateXLeftMin)  return stateA;
  if (humidity > stateXRightMax) return stateC;

  return stateB;
}

Twój obecny kod zawsze utrzymuje włączony stan B, bez względu na położenie potencjometru i wartość wilgotności.


edytowany 3x, ostatnio: furious programming, 2018-12-27 18:31

Pozostało 580 znaków

2018-12-28 14:19
1

Dziękuję Ci furious za wszelką pomoc i czas jaki poświęciłeś na koszt tego tematu :) naprawdę jesteś człowiek wielki :) co do działania - raz się program wgrywa i częściowo działa a raz nie , rozmuje że może być problem z płytką jednak będę próbował do skutku zmieniając m.in. kolejność funkcji itd :) na PW wyśle Ci informacje o ewentualnym powodzeniu całego programu - na ten moment jeszcze raz baardzo dziękuję :)

Pozostało 580 znaków

2018-12-28 15:58
0

Pamiętaj, że jak już będziesz po kolei dodawał nowe funkcje do programu, to wartość wilgotności należy porównywać z zakresami obliczonymi na podstawie położenia potencjometru. Czyli tak jak pokazałem w poprzednim poście. I pamiętaj też, że do zmiennej humidity w funkcji getNewState, czyli tej:

int getNewState()
{
  /* tu pobieramy bieżące odczyty */    

  int humidity = // tu wpisz zmapowaną wartość wilgotności

musisz wpisywać średnią wilgotność, bo używasz bufora cyklicznego do zapamiętywania pięciu ostatnich odczytów.

W razie większych problemów z działaniem kodu, wywal go i napisz wszystko od nowa – tym razem powoli i spokojnie, dbając o czytelność, formatowanie i ładny podział na małe funkcje. Cały program nie jest duży, więc w razie czego napisanie go jeszcze raz nie potrwa zbyt długo.

Powodzenia w takim razie. ;)


edytowany 2x, ostatnio: furious programming, 2018-12-28 15:59

Pozostało 580 znaków

2018-12-28 20:46
0

To znaczy wilgotność nie jest liczona średnia tylko wartość z potencjometru :D chyba literówkę tam zrobiłeś pisząc, że wilgotność jest liczona jako średnia :D

Pozostało 580 znaków

2018-12-28 21:04
1

Skoro tak twierdzisz to pewnie nastąpiła pomyłka. ;)

Chodzi mi o średnią wartość wyznaczoną na podstawie pięciu poprzednich odczytów, co realizowałeś za pomocą kodu podanego w tym poście. Problem w tym, że sam mianem „wilgotności” określałem odczyt z czujnika, a nie pozycję potencjometru (ten nazywałem po prostu potencjometrem lub środkiem stanu B).

Skoro tak, to nie widzę powodu, aby liczyć średnią z kilku odczytów potencjometru. To przecież nie ma sensu, bo nie kręcisz nim jak kierownicą w samochodzie. IMO w celu zapobieżenia świrowaniu urządzenia powinieneś przechowywać wartości kilku poptrzednich odczytów z czujnika wilgotności, bo ten faktycznie może zwracać wartości szybko zmieniające się w czasie. Ten problem można zlikwidować właśnie za pomocą uśredniania wartości kilku poprzednich pomiarów.


edytowany 2x, ostatnio: furious programming, 2018-12-28 21:06

Pozostało 580 znaków

2018-12-28 21:07
0

Dobrze , mianem wilgotności jest określana wartość czujnika , natomiast średnia jest liczona z "pomiarów" potencjometrem ponieważ zapobiega to nadmiernym "skokom" wartości potencjometru wyświetlanej na wyświetlaczu ;) a jeśli chodzi o wartości zwracane przez czujnik to nie mają one " dużego" skoku - wzrastaja/maleją stopniowo ;)

edytowany 1x, ostatnio: avabuy, 2018-12-28 21:08

Pozostało 580 znaków

2018-12-28 21:10
1

No nie mów, że jak kręcisz potencjometrem to wartość na wyświetlaczu wariuje, zamiast rosnąć/maleć płynnie. :/


edytowany 1x, ostatnio: furious programming, 2018-12-28 21:11

Pozostało 580 znaków

2018-12-28 22:50
0

To znaczy w sensie wartość już ustalona np 75% skacze na poziomie 74-75% i w tym celu została zastosowana ta tablica :D

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

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