Kanał - ATNEL tech-forum
Wszystkie działy
Najnowsze wątki



Teraz jest 18 lis 2018, o 15:31


Strefa czasowa: UTC + 1





Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 21 ] 
Autor Wiadomość
PostNapisane: 8 lis 2018, o 12:53 
Offline
Nowy
Avatar użytkownika

Dołączył(a): 04 gru 2017
Posty: 10
Pomógł: 0

Witam.

Chce dodać opcje, która będzie uruchamiać / wyłączać pompke przy odpowiednich warunkach. Wpisuje liczbe i od razu włącza mi się pompka (nawet nie zatwierdzę i działa ciągle, nawet jak wracam do głównego menu), a moim celem jest żeby pompka działała zależnie od wilgotności. Kod do pomiaru ADC działa poprawnie, jednak tu mam kłopot.

Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


Potraficie mi coś doradzić, bo niestety męczę sie nad tym troche? Jak przechodzę do tej pozycji menu, wpisuje liczbe i zatwierdzam to pompka się włącza niezależnie od wskazania czujnika i działa non stop. Próbowałem to jakoś rozwiązać, ale bez skutku. Z góry dziękuję i pozdrawiam. :oops: :oops:



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 9 lis 2018, o 15:11 
Offline
Użytkownik

Dołączył(a): 05 gru 2017
Posty: 58
Pomógł: 1

Witaj KampoPampo

Nie jestem mocny w te klocki ale postaram się Ci pomóc
tak przeglądałem twój kod i wpadł mi w oko pewien fragment twojego kodu

Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


nie uważasz że ten if jest dziwny bo oznacza - jeśli result jest większy od 0 i result jest mniejszy lub równy 100
dla mnie to niewiadoma tak jak myślę dla procka również bo jaka ta zmienna ma być albo większa od 0 albo mniejsza lub równa 100
i z czym porównać skoro to ta sama zmienna

jak myślisz nie powinno to wyglądać tak if (result>0 || result <=100)
co oznacza jeśli result jest większy od 0 lub result jest mniejszy lub równy 100

troszkę więcej w tym sensu jak myślisz?
Wybacz za wymądrzanie się początkującego



Ostatnio edytowano 10 lis 2018, o 15:14 przez miki53, łącznie edytowano 1 raz

Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 9 lis 2018, o 15:51 
Offline
Tech-support
Avatar użytkownika

Dołączył(a): 26 sty 2016
Posty: 733
Lokalizacja: Kraków
Pomógł: 62

miki53 napisał(a):
ak myślisz nie powinno to wyglądać tak if (result>0 || result <=100)
co oznacza jeśli result jest większy od 0 lub result jest mniejszy lub równy 100
Ale ten warunek "łapie" również wartości mniejsze od zera (bo spełniają warunek result <= 100) i większe od 100 (no bo przecież 101 jest większe od 0).
Tak że ten warunek zapisany przez kolegę @KampoPampo jest dobrze zapisany.

Natomiast reszty kodu nie rozumiem... strasznie chaotycznie to napisane... brakuje funkcji check_result(result)... brakuje pętli głównej programu... co to za zmienna liczba? A a? dałoby się uniknąć instrukcji goto (swoją drogą baaardzo zły nawyk)... wielokrotnie zagnieżdżone warunki - i może gdzieś w tym zagnieżdżeniu jest problem, ale nie umiem go znaleźć



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 9 lis 2018, o 18:27 
Offline
Tech-support
Avatar użytkownika

Dołączył(a): 01 lis 2015
Posty: 1387
Lokalizacja: okolice Warszawa
Pomógł: 141

prawie 200 wyświetleń i żadnej konkretnej podpowiedzi. :?
Powodem jest mało czytelny kod.
nie widzę np. dokąd prowadzi nieszczęsne "goto skok;".
nie widać wartości liczba.
bardzo ciężko przeanalizować - nawet ze szklaną kulą. :?



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 10 lis 2018, o 02:09 
Offline
Użytkownik

Dołączył(a): 05 gru 2017
Posty: 58
Pomógł: 1

Witam kolegę Marhef

chciałbym się zapytać czy na pewno ten warunek który napisał
kolega KampoPampo w swoim kodzie jest poprawny ?
bo jeśli nie to nie przeczytałeś uważnie mojego postu

if (result>0 && result <=100)

Myślę że w ten sposób nie można porównywać tą samą zmienną
z różnymi wartościami ?

Ale to tylko moja opinia

Tak się pytam dla własnej nauki i wiedzy

Reszta kodu jest mało czytelna i fragmentaryczna trudna do przeanalizowania
jak wspomniał kolega Daro69



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 10 lis 2018, o 09:13 
Offline
Tech-support
Avatar użytkownika

Dołączył(a): 01 lis 2015
Posty: 1387
Lokalizacja: okolice Warszawa
Pomógł: 141

Witam,
Podpowiem.
if( a > 0 && a <=100) // zamień operator logiczny && na wyraz 'jednocześnie, oraz, także..'. oba przyrównanie muszą być spełnione jednocześnie.
if( a > 0 || a < 100) // zamień operator na wyraz ' albo, lub, ewentualnie'. musi być spełnione co najmniej jedno przyrównanie, mogą oba.
Pozdrawiam
.........................................20:10.10/11/2018..................................
dopiszę jeszcze w tym poście bo szkoda miejsca.
w pierwszym if'ie, warunek jest spełniony dla 'a' większego od '0' ale nie większego od '100'. !!!
w drugim if'ie, warunek jest spełniony zawsze. (tak jak niżej napisał kolega "SylwekK" ). ponieważ każda wartość jest albo większa od 0, albo mniejsza równa 100. a ten if sprawdza czy a > 0(czy jest liczbą dodatnią). Jeżeli nawet nie jest, to jeszcze sprawdza bo być może jest mniejsze równe 100.
@miki53, napisz wartość która nie jest większa od 0 i jednocześnie nie jest mniejsza równa od 100. :idea:

Wysłane z mojego Lenovo K33a42 przy użyciu Tapatalka
.........................................21:17 10/11/2018...................................
żeby nie zaśmiecać wątku - konsekwentnie w tym poście dografuję, może pomoże. choć to i tak off top wątku. :roll:
Obrazek



Ostatnio edytowano 10 lis 2018, o 21:21 przez Daro69, łącznie edytowano 2 razy

Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 10 lis 2018, o 14:34 
Offline
Użytkownik

Dołączył(a): 05 gru 2017
Posty: 58
Pomógł: 1

Kolego KampoPampo

na samym początku zmień warunek if (result>0 && result <=100) czyli if (result>0 i result <=100)
jak widzisz ta sama zmienna jest porównywana nie może przyjąć -- dwóch -- równych wartości w tym samym czasie
bo to jest jedna i ta sama zmienna a nie dwie różne zmienne które chcesz porównać
warunek zawsze będzie nie spełniony

zamień go na warunek if (result>0 || result <=100) czyli if (result>0 lub result <=100)
warunek będzie spełniony jeśli zmienna result będzie większa od 0 -- lub -- mniejsza lub równa 100


przyjrzyj się jeszcze warunkowi if ( wilg >= liczba ) jaka jest wartość zmiennej - wilg - i zmiennej - liczba -
dlaczego ten warunek Ci przepuszcza i włącza pompkę

Na razie tylko tyle mogę pomóc może gdybyś wstawił większy fragment kodu to mógłbym pomóc bardziej



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 10 lis 2018, o 15:40 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 22 paź 2013
Posty: 1501
Lokalizacja: Lipsko
Pomógł: 107

No nie, co za bzdury... Jeśli wstawi tam "lub" to każda wartość łapie się w warunek.

_________________
http://www.sylwekkuna.com



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 10 lis 2018, o 20:20 
Offline
Tech-support
Avatar użytkownika

Dołączył(a): 26 sty 2016
Posty: 733
Lokalizacja: Kraków
Pomógł: 62

kolego miki53, tego, co napisałem wcześniej, jestem w 100% pewny. Zauważ, że sprawdzasz, czy zmienna result jest w przedziale od 0 do 100. Więc sprawdzasz oba warunki z operatorem &&.
Tak, żeby przybliżyć:
result > 0 && result <= 100:
Sprawdźmy dla kilku liczb:
5: 5 > 0 && 5 <= 100 -> wartość logiczna prawda (prawda and prawda = prawda)
99: 99 > 0 && 99 <= 100 -> wartość logiczna prawda (prawda and prawda = prawda)
101 : 101 > 0 && 101 <= 100 -> wartość logiczna fałsz (prawda and fałsz = fałsz)
A teraz result > 0 || result <= 100:
5: 5 > 0 || 5 <= 100 -> wartość logiczna prawda (prawda or prawda = prawda)
101: 101 > 0 || 101 <= 100 -> wartość logiczna nadal prawda (prawda or fałsz = prawda)
Też tego kiedyś tego nie rozumiałem. Ale tak to działa. I działa dobrze ;)



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 10 lis 2018, o 20:50 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 22 paź 2013
Posty: 1501
Lokalizacja: Lipsko
Pomógł: 107

Albo jeszcze inaczej. Dwa warunki, a pomiędzy nimi "&&" można rozbić na sekwencję jak poniżej czyli warunek zagnieżdżony:

Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

Natomiast w przypadku znaku "||" mamy coś takiego:


Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


Widać subtelną różnicę?

W drugim przypadku każde badanie uruchamia wykonanie "czegoś tam", a w pierwszym tylko jeśli faktycznie jeśli będzie zakres spełniony.

Swoją drogą takie rozbijanie warunków "AND" w Bascomie na pojedyncze bardzo zmniejszał kod. Nie wiedzieć czemu normalne użycie AND w jednej linii koszmarnie wydłużał program.

_________________
http://www.sylwekkuna.com



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 11 lis 2018, o 12:16 
Offline
Nowy
Avatar użytkownika

Dołączył(a): 04 gru 2017
Posty: 10
Pomógł: 0

Dałem ciała i dyskusja poszła w inną stronę, ale nie uważam, że podpowiedzi odnośnie ustawiania warunków są złe. Zacznę od zawarcia kilku istotnych funkcji, które mogą wyjaśnić wam przyczynę mojego problemu, bo tak jak było podane, nawet ze szklanej kuli się tego nie wyczyta.. Czy coś.. :oops:

Funkcja check_result()
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


Rozpisanie działania klawiszy ze zmienną a
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


Funkcja read_keypad() sprawdza kolejno wszystkie przyciski klawiatury i zwraca numer pierwszego wciśniętego przycisku, albo zero, gdy żaden przycisk nie został wciśnięty. Jest to instrukcja działania klawiatury matrycowej.

Funkcji ADC nie dodaje bo to, sam odczyt z adc jest prawidłowy, jednakże może gdzieś jest problem z wartością wilg.
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


Pętla główna
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


Zmienne

Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


Mam nadzieję, że nic nie pominąłem.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 11 lis 2018, o 14:19 
Offline
Użytkownik

Dołączył(a): 05 gru 2017
Posty: 58
Pomógł: 1

Dostało mi się ale to nic przynajmniej jakoś się ten post rozruszał

Ale i dobrze bo i dla mnie z tego jakaś nauka wypłynie

wytłumaczcie mi jak można porównać jedną i tą samą zmienną z nią samą, nawet gdyby zmieniała
się jej wartość?

dla jasności zmienna result = result wartość z lewej strony będzie się równała wartości z prawej str.
dla mnie to wygląda tak mam zmienną resuit o wartości 5 i teraz to porównaj - ale z czym z nią samą
jeśli nawet porównam z nią samą to zawsze będzie równa samej sobie - masło maślane

gdybym przyjął do porównania result porównaj z result_1 to są dwie różne zmienne które można porównać i to jest OK

Czy znowu się mylę?



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 11 lis 2018, o 14:55 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 22 paź 2013
Posty: 1501
Lokalizacja: Lipsko
Pomógł: 107

Zobacz jeszcze raz mój post. Tam nie ma porównania zmiennej samej ze sobą. Te operatory logiczne powodują, że porównania ze zmienną użytą w warunku za każdym razem jest osobnym działaniem. Nie wiem jak Ci to prościej wytłumaczyć.

_________________
http://www.sylwekkuna.com



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 11 lis 2018, o 16:07 
Offline
Użytkownik

Dołączył(a): 25 lip 2013
Posty: 1623
Pomógł: 78

I pamiętaj że jedno '=' oznacza przypisanie w języku C!



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 11 lis 2018, o 20:58 
Offline
Tech-support
Avatar użytkownika

Dołączył(a): 26 sty 2016
Posty: 733
Lokalizacja: Kraków
Pomógł: 62

Zerknąłem w kod...
Po co funkcja check_result?
Funkcję read_key można by zrobić na instrukcji switch, mam wrażenie, że byłoby łatwiej.
Tak, jak pisałem wcześniej, zrezygnowałbym z instrukcji goto, to zły nawyk.
Napisz, jak ma program działać, może napiszemy go w inny sposób?



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 11 lis 2018, o 21:48 
Offline
Nowy
Avatar użytkownika

Dołączył(a): 04 gru 2017
Posty: 10
Pomógł: 0

Funkcja check_result jest po to, aby wartość wpisana i zatwierdzona na klawiaturze, została zapisana do zmiennej. Przetestowałem tę opcje i działa dobrze.
read_key stworzyłem tak, żeby odczytywało wartość z klawiatury, może na switchach byłoby łatwiej ale jakoś się nad tym nie skupiałem, ponieważ nie sądziłem, że może wpływać na opisany przeze mnie problem.
Instrukcje goto wiem, że jest beznadziejnym rozwiązaniem, ale użyłem to po to, żeby poruszać się łatwo po menu (powrót do głównego menu oraz powrót do początku wyboru wilgotnosci.

Teraz o działaniu programu. Działanie jego ma być następujące. Z głównego menu wybieram opcje A - podlewanie zależne od wilgotnosci. Przechodzę do punktu menu WILGOTNOŚĆ i program prosi mnie o wpisanie wartości wilgotności (wartość zapisuje się do result, czujnik podłączony pod ADC). Zatwierdzam liczbe i program uruchamia pompkę jeśli wartość wilgotności na czujniku jest mniejsza od wpisanej. I tak cały czas do zatrzymania działania.

To działa jako wykasowanie danych.

Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


A to jest powrót do głównego menu

Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 11 lis 2018, o 21:58 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 22 paź 2013
Posty: 1501
Lokalizacja: Lipsko
Pomógł: 107

Porównujesz tam widzę "wilg i liczba", a nie widzę aby result był przepisany do zmiennej liczba. Tak ma być?
Sorki, ale strasznie chaotycznie wydaje mi się napisany program i jego analiza jest po prostu koszmarna jak dla mnie.

_________________
http://www.sylwekkuna.com



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 11 lis 2018, o 22:01 
Offline
Tech-support
Avatar użytkownika

Dołączył(a): 01 lis 2015
Posty: 1387
Lokalizacja: okolice Warszawa
Pomógł: 141

witam,
KampoPampo napisał(a):
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

czy nie chodzilo o
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

trochę miesza mi się. :?



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 12 lis 2018, o 10:35 
Offline
Nowy
Avatar użytkownika

Dołączył(a): 04 gru 2017
Posty: 10
Pomógł: 0

Daro69 napisał(a):
witam,
KampoPampo napisał(a):
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

czy nie chodzilo o
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

trochę miesza mi się. :?



Początkowo było tak i spełniało swoje działanie, ale dodałem zmienna liczba, bo myślałem, że to pomoże jakoś w odczycie wyniku z result.

Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


Za bardzo utrudniam. Proszę o wybaczenie :cry:



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 15 lis 2018, o 15:16 
Offline
Nowy
Avatar użytkownika

Dołączył(a): 04 gru 2017
Posty: 10
Pomógł: 0

Próbowałem dodać jakieś usprawnienia, ale problem cały czas jest ten sam, gdyż po zatwierdzeniu jakiejkolwiek wartości z klawiatury (od 1 do 100) pompka włącza się i działa cały czas nie reagując na Zmiany wartości wilgotności. Chciałbym wiedzieć o co chodzi, ale nie wiem. Jest ktoś w stanie podrzucić jakąś wskazówkę, bo na razie nie daje rady tego rozwiązać. Bardzo dziękuję za wcześniejsze odpowiedzi.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 15 lis 2018, o 15:29 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 22 paź 2013
Posty: 1501
Lokalizacja: Lipsko
Pomógł: 107

Zrób tryb debugowania na lcd. Wyślij tam wszystkie istotne zmienne na czas testów i obserwuj co się dzieje. Ja tak robię z każdym bardziej skomplikowanym programem, a i w prostszych też szybko można zlokalizować błąd - np. jeśli coś pisze pod tiny13 to najpierw pisze to na mega32 z lcd i jeśli algorytm działa dopiero robię konwersję na inny procek.

_________________
http://www.sylwekkuna.com



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
Wyświetl posty nie starsze niż:  Sortuj wg  
Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 21 ] 

Strefa czasowa: UTC + 1


Kto przegląda forum

Użytkownicy przeglądający ten dział: Brak zidentyfikowanych użytkowników i 1 gość


Nie możesz rozpoczynać nowych wątków
Nie możesz odpowiadać w wątkach
Nie możesz edytować swoich postów
Nie możesz usuwać swoich postów
Nie możesz dodawać załączników

Szukaj:
Skocz do:  
Sitemap
Technologię dostarcza phpBB® Forum Software © phpBB Group phpBB3.PL
phpBB SEO