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

KURS HOME ASSISTANT

Chcesz zautomatyzować swój dom bez skomplikowanego kodowania?
Zastanawiasz się nad wyborem sprzętu, oprogramowania i aplikacji?
Od czego zacząć przygodę z HA? Co będzie najlepsze na start?

Nasz kurs Home Assistant nauczy Cię krok po kroku, jak łatwo zautomatyzować swój dom i oszczędzić na rachunkach za prąd i ogrzewanie. Bez chmur, bez zbędnych abonamentów. Twoja przygoda z Home Assistant zaczyna się tutaj!

↓↓↓

    Szanujemy Twoją prywatność. Możesz wypisać się w dowolnym momencie.




    Teraz jest 10 cze 2025, o 11:55


    Strefa czasowa: UTC + 1





    Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 11 ] 
    Autor Wiadomość
    PostNapisane: 29 wrz 2016, o 07:29 
    Offline
    Nowy

    Dołączył(a): 29 wrz 2016
    Posty: 6
    Pomógł: 0

    Witam serdecznie szanownych kolegów i koleżanki.
    Jestem nowym użytkownikiem tego forum jak i początkującym programistą AVR. Z elektroniką mam styczność od dawna i nie jest mi obca ale programowanie to coś nowego i zarazem fajnego.

    Przejdę do sedna, jako mój pierwszy projekt postanowiłem zbudować sobie zwykły, mały sterownik oświetlenia led w kuchni. Mam ładą 5m taśmę led i teraz zaczyna się zabawa.
    Założenia projektu są następujące.
    Czujnik ruchu uruchamia ledy i świeci przez 5 min po wyjściu z pomieszczenia czyli po braku wykryciu ruchu, potem gaśnie. Dodatkowo ma być klawisz, którym będziemy mogli zapalić ledy lub inaczej mówiąc przedłużyć czas świecenia na godzinę.
    Czyli czujnik wykrywa, odpala led na 5 min w tym czasie klikamy klawisz i program zmienia ten czas z 5 min na godzinę.

    Napisałem programik i dużo kombinowałem i albo mam switch albo wykrywanie ruchu. Nie mogę przeskoczyć tego czasu z czujki ruchu. Jak czujka zapali led to klawisz działa mi dopiero jak te 5 min minie. Czyli wychodzi na to że program zatrzymuje się na ten czas 5min i nic w tym momencie nie odbiera by zmienić ten stan.

    Przepraszam że się tak rozpisałem ale jako początkujący proszę o małą pomoc lub podpowiedz.
    Pozdrawiam serdecznie.



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 29 wrz 2016, o 07:37 
    Offline
    Użytkownik

    Dołączył(a): 24 sty 2012
    Posty: 1469
    Pomógł: 56

    Tak Ci nikt nie pomoże pokaż kod...
    Widocznie napisałeś tą funkcję całkowicie blokująco. Popraw na nieblokującą ;-)

    _________________
    Jestem początkujący i moje porady mogą być błędne



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 29 wrz 2016, o 07:41 
    Offline
    Nowy

    Dołączył(a): 29 wrz 2016
    Posty: 6
    Pomógł: 0

    Dzięki, tak myślałem że bez kodu to będzie ciężko ale nie mam go teraz tutaj w pracy :) wieczorkiem podłączę moje wypociny.

    Witam, więc wracając do tematu. Poskładałem wszystko od nowa, nie ma sensu bym umieszczał wszystkie moje kombinacje. Napisałem kodzik na samych IF i jedyne co jeszcze to zamiast typowego czujnika ruchu zastosowałem drugi switch.
    Kod:
    int pir = 4;
    int switchPin1 = 2;
    int LedCzerwona = 8;
    int czas1 = 5000;
    int czas2 = 20000;

    void setup() {
      pinMode(pir, INPUT); // klawisz/ czujnik ruchu
      pinMode(switchPin1, INPUT); // klawisz
      pinMode(LedCzerwona, OUTPUT); //dioda led wyjscie czerwona
    }

    void loop() { 

      if(digitalRead(pir) == HIGH)
       {
         digitalWrite(LedCzerwona, HIGH);
         delay(czas1);
       }else{
         digitalWrite(LedCzerwona, LOW);
       }

       
      if(digitalRead(switchPin1) == HIGH)
       {
         digitalWrite(LedCzerwona, HIGH);
         delay(czas2);
       }else{
         digitalWrite(LedCzerwona, LOW);
       }

    }


    Czytałem dziś o przerywaniach i z opisu to by było wyjście dla mojego programu, co wy na to ?
    Proszę tylko o nie krytykowanie (uczę się tego) tylko o poradę i naprowadzenie.



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 30 wrz 2016, o 11:37 
    Offline
    Użytkownik

    Dołączył(a): 28 wrz 2016
    Posty: 215
    Pomógł: 14

    Można taki działanie uzyskać bez używania przerwań. Przerwania warto poznać na następnym etapie poznawania uC.
    Proponuje spróbować takiego programu
    Składnia: [ Pobierz ] [ Ukryj ] [ Zaznacz wszystko ]
    język cpp
    Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


    Bardzo dobrze, że wybrałeś sobie konkretne zastosowanie układu - to jest najlepsza nauka, gdy rozwiązania weryfikuje rzeczywistość.
    Bardzo dobrze, że testy przeprowadzasz "na stole", a nie w docelowym układzie, tak jest dużo łatwiej.
    Bardzo dobrze, że na początek wybrałeś prosty układ, łatwiej ogarniesz jego działanie.
    Warto by, po uruchomieniu spróbować dokładać dodatkowe funkcje np. dać potwierdzenie zadziałania pir diodą led, która błyśnie na np. 200ms. Przyda się to przy nastawianiu czułości pir.

    PS Kod wklejamy SYNTAX C++



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 30 wrz 2016, o 16:28 
    Offline
    Nowy

    Dołączył(a): 29 wrz 2016
    Posty: 6
    Pomógł: 0

    Dzięki za nie objechanie :) tak docelowo program chcę rozbudować o sterowanie led on/off PWM i dwie dodatkowe funkcje dla tego klawisza ale to potem, najpierw jednego się nauczę i opanuję :)

    ------------------------ [ Dodano po: 10 minutach ]

    przetestowałem Twoje rozwiązanie ale chyba ten tick nie przyjmuje większych parametrów bo nawet te 400 wywala taki błąd kompilator
    C:\Users\Piotr\Documents\Arduino\test3\test3.ino: In function 'void loop()':

    C:\Users\Piotr\Documents\Arduino\test3\test3.ino:27:14: warning: large integer implicitly truncated to unsigned type [-Woverflow]

    tick=400;// bo 400*50ms to 20s;

    no i tak będzie jak piszę
    The unsigned char datatype encodes numbers from 0 to 255.

    Ja potrzebuję dłuższych czasów więc kombinuję dalej, ale dzięki za pomoc na pewno się przyda i dowiedziałem się co nieco o CHAR



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 30 wrz 2016, o 17:45 
    Offline
    Użytkownik

    Dołączył(a): 28 wrz 2016
    Posty: 215
    Pomógł: 14

    pomier napisał(a):
    The unsigned char datatype encodes numbers from 0 to 255.


    Sorry, mój błąd. :oops: Powinien być typ int. Ale pocieszam się, że nie ma tego złego... . Widzę, że wychwyciłeś ten błąd - gratulacje!
    Rzeczywiście, typ unsigned char obejmuje wartości od 0 do 255, przy próbie nadania wartości 400 będzie błąd. Typ unsigned int obejmuje od 0 do 32tyś. i wartość 400 zmieści się znakomicie. Ja pomyślałem o wartości 100 i nie spojrzałem na 400. Nie to, że się usprawiedliwiam, ale pokazuję jak to się stało, bo lepiej uczyć się na błędach innych. I nauka dla mnie, by najpierw przetestować, a dopiero później pisać. Następnym razem się poprawie. :!:
    pomier napisał(a):
    najpierw jednego się nauczę i opanuję
    Trzymam kciuki!



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 30 wrz 2016, o 18:00 
    Offline
    Nowy

    Dołączył(a): 29 wrz 2016
    Posty: 6
    Pomógł: 0

    hehe spoko dzięki za następną podpowiedz. zaraz testuje !!
    Sprawdziłem i fakt jest super ale jest jednak ale sama czujka działa ok sam switch super ale w połączeniu czujka i w tym czasie przycisk to nic nie zmienia, zostaje czas świecenia z czujki
    Kod:
    //lepiej użyc #define bo to są stałe i w trakcie działania programu nie będa zmieniane
    #define pir 4
    #define switchPin1 2
    #define LedCzerwona 8
    #define Ledzolta 7
    unsigned int tick;


    void setup() {
      pinMode(pir, INPUT); // klawisz/ czujnik ruchu
      pinMode(switchPin1, INPUT); // klawisz
      pinMode(LedCzerwona, OUTPUT); //dioda led wyjście czerwona
      pinMode(Ledzolta, OUTPUT);
      tick=0;  //nie konieczne, ale lepiej stan początkowy mieć pod kontrolą
    }

    void loop() { 

      if(digitalRead(pir) == HIGH)
       {
         digitalWrite(LedCzerwona, HIGH);
         tick=50;// bo 100*50ms to 5s
       }

       
      if(digitalRead(switchPin1) == HIGH)
       {
         digitalWrite(LedCzerwona, HIGH);
         digitalWrite(Ledzolta, HIGH);
         tick=2000;
       }
       
       delay(50);//czekamy 50ms
       tick--;//zmniejszamy zmienną tick o 1
       if(tick==0)
       {
        digitalWrite(LedCzerwona,LOW);//jak odliczy czas, to gasimy led
        digitalWrite(Ledzolta,LOW);
       }
       
       
    }

    dla zobrazowania działania dodałem sobie ledzolta



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 30 wrz 2016, o 18:52 
    Offline
    Użytkownik

    Dołączył(a): 28 wrz 2016
    Posty: 215
    Pomógł: 14

    To potrzebujesz wyzwalania nie poziomem (HIGH/LOW) a zboczem (zmianą z HIGH na LOW, lub z LOW na HIGH). Do tego potrzebna jest dodatkowa zmienna, która zapamięta stan poprzedni. Jak to zrobić, to pewnie sam dasz radę. A jeśli nie to podpowiem.

    Pomysł z druga Led znakomity. Masz mini debugger. Warto też poznać bibliotekę serial i funkcję Serial.print(). Bardzo ułatwia uruchamianie programów.



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 30 wrz 2016, o 19:01 
    Offline
    Nowy

    Dołączył(a): 29 wrz 2016
    Posty: 6
    Pomógł: 0

    dzięki już kombinuję a skoro operacjach na zboczach to już nie zakrawa o przerywania?
    Przyznam szczerze, fajna zabawa z tym całym AVR ale wymyśliłem sobie "niby" prosty układ i program a tyle w tym zaawansowanych, jak dla mnie, opcji, ustawień i kombinacji. Nie mówię że się nie nauczę. Z natury jestem dociekliwy i chętny nauki czegoś nowego. Dodatkowo zawodowo zajmuję się projektowaniem grafiki 2D i 3D to i cierpliwości i dokładności mi raczej nie brakuje :) Taka mała auto reklama. Wracam do pracy z AVR



    Ostatnio edytowano 30 wrz 2016, o 19:41 przez pomier, łącznie edytowano 1 raz

    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 30 wrz 2016, o 19:31 
    Offline
    Moderator zasłużony dla forum.atnel.pl
    Avatar użytkownika

    Dołączył(a): 18 lip 2012
    Posty: 3229
    Lokalizacja: Kraków - obok FAB5 ATMEL'a
    Pomógł: 91

    Polecam się zapoznać: topic7402.html

    _________________
    http://www.jaglarz.info



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 30 wrz 2016, o 19:36 
    Offline
    Nowy

    Dołączył(a): 29 wrz 2016
    Posty: 6
    Pomógł: 0

    ok, przepraszam, poprawię się z tym wstawianiem kodów.

    ------------------------ [ Dodano po: 10 minutach ]

    Alef2 napisał(a):
    Warto też poznać bibliotekę serial i funkcję Serial.print()

    Ta funkcję poznałem pobieżnie przy zabawie z czujnikiem odległości, fajna ale penie jeszcze dużo mnie czeka :)

    Dobra na dziś starczy, jednak piwko i uwaga potrzebna przy projektowaniu programu nie idą w parze :)
    Wrócę do tematu na świeżo.



    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: 11 ] 

    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