logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

[Rozwiązano] Jak uruchamiać zgrzewanie po wciśnięciu przycisku? Problem z kodem.

Dawek1997 20 Cze 2018 22:49 669 11
REKLAMA
  • #1 17287715
    Dawek1997
    Poziom 6  
    Posty: 70
    Ocena: 7
    Witam,
    Mam taki kod do sterowania przekaźnikiem zgrzewarki, własnej roboty i mam taki problem, że ten oto kod po wciśnięciu przycisku zaczyna odliczać czas 3 sekundy i wykonuje zgrzewanie. Problem polega na tym, że chciałbym aby zgrzewanie włączało się od razu po naciśnięciu tego przycisku, a po zgrzaniu odliczał te 3 sekundy w celu zablokowania możliwości ponownego zgrzewania przez ten czas. Przenosiłem wielokrotnie we wszelaki sposób niektóre polecenia, np. Funkcję 

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    przenosiłem nad funkcję 3 sekundowego opóźnienia, to czas trwania zgrzewania wynosił (czas) + te 3 sekundy.
    Zamiast else zastosowałem ten kod i umiejscowiłem go nad funkcją 3 sekundowego opóźnienia

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    to wtedy kod działał prawie tak jak chciałem, bo jeżeli przytrzymałem przycisk przez krótszy czas niż ustawione zgrzewanie to działało prawidłowo ale jak np. mam ustawiony czas zgrzewania na 75ms, to trzymając przycisk dłużej niż ten czas, to znów zgrzewanie wynosi (czas) + 3sekundy. Już od kilku godzin siedzę przy tym kodzie i już szlak mnie trafia. Bardzo proszę o pomoc.

    KOD

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
  • REKLAMA
  • Pomocny post
    #2 17288028
    Ba_rt
    Poziom 13  
    Posty: 111
    Pomógł: 4
    Ocena: 10
    Odczyt stanu przycisku powinieneś realizować kilkukrotnie w przerwaniu, aby wyeliminować drgania styków. Twoim problemem jest fakt iż podczas zdarzenia wywołanego przyciśnięciem przycisku, cały czas sprawdzasz jego stan i znowu wywołujesz akcję. Skorzystanie z dobrodziejstw przerwań rozwiąże problem.
  • REKLAMA
  • Pomocny post
    #3 17288060
    PowracajacyBumerang
    Poziom 9  
    Posty: 15
    Pomógł: 1
    Ocena: 1
    Reaguj na zmiane stanu przycisku a nie na jego stan. Zamiast delay, użyj millis() i maszyny stanów. Dzięki temu będziesz mógł innym przyciskiem awaryjnie przerwać proces w dowolnym momencie. Teraz to niemożliwe.
  • Pomocny post
    #4 17289398
    Konto nie istnieje
    Poziom 1  
  • Pomocny post
    #5 17289793
    Konto nie istnieje
    Konto nie istnieje  
  • Pomocny post
    #6 17290235
    Konto nie istnieje
    Poziom 1  
  • REKLAMA
  • Pomocny post
    #7 17290648
    Konto nie istnieje
    Konto nie istnieje  
  • #8 17290926
    Dawek1997
    Poziom 6  
    Posty: 70
    Ocena: 7
    nowyARM napisał:
    Nie będę zgadywał i dawał 1000 kodów na 1000 okoliczności. Jak autor napisze co potrzebuje i będe dysponował stosownym kodem to go umieszczę na forum.


    Posiadam Arduino UNO, na elektronice się znam lecz w pisaniu kodów jestem jeszcze na poziomie amatorskim, znam tylko podstawowe funkcję. Szczegółowo opiszę jak ma działać program do którego dążę.
    W układzie będzie ekran LCD 16x2 z modułem i2c, potencjometr oraz przycisk.
    Założenie: Ekran LCD wskazuje czas w ms (zakres od 0-1000ms), czas regulowany potencjometrem. Naciśnięcie przycisku sprawia, że na ustawiony czas, na jednym z pinów ma zostać podany stan wysoki w celu załączenia przekaźnika do uruchomienia zgrzewarki. Po wykonaniu tej operacji, program ma uniemożliwić uruchomienie zgrzewarki na czas 3 sekund i oczekiwać na kolejne wciśnięcie przycisku. Najczęstszą ustawą czasu na jakiej będę pracował będzie ok. 70ms, stąd ten czas zwłoki, by dłuższe przytrzymanie przycisku nie spowodowało kolejnego załączenia.
  • REKLAMA
  • Pomocny post
    #9 17290991
    Konto nie istnieje
    Konto nie istnieje  
  • Pomocny post
    #10 17291017
    Konto nie istnieje
    Poziom 1  
  • #11 17291069
    Dawek1997
    Poziom 6  
    Posty: 70
    Ocena: 7
    emarcus napisał:
    Czy ooczekujesz że to też otrzymasz "na srebrnej tacy"(?)


    Wszystko przeanalizowałem, wasze porady coś tam mniej więcej zrozumiałem lecz akurat nie miałem możliwości sprawdzenia tego, gdyż akurat jestem w trasie. Postanowiłem jeszcze tylko tak dla dokładnego wyjaśnienia, opisać szczegółowo działanie programu. Zaraz biorę się za pisanie, jak będę miał jakiś problem to się odezwę, biorąc pod uwagę mój stopień zaawansowania w programowaniu zajmie mi to pewnie trochę czasu. :)

    Dodano po 2 [godziny] 3 [minuty]:

    emarcus napisał:
    Resztę poskładaj /dodaj, uzupełnij wg wyżej wskazówek.


    No i się udało :) . Przerobiłem twój kod pod siebie i działa znakomicie. Dzięki wielkie.





    KOD:

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    Dodano po 13 [minuty]:

    Obędzie się bez czasu zwłoki, bo dzięki tej funkcji trzymając przycisk dłużej nie załącza się niepotrzebnie drugi raz :)
  • #12 17293976
    Dawek1997
    Poziom 6  
    Posty: 70
    Ocena: 7
    Dzięki za pomoc. Temat zamykam.

Podsumowanie tematu

✨ Użytkownik miał problem z kodem do sterowania przekaźnikiem zgrzewarki, który po naciśnięciu przycisku odliczał 3 sekundy przed rozpoczęciem zgrzewania. Chciał, aby zgrzewanie uruchamiało się natychmiast po naciśnięciu przycisku, a 3-sekundowe opóźnienie miało blokować kolejne zgrzewanie. Uczestnicy dyskusji sugerowali użycie przerwań do odczytu stanu przycisku, zamiast polegać na funkcji delay, oraz implementację maszyny stanów z wykorzystaniem funkcji millis(). Użytkownik ostatecznie dostosował kod, aby działał zgodnie z jego wymaganiami, w tym z obsługą wyświetlacza LCD i regulacją czasu zgrzewania za pomocą potencjometru.
REKLAMA