Przerwania, z opóźnieniem jak ogarnąć

alankedzior
Posts: 114
Joined: Mon Jun 18, 2018 5:38 pm

Post

Jesteś w stanie o to okomemtowac żeby dotarło do mnie jak to funkcjonuje
User avatar
pzygmunt
Posts: 20302
Joined: Tue Jan 19, 2016 9:26 am
Location: Paczków
Been thanked: 59 times

Post

Code: Select all

#define PIN_BUTTON 21
#define PIN_LIGHT 28  
#define PIN_ALARM 34  
#define PIN_PIR 24    
#define PIN_LED 13            

#define ARM_DELAY 5000 // Opóźnienie uzbrojenia alarmu w ms.
#define ALARM_DELAY 5000  // Opóźnienie załączenia alarmu w ms.
#define LED_BLINK_PERIOD 500 // Okres migania diody w ms.
#define ALARM_ON LOW // definicja określająca stan pinu dla alarmu włączonego
#define ALARM_OFF HIGH // definicja określająca stan pinu dla alarmu wyłączonego

unsigned long alarm_delay_timer = 0; // Licznik czasu opóźnienia załączenia alarmu
unsigned long arm_disarm_timer = 0; // Licznik czasu opóźnienia uzbrojenia alarmu
bool waiting_for_arm = false; // Zmienna określająca czy czekamy na uzbrojenie alarmu
unsigned long alarm_armed = 0; // Zmienna określająca czy alarm jest uzbrojony

unsigned long led_blink_time = 0; // Locznik czasu migania diody podczas uzbrajania
unsigned long btn_next_check = 0; // Czas kolejnego sprawdzania stanu przycisku
char btn_pressed = false; // Zmienna określająca czy przucisk podczas ostatniego sprawdzania był wciśnięty czy też nie

// Funkajca zwraca prawdję jeżeli przycisk jest wciśnięty
bool isBtnPressed() { 
  return digitalRead(PIN_BUTTON) == LOW;
}

// Funkajca zwraca prawdję jeżeli wykryto ruch
bool motionDetected() {
   return digitalRead(PIN_PIR) == HIGH;
}

// Funkajca zwraca prawdję jeżeli alarm jest załączony
bool isArmed() {
  return alarm_armed != 0;
}

void setup() {
  pinMode(PIN_LED, OUTPUT);
  pinMode(PIN_LIGHT, OUTPUT);
  digitalWrite(PIN_LIGHT, HIGH);
  pinMode(PIN_ALARM, OUTPUT);
  digitalWrite(PIN_ALARM, ALARM_OFF);
  pinMode(PIN_PIR, INPUT);
  pinMode(PIN_BUTTON, INPUT_PULLUP);

  btn_pressed = isBtnPressed(); // Zapamiętujemy stan przycisku przy inicjalizacji 
}


// Detekcja intruzów / uruchamianie alarmu
void intruders_detection(unsigned long now) {
    if (!isArmed()) return; // Jeżeli alarm nie jest uzbrojony to wyjdź z funkcji
    if (alarm_delay_timer == 0 ) { // Jeżeli odliczanie nie zostało zainicjowane 
        if ( motionDetected() ) // Jeżeli wykryto ruch
          {
             alarm_delay_timer = now + ALARM_DELAY; // zainicjuj odliczanie poprzez określenie czasu po którym nastąpi załączenie alarmu
          }
    } else if (alarm_delay_timer < now) { // Jezeli odliczanie zostalo zainicjowane (wynika to z else) i upłynął zadany czas 
        digitalWrite(PIN_ALARM, ALARM_ON); // Włącz alarm
    }
}

// Miganie diody podczas uzbrajania
void led_blinking(unsigned long now) {
    if (waiting_for_arm && led_blink_time < now) { // Jeżeli czekamy na uzbrojenie i upłynął czas do nastepnej zmiany stanu pinu do którego pdołaczona jest dioda
      led_blink_time = now + LED_BLINK_PERIOD; // Ustaw opóźnienie dla kolejnego "mignięcia"
      digitalWrite(PIN_LED, digitalRead(PIN_LED) == HIGH ? LOW : HIGH); // Odwóróc stan pin-u jeżeli HIGH to ustaw LOW. Jeżeli LOW do ustaw HIGH
    }
}

// Włącz oświetlenie 
void turn_lights_on() {
    digitalWrite(PIN_LIGHT, motionDetected() ? HIGH : LOW); // Włącz jeżeli wykryto ruch. Wyłącz jeżeli brak ruchu.
}

// Osbługa przycisku
void button_check(unsigned long now) {
    if (now < btn_next_check // Jeżeli upłynął zadany czas do kolejnego sprawdzania (pozwala to wyeliminować drgania przycisku)
        || btn_pressed == isBtnPressed() ) return; // i zmienił się stan przycisku to przechodzi dalej. Jeżeli nie to wychodzi z funkcji

    btn_pressed = isBtnPressed(); // Zapamiętaj stan przycisku
    btn_next_check = now + 50; // Ustaw opóźnienie do kolejnego sprawdzania (50ms.)
      
    if (btn_pressed) { // Jeżeli przycisk wciśnięty
         waiting_for_arm = !waiting_for_arm && !isArmed(); // Czekamy na uzbrajanie jeżeli obecnie nie czekamy na uzbrojenie i alarm jest nieuzbrojony
         arm_disarm_timer = now + ( waiting_for_arm ? ARM_DELAY : 0 );  // Ustawo opóźnienie jeżeli uzbrajamy. Jeżeli rozbrajamy to nie czekaj
    }
}

// Uzbrajanie i rozbrajanie alarmu
void armdisarm(unsigned long now) {
    if (arm_disarm_timer == 0 
       || arm_disarm_timer > now ) return; // Jeżeli licznik czasu nie jest ustawiony lub jeszcze nie nadszedł czas uzbrojenia/rozbrojenia to wyjdź
        
    arm_disarm_timer = 0; // Deaktywuj lincznik odliczania
    alarm_armed = waiting_for_arm ? now : 0; // Jeżeli czekaliśmy na uzbrojenie to uzbrój określając moment uzbrojenia. Jeżeli nie to rozbrój 
    waiting_for_arm = false; // Nie czekamy już na uzbrojenie

    digitalWrite(PIN_LED, isArmed() ? HIGH : LOW);  // Ustawiamy diodę odpowiednio w zależności czy alarm jest uzbrojony czy też nie
         
    if (!isArmed()) { // Jeżeli alarm rozbrojony
        alarm_delay_timer = 0; // Anulujemy odliczanie do alarmu
        digitalWrite(PIN_ALARM, ALARM_OFF); // Wyłaczamy alarm (mógł być włączony)
    }
}

void loop() {

  unsigned long now = millis();

  intruders_detection(now);
  led_blinking(now);
  button_check(now);
  armdisarm(now);
  turn_lights_on();
  
}
SUPLA.... Nareszcie w domu.
alankedzior
Posts: 114
Joined: Mon Jun 18, 2018 5:38 pm

Post

Jesteś WIELKI jak HIGH w moim nowym programie :) jak całość zacznie funkcjonować postaram się przedstawić wam projekt mojego alarmu.dzięki Bardzo
alankedzior
Posts: 114
Joined: Mon Jun 18, 2018 5:38 pm

Post

@pzygmunt

Dodałem do twojego programu opcję wysyłania sms, wszystko działa Sms wysyła lecz nie mogę wyłączyć alarmu gdy dodam linijkę sendsms, czy spowodowane jest to brakiem przerwania na przycisku ? czy możesz coś poradzić jeszcze w tym temacie.


Code: Select all

#include "agsm_SMS_lbr.h"
#include <SoftwareSerial.h>

#define powerPIN 7
#define resetPIN 6
#define statusPIN 5
#define BUFFDSIZE 1024



const char *numer = "0123456789";
const char *wiadomosc = "Uwaga! Wykryto ruch!";
int state = 0, i = 0, powerState = 0;
char ch, buffd[1024], readBuffer[BUFFDSIZE];
SoftwareSerial agsmSerial(10, 3);


#define PIN_BUTTON 21
#define STREFA1 28 
#define STREFA2 29 
#define STREFA3 30 
#define STREFA4 31  
#define PIN_ALARM 34  
#define PIN_PIR_KORYTARZ 26    
#define PIN_PIR_LAZIENKA 22  
#define PIN_PIR_AKWARIUM 23  
#define PIN_PIR_SALON1 24  
#define PIN_PIR_SALON2 25  
#define PIN_PIR_GARAZ 27  
#define PIN_LED 49            

#define ARM_DELAY 5000 // Opóźnienie uzbrojenia alarmu w ms.
#define ALARM_DELAY 10000  // Opóźnienie załączenia alarmu w ms.
#define LED_BLINK_PERIOD 500 // Okres migania diody w ms.
#define ALARM_ON LOW // definicja określająca stan pinu dla alarmu włączonego
#define ALARM_OFF HIGH // definicja określająca stan pinu dla alarmu wyłączonego

unsigned long alarm_delay_timer = 0; // Licznik czasu opóźnienia załączenia alarmu
unsigned long arm_disarm_timer = 0; // Licznik czasu opóźnienia uzbrojenia alarmu
bool waiting_for_arm = false; // Zmienna określająca czy czekamy na uzbrojenie alarmu
unsigned long alarm_armed = 0; // Zmienna określająca czy alarm jest uzbrojony

unsigned long led_blink_time = 0; // Licznik czasu migania diody podczas uzbrajania
unsigned long btn_next_check = 0; // Czas kolejnego sprawdzania stanu przycisku
char btn_pressed = false; // Zmienna określająca czy przycisk podczas ostatniego sprawdzania był wciśnięty czy też nie

// Funkajca zwraca prawdję jeżeli przycisk jest wciśnięty
bool isBtnPressed() { 
  return digitalRead(PIN_BUTTON) == LOW;
}

// Funkajca zwraca prawdję jeżeli wykryto ruch
bool motionDetected() {
   return digitalRead(PIN_PIR_KORYTARZ) == HIGH;
    return digitalRead(PIN_PIR_LAZIENKA) == HIGH;
     return digitalRead(PIN_PIR_AKWARIUM) == HIGH;
      return digitalRead(PIN_PIR_SALON1) == HIGH;
       return digitalRead(PIN_PIR_SALON2) == HIGH;
        return digitalRead(PIN_PIR_GARAZ) == HIGH;
}

// Funkajca zwraca prawdję jeżeli alarm jest załączony
bool isArmed() {
  return alarm_armed != 0;
}

void setup() {
  agsmSerial.begin(9600);
  clearagsmSerial();
  clearSerial();
  
 pinMode(PIN_LED, OUTPUT);
  pinMode(STREFA1, OUTPUT);
  digitalWrite(STREFA1, LOW);
  pinMode(STREFA2, OUTPUT);
  digitalWrite(STREFA2, LOW);
  pinMode(STREFA3, OUTPUT);
  digitalWrite(STREFA3, LOW);
  pinMode(STREFA4, OUTPUT);
  digitalWrite(STREFA4, LOW);
  pinMode(PIN_ALARM, OUTPUT);
  digitalWrite(PIN_ALARM, ALARM_OFF);
  pinMode(PIN_PIR_KORYTARZ, INPUT);
   pinMode(PIN_PIR_LAZIENKA, INPUT);
    pinMode(PIN_PIR_AKWARIUM, INPUT);
     pinMode(PIN_PIR_SALON1, INPUT);
      pinMode(PIN_PIR_SALON2, INPUT);
       pinMode(PIN_PIR_GARAZ, INPUT);
  pinMode(PIN_BUTTON, INPUT_PULLUP);

  btn_pressed = isBtnPressed(); // Zapamiętujemy stan przycisku przy inicjalizacji 
}


// Detekcja intruzów / uruchamianie alarmu
void intruders_detection(unsigned long now) {
    if (!isArmed()) return; // Jeżeli alarm nie jest uzbrojony to wyjdź z funkcji
    if (alarm_delay_timer == 0 ) { // Jeżeli odliczanie nie zostało zainicjowane 
        if ( digitalRead(PIN_PIR_KORYTARZ )) // Jeżeli wykryto ruch
          {
             alarm_delay_timer = now + ALARM_DELAY; // zainicjuj odliczanie poprzez określenie czasu po którym nastąpi załączenie alarmu
          }
    } else if (alarm_delay_timer < now) { // Jezeli odliczanie zostalo zainicjowane (wynika to z else) i upłynął zadany czas 
       
       
        
        digitalWrite(PIN_ALARM, ALARM_ON);   // Włącz alarm
        
       // sendSMS(numer, wiadomosc);
         
        
    }
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); // Włącz alarm

    
       // sendSMS(numer, wiadomosc);                                        // nie można wyłączyć alarmu gdy dodam wysyłanie smsa, czy spowodowane jest to brakiem przerwań ? jak to ominąć ?
        
       
  }


}

// Miganie diody podczas uzbrajania
void led_blinking(unsigned long now) {
    if (waiting_for_arm && led_blink_time < now) { // Jeżeli czekamy na uzbrojenie i upłynął czas do nastepnej zmiany stanu pinu do którego pdołaczona jest dioda
      led_blink_time = now + LED_BLINK_PERIOD; // Ustaw opóźnienie dla kolejnego "mignięcia"
      digitalWrite(PIN_LED, digitalRead(PIN_LED) == HIGH ? LOW : HIGH); // Odwóróc stan pin-u jeżeli HIGH to ustaw LOW. Jeżeli LOW do ustaw HIGH
    }
}

//Włącz oświetlenie 
void turn_lights_on() {



if (digitalRead(PIN_PIR_KORYTARZ))
{
   (digitalWrite(STREFA3, HIGH));
}
else

{
  (digitalWrite(STREFA3, LOW));
  }

  
if (digitalRead(PIN_PIR_LAZIENKA))
{
   (digitalWrite(STREFA1, HIGH));
}
else

{
  (digitalWrite(STREFA1, LOW));
  }

if (digitalRead(PIN_PIR_AKWARIUM))
{
   (digitalWrite(STREFA1, HIGH));
   (digitalWrite(STREFA2, HIGH));
}
else

{
  (digitalWrite(STREFA1, LOW));
   (digitalWrite(STREFA2, LOW));
  }

if (digitalRead(PIN_PIR_SALON2))
{
      (digitalWrite(STREFA2, HIGH));
}
else

{
    (digitalWrite(STREFA2, LOW));
  }

  if (digitalRead(PIN_PIR_GARAZ))
{
      (digitalWrite(STREFA4, HIGH));
}
else

{
    (digitalWrite(STREFA4, LOW));
  }
}

// Osbługa przycisku
void button_check(unsigned long now) {
    if (now < btn_next_check // Jeżeli upłynął zadany czas do kolejnego sprawdzania (pozwala to wyeliminować drgania przycisku)
        || btn_pressed == isBtnPressed() ) return; // i zmienił się stan przycisku to przechodzi dalej. Jeżeli nie to wychodzi z funkcji

    btn_pressed = isBtnPressed(); // Zapamiętaj stan przycisku
    btn_next_check = now + 50; // Ustaw opóźnienie do kolejnego sprawdzania (50ms.)
      
    if (btn_pressed) { // Jeżeli przycisk wciśnięty
         waiting_for_arm = !waiting_for_arm && !isArmed(); // Czekamy na uzbrajanie jeżeli obecnie nie czekamy na uzbrojenie i alarm jest nieuzbrojony
         arm_disarm_timer = now + ( waiting_for_arm ? ARM_DELAY : 0 );  // Ustawo opóźnienie jeżeli uzbrajamy. Jeżeli rozbrajamy to nie czekaj
    }
}

// Uzbrajanie i rozbrajanie alarmu
void armdisarm(unsigned long now) {
    if (arm_disarm_timer == 0 
       || arm_disarm_timer > now ) return; // Jeżeli licznik czasu nie jest ustawiony lub jeszcze nie nadszedł czas uzbrojenia/rozbrojenia to wyjdź
        
    arm_disarm_timer = 0; // Deaktywuj lincznik odliczania
    alarm_armed = waiting_for_arm ? now : 0; // Jeżeli czekaliśmy na uzbrojenie to uzbrój określając moment uzbrojenia. Jeżeli nie to rozbrój 
    waiting_for_arm = false; // Nie czekamy już na uzbrojenie

    digitalWrite(PIN_LED, isArmed() ? HIGH : LOW);  // Ustawiamy diodę odpowiednio w zależności czy alarm jest uzbrojony czy też nie
         
    if (!isArmed()) { // Jeżeli alarm rozbrojony
        alarm_delay_timer = 0; // Anulujemy odliczanie do alarmu
        digitalWrite(PIN_ALARM, ALARM_OFF); // Wyłaczamy alarm (mógł być włączony)
    }




}

    

void loop() {

  unsigned long now = millis();

  intruders_detection(now);
  led_blinking(now);
  button_check(now);
  armdisarm(now);
  turn_lights_on();
  
 
  
  
}
    



User avatar
pzygmunt
Posts: 20302
Joined: Tue Jan 19, 2016 9:26 am
Location: Paczków
Been thanked: 59 times

Post

Może po wejściu sendSMS pętla się zatrzymuje ?
SUPLA.... Nareszcie w domu.
alankedzior
Posts: 114
Joined: Mon Jun 18, 2018 5:38 pm

Post

Na pewno się zatrzymuje , probowalem tworzyć nowa pętle która wysyła SMS gdy alarm jest załączony ale nic z tego, masz może jakiś pomysł jak to obejść
User avatar
Espablo
Posts: 1754
Joined: Wed Jun 29, 2016 5:04 pm
Location: Oświęcim

Post

Możesz pokazać jak wygląda ta funkcja sendSMS?
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

Z góry zaznaczam, że nie używam tego Arduino do Supli, jest to niezależny moduł który będzie odpowiadał za alarm, światło awaryjne i oświetlenie na schodach.


Biblioteka obsługi sms wygląda tak:

Code: Select all

/*
agsm_SMS_lbr.ino v 0.97/20151118 - a-gsm 2.064 LIBRARY SUPPORT
COPYRIGHT (c) 2015 Dragos Iosub / R&D Software Solutions srl

You are legaly entitled to use this SOFTWARE ONLY IN CONJUNCTION WITH a-gsm DEVICES USAGE. Modifications, derivates and redistribution 
of this software must include unmodified this COPYRIGHT NOTICE. You can redistribute this SOFTWARE and/or modify it under the terms 
of this COPYRIGHT NOTICE. Any other usage may be permited only after written notice of Dragos Iosub / R&D Software Solutions srl.

This SOFTWARE is distributed is provide "AS IS" in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied 
warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

Dragos Iosub, Bucharest 2015.
http://itbrainpower.net
***************************************************************************************
SOFTWARE:
This file MUST be present, toghether with other files, inside a folder named 
like your main sketch!
***************************************************************************************
HARDWARE:
Read the readme file(s) inside the arhive/folder.
***************************************************************************************
HEALTH AND SAFETY WARNING!!!!!!!!!!!!!!!!!!!!
High power audio (around 700mW RMS)! You can damage your years! 
Use it with care when headset is connected. USE IT AT YOUR OWN RISK!
We recomend to set the volume at maximum level 20!
***************************************************************************************
*/

/*
	send "message" to "phno". 
	Returns 1 for success, 0 for failure
	phtype:
		129 (default)
		145
		161
*/
int sendSMS(char* phno, char* message, char* phtype){
	if(ready4SMS != 1)	
		setupMODEMforSMSusage();
	int res=0;
	clearBUFFD();
	sprintf(buffd,"AT+CMGS=\"%s\",%s\r", phno, phtype);
	sprintf(buffd,"AT+CMGS=\"%s\"\r", phno);
	agsmSerial.print(buffd);
res = recUARTDATA(">","ERROR",12);  
if(res==1) {    
		clearBUFFD();
		sprintf(message,"%s%c",message,0x1A);
		aGsmCMD(message,2);  
		res = recUARTDATA("OK","ERROR",30);  
		delay(150);
		#if defined(SMSLibDebug)
			if(res==1 && strstr(buffd,"+CMGS:")) {
				Serial.println(F("SMS succeed")); 
			}else{ 
				Serial.println(F("SMS error"));  
			}
			Serial.flush();
			delay(150);
	#endif
}
	else{
		#if defined(SMSLibDebug)
			Serial.println(F("SMS rejected"));  
			Serial.flush();
		#endif
	}
	return res;
}
/*
int sendSMS(char* phno, char* message, char* phtype){
	if(ready4SMS != 1)	
		setupMODEMforSMSusage();
	int res=0;
	clearBUFFD();
	sprintf(buffd,"AT+CMGS=\"%s\",%s\r", phno, phtype);
	agsmSerial.print(buffd);
	res = recUARTDATA(">","ERROR",12);  
	if(res==1) {    
		clearBUFFD();
		sprintf(message,"%s%c",message,0x1A);
		aGsmCMD(message,2);  
		res = recUARTDATA("OK","ERROR",30);  
		delay(150);
		if(res==1 && strstr(buffd,"+CMGS:")) Serial.println(F("SMS succeed")); 
		else Serial.println(F("SMS error"));  
		Serial.flush();
		delay(150);
	}
	return res;
}
*/

/*
	read SMS at SMSindex location
	SMS content loaded in buffd
	you can check...if strlen(buffd)<1 => no SMS at that location
	SMSindex between 1 and noSMS (last used SMS location)
*/
void readSMS(int SMSindex){        
	clearBUFFD();
	if(ready4SMS != 1) setupMODEMforSMSusage();
	if(totSMS<1) listSMS();
	if(SMSindex > noSMS || SMSindex < 1) return;
	int cnt=0;
	int j=0;
	int run=1;
	char c;
	unsigned long startTime = 0;
	clearagsmSerial();
	agsmSerial.print("AT+CMGR=");//send command to modem
	agsmSerial.print(SMSindex);//send command to modem
	agsmSerial.println(",0");//send command to modem
	delay(1);
	readline();//just 2 remove modem cmd echo
	readline();//just 2 remove second line ==> (containing OK / +CMS ERROR / SMS header)
	//her buffd contains the SMS header (sender number, date+time)
	if(strlen(buffd)<20)
		if(strstr(buffd,"OK")||strstr(buffd,"ERROR:")) {//check empty message location or beyond interval SMS location
			clearBUFFD();
			clearagsmSerial();
			#if defined(SMSLibDebug)
				Serial.println(F("noSMS at this location"));
			#endif
			return;
		}
	startTime = millis();
	while(run){//here
		if(TXavailable()){
			c = agsmSerial.read();
			if(c == '\r') {//look for CR char(end of SMS message)
				buffd[cnt]=0x00;
				break;
			}
			if(cnt < BUFFDSIZE-1) {
				buffd[cnt] = c;
			} else {//buffer overflow here (avoided)
				break;
			}
			cnt++;
		}
		else if(millis() - startTime > (unsigned long) 2000) //unblocking procedure 
			  break;
	}
	buffd[cnt]=0x00;//add string terminator
	clearagsmSerial();//clear remaining serial chars
}

/*just print all SMSs to the debug console...*/
void readAllSMS(){
	listSMS();
	clearagsmSerial();
	int cnt;
	cnt = noSMS;
	while (cnt>0){
		Serial.print(F("SMS "));//noSMS
		Serial.println(cnt);
		readSMS(cnt);
		Serial.println(buffd);delay(50);
		clearBUFFD();
		clearagsmSerial();
		cnt--;
	}
}

/*
	delete SMS at SMSindex location...
	to make some space, delete from bigges to smalles(desired) SMSindex
	you can try something like:
	
	listSMS();//update noSMS(last used SMS location)
	int cnt;
	cnt = noSMS;
	//while (cnt > 0){//to delete all
	while (cnt > DesiredIndex){//to delete until DesiredIndex
		deleteSMS(cnt--);
	}
*/
void deleteSMS(int SMSindex){
	if(ready4SMS != 1)	
		setupMODEMforSMSusage();
	char tmpChar[20];//40
	memset(tmpChar,0x00, sizeof(tmpChar));
	clearBUFFD();     
	sprintf(tmpChar,"+CMGD=%i\r",SMSindex);//format the delete command 
	sendATcommand(tmpChar,"OK","ERROR",3);//send command to modem
}

/*
	read SMS storage capacity, 
	total SMS locations(capacity) ==> noSMS(global var), 
	last used SMS location ==> noSMS(global var)
*/
void listSMS(){
	if(ready4SMS != 1)	
		setupMODEMforSMSusage();
	int res=0;
	int j=0;
	char * pch;
	while(res!=1)
	res = fATcmd(F("+CPMS?"),10, "OK","+CMS ERROR:");//+CPMS: "SM",8,50,"SM",8,50,"SM",8,50// +CMS ERROR:
	j=0;
	pch = strtok (buffd,",");
	while (pch != NULL){//parsing for SMS SIMM entries
		if(j==1){// used SMS
			noSMS=atoi(pch);
		}else if(j==2){//total SMS
			totSMS=atoi(pch);
		}
		pch = strtok (NULL, ",");
		j++;
	}
}
+


podprogram

Code: Select all

/*
agsm_SMS_lbr.h v 0.9711/20160707 - a-gsm 2.064 LIBRARY SUPPORT
COPYRIGHT (c) 2016 Dragos Iosub / R&D Software Solutions srl

You are legaly entitled to use this SOFTWARE ONLY IN CONJUNCTION WITH a-gsm DEVICES USAGE. Modifications, derivates and redistribution 
of this software must include unmodified this COPYRIGHT NOTICE. You can redistribute this SOFTWARE and/or modify it under the terms 
of this COPYRIGHT NOTICE. Any other usage may be permited only after written notice of Dragos Iosub / R&D Software Solutions srl.

This SOFTWARE is distributed is provide "AS IS" in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied 
warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

Dragos Iosub, Bucharest 2016.
http://itbrainpower.net
***************************************************************************************
SOFTWARE:
This file MUST be present, toghether with other files, inside a folder named 
like your main sketch!
***************************************************************************************
HARDWARE:
Read the readme file(s) inside the arhive/folder.
***************************************************************************************
HEALTH AND SAFETY WARNING!!!!!!!!!!!!!!!!!!!!
High power audio (around 700mW RMS)! You can damage your years! 
Use it with care when headset is connected. USE IT AT YOUR OWN RISK!
We recomend to set the volume at maximum level 20!
***************************************************************************************
*/

int noSMS=0, totSMS=0;

#define agsm_SMS
#if !defined (agsm_BASIC)
	#include "agsm_basic_lbr.h"
#endif

int ready4SMS = 0, ready4Voice = 0;

int sendSMS(char* phno, char* message, char* phtype = "129");
void readSMS(int SMSindex);
void readAllSMS(void);
void deleteSMS(int SMSindex);
void listSMS(void);
User avatar
Espablo
Posts: 1754
Joined: Wed Jun 29, 2016 5:04 pm
Location: Oświęcim

Post

Spróbuj zamienić miejscami i dać

Code: Select all

sendSMS(numer, wiadomosc);
digitalWrite(PIN_ALARM, ALARM_ON); 
Masz tam 2 wywołania sendSMS. Sprawdź na razie z jedynym potem dodaj następne.
Dodaj sobie jeszcze blokadę żeby nie wysyłał SMS za każdym razem jak wejdzie w loopie w tą funkcję
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

Miejscami już zmieniałem wcześniej i nic, probowalem też tylko w jedej funkcji używać i też nic. Co masz na myśli blokować ten warunek w loopie? Dodać if czy co?

Return to “Pomoc”