eGospodarka.pl
eGospodarka.pl poleca

eGospodarka.plGrupypl.misc.elektronikaprogramowanie w C - bardzo ogólne pytanie o filozofię. Arduino w roli programatora pralki
Ilość wypowiedzi w tym wątku: 79

  • 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.

strony : 1 ... 6 . [ 7 ] . 8


Szukaj w grupach

Szukaj w grupach

Eksperci egospodarka.pl

1 1 1

Wpisz nazwę miasta, dla którego chcesz znaleźć jednostkę ZUS.

Wzory dokumentów

Bezpłatne wzory dokumentów i formularzy.
Wyszukaj i pobierz za darmo: