-
61. Data: 2017-10-30 18:56:37
Temat: Re: programowanie w C - bardzo ogólne pytanie o filozofię. Arduino w roli programatora pralki
Od: Piotr Gałka <p...@c...pl>
W dniu 2017-10-30 o 17:32, slawek pisze:
> On Mon, 30 Oct 2017 17:00:21 +0100, Piotr
> Gałka<p...@c...pl> wrote:
>> Czyli, w pierwszym podejściu muszę się zapoznać z tymi
> ograniczeniami o
>> których pisałeś w poprzedniej wypowiedzi.
>
> Jest free dla firm z pięcioma komputerami czy jakoś tak.
Takiego typu warunku się nie spodziewałem. Myślałem raczej, że jakieś
opcje debuggowania, czy pracy w grupie, czy jakieś biblioteki są
wycięte. Ale kiedyś sprawdzę.
Jeśli faktycznie to się nie załapię. Sam mam 3 komputery - jeden w
sieci, drugi nie podłączony i stary z XP dla tego co nie działa pod
Win7. Brat tak samo, a nie jesteśmy sami.
A może liczą się tylko te podłączone - to wtedy mam jeden :)
P.G.
-
62. Data: 2017-10-30 21:44:06
Temat: Re: programowanie w C - bardzo ogólne pytanie o filozofię. Arduino w roli programatora pralki
Od: ToMasz <t...@p...fm.com.pl>
W dniu 30.10.2017 o 17:13, slawek pisze:
> On Mon, 30 Oct 2017 15:29:36 +0100, ToMasz <N...@o...pl> wrote:
>> rozwiązania w c++. Ty mi nic nie pomogłeś, jeden z kolegów napisał
>> program. ale odpowiedzi nie otrzymałem. Dlamnie
>
> Twoja mamusia i twój tatuś może pomagali ci jeszcze na studiach, bo
> przecież taki śliczny byłeś.
Tatuś już od dawna nie żył, a mamusia tyrała.
> Ale tu nikt za ciebie nie będzie odwalał roboty, to na co możesz liczyć
> (i to jak zadasz jakieś ciekawe pytanie) to jakieś ogólne wskazówki,
no więc prosiłem o napisanie jak w c obejść goto (gosub)
> takie właśnie jak "doucz się jak się programuje, bo jeżeli jedyne co
> potrafisz to goto rodem z Basica to trochę za mało na napisanie
> sensownego programu do obsługi pralki".
ale to nie jest wskazówka. pisanie że goto jest do zastąpienia w inny
sposób już od lat 70 to też nie wskazówka. a analiza mojej rodziny to
już granica dobrego wychowania.
>
>> Pozatym jak pralka miała by urwać rękę albo palce?
>
> Normalnie. Będzie trochę krwi. Prawdopodobnie przeżyjesz, więc na
> nagrodę Darwina się nie załapiesz. A wystarczy że ruszy wirowanie przy
> otwartym bębnie.
i co się wtedy stanie? ruszy a ja z premedytacją wsadzę tam rękę? Po co
to piszesz? Masz w tym jakiś cel? skąd wiesz ile pralek naprawiłem? Nie
wpadłeś na to, że właśnie ta ilość niedziałającej elektroniki skłania
mnie do realizacji pomysłu z arduino?
ToMasz
-
63. Data: 2017-10-31 09:07:47
Temat: Re: programowanie w C - bardzo ogólne pytanie o filozofię. Arduino w roli programatora pralki
Od: Mateusz Viste <m...@w...tell>
On Mon, 30 Oct 2017 21:44:06 +0100, ToMasz wrote:
> ale to nie jest wskazówka. pisanie że goto jest do zastąpienia w inny
> sposób już od lat 70 to też nie wskazówka. a analiza mojej rodziny to
> już granica dobrego wychowania.
Kopiesz się z koniem - nie wygrasz :)
Koń (lub troll) - ma to do siebie że w kopaniu się ma dużą wprawę, tyle
że na tym kończą się jego umiejętności. Nie trać czasu - użyj killfile.
> no więc prosiłem o napisanie jak w c obejść goto (gosub)
Mowa tutaj o pralce, a nie o kontrolerze lotów kosmicznych, więc nie ma
sensu wiele kombinować. Jeśli goto pasuje do tego co chcesz osiągnąć i
działa - nie ma powodu by go nie użyć. Zawsze najsłuszniej korzystać z
narzędzi które się zna i nad którymi ma się kontrolę.
Nie jestem co prawda jednym z tych zagorzałych przeciwników goto, ale sam
raczej w tym kontekście zrobiłbym to inaczej: "program" pralki to nic
innego jak ciąg różnych akcji o pewnej długości. Być może coś takiego
miałoby sens:
void wirowanie(int czas, int szybkosc) {
...
}
void plukanie(int czas, int szybkosc) {
...
}
void grzanie(int temperatura) {
for (;;) {
int t = zmierz_temp_wody();
if (t >= temperatura) break;
wlacz_grzalke();/* grzałka jest "włączana" w kółko, gdyż z */
/* powodów bezpieczeństwa wyłącza się sama */
/* po kilkunastu sekundach bez sygnału */
sleep(5);
}
wylacz_grzalke();
}
void pranie(int czas, int szybkosc) {
...
}
Czyli definiujesz zestaw funkcji które odpowiadają za "podstawowe"
czynności które pralka potrafi wykonać. Następnie programujesz cykle
wywołując powyższe funkcje w odpowiedniej kolejności i ze stosownymi
parametrami:
void program_prawie_czysta_odziez(void) {
grzanie(40);
pranie(600, 600);
plukanie(60, 400);
wirowanie(60, 800);
}
void program_mega_brud(void) {
grzanie(70);
pranie(600, 600);
plukanie(120, 800)
grzanie(70);
pranie(900, 800);
plukanie(120, 800);
wirowanie(60, 1000);
}
void program_moja_flanelowa_koszula(void) {
grzanie(40);
pranie(900, 400);
plukanie(120, 400);
wirowanie(60, 400);
}
Mateusz
-
64. Data: 2017-10-31 11:09:23
Temat: Re: programowanie w C - bardzo ogólne pytanie o filozofię. Arduino w roli programatora pralki
Od: Piotr Gałka <p...@c...pl>
W dniu 2017-10-30 o 15:29, ToMasz pisze:
>
> Jak dlamnie w c++ mogę napisać program, w krórym zawsze, bez wyjątku,
> komputer musi "przerobić" wszystko od a do z, nawet jeśli połowa lub
> więcej nie będzie wykorzystywana. w części niewykorzystywanej będzie if
> cośtam - nierób nic.
> W zasadzie o to pytałem. czy to jest dobry sposób pisania programu w C+?
> (dialekt arduino) Na pierwszy rzut oka to marnortrastwo pracy procesora,
> bo jak właśnie tłumaczę, jeśli w basicu napiszę program ma tylko płukać,
> będzie startował od 10 do 100, gdzie jest program główny i skakał do
> 900-999 gdzie jest płukanie. to samo w c++ będzie U MNIE wymagało
> przejścia - pranie? nie nie pierz, ale sprawdz jak się pierze. płukanie?
> Nie nie płukaj, ale już wiesz jak to należało zrbić? przeczytałeś
> procesorku? no to się śpiesz, bo tam gdzieś na koncu jest płukanie.
>
> O istotę mi chodzi o sens
>
Naszło mnie aby to przeczytać jeszcze raz i jeszcze raz itd...
Czytając:
"pranie? nie nie pierz, ale sprawdz jak się pierze. płukanie?
Nie nie płukaj, ale już wiesz jak to należało zrbić? przeczytałeś
procesorku?"
mam wrażenie, że Ty uważasz, że jak jest
if(warunek)
{
zrób jedno coś;
zrób inne coś;
zrób coś na zakończenie;
}
i warunek jest false to procesor będzie studiował znak po znaku to co
jest napisane w {} szukając } zamykającego blok wykonywany warunkowo.
Otóż nic z tych rzeczy - on od razu skoczy za }
Zapominasz, że kod źródłowy został dawno przeanalizowany przez
kompilator i w programie, który widzi procesor jest po prostu skok w
odpowiednie miejsce gdy warunek jest false.
W programie, który widzi procesor, jest cała masa goto. Różnica jest
taka, że o to aby te skoki były w dobre miejsca dba kompilator a nie
programista.
Jeszcze słówko o pomijaniu kawałków programu w przypadku błędów - bo mam
wrażenie, że to też miejsce gdzie chciałbyś mieć goto.
W prostym przypadku, gdy mamy wykonać serię czynności, ale jak któraś
się nie uda to mamy pominąć pozostałe i na końcu wiedzieć, że był błąd
to zakładając, że mamy serię funkcji z których każda zwraca true jak się
jej udało i false jak się nie udało to można to zapisać np. tak:
bool ok=fun1();
if(ok)ok=fun2();
if(ok)ok=fun3();
if(ok)ok=fun4();
lub krócej:
bool ok = fun1() && fun2() && fun3() && fun4();
gdyż operator && (logiczne and) nie sprawdza wartości tego czego nie
musi - jak np. fun2() da false to on już wie, że wynik całego wyrażenia
będzie false i nie ustala wartości fun3() i fun4() czyli ich nie wykonuje.
I w obu przypadkach jak fun2() zwróci false to procesor nie będzie
czytał dalszego kawałka programu tylko ma w programie skok na koniec tej
sekwencji.
P.G.
-
65. Data: 2017-10-31 18:01:04
Temat: Re: programowanie w C - bardzo ogólne pytanie o filozofię. Arduino w roli programatora pralki
Od: slawek <f...@f...com>
On Mon, 30 Oct 2017 21:44:06 +0100, ToMasz <t...@p...fm.com.pl>
wrote:
> i co się wtedy stanie? ruszy a ja z premedytacją wsadzę tam rękę?
Po co
> to piszesz? Masz w tym jakiś cel? skąd wiesz ile pralek naprawiłem?
Nie
Nie wsadzisz. Bo ona już tam będzie. W środku. I nie wyciągniesz. Bo
czas reakcji człowieka jest dłuższy niż czas pełnego obrotu bębna
przy wirowaniu. Jeżeli ładowana od góry to amputacja, złamanie np.
obu kości przedramienia lub coś w ten deseń. Jeżeli ładowana od
przodu to np. rozerwanie wiązadeł, uszkodzenia stawów, cokolwiek.
A nie da się wyjąć upranych rzeczy nie wkładając łap. No chyba że
będziesz używał szczypiec czy czegoś.
Trochę naoglądałem się ludzi po podobnych wypadkach, np.
rekonstrukcja dłoni bo śmigło w dronie "samo" ruszyło.
-
66. Data: 2017-10-31 18:15:00
Temat: Re: programowanie w C - bardzo ogólne pytanie o filozofię. Arduino w roli programatora pralki
Od: slawek <f...@f...com>
On Tue, 31 Oct 2017 11:09:23 +0100, Piotr
Gałka<p...@c...pl> wrote:
> mam wrażenie
Że aby ładnie takie rzeczy oprogramować to potrzebne są wątki i/lub
kolejka priorytetowa.
Przydałoby się także kopać psa.
A zacząć od przeczytania dobrego podręcznika do C, polecam Sexton
"Język C to proste" i Francuz "C dla AVR" (czy jakoś tak).
I obejrzeć sobie jakiś open source - taki który dobrze działa - pełno
tego wszędzie - to lepsze niż nadęte akademickie przykłady.
-
67. Data: 2017-10-31 18:40:17
Temat: Re: programowanie w C - bardzo ogólne pytanie o filozofię. Arduino w roli programatora pralki
Od: slawek <f...@f...com>
On Mon, 30 Oct 2017 18:56:37 +0100, Piotr
Gałka<p...@c...pl> wrote:
> A może liczą się tylko te podłączone - to wtedy mam jeden :)
Sprawdź sam, ale jeżeli czegoś nie pomyliłem to...
Liczy się, IMO, ile kopi jest używanych w firmie. Czyli jeżeli firma
ma komputer z MSVS Community to ok. Jeżeli dwa takie, to ok. Jeżeli
używasz jako hobbysta i masz to na trzech... to ok. Ale jak jest
sześciu ludzi w firmie i jakieś np. osiem razy zainstalowane VS
Community... to już nie jest ok. Jeżeli to firma, a nie szkoła.
Szkoły nie mają ograniczenia, studenci (do uczenia się) też nie.
Chyba jeszcze research się też łapie na Community. Z drugiej strony
student jako osoba fizyczna się łapie.
Ale np. firma zatrudniająca 100 programistów... No sorry, koszt
licencji 100 sztuk kompilatora to dla niej mały pryszcz. I na
Community się nie załapie.
Zresztą poczytaj sam: wyszukaj Visual Studio Community w Google.
Swego czasu były darmowe wersje Express - każdy mógł używać do czego
chciał - komercjalnie też. Od normalnych różniły się że nie miały
tego i owego. Ale w praktyce i tak miały wszystko co potrzebne. (Z
rzeczy ciekawych a wyciętych to OpenMP). Microsoft chyba przestał te
expressy wypuszczać.
-
68. Data: 2017-10-31 20:32:20
Temat: Re: programowanie w C - bardzo ogólne pytanie o filozofię. Arduino w roli programatora pralki
Od: Piotr Gałka <p...@c...pl>
W dniu 2017-10-31 o 18:40, slawek pisze:
> Zresztą poczytaj sam: wyszukaj Visual Studio Community w Google.
Znalazłem jakąś licencję z której wynika że jak firma:
- ma mniej niż 250 komputerów i jednocześnie
- przychód mniejszy niż 1 mln USD
to nie jest firmą.
A jak nie jest firmą to może gratis używać to na 5 wskazanych komputerach.
Dla open source czy dla edukacji to można nawet jak się jest firmą.
Natomiast tego co piszą o zasadach udostępniania tego co się napisało to
ni w ząb nie rozumiem. Tam coś piszą o zapewnieniu w licencji co
najmniej takiej samej ochrony jak ta licencja, ale nie wiem kiedy.
Ciekawe, czy jak coś napiszę i będę chciał komuś exe udostępnić to też
muszę jakieś licencje wypisywać.
Czy jak przetestuję kod źródłowy i będę chciał udostępnić źródła to już
jest praca nad projektem open-source.
Oczywiście gdzieś sobie zapisuję to hasło i ... może kiedyś, bo teraz
brak czasu.
Zastanawia mnie co to znaczy "wskazany komputer".
Czy to się nie sprowadzi do tego, że nie uda mi się tego zainstalować i
używać na komputerze na którym pracuję - czyli nie połączonym do sieci.
To nie są pytania do grupy tylko takie sobie moje wątpliwości.
P.G.
-
69. Data: 2017-10-31 22:34:23
Temat: Re: programowanie w C - bardzo ogólne pytanie o filozofię. Arduino w roli programatora pralki
Od: ToMasz <t...@p...fm.com.pl>
> Czyli definiujesz zestaw funkcji które odpowiadają za "podstawowe"
> czynności które pralka potrafi wykonać. Następnie programujesz cykle
> wywołując powyższe funkcje w odpowiedniej kolejności i ze stosownymi
> parametrami:
DZIĘKI
ToMasz
-
70. Data: 2017-11-01 03:37:36
Temat: Re: programowanie w C - bardzo ogólne pytanie o filozofię. Arduino w roli programatora pralki
Od: Jacek Radzikowski <j...@s...die.die.die.piranet.org>
On 10/23/17 17:07, ToMasz wrote:
> witam
> bardzo bardzo hobbisticznie zajmuję się arduino. w wolnych chwilach,
> żeby synowi zaszczepić.... Nie. Żeby się nie bał elektroniki. Wpadłem na
> pomysł aby pralkę w której umarła elektronika, naprawić za pomocą
> arduino. Tyle ze ja pokolenie temu programowałem zx spectrum, więc
> jestem skażony na całe życ[...]
Ja bym zaczął od porządnego zdefiniowania problemu: Każde z zadań składa
się z serii kroków, a każdy krok ma określony zestaw wyjść, warunek jaki
musi być spełniony żeby przejść do kolejnego kroku, oraz numer
następnego kroku. Te wszystkie informacje da się opisać jako w miarę
prostą strukturę:
typedef WarunekWyjścia bool (*f)();
struct {
int nastepnyKrok;
int wyjscia[liczbaWyjsc];
int czasTrwania;
WarunekWyjscia funkcjaTestujaca;
} KrokOperacji;
Co oznaczają pola w strukturze:
* nastepnyKrok - to jest indeks w tabeli opisującej zestaw kroków dla
danej operacji, do którego kroku przejeść po spełnieniu warunku wyjścia
dla danego kroku.
* wyjścia - Tabela opisująca stan wyjść dla danego kroku. W najprostszym
przypadku to mogą być wartości jakie należy wysłać na piny
mikrokontrolera: np. pierwszej pozycji w tabeli odpowiada pin sterujący
wolnymi obrotami w lewo. Druga pozycja ro wolne obroty w prawo. Trzecia
to włączenie grzałki, itd. "Wyjścia" mogą też uruchamiać funkcje
wykonujące bardziej skomplikowane operacje. Wszystko zależy od
implementacji.
* czasTrwania - Jeśli ustawione jest na wartość większą od zera, to mówi
przez jak długo ma trwać dany krok. Jeśli ostawione jest na zero, to
wywoływana jest funkcja testująca warunek stopu.
* funkcjaTestująca - funkcja zwracająca true jeśli pralka osiągnęła stan
kiedy można przejść do kolejnego kroku, albo false, jeśli trzeba czekać
dalej (np. sprawdzanie czy temperatura wody osiągnęła wymaganą
temperaturę, albo czy pralka jest napełniona wodą.)
Opis każdej operacji będzie zawarty w tabeli takich struktur,
składającej się w tylu wierszy, ile jest kroków:
struct KrokOperacji operacjaPranie[] = {
{1, {0, 0, 0, 1, .... }, 0, czekajNaNapełnienieBębna}, // napełnij
beben pralki wodą
{2, {1, 0, 0, 0, .... }, 10, NULL}, //kręć powoli silnikiem w lewo
...
};
struct KrokOperacji operacjaWirowanie[] = {
.....
};
itd.
Na pierwszy rzut oka to może wyglądać jak niepotrzebne komplikowanie
sobie życia, ale w rzeczywistości to przekłada się na olbrzymie
uproszczenie programu sterującego, który nie zależy od tego jak są
zdefiniowane operacje. Zmiana w opisie operacji pociągnie za sobą
jedynie zmianę tabeli ja opisującej, bez potrzeby modyfikowania kodu.
Główna pętla programu sterującego będzie wyglądać mniej-więcej w taki
sposób:
void loop() {
switch(operacja) {
case 0: // czekaj na wybranie programu
operacja = wybórOperacji();
krok = 0;
break;
case 1: // pranie
//Funkcja zwróci numer kroku do którego należy przejść. Jeśli
krok = nastepnyKrok(operacjaPranie, krok)
// krok < 0 oznacza koniec operacji i wracamy do wyboru
programu
if(krok < 0)
operacja = 0
break;
case 2: // pranie
krok = nastepnyKrok(operacjaWirowanie, krok)
if(krok < 0)
operacja = 0
break;
... // pozostałe operacje
default:
operacja = 0; // kiedy operacja nie jest zdefiniowana,
powróć do wyboru programu
}
}
//Funkcja sprawdzająca czy użytkownik che uruchomić jakąś operację, i
zwracająca jej indeks.
int wybórOperacji() {
if(wybranePranie)
operacja = 1;
else if (wybraneWirowanie)
operacja = 2;
else ....
....
else
operacja = 0; //w pozostałych przypadkach zawsze wróć do wyboru
operacji
return operacja
}
Tak implementacja głównej pętli jest bardzo rozwlekła, ale zależało mi
na pokazaniu jak ręcznie obsłużyć każdy z programów. Kosztem
niewielkiego zwiększenia skomplikowania tabeli opisującej programy, i
(pozornego) zmniejszenia czytelności głównej pętli, można ją mocno skrócić.
I teraz chyba najważniejsza funkcja programu, wyliczająca następny krok
programu. Jeśli nie nadszedł czas na przejście do następnego, to zwraca
numer obecnego kroku
int nastepnyKrok(struct KrokOperacji *opis, int krok)
{
// jeśli przerywamy program, to wróć do wyboru operacji
if(przerwanieProgramu)
{
zatrzymajPralkę();
return -1;
}
opisKroku = opis[krok]; //opis wykonywanego kroku
//Ustaw wyjścia dla aktualnego kroku.
//Ustawianie wyjść tutaj ma tę zaletę, ze pożądany stan wyjśc będzie
ustawiany przy każdym obiegu pętli. Wadą jest to że ustawianie wyjść
jest wywoływane przy każdym obiegu pętli, co w wyjątkowych sytuacjach
może mieć niepożądane następstwa.
ustawWyjścia(opisKroku.wyjścia);
//jeśli obecna operacja ma trwać określony czas, to sprawdź czy
jeszcze odlicza timer.
if(timerAktywny)
{
if(timer > 0) // czas nie upłynął. Zwróć numer aktualnego kroku
return krok
//Czas upłynął. Zatrzymaj timer i zwróć indeks kolejnego kroku
zatrzymajTimer();
return opisKroku.nastepnyKrok;
}
//Jeśli timer nie jest aktywny, to albo trzeba zbadać warunek
wyjście, albo ustawić timer dla kolejnego kroku.
if(opisKroku.czasTrwania > 0) // krok trwa określony czas)
{
uruchomTimer(opisKroku.czasTrwania);
return krok;
}
//sprawdź warunek wyjścia
if(opisKroku.funkcjaTestujaca())
//funkcja zwróciła true, przechodzimy do kolejnego kroku
return opisKroku.nastepnyKrok
//nic się nie dzieje, pozostajemy dalej w tym samym kroku
return krok
}
Z doprowadzeniem kodu do postaci kompilowalnej i działającej,
zaimplementowaniem obsługi timera odmierzającego czas i funkcji
pomocniczych testujących warunki i ustawiających wyjścia powinieneś
poradzić sobie sam :)
Jacek.