-
1. Data: 2017-10-23 23:07:53
Temat: programowanie w C - bardzo ogólne pytanie o filozofię. Arduino w roli programatora pralki
Od: ToMasz <t...@p...fm.com.pl>
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 życie
Czy w basicu czy w C++, zacząłbym od napisania sekcji, takich jak
pranie, czyli: spawdzenie czy jest woda, czy klapka zamknięta i
obracanie bębnem w prawo i lewo, Wirowanie, czyli znowu - klapa, woda i
dawaj z obracaniem itd. pralkę zaopatrzyłbym w 3 pokrętła. czas prania,
szybkość wirowania i temperatura. użytkownik ustawiałby nimi wartość
zmiennych czas, temp, obr. no i w basicu, każda z sekcji zaczynałby się
w konkretnej lini. pranie 100, płukanie 200, wirowanie 300.
sam program wykonawczy wyglądałby ( w uproszczeniu ) tak:
go to 100 (pranie)
go to 100 (pranie)
go go 100 (pranie)
go to 200 (płukanie)
go to 300 (wirowanie)
nie chcąc komplikować emaila, użyłem 3 zadań, ale ze wzrostem ich
liczby, program w bascu, tylko lekko urośnie. w C++ - nie mam pojęcia
jak to _dobrze_ zrobić. precyzując - zrobię, program wychodzi 2 razy
dłuższy, i to na zasadzie, rób _wszystko_ po kolei (bo nie mogę skakać
po numerach lini), ale jeśli jakiś tam parametr był już
zrobiony(wybrany), to pomiń.... (np płukanie). tak, da się, ale program
robi się znacznie dłuzszy, coraz więcej zmiennych, i tabun if-ów. no nie
wierzę że nieda się tego w C++ zrobić prościej.
Czy moglibyście mi pi razy oko wyjasnić jak to sie w C robi? Tyle ze nie
mogą być to osobne programy zapisane na dysku (do wczytywania w miarę
trwania prania), bo to trzeba na raz wgrać do arduino.
ToMasz
PS
PRalki jeszcze nie tknąłem.
-
2. Data: 2017-10-24 08:29:18
Temat: Re: programowanie w C - bardzo ogólne pytanie o filozofię. Arduino w roli programatora pralki
Od: Janusz <j...@o...pl>
W dniu 2017-10-23 o 23:07, ToMasz pisze:
> witam
> bardzo bardzo hobbisticznie zajmuję się arduino. w wolnych chwilach,
> żeby synowi zaszczepić.... Nie. Żeby się nie bał elektroniki.
Kupić zestaw czujników + wyświetlacz i się bawić z synem.
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
Zły pomysł, tam jest sieć, i do zabawy się to nie nadaje, wpierw trzeba
wymyśleć międzymordzie pomiędzy czujnikami, zaworami, silnikiem a avrduino.
To nie bułka z masłem.
> jestem skażony na całe życie
> Czy w basicu czy w C++, zacząłbym od napisania sekcji, takich jak
W C są funkcje, nie ma numerowania lini bo funkcje identyfikuje sie po
nazwie a nie numerze linii w której występuje.
Poczytaj razem z synem kurs arduino, tam masz to wyjaśnione.
> PRalki jeszcze nie tknąłem.
I dobrze, jeszcze sobie lub dziecku krzywdę zrobisz.
--
Pozdr
Janusz
-
3. Data: 2017-10-24 09:31:16
Temat: Re: programowanie w C - bardzo ogólne pytanie o filozofię. Arduino w roli programatora pralki
Od: Atlantis <m...@w...pl>
W C/C++ możesz z grubsza programować tak, jak to się robiło w Basicu.
Służą do tego etykiety (słowo zakończone dwukropkiem) oraz instrukcja
goto. Tylko moim zdaniem nie ma to większego sensu - instrukcja ta
przydaje się sporadycznie (choć w pewnych sytuacjach faktycznie się
przydaje), a jej nadużywanie drastycznie zmniejsza czytelność kodu. Są
tacy, których zdaniem nie powinno się jej używać w ogóle.
Programowanie strukturalne albo obiektowe jest dużo bardziej naturalnym
rozwiązaniem od tego, z czym ma się do czynienia w Basicu albo
asemblerze. Dlatego warto jak najszybciej pozbyć się starych przyzwyczajeń.
-
4. Data: 2017-10-24 10:15:42
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-24 o 09:31, Atlantis pisze:
> W C/C++ możesz z grubsza programować tak, jak to się robiło w Basicu.
> Służą do tego etykiety (słowo zakończone dwukropkiem) oraz instrukcja
> goto. Tylko moim zdaniem nie ma to większego sensu - instrukcja ta
> przydaje się sporadycznie (choć w pewnych sytuacjach faktycznie się
> przydaje), a jej nadużywanie drastycznie zmniejsza czytelność kodu. Są
> tacy, których zdaniem nie powinno się jej używać w ogóle.
>
Nigdy nie zdarzyło mi się mieć potrzeby użycia w C instrukcji goto, ba,
nawet jakby mnie ktoś poprosił o wymienienie wszystkich instrukcji
dostępnych w C to chyba bym sobie o niej nie przypomniał, a używam
(sporadycznie i nie do mikrokontrolerów) C gdzieś tak od 1986r.
Tak się zastanawiam do czego ona mogła by być przydatna i nie bardzo
potrafię wymyślić jakiś przykład generujący realną taką potrzebę.
A jeśli już w ogóle to chyba tylko wewnątrz jednej funkcji do jakiegoś
rozwikłania czegoś co w przeciwnym wypadku wymagało by albo dwukrotnego
napisania kilku linijek programu, albo ujęcia ich w kolejną wywoływaną
funkcję.
Na pewno wybrałbym jedno z tamtych rozwiązań, a nie goto, choćby
dlatego, że nie pamiętam o jego istnieniu.
P.G.
-
5. Data: 2017-10-24 10:49:14
Temat: Re: programowanie w C - bardzo ogólne pytanie o filozofię. Arduino w roli programatora pralki
Od: "J.F." <j...@p...onet.pl>
Użytkownik "ToMasz" napisał w wiadomości grup
dyskusyjnych:osllnb$psp$...@d...me...
>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.
Na tym poziomie zaawansowania ... kup nowa pralke :-)
Ale na starej mozesz pocwiczyc - przyda sie do nowej, jak sie zepsuje
:-)
>Czy w basicu czy w C++, zacząłbym od napisania sekcji, takich jak
>pranie, czyli: spawdzenie czy jest woda, czy klapka zamknięta i
>obracanie bębnem w prawo i lewo, Wirowanie, czyli znowu - klapa, woda
>i dawaj z obracaniem itd. pralkę zaopatrzyłbym w 3 pokrętła. czas
>prania,
A tu choroba "przerwania" przychodza - zona chce program zmienic, albo
zapomniany ciuch dorzucic.
>sam program wykonawczy wyglądałby ( w uproszczeniu ) tak:
>go to 100 (pranie)
go sub chyba ... tak, zeby mogl wrocic.
>go to 100 (pranie)
>go go 100 (pranie)
>go to 200 (płukanie)
>go to 300 (wirowanie)
>Czy moglibyście mi pi razy oko wyjasnić jak to sie w C robi? Tyle ze
>nie
Ilu programistow, tyle metod.
J>
-
6. Data: 2017-10-24 10:56:23
Temat: Re: programowanie w C - bardzo ogólne pytanie o filozofię. Arduino w roli programatora pralki
Od: "HF5BS" <h...@...pl>
Użytkownik "Piotr Gałka" <p...@c...pl> napisał w
wiadomości news:osmsrd$mk1$1$PiotrGalka@news.chmurka.net...
>W dniu 2017-10-24 o 09:31, Atlantis pisze:
>> W C/C++ możesz z grubsza programować tak, jak to się robiło w Basicu.
>> Służą do tego etykiety (słowo zakończone dwukropkiem) oraz instrukcja
>> goto. Tylko moim zdaniem nie ma to większego sensu - instrukcja ta
>> przydaje się sporadycznie (choć w pewnych sytuacjach faktycznie się
>> przydaje), a jej nadużywanie drastycznie zmniejsza czytelność kodu. Są
>> tacy, których zdaniem nie powinno się jej używać w ogóle.
>>
>
> Nigdy nie zdarzyło mi się mieć potrzeby użycia w C instrukcji goto, ba,
> nawet jakby mnie ktoś poprosił o wymienienie wszystkich instrukcji
> dostępnych w C to chyba bym sobie o niej nie przypomniał, a używam
> (sporadycznie i nie do mikrokontrolerów) C gdzieś tak od 1986r.
Ja w basicu też mniej-więcej tak. Przyznaję, używałem, w różnych dialektach.
Głównie w sytuacji, gdy np. finalizowałem program i np. trzeba było
przeskoczyć baterię podprogramów (tak, jak najbardziej daje sie programować
strukturalnie, obiektowo? Przyznam, że nie wiem, musiałbym poznać, co to), a
upraszczało to program... Albo z lenistwa :)
>
> Tak się zastanawiam do czego ona mogła by być przydatna i nie bardzo
> potrafię wymyślić jakiś przykład generujący realną taką potrzebę.
Na szybko, z numerami linii, trochę lenistwa (jak np. coś się rzeźbiło
ad-hoc, nie szkoda róż, gdy płonie las, jak szkoda było czasu na
grzeczności)
10 coś-tam
20 gdzieś tam
25 IF n=7 GOTO 50
30 GOSUB 100: REM drapanie po tyłku
40 GOSUB 200: REM klepanie po ramieniu
50 END: REM kończymy program, można zastosować, robiło się IF n=7 THEN END
100 podrap mnie: RETURN
200 poklep mnie: RETURN
Czasami szybciej było tak "na chama", niż tworzyć dodatkowo zestaw procedur.
Poza tym, zajmowało mniej pamięci, niewiele, czasem było to decydujące, jak
program był na styk w pamięci, co w małych komputerkach było całkiem częste.
> A jeśli już w ogóle to chyba tylko wewnątrz jednej funkcji do jakiegoś
> rozwikłania czegoś co w przeciwnym wypadku wymagało by albo dwukrotnego
> napisania kilku linijek programu, albo ujęcia ich w kolejną wywoływaną
> funkcję.
Różnie, często z lenistwa, ale też często z braku (poza GOSUB/GO SUB -
zależnie od dialektu) mechanizmu wspierającego strukturalność w wielu
dialektach BASICa.
Pierwsze możliwości trafiłem w QBASIC M$, gdzie zresztą linie programu są
już w rzeczywistości etykietami i tak przez interpreter uważane. Gdzie
jawnie można już było używać etykiet, już chyba od GWBASICa była też
rozszerzona instrukcja IF: (nie pomnę teraz dokładnej składni, ale mniej
więcej...)
IF n=7
podrap mnie po głowie
powiedz coś miłego
mozna było zagnieżdżać pętle
ENDIF
Jeszcze pętle WHILE-WEND, co dialekt, to inaczej.
> Na pewno wybrałbym jedno z tamtych rozwiązań, a nie goto, choćby dlatego,
> że nie pamiętam o jego istnieniu.
No, gdybym od początku tak mógł..., zresztą nawet wszelkie pisemka
pyszczyły, aby unikać goto, żeby działać strukturalnie, dzięki czemu np. w
razie zmiany jakiegoś komponentu przegrzebać trzeba będzie tylko jego
podprogram, zamiast rzeźbić ponownie całość, taka konstrukcja modułowa.
Zresztą, dla zabawy bawiłem się (tautologia, wiem), w programowanie
strukturalne używając tylko goto, bez gosub i innych procedur definiowanych.
Dzisiaj... chyba już mi się nie bardzo chce, bo się nie bawię...
Sporadycznie...
--
Psy kochają przyjaciół i gryzą wrogów,
w odróżnieniu od ludzi, którzy niezdolni są do czystej miłości
i zawsze muszą mieszać miłość z nienawiścią.
(C) Zygmunt Freud.
-
7. Data: 2017-10-24 11:22:51
Temat: Re: programowanie w C - bardzo ogólne pytanie o filozofię. Arduino w roli programatora pralki
Od: Janusz <j...@o...pl>
W dniu 2017-10-24 o 10:15, Piotr Gałka pisze:
> W dniu 2017-10-24 o 09:31, Atlantis pisze:
>> W C/C++ możesz z grubsza programować tak, jak to się robiło w Basicu.
>> Służą do tego etykiety (słowo zakończone dwukropkiem) oraz instrukcja
>> goto. Tylko moim zdaniem nie ma to większego sensu - instrukcja ta
>> przydaje się sporadycznie (choć w pewnych sytuacjach faktycznie się
>> przydaje), a jej nadużywanie drastycznie zmniejsza czytelność kodu. Są
>> tacy, których zdaniem nie powinno się jej używać w ogóle.
>>
>
> Nigdy nie zdarzyło mi się mieć potrzeby użycia w C instrukcji goto, ba,
> nawet jakby mnie ktoś poprosił o wymienienie wszystkich instrukcji
> dostępnych w C to chyba bym sobie o niej nie przypomniał, a używam
> (sporadycznie i nie do mikrokontrolerów) C gdzieś tak od 1986r.
>
> Tak się zastanawiam do czego ona mogła by być przydatna i nie bardzo
> potrafię wymyślić jakiś przykład generujący realną taką potrzebę.
Znalazłby się, np wyjście z podwójnej pętli, breakiem wyjdziesz tyle że
pętlę wyżej gdzie musisz testować warunek dalszego wyjścia, jak widzisz
zaciemnia się kod i robi się to mało eleganckie.
--
Pozdr
Janusz
-
8. Data: 2017-10-24 11:24:17
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-23 o 23:07, ToMasz pisze:
> Czy moglibyście mi pi razy oko wyjasnić jak to sie w C robi? Tyle ze nie
> mogą być to osobne programy zapisane na dysku (do wczytywania w miarę
> trwania prania), bo to trzeba na raz wgrać do arduino.
>
W C zrobisz np. tak:
int obroty(int kierunek,int czas)
{
// tu sterowanie silnikiem i odmierzenie czasu
}
int pranie(int cykli)
{
int i;
int err;
for(i=0;i<cykli;i++)
{
err=obroty(0,5); // w lewo, przez 5 sekund
if(err!=0)return err;
err=obroty(1,5); // w prawo, przez 5 sekund
if(err!=0)return err;
}
return 0; // oznacza że się udało bez błędów
}
//podobnie
int plukanie(int cykli)
{
}
int wirowanie(int czas, int predkosc)
{
}
//i całość
void main()
{
int err;
err=wlewanie_wody();
if(err==0)err=pranie(50);
if(err==0)err=plukanie(5);
if(err==0)err=wirowanie(20,1000);
if(err!=0)mrugaj_czerwownym_LEDem_w_nieskonczonosc()
;
zapal_LED_koniec_prania();
}
Użyłem int jako err bo ogólnie błędom można nadać różne numery i je
rozróżniać.
Ale jak jest tylko zero/jedynkowo to czytelniej byłoby wszędzie gdzie
jest err zamiast int użyć bool.
Ja zaczynałem się uczyć C od książki Kernighan, Ritche "Język C", ale to
było wieki temu. Nie mam pojęcia czy teraz jest coś lepszego aby zacząć
od podstaw.
Ale na pewno warto - choćby dla swojego samorozwoju.
Z tym, że ja uważam, że nie koniecznie trzeba zaprzęgać C do hardawre'u.
Równie dobrze można korzystać z komputera samego w sobie.
Zadanie 1 ode mnie:
1.Napisz program do wypisywania na ekranie kolejnych liczb pierwszych
(np. do 100, a jak już będzie działał to zmień zakres na 1000).
2.Otocz go pomiarem czasu wykonania - czyli jak kończy to wypisuje ile
mu to zajęło.
3.Rozdziel proces wyliczania od procesu wypisywania liczb pierwszych
(czyli wyniki zbieraj w buforze i potem wypisuj z bufora).
4.Zamiast wypisywać liczby pierwsze wypisz tylko ich liczbę (wiesz ile
zebrałeś ich w buforze). Możesz zwiększyć zakres poszukiwania - może do
10000.
5.Zastanów się co można zmienić w algorytmie aby program liczył szybciej
- masz gotowe narzędzie do sprawdzenia czy pomysł jest dobry, czy zły, a
wypisywanie liczby znalezionych liczb ma wykryć sytuacje, gdyby
modyfikacja algorytmu coś w nim zepsuła i jednocześnie nie zajmuje czasu
wypisywaniem wszystkich liczb, bo obsługa ekranu jest czasochłonna
Ewentualne zadanie 2 (moim zdaniem trudniejsze):
Mieliśmy kiedyś taką grę "samotnik" (jest pewnie wiele typów). Trójkąt -
w dolnej linii 5 dziurek, w następnej 4 itd aż na górze jedna. Wkłada
się w to pionki zostawiając jedną dziurkę wolną i następnie zbija je jak
w warcabach. Celem jest aby został tylko jeden pionek.
Mój, wtedy chyba 7 letni, syn się bardzo irytował, że to nigdy nie da
się zrobić i pytał, czy ja umiem. Powiedziałem mu, że ja takie problemy
rozwiązuję inaczej. Usiedliśmy przy komputerze i po około 2h miałem
program (w międzyczasie tłumaczyłem dziecku mniej więcej jak zapisuję to
zadanie (obrazkowo na papierze, a nie w kodzie)), który dla każdego
stanu początkowego wyszukiwał wszystkie sekwencje prowadzące do sukcesu.
Mój program składał się z 13-tu zagłębionych pętli for(). Każda pętla
wykonywała jeden ruch i wołała kolejną (chyba, że ruch już nie był
możliwy). Jak dochodziło do ostatniej i ona mogła wykonać ruch to
oznaczało sukces.
Jak już to miałem to użyłem tej procedury do policzenia ile sekwencji
kończy się sukcesem w każdej z 4 sytuacji początkowych (inne są
symetryczne) z tego wyszło, z jakiej zaczynać aby mieć największą
szansę. A potem dla każdej sytuacji wydrukowałem po 10 sekwencji
prowadzących do celu i on już sam je sobie "w realu" przećwiczył i
bardzo mu się podobało, że nareszcie ta wkurzająca gra została pokonana.
P.G.
-
9. Data: 2017-10-24 11:39:25
Temat: Re: programowanie w C - bardzo ogólne pytanie o filozofię. Arduino w roli programatora pralki
Od: ajt <a...@a...com.pl>
W dniu 2017-10-24 o 10:15, Piotr Gałka pisze:
> Nigdy nie zdarzyło mi się mieć potrzeby użycia w C instrukcji goto, ba,
> nawet jakby mnie ktoś poprosił o wymienienie wszystkich instrukcji
> dostępnych w C to chyba bym sobie o niej nie przypomniał, a używam
> (sporadycznie i nie do mikrokontrolerów) C gdzieś tak od 1986r.
>
> Tak się zastanawiam do czego ona mogła by być przydatna i nie bardzo
> potrafię wymyślić jakiś przykład generujący realną taką potrzebę.
Mam podobny staż i też nie używam goto, ale jedyny raz to zrobiłem w
pewnym konkretnym przypadku. Musiałem zaimplementować algorytm liczenia
pierwiastków zespolonych wielomianu dowolnego stopnia. W jakiejś książce
znalazłem gotową procedurę w Fortranie. Kod był strasznie pokręcony i
miał powtykane goto w wielu różnych miejscach, np. w ten sposób było
zrobione wyjście z pętli, ale i wskoczenie do pętli w inne miejsce po
spełnieniu jakiegoś warunku na zewnątrz. Próbowałem to przerobić na
jakąś czytelniejszą postać, ale w końcu się poddałem i mechanicznie
przepisałem na C, wraz ze wszystkimi goto. Poszło od pierwszego razu,
więc nie chciało mi się już później przy tym grzebać :)
--
Pozdrawiam
Andrzej
www.radom.city
-
10. Data: 2017-10-24 11:45:09
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-24 o 10:56, HF5BS pisze:
>
>> Nigdy nie zdarzyło mi się mieć potrzeby użycia w C instrukcji goto,
>> ba, nawet jakby mnie ktoś poprosił o wymienienie wszystkich instrukcji
>> dostępnych w C to chyba bym sobie o niej nie przypomniał, a używam
>> (sporadycznie i nie do mikrokontrolerów) C gdzieś tak od 1986r.
>
> Ja w basicu też mniej-więcej tak. Przyznaję, używałem, w różnych
> dialektach.
> Głównie w sytuacji, gdy np. finalizowałem program i np. trzeba było
> przeskoczyć baterię podprogramów (tak, jak najbardziej daje sie
> programować strukturalnie, obiektowo? Przyznam, że nie wiem, musiałbym
> poznać, co to), a upraszczało to program... Albo z lenistwa :)
>
>>
>> Tak się zastanawiam do czego ona mogła by być przydatna i nie bardzo
>> potrafię wymyślić jakiś przykład generujący realną taką potrzebę.
>
To jest wypowiedź w kontekście mojego poprzedniego zdania - czyli piszę
o języku C.
> Na szybko, z numerami linii, trochę lenistwa (jak np. coś się rzeźbiło
> ad-hoc, nie szkoda róż, gdy płonie las, jak szkoda było czasu na
> grzeczności)
>
> 10 coś-tam
> 20 gdzieś tam
> 25 IF n=7 GOTO 50
> 30 GOSUB 100: REM drapanie po tyłku
> 40 GOSUB 200: REM klepanie po ramieniu
> 50 END: REM kończymy program, można zastosować, robiło się IF n=7 THEN END
> 100 podrap mnie: RETURN
> 200 poklep mnie: RETURN
>
A Ty odpowiadasz jakbym napisał, że w BASICU nie używałem GOTO.
Akurat w BASICU (na Commodore 64) używałem.
P.G.