Zatrzymanie pętli przyciskiem.

0

Witam, znowu potrzebuje pomocy :P

Mam na swojej stronie dwa guziki uruchom i zatrzymaj. Chciałem zrobić tak, aby po wciśnięciu guzika uruchom zaczęła wykonywać się pętla while, której warunkiem zatrzymania miało by być wciśnięcie klawisza zatrzymaj. Chciałem to zrobić na takiej zasadzie, że po wcisnieciu buttona zatrzymaj ustawi się w nim zmienna logiczna $stop na true i pętla while sie zatrzyma jeżeli $stop jest inne niż false. Oto kod którym próbowałem to zrobić

if (isset($_POST['zatrzymaj']))
	{
		$stop = true;
	}
if (isset($_POST['uruchom']))
	{
		$dtemp = $_POST['docelowaTemp'];
		while ($stop == false)
		{
			// Kod petli
		}
	}

Ale mi to nie działa i coś mi się wydaje, że takie coś nie ma prawa działać. Jak wykonać takie zatrzymanie pętli?
Pomocy :(

1

Tego nie da się tak zrobić. Opisz po co ci ta pętla w takim kształcie a najlepiej jaki problem próbujesz rozwiązać - prawdopodobnie uda się zaproponować coś lepszego.

0

Raczej nie można zatrzymać pętli a potem kontynuować jej pracy, ale można zatrzymać ją, a potem uruchomić funkcję która będzie mieć w sobie kopie tej pętli.

0
szopenfx napisał(a):

Tego nie da się tak zrobić. Opisz po co ci ta pętla w takim kształcie a najlepiej jaki problem próbujesz rozwiązać - prawdopodobnie uda się zaproponować coś lepszego.

No właśnie tak myślałem, że czegoś takiego nie da rady zrobić.

A więc tak robi mały projekt do szkoły oparty na raspberry pi. Mój program ma wyświetlać na stronie www aktualną temperaturę w pomieszczeniu z czujnika i jeżeli wprowadzimi, że mamy dogrzać pomieszczenie np do 27C to do program ma wysłać 1 do przekaźnika, który uruchomi grzałkę i dogrzeje do tych 27C i wyłączy. Jeżeli temperatura spadnie znowu poniżej tych 27*C to znowu ją włączy dogrzeje i się wyłączy i tak w kółko. Dla tego pasuje mi tu jakaś nieskończona pętla, ale musiała by mieć ona jakieś przerwanie. Strona moja wygląda tak:

user image

Kod, który miał to realizować:

if (isset($_POST['zatrzymaj']))
	{
		$stop = true;
	}
if (isset($_POST['uruchom']))
	{
		$dtemp = $_POST['docelowaTemp'];
		while ($stop == false)
		{
			while ($temp < $docelowatemp)
			{
				include 'temp.php'; // Pobranie temperatury z czujnika
				exec("gpio write 2 1");  // Włącza grzałkę dopóki temperatura z czujnika < od docelowej temp.
			}
			
			exec("gpio write 2 0"); // wyłącza grzałkę
		}
	}

Podejrzewam, że można to pewnie rozwiązać w jakiś banalny sposób, ale jestem dosyć mocno początkujący i nie wiem jak sobie z tym poradzić. Ma ktoś jakąś koncepcję jak to zrealizować?

2

Ale wiesz, że tak się nie da? Kod który wykonujesz w php wykonuje się na serwerze przed wysłaniem strony do klienta i już. Jak klient widzi stronę, to skrypt już się wykonał i nie ma możliwości aby klient mógł przerwać pętlę. Musisz użyć jakiegoś innego mechanizmu. Ja bym zrobił tak, że użyłbym w tle jakiejś usługi którą sterujemy z poziomu aplikacji www. Czyli ona działa w tle, a serwer przechwytuje tylko żądania i wysyła je do usługi. Dodatkowo można by dynamicznie pobierać aktualną temperaturę oraz stan grzania.

Druga mała uwaga. Sterowanie w ten sposób, że masz jeden próg przy którym włączasz/wyłączasz jest niezbyt optymalne. W takich rozwiązaniach stosuje się tzw. histerezę. Czyli grzejemy do temperatury np. 25C, a ponownie włączamy jak temperatura spadnie poniżej np. 24C. Inaczej zajeździsz grzałkę oraz przekaźniki bo może się zdarzyć, że układ będzie się włączać/wyłączać co sekundę.

0

Dzięki wielkie nie wiem czemu, ale jakoś na to nie wpadłem żebry zrobić skrypt odpowiedzialny za to i go po prostu uruchamiać/zatrzymywać z poziomu przeglądarki.

0

Po stronie klienta (czyli przeglądarki) napisz sobie skrypt w JS, który będzie odpytywał serwer co np. 60 sec. o stan ostatnich 60 temperatur regulowanych twoim programem oraz czy grzałka w danym momencie była włączona czy nie.
W PHP jak otrzymasz żądanie wystarczy, że odczytasz tylko te 60 temp. z bazy danych/pliku czy jakkolwiek to tam trzymasz i wyświetlisz w przeglądarce.
Możesz użyć tej listy do np. narysowania wykresu ostatnich temperatur z informacją o stanie grzałki w danym przedziale czasowym.

0
szopenfx napisał(a):

Po stronie klienta (czyli przeglądarki) napisz sobie skrypt w JS, który będzie odpytywał serwer co np. 60 sec. o stan ostatnich 60 temperatur regulowanych twoim programem oraz czy grzałka w danym momencie była włączona czy nie.
Sugerowałbym użycie Ajaxu aby nie trzeba było przeładowywać całej strony.

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