Skocz do zawartości

Problem konceptualny, jak to napisać najprościej.


SOYER

Pomocna odpowiedź

12 godzin temu, Elvis napisał:

@SOYER O ile rozumiem w tym przedziwnym przykładzie chodziło o uniknięcie wielokrotnego powtarzania prawie identycznego warunku, czyli:

Zamiast wymyślać nowy język programowania, można chwilę zastanowić się nad pierwotnym zadaniem:

Sprawdzenie, czy na jakimkolwiek czujniku jest wynik wyższy od górnej granicy można zrealizować nieco inaczej - policzmy maksymalną wartość odczytów, czyli max(t1, t2, ..., t5), a następnie porównajmy z tempMax. Jeśli którykolwiek przekracza limit, to i maksimum przekracza, więc na razie w pseudokodzie mamy coś takiego:

t = max(t1, t2, t3, t4, t5)
if (t > tempMax)
  przek1 = 1;

Teraz druga część, czyli sprawdzanie, czy wszystkie odczyty mają wartość poniżej dolnej granicy. Możemy ponownie wykorzystać maksymalny odczyt, wystarczy go porównać z tempMin. Jeśli max(t1,..,t5) jest mniejsze od tempMin, to na pewno wszystkie odczyty są też mniejsze od tempMin:

t = max(t1, t2, t3, t4, t5)
if (t < tempMin)
  przek1 = 0;

Łatwo zauważyć, że maksimum musimy obliczyć tylko raz, a warunki są już bardzo proste. Napisanie funkcji liczącej maksimum to chyba nic trudnego, a w przypadku C++ nie trzeba nawet nic pisać:

auto t = std::max({t1, t2, t3, t4, t5});
if (t > tempMax)
  przek1 = 1;
else if (t < tempMin)
  przek1 = 0;

 

Dzięki @Elvis. Musiałem to kilka razy przeczytać, właśnie o takie rozwiązanie mi chodziło. Do pogłówkowania😁. Przy okazji dowiedziałem się o istnieniu takiej funkcji jak max()👍.

Muszę jeszcze poczytać o automatycznym typie zmiennych "auto". Bo już dzisiaj drugi raz spotykam się z takim zapisem, a też o tym nie wiedziałem.

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

To teraz poproszę o pomoc w czymś bardziej(?) skomplikowanym.

Problem, ustawić wartość zmiennej (tMax)w zakresie powiedzmy 10 do 50, przy pomocy enkodera obrotowego i wyświetlacza lcd.

Teoretycznie ja z moim poziomem wiedzy musiałbym to chyba rozrysować na 40 ekranów, co jest absurdem. 

Czyli co? Jakaś tablica char z znakami od 10 do 40, kręcimy pokrętłem i kod wypisuje nam na lcd kolejne liczby w górę lub w dół? Jednak zmienna którą zmieniamy ma już jakąś wartość przypisaną czyli wchodząc w tryb jej ustawiania musimy nakazać w kodzie rozpoczęcie zmian od konkretnej pozycji z naszej tablicy char.

Jak to najprościej ugryźć?

Link do komentarza
Share on other sites

Wystarczy jedna zmienna całkowita, którą impulsy enkodera zwiększają lub zmniejszają (w zależności od kierunku obrotów) i której wartość jest wyświetlana.

Kiedy wartość dojdzie do krańca zakresu, to przeskakujemy na drugi koniec lub zmieniamy kierunek odliczenia (wg gustu).

Link do komentarza
Share on other sites

W sumie racja. Tyle, że dwie zmienne. Jedna tMax i druga lokalna, tworzona po wejściu w tryb ustawień, pobierająca wartość początkową od tMax, a po zaakceptowaniu zmiany ustawień tMax pobiera wartość z tej lokalnej.

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

 

Właśnie piszę soft do zgrzewarki i też tam mam wartości granicze, może to cię zainteresuje, ja swoje zmienne zorganizowałem w struktury aby łatwiej było nimi manipulować, może ten kawałek kodu pomoże rozwiązać twój problem:

#include <avr/io.h>

#include "zgrzew.h"


struct imp;


zgrzew_t zgrzew_param =
{
	   .preimp = {.val = 0,.min = 0,.max = 500},
		.pause = {.val = 0,.min = 0,.max = 500},
	   .impuls = {.val = 0,.min = 20,.max =2000}
};
/*
 * zgrzew.h
 *
 *  Created on: 18 lut 2023
 *      Author: _LM_
 */
#ifndef ZGRZEW_H_
#define ZGRZEW_H_

#include <avr/io.h>
#include <avr/pgmspace.h>

 struct imp
{
	     uint16_t val;
 const   uint16_t min;
 const 	 uint16_t max;
};

typedef struct
{
	struct imp preimp,pause,impuls;
}zgrzew_t;


zgrzew_t zgrzew_param;

#endif /* ZGRZEW_H_ */

Później w obsłudze enkodera będzie podstawiany wskaźnik do aktualnie edytowanej wartości i regulacja zależnie od tego na ile pozwalają zakresy ustawione w strukturach. Sorki że nie jest to kod stricte odpowiadający twojemu problemowi chcę tylko pokazać w jaki sposób możesz łatwo zorganizować swoje dane. Aha gdyby okazało się że struktur "imp" ma być wiele więcej to lepiej jest je wrzucić do tablicy. 

Edytowano przez _LM_
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.