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



Teraz jest 24 kwi 2024, o 15:17


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 ]
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: 3187
Lokalizacja: Kraków - obok FAB5 ATMEL'a
Pomógł: 89

Polecam się zapoznać: topic7402.html



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 0 gości


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