Przerwania, z opóźnieniem jak ogarnąć

User avatar
Espablo
Posts: 1754
Joined: Wed Jun 29, 2016 5:04 pm
Location: Oświęcim

Post

Chodzi o to że jak masz alarm włączony i spełniony jest np warunek PIN_PIR_AKWARIUM to za każdym razem jak program tu wchodzi chce wysyłać sms

Code: Select all

if (digitalRead(PIN_PIR_AKWARIUM)||  digitalRead(PIN_PIR_SALON1) ||  digitalRead(PIN_PIR_SALON2) ||  digitalRead(PIN_PIR_GARAZ) ||  digitalRead(PIN_PIR_LAZIENKA))
{
   digitalWrite(PIN_ALARM, ALARM_ON);
 sendSMS(numer, wiadomosc);                                        
       
  }
Można to zrobić np

Code: Select all

if ((digitalRead(PIN_PIR_AKWARIUM)||  digitalRead(PIN_PIR_SALON1) ||  digitalRead(PIN_PIR_SALON2) ||  digitalRead(PIN_PIR_GARAZ) ||  digitalRead(PIN_PIR_LAZIENKA) && !lock) 
{
  digitalWrite(PIN_ALARM, ALARM_ON);
 lock = sendSMS(numer, wiadomosc);                                        
       
  }
 if (!(digitalRead(PIN_PIR_AKWARIUM)  && digitalRead(PIN_PIR_SALON1) && digitalRead(PIN_PIR_SALON2)  && digitalRead(PIN_PIR_GARAZ)  && digitalRead(PIN_PIR_LAZIENKA)) {
  lock = 0;
 } 
Pisane na kolanie i trzeba przetestować
Każde urządzenie elektryczne działa o wiele lepiej jeśli podłączysz je do prądu. :? :roll:
alankedzior
Posts: 114
Joined: Mon Jun 18, 2018 5:38 pm

Post

Spróbuję, choć taki jest sens że gdy któryś czujnik podczas uzbrojenia wykryje ruch załącza alarm i wysyła SMS uzbrojenie alarmu to Inna funkcja i uruchomienie tez inna , jeżeli jest uzbrojony lecz gdy nie wykrywa ruchu cały czas czeka nic nie robiąc. Może spróbować napisac nowego voida który brednie sprawdzał czy alarm ma określony stan i wtedy wysyła SMS ale próbowałem i nie mogę ogarnąć
User avatar
Espablo
Posts: 1754
Joined: Wed Jun 29, 2016 5:04 pm
Location: Oświęcim

Post

Tak, ale jak ruch będzie trwał np 20s to Ty możesz dostać z 10 lub więcej smsow
Każde urządzenie elektryczne działa o wiele lepiej jeśli podłączysz je do prądu. :? :roll:
alankedzior
Posts: 114
Joined: Mon Jun 18, 2018 5:38 pm

Post

jak zdefiniować lock ?
User avatar
Espablo
Posts: 1754
Joined: Wed Jun 29, 2016 5:04 pm
Location: Oświęcim

Post

alankedzior wrote: Sun Nov 11, 2018 3:31 pm jak zdefiniować lock ?
Można na dwa sposoby
1. Jako zmienna globalna

Code: Select all

int lock;
2. Lub

Code: Select all

void intruders_detection(unsigned long now) {
static int lock;
... 
Każde urządzenie elektryczne działa o wiele lepiej jeśli podłączysz je do prądu. :? :roll:
alankedzior
Posts: 114
Joined: Mon Jun 18, 2018 5:38 pm

Post

Dodałem kilka nawiasów i się skompilowało ( z lock) lecz problem się nadl nie rozwiązał...

Działa wszystko do momentu gdy uzbrajam alarm przyciskiem, alarm się uzbraja dioda się zapala ( alarm czuwa ) , naruszam strefę, syrena się załącza, lecz nie idzie rozbroić alarmu syreny. Może problem rozwiązało by owe przerwanie na przycisku lecz nie bardzo wiem jak to rozfryźć, działam na Arduino Mega obecnie przycisk jest na Pinie 21 czyl pin który obsługuje przerwania,
Liam
Posts: 1
Joined: Tue Jan 15, 2019 8:21 pm

Post

Nie chcąc budować nowego wątku, podłączę się do dyskusji licząc na pomoc. ( to tak na poczatek).

Primo :
Witam wszystkich , jestem tu nowy.
A teraz do faktów.
Z Arduino bawię się od trzech tygodni i naskrobałem taki program.
Arduino Pro / Mini
5V, 16 MHZ , dwie matryce szregowo P10 ( DMD.h)
wyświetlanie czasu z GPS, lub po wyborze pilotem RC5 tryb stopera.

Code: Select all

#include <SPI.h>
#include <DMD.h>
#include <TimerOne.h>
#include <Time.h>
#include <TinyGPS++.h>
#include <IRremote.h>
//#include "SystemFont5x7.h"
#include "Arial_black_16.h"
//#include "Arial14.h"
#define Serial_GPS Serial
TinyGPSPlus gps;
static const uint32_t GPSBaud = 9600;
#define DISPLAYS_ACROSS 2// ile matryc szeregowo
#define DISPLAYS_DOWN 1// ile matryc w pionie
DMD dmd( DISPLAYS_ACROSS , DISPLAYS_DOWN );
int RECV_PIN = 12;// PIN odbiornika IR
IRrecv irrecv(RECV_PIN);
decode_results results;

unsigned long aktczas = 0;
unsigned long zapczas = 0;

byte setki;
byte sminuty;
byte ssekundy;
byte klucz;

char mi[3];
char gg[3];
char ss[3];
char czas[11];
char sss[3];
char smi[3];
char sme[3];
char licz[9];

String strmi;
String strgg;
String strss;
String str11;
String sstrmi;
String sstrgg;
String sstrss;
String liczydlo;

const int buttonPin = 2;
int buttonState = 0;

boolean zegar;
boolean stoper;

// ***************************************************************

void setup(void)
{
  irrecv.enableIRIn(); // Start odbiornika IR
  Serial.begin(9600);
  Serial_GPS.begin(GPSBaud);
  Timer1.initialize( 2500 );//    2,5 ms odswiezanie matrycy
  Timer1.attachInterrupt( ScanDMD );
  dmd.selectFont(Arial_Black_16);
  // dmd.selectFont(SystemFont5x7);
  // dmd.selectFont(Arial14);
  pinMode(buttonPin, INPUT);
  dmd.clearScreen(true);
  setki = 0;

}
void ScanDMD()

{
  dmd.scanDisplayBySPI();
}

void loop()
{
  if (irrecv.decode(&results)) {
    klucz = (results.value);
    switch (klucz) {

      case 1://zegar
        dmd.clearScreen(true);
        stoper = false;
        zegar = true;
        break ;

      case 3://stoper
        dmd.clearScreen(true);
        zegar = false;
        stoper = false;
        setki = 0;
        ssekundy = 0;
        sminuty = 0;
        dmd.drawString( 7, 1, "00:00.0", 8, GRAPHICS_NORMAL );
        break ;

      case 4:// start stoper
        dmd.clearScreen(true);
        zegar = false;
        stoper = true;
        break ;

      case 6://pauza
        dmd.clearScreen(true);
        stoper = false;
        zegar = false;
        dmd.drawString( 7, 1, licz, 9, GRAPHICS_NORMAL );
        break ;
    }
    irrecv.resume();
  }
  if (stoper) {
    stoper1();
  }
  if (zegar) {
    zegar1();
  }
}

// ************* Koniec obslugi IR ****************

// *******************  Zegar *********************

void zegar1()
{
  buttonState = digitalRead(buttonPin);

  while (Serial_GPS.available()) {
    if (gps.encode(Serial_GPS.read())) {

      byte Hour = gps.time.hour();
      byte Minute = gps.time.minute();
      byte Second = gps.time.second();

      // Przeliczenie zeby czas wygladal " 7:09 " a nie " 7:9 "

      // ******************** Sekundy **********************

      strss = String(Second);
      if (Second < 10) {
        strss = "0" + strss;
      }
      strss.toCharArray(ss , 3);

      //****************Minuty*******************************

      strmi =  String(Minute);
      if (Minute < 10) {
        strmi = "0" + strmi;
      }
      strmi.toCharArray(mi , 3);

      //***************** Godziny ************************************

      if (buttonState == HIGH) {
        Hour = Hour + 2;
      } else {
        Hour = Hour + 1;
      }

      if (Hour > 23) {
        Hour = 0;
      }
      strgg = String(Hour);
      strgg.toCharArray(gg , 3);

      //****************************************************************

      String strgg = gg;
      String strmi = mi;
      String strss = ss;
      str11 =  strgg + ":" + strmi + ":" + strss + "   ";
      str11.toCharArray(czas, 10);
      dmd.drawString( 1, 1, czas, 10, GRAPHICS_NORMAL );
      while (zegar != true);
    }
  }
}
void stoper1()
{

  // ***************   STOPER   ***************

  aktczas = millis();
  if (aktczas - zapczas >= 100UL) {
    zapczas = aktczas;
    setki++;
  }
  if (setki == 10) {
    ssekundy++;
    setki = 0;
  }
  if (ssekundy == 60) {
    sminuty++;
    ssekundy = 0;
  }
  if (sminuty == 100) {
    sminuty = 0;
  }
  sstrmi =  String(ssekundy);
  if (ssekundy < 10) {
    sstrmi = "0" + sstrmi;
  }
  sstrgg =  String(sminuty);
  if (sminuty < 10) {
    sstrgg = "0" + sstrgg;
  }
  sstrss =  String(setki);
  sstrss.toCharArray(sss , 2);
  String sstrss = sss;
  sstrmi.toCharArray(smi , 3);
  String sstrmi = smi;
  sstrgg.toCharArray(sme , 3);
  String sstrgg = sme;
  liczydlo =  sstrgg + ":" + sstrmi + "." + sstrss + " ";
  liczydlo.toCharArray(licz, 9);
  dmd.drawString( 7, 1, licz, 9, GRAPHICS_NORMAL );
  while (stoper != true);
}

//************  Koniec stopera ************************
" Szkic używa 17656 bajtów (57%) pamięci programu. Maksimum to 30720 bajtów.
Zmienne globalne używają 1023 bajtów (49%) pamięci dynamicznej, pozostawiając
1025 bajtów dla zmiennych lokalnych. Maksimum to 2048 bajtów."

Tak mówi kompilator.


No i wszystko działa piękie, tylko ....
no właśnie, gdy stoper liczy
to z biegiem czasu rozjeżdża się .
Po 26 minutach jest opóźniony o około 37 sekund , a to jest dla mnie nie do przyjęcia.
Porównywałem z drugim zegarem na GPS-ie.

Gdzie mam błąd ?
Poza ogólnym bałaganem w kodzie.

Pozdrawiam serdecznie i dziękuję za konstruktywne odpowiedzi.

Return to “Pomoc”