Skocz do zawartości

Uruchamianie wyświetlacza lub programu po wykryciu ruchu


Krisk

Pomocna odpowiedź

Od razu zaznaczę, że to pytanie od nowicjusza...

Buduję zestaw do pomiaru odległości do garażu na wyświetlaczu MAX7219 z sensorem HC-SR04. Chciałbym dodać funkcję uruchamiania programu dopiero po wykryciu ruchu przez sensor, próbowałem kilka razy i nie udało mi się to...

Czy ktoś mógłby podpowiedzieć?

Program wygląda tak jak poniżej. Zastanawiałem się, czy odczyt z PIR dodać w pętli czy powinno to być coś w rodzaju przerwania?

 

#include <Adafruit_BMP085_U.h>

// REQUIRES the following Arduino libraries:
// - DHT Sensor Library: https://github.com/adafruit/DHT-sensor-library
// - Adafruit Unified Sensor Lib: https://github.com/adafruit/Adafruit_Sensor
// - HCSR04 library: https://github.com/Martinsos/arduino-lib-hc-sr04
// - MD_Parola Library: https://github.com/MajicDesigns/MD_Parola
// - MD_MAX72XX library can be found at https://github.com/MajicDesigns/MD_MAX72XX
// Find All "Great Projects" Videos : https://www.youtube.com/channel/UCCC8DuqicBtP3A_aC53HYDQ/videos

#include <MD_Parola.h>
#include <MD_MAX72xx.h>
#include <SPI.h>
#include <HCSR04.h>
#include "DHT.h"
#include <Ultrasonic.h>

#define DHTTYPE DHT11   // DHT 11

#define HARDWARE_TYPE MD_MAX72XX::FC16_HW
#define MAX_DEVICES 4
#define CLK_PIN   13
#define DATA_PIN  11
#define CS_PIN    10

// SPI hardware interface
//MD_Parola P = MD_Parola(HARDWARE_TYPE, CS_PIN, MAX_DEVICES);
// SOFTWARE SPI
MD_Parola P = MD_Parola(HARDWARE_TYPE, DATA_PIN, CLK_PIN, CS_PIN, MAX_DEVICES);
UltraSonicDistanceSensor distanceSensor(9, 8);  // Initialize sensor that uses digital pins 13 and 12.

uint8_t scrollSpeed = 25;    // default frame delay value
char megs[4];

int distance;
int lastdistance;
bool newDistance = false;
uint32_t lastTime = 0;


           

void readDistance() {        
distance = distanceSensor.measureDistanceCm() + 1;      
    delay(200);                 
   if (distance != lastdistance)
    {
    lastdistance = distance;
    newDistance = true;           
  }
}
void setup()
{
  Serial.begin(115200);
  P.begin(1);
  P.setZone(2, 0, 2);
  P.displayZoneText(0, megs, PA_CENTER, scrollSpeed, 0, PA_PRINT, PA_NO_EFFECT);
  pinMode(7, OUTPUT); //Poszczególne piny sterujące diodą jako wyjścia
  pinMode(2, INPUT); //PIR jako wejście
  digitalWrite(7, HIGH); //Dioda wyłączona
}

void loop()
{
readDistance(); 
P.displayAnimate();
P.getZoneStatus(0);
    if (newDistance)
    {
    lastTime = millis(); 
    sprintf(megs, "%d", distance);
    P.displayReset(0);
    newDistance = false;
  }
  if (millis() - lastTime >= 10000)
  {
   
  }
}

 

Link do komentarza
Share on other sites

To dosyć proste, zapamiętujesz jakąś wartość odległości i jeśli ta wartość zmieni się o +/- ustalony próg w zadanym czasie to znaczy że ktoś ci łazi po garażu 

Edytowano przez _LM_
Link do komentarza
Share on other sites

Chyba się nie zrozumieliśmy. Chodzi o to, że chciałbym aby wyświetlacz uruchamiał się dopiero po wykryciu ruchu przez czujnik PIR.

Wyświetlacz podłączony jest pod zasilanie +5V stałe, myślałem coś na zasadzie zrobienia warunku, powiedzmy, że zasilanie wezmę z PIN6, a napięcie się pojawi dopiero po wyryciu ruchu przez PIR.

 

Link do komentarza
Share on other sites

Zarejestruj się lub zaloguj, aby ukryć tę reklamę.
Zarejestruj się lub zaloguj, aby ukryć tę reklamę.

jlcpcb.jpg

jlcpcb.jpg

Produkcja i montaż PCB - wybierz sprawdzone PCBWay!
   • Darmowe płytki dla studentów i projektów non-profit
   • Tylko 5$ za 10 prototypów PCB w 24 godziny
   • Usługa projektowania PCB na zlecenie
   • Montaż PCB od 30$ + bezpłatna dostawa i szablony
   • Darmowe narzędzie do podglądu plików Gerber
Zobacz również » Film z fabryki PCBWay

1 minutę temu, ethanak napisał:

Nie manipulujesz zasilaniem wyświetlacza, ale wyświetlasz same czarne jeśli PIR nie wykrył ruchu.

Noo, nie ułatwiasz 🙂

A dlaczego nie można odciąć zasilania od wyświetlacza?

A no już sam sobie odpowiedziałem odłączając +5V 😄

Kurcze to wygaszenie nie brzmi łatwo do zrobienia.

Link do komentarza
Share on other sites

10 minut temu, Krisk napisał:

Chciałbym dodać funkcję uruchamiania programu dopiero po wykryciu ruchu przez sensor,

Troszeczkę powinieneś doprecyzować swoje pytanie. Generalnie by urządzenie mogło działać musi zostać wpierw uruchomione. Jeśli teraz zależy Ci na tym aby po uruchomieniu obniżyć zużycie energii możesz swój uC uśpić. Tu musiałbyś poczytać o tym - jest dużo wątków w tym temacie na tym forum.

Powstaje pytanie jak i kiedy wybudzić układ z tego snu i tu rzeczywiście mogą się przydać przerwania, o których piszesz. Generalnie jeśli mówimy np. o Arduino UNO to poza dedykowanymi wejściami przerwań zewnętrznych (zgłaszanych np. przez czujnik PIR, w sumie nie ważne przez co) to właściwie na każdym innym pinie możesz takie przerwanie także wykryć i "obsłużyć"- to przerwania PCINT.

O przerwaniach PCINT możesz np. poczytać tu:

https://starter-kit.nettigo.pl/2018/04/przerwanie-na-kazdym-pinie-arduino-uno/

Swoją drogą ja bym najpierw zaczął od programu, który z tego usypiania i przerwań nie korzysta (w końcu możesz zasilać z sieci, a nie z baterii). Jak już Ci wszystko będzie działało to wtedy w ramach rozwoju możesz dalej swój program modyfikować. Z tymi przerwaniami to nie jest takie "łapu capu", a wygląda na to, że raczej zaczynasz przygodę z uC i jesteś na etapie pętli programowych. Więc działaj powolutku.

Link do komentarza
Share on other sites

16 minut temu, Krisk napisał:

 Chodzi o to, że chciałbym aby wyświetlacz uruchamiał się dopiero po wykryciu ruchu przez czujnik PIR.

To jak @_LM_ wspomniał..robisz warunek w którym coś tam robisz po wykryciu ruchu, nic prostszego... 

A co do wygaszenia pędów to twoja biblioteka raczej na 100% posiada już gotowa funkcję która gasi cały wyświetlacz, więc to też nic trudnego

Link do komentarza
Share on other sites

13 minut temu, Belferek napisał:

Troszeczkę powinieneś doprecyzować swoje pytanie. Generalnie by urządzenie mogło działać musi zostać wpierw uruchomione. Jeśli teraz zależy Ci na tym aby po uruchomieniu obniżyć zużycie energii możesz swój uC uśpić. Tu musiałbyś poczytać o tym - jest dużo wątków w tym temacie na tym forum.

Powstaje pytanie jak i kiedy wybudzić układ z tego snu i tu rzeczywiście mogą się przydać przerwania, o których piszesz. Generalnie jeśli mówimy np. o Arduino UNO to poza dedykowanymi wejściami przerwań zewnętrznych (zgłaszanych np. przez czujnik PIR, w sumie nie ważne przez co) to właściwie na każdym innym pinie możesz takie przerwanie także wykryć i "obsłużyć"- to przerwania PCINT.

O przerwaniach PCINT możesz np. poczytać tu:

https://starter-kit.nettigo.pl/2018/04/przerwanie-na-kazdym-pinie-arduino-uno/

Swoją drogą ja bym najpierw zaczął od programu, który z tego usypiania i przerwań nie korzysta (w końcu możesz zasilać z sieci, a nie z baterii). Jak już Ci wszystko będzie działało to wtedy w ramach rozwoju możesz dalej swój program modyfikować. Z tymi przerwaniami to nie jest takie "łapu capu", a wygląda na to, że raczej zaczynasz przygodę z uC i jesteś na etapie pętli programowych. Więc działaj powolutku.

Ten program działa bez wybudzania, oczywiście jako początkujący nie zrobiłem go samemu, trochę zmodyfikowałem, bo oryginalny posiadał jeszcze pomiar temperatury, który usunąłem.

W tym wygaszaniu nie chodzi o oszczędność energii, po prostu dobrze by to wyglądało, jakby urządzenie zaczęło działać (lub był widoczny odczyt) dopiero po wykryciu ruchu. Na ten moment byłbym w stanie jedynie podłączyć drugie Arduino, które będzie załączać zasilanie po wykryciu ruchu dla Arduino, który wykonuje pomiar. Ale to nie o to chodzi 🙂

Ten program dla mnie jest zbyt skomplikowany, aby wstawić tam warunek, bez pomocy kogoś doświadczonego nie dam rady.

 

 

Link do komentarza
Share on other sites

1 minutę temu, Krisk napisał:

Ten program dla mnie jest zbyt skomplikowany, aby wstawić tam warunek,

E tam.

Na początku loop czytasz pin podłączony do czujki PIR. Jeśli stan jest niski - wygaszasz wyświetlacz, robisz jakiegoś delaja typu sekunda i return.

Nie, nie wiem jak się w Twojej bibliotee wygasza wyświetlacz, ale przeczytanie dokumentacji i przykładów nie powinno przekraczać możliwości początkującego.

Czyli coś w stylu:

void loop()
{
  if (digitalRead(PIN_PIR) == LOW) {
    // wygaś wyświetlacz
    delay(1000);
    return;
  }
  // zapal wyświetlacz
  //i dalej jak było wcześnmiej
  
  

Spróbuj tak (oczywiście ustaw pin na INPUT w setup).

 

 

Link do komentarza
Share on other sites

21 godzin temu, Krisk napisał:

Ten program dla mnie jest zbyt skomplikowany, aby wstawić tam warunek, bez pomocy kogoś doświadczonego nie dam rady.

To zaczynaj nie od pisania programu tylko od opracowania jego koncepcji tzw. algorytmu. Taki algorytm będący np. graficzną prezentacją działania programu pozwoli Ci na dokładne jego "opracowanie od podstaw". Mając swoją receptę na program (algorytm), w kolejnych już krokach każdy z jego etapów zapisujesz w języku programowania. Uwierz mi jeśli ktoś mówi, że "dobry algorytm to podstawa dla dobrego programu" to wie co mówi.

Trochę na ten temat znajdziesz np tu: http://www.informatyka.orawskie.pl/?pl_algorytmy,131

Tak na marginesie ja jeśli pracuję nad algorytmem programu korzystam z metod graficznych - bardzo mi to pomaga.

Edytowano przez Belferek
  • Lubię! 1
Link do komentarza
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!

Anonim
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...

Ważne informacje

Ta strona używa ciasteczek (cookies), dzięki którym może działać lepiej. Więcej na ten temat znajdziesz w Polityce Prywatności.