Skocz do zawartości
Komentator

Kurs Arduino - #7 - Wyświetlacz tekstowy, LCD 2x16

Pomocna odpowiedź

6 godzin temu, ethanak napisał:

Dlaczego nie chcesz poszukać sobie na forum (bo już było wyjaśniane i to nie raz) tylko czekasz, aż ktoś Ci wyośli? Może uważasz, że naszym obowiązkiem jest wyjaśnianie podstaw każdemu, kto się zgłosi i komu nie będzie się chciało szukać? Bo jeśli tak - to chyba nie to forum, spróbuj na onecie...

Padło pytanie, zadane w rozsądny sposób, nie było tam nic nieodpowiedniego - jak ktoś ma czas i chęć to odpowie. Takie komentarze tylko zniechęcają do korzystania z forum, bo prawie wszystko już "było". A jeśli dobrze pamiętam to akurat w kontekście tego kursu takich pytań wiele się nie pojawiało. 

7 godzin temu, kris2k napisał:

Czyli to taki trik żeby warunek IF porównał zmienna typu "unsigned long" z druga zmienna tez typu "unsigned long".

Nie próbowałem, ale pewnie bez tego dopisu "UL" IF nie zadziała?

Warunek zadziała, ale tak jak @ethanak wspomniał będzie to zależeć od wartości zmiennej. Temat ten był szerzej poruszany np. w tym temacie:

 

Udostępnij ten post


Link to post
Share on other sites
(edytowany)

Treker, dziękuje za odpowiedz!

Do drugiej części kursu Arduino dopiero muszę dobrnąć, póki co, jestem tutaj. Wcześniejszy komentarz kolegi pozwolę sobie zupełnie zignorować. Jako początkujący "użyszkodnik" Arduino, mam jeszcze pewne problemy w płynnym poruszaniu się w tematyce programowania tego mikro-kontrolera. Otóż mam taki problem natury praktycznej. Chciałbym zaprogramować układ, który będzie działać w zależności od "czasu". (To tak przy okazji zabawy ze stoperem.)

Przykład: Podanie napięcia wysokiego na pin X przez czas krótszy niż 0,5sek. wykona czynność A, podanie tego samego sygnału ale dłużej niż 0,5sek. wykona czynność B.

Czy to jest do zrobienia już na tym etapie, czy podobna tematyka będzie jeszcze dalej gdzieś opisana?

Edytowano przez Treker
Poprawiłem formatowanie.

Udostępnij ten post


Link to post
Share on other sites
33 minuty temu, Treker napisał:

Takie komentarze tylko zniechęcają do korzystania z forum, bo prawie wszystko już "było"

Co więcej, z ciekawości wrzuciłem "unsigned long" w szukarkę i na pierwszych kilku stronach nie ma wytłumaczenia. Ale by to wyszukać, to trzeba znać rozwinięcie akronimu.. pytający nie znał, a szukając "UL" nic nie znajdujemy (zapewne za krótka fraza dla szukarki).

Jasne, można szukać na Google, a nie na forum, ale "było" sugeruje jednak forum.

  • Lubię! 1

Udostępnij ten post


Link to post
Share on other sites

@kris2k, w dalszej części tego kursu pokazany jest ultradźwiękowy czujnik odległości, w którym używana jest funkcja pulseIn(), która może rozwiązać Twój problem. Alternatywnie możesz spróbować napisać coś takiego samodzielnie, ale tutaj przydałoby się ogólnie trochę więcej praktyki - nie jest to skomplikowane, kwestia tego, aby trochę pokombinować. Jak wykonasz trochę więcej ćwiczeń to na pewno sobie poradzisz 🙂 

Udostępnij ten post


Link to post
Share on other sites

OK, czyli jeszcze nie ten etap. Generalnie prowodyrem moich pytań jest funkcja milis() której też kolega Gregorio użył w swoim programie. No to zabieram się za kolejne kroki kursu.

Udostępnij ten post


Link to post
Share on other sites

Mam problem z zadaniem 7.4. Napisałem program na ten stoper i działa, ale za wolno. Co jest tego przyczyną, co warto zmienić żeby dobrze odmierzał czas ? Z góry dziękuję za pomoc. 

#include <LiquidCrystal.h> //Dołączenie bilbioteki
LiquidCrystal lcd(2, 3, 4, 5, 6, 7); //Informacja o podłączeniu nowego wyświetlacza
int sek;
int ms;
void setup() {
  pinMode(9,INPUT_PULLUP);
  pinMode(10,INPUT_PULLUP);
  lcd.begin(16, 2); //Deklaracja typu
  
 }
 
void loop() {

  if(digitalRead(9)==LOW)
  {
    sek=0;
    ms=0;
    while(digitalRead(10)==HIGH)
    {
      delay(10);
      ms=ms+1;
      if(ms==100)
      {
        sek=sek+1;
        ms=0;
      }
    lcd.setCursor(0, 0);
    lcd.print("Czas w sek:");
    lcd.setCursor(0,1);
    lcd.print(sek);
    lcd.setCursor(2,1);
    lcd.print(":");
    lcd.print(ms);
    
    }
    
  }
    
   
}

 

Udostępnij ten post


Link to post
Share on other sites

@matrix12, witam na forum 😉 Widzę, że to Twoje pierwsze kroki na Forbocie, oto najważniejsze informacje na start:

  • Chcesz przywitać się z innymi członkami naszej społeczności? Skorzystaj z tematu powitania użytkowników.
  • Opis najciekawszych funkcji, które ułatwiają korzystanie z forum znajdziesz w temacie instrukcja korzystania z forum - co warto wiedzieć?
  • Poszczególne posty możesz oceniać (pozytywnie i negatywnie) za pomocą reakcji - ikona serca w prawym dolnym rogu każdej wiadomości.

11 godzin temu, matrix12 napisał:

Napisałem program na ten stoper i działa, ale za wolno

Co dokładnie oznacza, że stoper działa za wolno? Chodzi Ci od odświeżanie danych na wyświetlaczu, błędne pomiary czy jeszcze o coś innego?

Udostępnij ten post


Link to post
Share on other sites

Właśnie nie wiem gdzie leży problem. Jak ustawię, aby na wyświetlaczu pokazywały się tylko sekundy pomiar jest poprawny:

while(digitalRead(10)==HIGH)
    {
      delay(1000);
     
     
      
        sek=sek+1;
        
      
    lcd.setCursor(0, 0);
    lcd.print("Czas w sek:");
    lcd.setCursor(0,1);
    lcd.print(sek);

Jednak jak chcę, aby obok na wyświetlaczu przeskakiwały milisekundy, jak w poście wyżej, pomiar nie jest poprawny. Przykładowo 5 sekund odmierza jako około 3:50; 10 sekund to na wyświetlaczu około 7. Wizualnie na wyświetlaczu wygląda wszystko ok, widać jak przeskakują milisekundy, tylko dzieje się to za wolno. 

Udostępnij ten post


Link to post
Share on other sites

Robiąc taki kod:

1) czekaj 1 sekundę
2) zrób inne polecenia

zakładasz, że punkt drugi robi się w nieskończenie krótkim czasie.

  • Lubię! 1

Udostępnij ten post


Link to post
Share on other sites
Dnia 14.10.2018 o 23:18, Treker napisał:

@kris2k, w dalszej części tego kursu pokazany jest ultradźwiękowy czujnik odległości, w którym używana jest funkcja pulseIn(), która może rozwiązać Twój problem. Alternatywnie możesz spróbować napisać coś takiego samodzielnie, ale tutaj przydałoby się ogólnie trochę więcej praktyki - nie jest to skomplikowane, kwestia tego, aby trochę pokombinować. Jak wykonasz trochę więcej ćwiczeń to na pewno sobie poradzisz 🙂 

Czy funkcja pulseIn() potrafi działać z wejsciami analogowymi A0-A5? Czy to tylko jest pod cyfrowe piny?

Udostępnij ten post


Link to post
Share on other sites
Dnia 20.10.2018 o 16:53, matrix12 napisał:

Jednak jak chcę, aby obok na wyświetlaczu przeskakiwały milisekundy, jak w poście wyżej, pomiar nie jest poprawny. Przykładowo 5 sekund odmierza jako około 3:50; 10 sekund to na wyświetlaczu około 7. Wizualnie na wyświetlaczu wygląda wszystko ok, widać jak przeskakują milisekundy, tylko dzieje się to za wolno. 

Tak jak napisał Marooned - nie bierzesz pod uwagę tego, że wypisanie na ekran zajmuje Arduino również jakiś krótki okres czasu. Przy częstym "wyrzucaniu" wyniku na wyświetlacz czasy te się kumulują i stąd duże rozbieżności. Dla testu postaraj się tak przebudować kod, aby dane na LCD wypisywać np. tylko co około 100 ms. Powinno być już wtedy lepiej. Docelowo taki stoper i tak należałoby napisać z użyciem funkcji millis(), która pozwala znacznie dokładniej odmierzać czas: Kurs Arduino II – #9 –  wielozadaniowość, opóźnienia z millis(). Dobrze jednak eksperymentować z takim podejściem jak w Twoim aktualnym programie, aby zaobserwować w praktyce pewne problemy, które masz teraz 😉

Dnia 21.10.2018 o 11:42, kris2k napisał:

Czy funkcja pulseIn() potrafi działać z wejsciami analogowymi A0-A5? Czy to tylko jest pod cyfrowe piny?

Jeśli dobrze pamiętam to funkcja ta powinna działać na pinach analogowych używanych w trybie cyfrowym bez żadnego problemu.

Udostępnij ten post


Link to post
Share on other sites
20 minut temu, Treker napisał:

Jeśli dobrze pamiętam to funkcja ta powinna działać na pinach analogowych używanych w trybie cyfrowym bez żadnego problemu.

To prawda, w kursie nie jest to wspomniane, ale wejścia A0-A5 działać też mogą jako normalne wejścia/wyjścia cyfrowe. Wtedy pulseIn() działa poprawnie.

Jednak mój problem techniczny jest inny. Potrzebne mi sterowanie które wykrywa 1) że sygnał w ogóle jest doprowadzony do wejścia, i jest to sygnał typu (flywire/napięcie mniejsze/napięcie większe) 2) trzeba zbadać czas w jakim te przypadki się pojawiają, jak krótko to coś trzeba zrobić, jak długo, to nic nie trzeba zrobić.

W samej technice cyfrowej użycie pulseIn() byłoby idealne, ale jak chce odczytywać sygnały z innego urządzenia w sposób analogowy to jest klops.

Udostępnij ten post


Link to post
Share on other sites

Jeśli chcesz mierzyć napięcia na wejściach to wspomniana funkcja Ci nie pomoże - nie do tego była przygotowywana. Musisz pokombinować i samodzielnie napisać takie rozwiązanie.

Udostępnij ten post


Link to post
Share on other sites
3 minuty temu, Treker napisał:

Jeśli chcesz mierzyć napięcia na wejściach to wspomniana funkcja Ci nie pomoże - nie do tego była przygotowywana. Musisz pokombinować i samodzielnie napisać takie rozwiązanie.

Jakaś głębsza podpowiedź? W sensie odczytać napięcie z pinu analogowego ale funkcją milis() sprawdzać czas jak długo one tam jest?

Udostępnij ten post


Link to post
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!

Gość
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...