Skocz do zawartości

Uruchamianie wyświetlacza lub programu po wykryciu ruchu


Pomocna odpowiedź

Napisano

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)
  {
   
  }
}

 

(edytowany)

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_

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.

 

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.

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.

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

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.

 

 

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

 

 

U Ciebie w bibliotece funkcja odpowiedzialna za czyszczenie to 

lcd.clear();

dorzuc u siebie w kodzie na końcu jakiś delay(5000) np. I na końcu ten .clear(), i sprawdź czy po upływie kilku sekund matryca zgaśnie

(edytowany)
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

Bądź aktywny - zaloguj się lub utwórz konto!

Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony

Utwórz konto w ~20 sekund!

Zarejestruj nowe konto, to proste!

Zarejestruj się »

Zaloguj się

Posiadasz własne konto? Użyj go!

Zaloguj się »
×
×
  • Utwórz nowe...