Advanced-Call-Controll-Relay-with-Arduino

Zapraszam do zapoznania się z moim projektem sterowania przekaźnikiem przy użyciu Arduino oraz modemu SIM800L.

Urządzenie powstało, ponieważ chciałem mieć możliwość otwierania bramy na osiedlu, bez konieczności używania pilota.

Idea była taka, żeby wyzwolić przekaźnik znajdujący się w mieszkaniu, który zwierając odpowiedni styk w domofonie, otworzy bramę.

Założenia:

  • urządzenie powinno obsługiwać tylko wskazane numery
  • numery nie powinny być hardkodowane w kodzie programu
  • urządzenie powinno móc pracować bez zasilacza
  • urządzenie powinno oszczędzać baterię
  • urządzenie powinno w pełni obsługiwać przychodzące wiadomości SMS
  • urządzenie powinno umożliwiać zdalne uruchomienie komend AT
  • urządzenie powinno umożliwiać zdalne wywołanie kodów USSD

Jak to działa?

Jest wskazane aby przy pierwszym użyciu, na karcie SIM nie znajdowały się kontakty. Wynika to z faktu, że numer telefonu kontaktu na pierwszej pozycji karty SIM, jest traktowany jako numer zarządzający. Tylko ten konkretny numer będzie mógł wykonywać operacje za pomocą komend SMS.

Jak sprawdzić kontakty na karcie SIM?

Poniżej znajduje się kod prostego szkicu, do komunikacji Arduino via Serial port z modemem podłączonym do pinów 11/12

#include <SoftwareSerial.h>
SoftwareSerial gsm(11, 12);
String atCommand;
void setup()
{
Serial.begin(9600);
while (!Serial) {}
gsm.begin(9600);
while (!gsm) {}
}

void loop()
{
if (gsm.available()) {
Serial.write(gsm.read());
}
while (Serial.available()) {
delay(10);
if (Serial.available() > 0)
{ char c = Serial.read();
atCommand += c;
}
}
if (atCommand.length() > 0)
{
gsm.println(atCommand);
atCommand = "";
}
}

Po wgraniu szkicu do Arduino, należy w Serial Monitorze wywołać komendę listującą wszystkie kontakty karty SIM

AT+CPBR=1,250

Jeżeli na pierwszej pozycji mamy jakiś wpis, to kasujemy go przez wywołanie

AT+CPBW=1

Wracamy do kodu głównego.

Szkic wykorzystuje zmodyfikowaną przez mnie bibliotekę GSM-GPRS-GPS-Shield-GSMSHIELD którą należy pobrać i dodać do IDE

Modyfikacja umożliwia m.in. komunikację z modułem SIM800L, czego nie oferował oryginał


#include "SIM900.h"
#include <avr/interrupt.h>
#include <avr/power.h>
#include <avr/sleep.h>
#include <EEPROM.h>
#include "sms.h"
#include "call.h"
CallGSM call;
SMSGSM sms;
const int RELAY1 = A0;
const int RELAY2 = A1;
const int callsAddr = 0;
const int openingAddr = 1;

//I`m counting calls and relay opening
//Liczę przychodzące rozmowy oraz uruchomienie przekaźnika
int calls = 1;
int opening = 1;
char spos;
char number[13];
char sim_number[13];
char reply[210];
char stat;
char message[159];

//Comment to disable debug with Serial.
//Zakomentowanie wyłączy konsolę Serial
#define LOCAL_DEBUG

//Comment line below to disable sms sent (when testing/debuging)
//Zakomentowanie wyłączy wysyłanie wiadomości SMS np podczas debugowania
#define SMS_ON

Jak widać powyżej, definiujemy dwa przekaźniki RELAY1, RELAY2 sterowane przez wyjścia A1A2callsAddr oraz openingAddr są adresami Eprom, gdzie przechowuję wartości calls oraz  opening, które zliczają ile połączeń odebrał modem oraz ile razy został uruchomiony przekaźnik (otwarta brama).

Zakładam że na początku warto przyjrzeć się komunikatom na konsoli, więc nie komentujemy #define LOCAL_DEBUG. Z drugiej strony warto zakomentować #define SMS_ON. Mamy wtedy pewność że kod nie wyśle żadnej wiadomości SMS. #define SMS_ON powinno być odkomentowane kiedy zakończymy debugowanie/testowanie.

 gsm.SimpleWriteln(F("AT+CMEE=2"));
checkSMS();

W setupie nie dzieje się nic szczególnego, włączamy rozszerzone opisy błędów i sprawdzamy czy na karcie znajdują się jakieś wiadomości SMS. To na wypadek, gdyby podczas wyłączenia modemu, lub przy niewgranym szkicu, przyszły do nas nowe wiadomości. Normalnie sprawdzenie wiadomości następuje po wybudzeniu Arduino przez modem.


Pętla

Skoro jesteśmy w pętli, to znaczy że modem uruchomił Arduino. Możliwości są dwie:

  • połączenie głosowe
  • wiadomość SMS

Modem wybudza Arduino przez podanie sygnału z pinu RING w modemie na pin D1. attachInterrupt(1, pinInterrupt, LOW) 

Sprawdzamy to za pomocą call.CallStatus(). Jeżeli zwraca CALL_INCOM_VOICE, to wybudziło połączenie głosowe . W przeciwnym razie –  wiadomość SMS.

Przypadek 1 połączenie głosowe

Warunek (call.CallStatusWithAuth(number, 1, 100) == CALL_INCOM_VOICE_AUTH) sprawdza czy dzwoniący numer number znajduje się na karcie SIM w przedziale 1-100.

Jeżeli tak, to “podnoszę słuchawkę” czekam po czym “rozłączam się” i wyzwalam przekaźnik. Czemu tak? Oczywiście można wysłać kod zajętości ale wtedy osoba dzwoniąca trafi na pocztę lub wysłucha komunikat o zajętości – po czym będzie musiała się rozłączyć a do nas (modem) przyjdzie SMS o próbie połączenia. Odebranie i szybkie rozłączenie załatwia problem w niecałe 2 sekundy.

void loop()
{
byte b = call.CallStatus();
if (b == CALL_INCOM_VOICE) {
#ifdef LOCAL_DEBUG
Serial.print(F("> Incomming phone call from "));
#endif
if (call.CallStatusWithAuth(number, 1, 100) == CALL_INCOM_VOICE_AUTH) {
#ifdef LOCAL_DEBUG
Serial.println(F(" Allowed <"));
#endif

//Pick up, wait a second, hang up and close/open relay, increase opening counter
//Odbierz rozmowę, poczekaj chwilę, rozłącz rozmowę i zamknij/otwórz przekaźnik, inkrementuj licznik otwarć
call.PickUp();
delay(100);
call.HangUp();
digitalWrite(RELAY1, LOW);
delay(1000);
digitalWrite(RELAY1, HIGH);
opening = EEPROM.read(openingAddr) + 1;
EEPROM.update(openingAddr, opening);
} else {
#ifdef LOCAL_DEBUG
Serial.println(F(" Forbidden <"));
#endif
call.PickUp();
delay(100);
call.HangUp();
}
calls = EEPROM.read(callsAddr) + 1;
EEPROM.update(callsAddr, calls);
} else {
checkSMS();
}
};

Po zakończeniu rozmowy wracamy do pętli i wywoływana jest procedura checkSMS()

checkSMS()

Sprawdzamy czy na karcie są jakiekolwiek SMSy

spos = sms.IsSMSPresent(SMS_ALL);

Sprawdzamy czy jest zdefiniowany numer Administratora

(1 == gsm.GetPhoneNumber(1, number))

Sprawdzamy czy nadawcą wiadomości jest Administrator

sms.GetAuthorizedSMS((int)spos, number, 13, message, 160, 1, 1);

Rozdzielamy wiadomość SMS na słowa rozdzielone średnikiem

char delimiters[] = ";";

Lista zdefiniowanych keywordów

smsWords[0]=[C]ontact, [A]dmin
smsWords[1]=[A]add, [D]elete, [F]ind,[A]tt,[U]ssd
smsWords[2]=phoneNumber,[A]ll,atCommand, ussdCode
smsWords[3]=contatName
smsWords[4]=[N]otify

Lista obsługiwanych wiadomości sterujących SMS

C;A;xxxxxxxxx;John Doe;N - will add (if not exist) John Doe contact and send him a message
C;A;xxxxxxxxx;John Doe - will add (if not exist) John Doe contact
C;D;xxxxxxxxx - will delete contact with number xxxxxxxxx (if exist)
C;D;A - will delete ALL contacts (Administrator too)
C;F;xxxxxxxxx - will find if number xxxxxxxxx exist on phonebook
A;A;AT+CBC - will execute AT command (e.g. AT+CBC) and send modem answer
A;U;someCode - will execute USSD code
A;I - will send replay message with some details

Dodawanie kontaktu – komenda np C;A;123456789;Janek Michalczewski;N spowoduje sprawdzenie czy podany numer już nie istnieje na karcie SIM, jeżeli nie – to dodanie na pierwszej wolnej pozycji. Ponieważ numer z przykładu ma tylko 9 cyfr, dodany zostanie do niego prefix 48. Poza tym nazwa zostanie przycięta do 14 znaków, co wynika z ograniczeń karty SIM. Litera N na końcu jest opcjonalna, jeżeli zostanie użyta, to po dodaniu do książki, na numer rejestrowanego kontaktu, zostanie wysłany SMS z potwierdzeniem rejestracji.

Usuwanie kontaktu – komenda np C;D;123456789 spowoduje odszukanie i usunięcie kontaktu z tym numerem

Usuwanie wszystkich kontaktów C;D;A usuwa wszystkie kontakty łącznie z Administratorem

Wyszukiwanie kontaktu – np C;F;123456789  sprawdzi czy podany numer znajduje się na karcie SIM

Wywołanie komendy AT  -np A;A;AT+CSQ sprawdzi poziom sygnału odbieranego, informacja zwrotna (jeżeli nie dłuższa niż 160 znaków) zostanie odesłana przez SMS

Wywołanie kodu USSD -np A;U;*127*1# sprawdzi stan środków w nju mobile

Na koniec komenda którą sprawdzam statystyki połączeń oraz ilość otwarć bramy oraz stan baterii A;I

Przy okazji komend należy pamiętać że wysłanie pierwszej, nie spowoduje jej wykonania! Wynika to z faktu, że na początku nie mamy wpisanego numeru Administratora i komenda nie przechodzi weryfikacji. Pierwszy SMS skutkuje tylko przypisaniem nadawcy do roli Administratora.

Kolejną rzeczą są odpowiedzi na komendy AT oraz kody USSD. Jeżeli ich długość przekroczy 160 znaków, nie zostaną odesłane do Administratora.

Jeżeli program odbierze nieautoryzowaną wiadomość SMS prześle ją do Administratora.

Pełny kod

/*
For the purposes of this program I have modified GSM-GPRS-GPS-Shield library from
https://github.com/open-electronics/GSM-GPRS-GPS-Shield.
This code is runnig on Arduino Nano clone and SIM800L modem.
For proper communication with SIM800L parameters need to be set:
-GSM.cpp
#define _GSM_TXPIN_
#define _GSM_RXPIN_
-GSM.h
#define GSM_ON
If your SIM card require PIN code, open GSM.cpp,
find SendATCmdWaitResp(F("AT+CPIN=XXXX"), 500, 50, "READY", 5); uncomment and fill XXXX

https://theveel.com/
Kamil Kaleta
*/

#include "SIM900.h"
#include <avr/interrupt.h>
#include <avr/power.h>
#include <avr/sleep.h>
#include <EEPROM.h>
#include "sms.h"
#include "call.h"
CallGSM call;
SMSGSM sms;
const int RELAY1 = A0;
const int RELAY2 = A1;
const int callsAddr = 0;
const int openingAddr = 1;

//I`m counting calls and relay opening
//Liczę przychodzące rozmowy oraz uruchomienie przekaźnika
int calls = 1;
int opening = 1;
char spos;
char number[13];
char sim_number[13];
char reply[210];
char stat;
char message[159];

//Comment to disable debug with Serial.
//Zakomentowanie wyłączy konsolę Serial
#define LOCAL_DEBUG

//Comment line below to disable sms sent (when testing/debuging)
//Zakomentowanie wyłączy wysyłanie wiadomości SMS np podczas debugowania
#define SMS_ON

void setup()
{
spos = -1;
Serial.begin(9600);
Serial.println(F("> GSM Shield testing"));
if (gsm.begin(2400)) {
Serial.println(F("> Status READY"));
}
else Serial.println(F("> Status IDLE"));
pinMode(RELAY1, OUTPUT);
pinMode(RELAY2, OUTPUT);
digitalWrite(RELAY1, HIGH);
digitalWrite(RELAY2, HIGH);
gsm.SimpleWriteln(F("AT+CMEE=2"));
checkSMS();
};

void loop()
{
byte b = call.CallStatus();
if (b == CALL_INCOM_VOICE) {

#ifdef LOCAL_DEBUG
Serial.print(F("> Incomming phone call from "));
#endif
if (call.CallStatusWithAuth(number, 1, 100) == CALL_INCOM_VOICE_AUTH) {
#ifdef LOCAL_DEBUG
Serial.println(F(" Allowed <"));
#endif

//Pick up, wait a second, hang up and close/open relay, increase opening counter
//Odbierz rozmowę, poczekaj chwilę, rozłącz rozmowę i zamknij/otwórz przekaźnik, inkrementuj licznik otwarć
call.PickUp();
delay(100);
call.HangUp();
digitalWrite(RELAY1, LOW);
delay(1000);
digitalWrite(RELAY1, HIGH);
opening = EEPROM.read(openingAddr) + 1;
EEPROM.update(openingAddr, opening);
} else {
#ifdef LOCAL_DEBUG
Serial.println(F(" Forbidden <"));
#endif
call.PickUp();
delay(100);
call.HangUp();
}
calls = EEPROM.read(callsAddr) + 1;
EEPROM.update(callsAddr, calls);
} else {

checkSMS();
}
};

void pinInterrupt(void) {
detachInterrupt(1);
}

void sleepNow(void)
{
//Arduino is awake by SIM800L. Check data from modem, starts loop and go sleep again.
//Modem RING pin is connected to D1 pin (interrupt1)
//Arduino jest wybudzane przez modem SIM800L, uruchamia pętlę i ponownie zasypia
//Pin RING modemu podłączony jest do pinu D1 Arduino (przerwanie1)

//Without this modem will continue sending +creg reply which will wake up arduino for no reason
//Bez tej komendy modem będzie cyklicznie wybudzał arduino
gsm.SendATCmdWaitResp("AT+CREG=0", 2000, 50, "OK", 2, reply );
#ifdef LOCAL_DEBUG
Serial.println(F("< Fell asleep >"));
#endif
attachInterrupt(1, pinInterrupt, LOW);
delay(100);
set_sleep_mode(SLEEP_MODE_PWR_DOWN);
sleep_enable();
sleep_mode();
sleep_disable();
#ifdef LOCAL_DEBUG
Serial.println(F("n< Woke up >"));
#endif

//Important delay
//Ważne opóźnienie
delay(2000);
}

void checkSMS() {
#ifdef LOCAL_DEBUG
Serial.println(F("> Check text Messages"));
#endif
gsm.SendATCmdWaitResp("AT+CREG=2", 2000, 50, "OK", 2, reply );
delay(1000);
spos = sms.IsSMSPresent(SMS_ALL);
Serial.println(spos);
message[0] = '';
number[0] = '';
sim_number[0] = '';
reply[0] = '';
byte admNrValid = 0;
if ((int)spos > 0) {

//Check if there is a contact on position 1 simcard, it`s where it keeps Administrator phone number
//Sprawdź czy na 1 pozycji karty SIM znajduje się kontakt - na pierwszej pozycji przechowywany jest numed administratora
if (1 == gsm.GetPhoneNumber(1, number)) {
#ifdef LOCAL_DEBUG
Serial.print(F("n@ Administrator phone numbern@ ")); Serial.println(number);
#endif
admNrValid = 1;
} else {
#ifdef LOCAL_DEBUG
Serial.print(F("> No Administrator phone number!"));
#endif
}

//Ckeck if Authorized SMS (from Admin, whitch is positin 1 on sim card)
//Sprawdź czy SMS autoryzacyjny - czy nadawcą jest Administrator
stat = sms.GetAuthorizedSMS((int)spos, number, 13, message, 160, 1, 1);
#ifdef LOCAL_DEBUG
Serial.print(F("n########## SMS ############n# Position on list:"));
Serial.println((int)spos);
Serial.print(F("# From:"));
Serial.println((char *)number);
Serial.print(F("# Message:"));
Serial.println(message);
#endif
if (stat == GETSMS_AUTH_SMS) {

//Split sms body to keywords
//Podziel wiadomość SMS na komendy
char delimiters[] = ";";
char* valPosition;
valPosition = strtok(message, delimiters);
char* smsWords[] = {0, 0, 0};
int i;
while (valPosition != NULL) {
smsWords[i] = valPosition;
#ifdef LOCAL_DEBUG
Serial.print(F("# smsWords["));
Serial.print(i); Serial.print(F("] = "));
Serial.println(smsWords[i]);
#endif
valPosition = strtok(NULL, delimiters);
i++;
}
/*
SMS keywords
Wyciągniete słowa kluczowe z SMSa
smsWords[0]=[C]ontact, [A]dmin
smsWords[1]=[A]add, [D]elete, [F]ind,[A]tt,[U]ssd
smsWords[2]=phoneNumber,[A]ll,atCommand, ussdCode
smsWords[3]=contatName
smsWords[4]=[N]otify

Available sms commands
Dostępne komendy SMS
C;A;xxxxxxxxx;John Doe;N - will add (if not exist) John Doe contact and send him a message
C;A;xxxxxxxxx;John Doe - will add (if not exist) John Doe contact
C;D;xxxxxxxxx - will delete contact with number xxxxxxxxx (if exist)
C;D;A - will delete ALL contacts (Administrator too)
C;F;xxxxxxxxx - will find if number xxxxxxxxx exist on phonebook
A;A;AT+CBC - will execute AT command (e.g. AT+CBC) and send modem answer
A;U;someCode - will execute USSD code
A;I - will send replay message with some details
*/

//Parse incomming message
//Dekodowanie wiadomości SMS
if (strcmp(smsWords[0], "C") == 0)
{
#ifdef LOCAL_DEBUG
Serial.println(F("[C]ontact"));
#endif
if (strcmp(smsWords[1], "A") == 0)
//[C]ontact-[A]dd
{
#ifdef LOCAL_DEBUG
Serial.println(F("[C]ontact-[A]dd"));
#endif
byte p = isPhoneNumber(smsWords[2]);
if (p > 0)
{
char smsBody[160] = {0};
strcat(smsBody, "Phone number ");
strcat(smsBody, smsWords[2]);
strcat(smsBody, " ALREADY found on position ");
char buffer [20];//iteger as char
itoa ( p, buffer, 10);
strcat(smsBody, buffer);
#ifdef SMS_ON

//Send SMS with smsBody to Administrator (1 simcard contact position)
//Wyślij SMS do Administratora (kontakt na 1 pozycji karty SIM)
sms.SendSMS(1, smsBody);
#endif
#ifdef LOCAL_DEBUG
Serial.print("nSMS ");
Serial.println(smsBody);
#endif
} else {
#ifdef LOCAL_DEBUG
Serial.print(F("Have NOT found given number.I will try to add "));
Serial.println(smsWords[2]);
#endif
if (1 == gsm.WritePhoneNumber(0, smsWords[2], smsWords[3]))
{
byte b = isPhoneNumber(smsWords[2]);
if (strcmp(smsWords[4], "N") == 0)
//NOTIFY USER
{
#ifdef SMS_ON

//Send SMS to b, which is new contact simcard index
//Wyślij SMS do b, gdzie b to index dodawanego kontaktu
sms.SendSMS(b, "Your phone number has been registered");
#endif
#ifdef LOCAL_DEBUG
Serial.print(F("[SMS] "));
Serial.println(F("Your phone number has been registered."));
#endif
}
char smsBody[160] = {0};
strcat(smsBody, "Phone number ");
strcat(smsBody, smsWords[2]);
strcat(smsBody, " has been registered on position ");
char buffer [20];//iteger as char
itoa ( b, buffer, 10);
strcat(smsBody, buffer);
#ifdef SMS_ON
sms.SendSMS(1, smsBody);
#endif
#ifdef LOCAL_DEBUG
Serial.print(F("n[SMS] "));
Serial.println(smsBody);
#endif
}
}
} else if (strcmp(smsWords[1], "D") == 0)
//[C]ontact-[D]elete
{
#ifdef LOCAL_DEBUG
Serial.println(F("[C]ontact-[D]elete"));
#endif
if (strcmp(smsWords[2], "A") == 0) {

//[C]ontact-[D]elete-[A]ll
#ifdef LOCAL_DEBUG
Serial.println(F("[C]ontact-[D]elete-[A]ll"));
#endif
for (int i = 1; i < 251; i++) {
gsm.DelPhoneNumber(i);
}
gsm.SendATCmdWaitResp("AT+CPBR=1,250", 20000, 50, "OK", 5, reply );
#ifdef SMS_ON
sms.SendSMS(number, (char *)reply);
#endif
#ifdef LOCAL_DEBUG
Serial.print(F("[SMS] "));
Serial.println((char *)reply);
#endif
} else {
//Will delete single contact but is number on phonebook?
//Usuwa kontakt jeżlei znajdzie na karcie SIM
byte p = isPhoneNumber(smsWords[2]);
if (p > 0)
{
if (1 == gsm.DelPhoneNumber(p)) {
char smsBody[160] = {0};
strcat(smsBody, "Number ");
strcat(smsBody, sim_number);
strcat(smsBody, " found on position ");
char buffer[4];
sprintf(buffer, "%d", p); //p to char
strcat(smsBody, buffer);
strcat(smsBody, ", and deleted");
#ifdef SMS_ON
sms.SendSMS(1, smsBody);
#endif
#ifdef LOCAL_DEBUG
Serial.print(F("[SMS] "));
Serial.println(smsBody);
#endif
} else {
char smsBody[160] = {0};
strcat(smsBody, "Found number ");
strcat(smsBody, sim_number);
strcat(smsBody, " on position ");
strcat(smsBody, p);
strcat(smsBody, ", but couldn't delete");
#ifdef SMS_ON
sms.SendSMS(1, smsBody);
#endif
#ifdef LOCAL_DEBUG
Serial.print(F("[SMS] "));
Serial.println(smsBody);
#endif
}
}
}
} else if (strcmp(smsWords[1], "F") == 0)
//[C]ontact-[F]ind
{
#ifdef LOCAL_DEBUG
Serial.println(F("[C]ontact-[F]ind"));
#endif
byte p = isPhoneNumber(smsWords[2]);
if (p > 0)
{
char smsBody[160] = {0};
strcat(smsBody, "Phone number ");
strcat(smsBody, smsWords[2]);
strcat(smsBody, " found on position ");
char buffer [20];
itoa ( p, buffer, 10);
strcat(smsBody, buffer);
#ifdef SMS_ON
sms.SendSMS(1, smsBody);
#endif
#ifdef LOCAL_DEBUG
Serial.print(F("[SMS] "));
Serial.println(smsBody);
#endif
} else {
char smsBody[160] = {0};
strcat(smsBody, "Phone number ");
strcat(smsBody, smsWords[2]);
strcat(smsBody, " has not been found");
#ifdef SMS_ON
sms.SendSMS(1, smsBody);
#endif
#ifdef LOCAL_DEBUG
Serial.print(F("[SMS] "));
Serial.println(smsBody);
#endif
}
}
} else if (strcmp(smsWords[0], "A") == 0) {
#ifdef LOCAL_DEBUG
Serial.println(F("[A]dministrator"));
#endif
if (strcmp(smsWords[1], "A") == 0)
//[A]dministrator-[A]T
{
#ifdef LOCAL_DEBUG
Serial.println(F("[A]dministrator-[A]T"));
#endif
gsm.SendATCmdWaitResp(smsWords[2], 5000, 50, "OK", 5, reply );
#ifdef SMS_ON
if (strlen((char *)reply) > 159)
sms.SendSMS(1, "AT Response too long for message");
else
sms.SendSMS(1, (char *)reply);
#endif
#ifdef LOCAL_DEBUG
Serial.print(F("[SMS] "));
Serial.println((char *)reply);
#endif
} else if (strcmp(smsWords[1], "U") == 0) {
//[A]dministrator-[U]SSD
#ifdef LOCAL_DEBUG
Serial.println(F("[A]dministrator-[U]SSD"));
#endif
char atussd[20] = {0};
strcat(atussd, "AT+CUSD=1,"");
strcat(atussd, smsWords[2]);
strcat(atussd, """);
char st = (gsm.SendATCmdWaitResp(atussd, 5000, 100, "CUSD", 3, reply));

if (2 == gsm.WaitResp(10000, 100, "CUSD")) {
char b[160];
memcpy(b, gsm.comm_buf + 2, strlen(gsm.comm_buf));
b[160] = '';
#ifdef SMS_ON
if (strlen(gsm.comm_buf) < 160)
sms.SendSMS(1, b);
else
sms.SendSMS(1, "USSD response to long for SMS message");
#endif
#ifdef LOCAL_DEBUG
Serial.print(F("[SMS] "));
Serial.println((char *)(gsm.comm_buf));
#endif
} else {
Serial.print(F("Something wrong with USSD command"));
Serial.println(reply);
#ifdef SMS_ON
sms.SendSMS(1, reply);
#endif
}
} else if (strcmp(smsWords[1], "I") == 0) { /////[A]dministrator-[I]nfo
char st[1];
st[0] = '';
char str_perc[3];
str_perc[0] = '';
char str_vol[6]; //4
str_vol[0] = '';

#ifdef LOCAL_DEBUG
Serial.println(F("[A]dministrator-[I]nfo"));
#endif
reply[0] = '';
opening = EEPROM.read(openingAddr);
calls = EEPROM.read(callsAddr);
char calls_;
char smsBody[160] = {0};
strcat(smsBody, "Calls: ");
char buffer[10];
sprintf(buffer, "%d", calls);
strcat(smsBody, buffer);
strcat(smsBody, ", Opening: ");
sprintf(buffer, "%d", opening);
strcat(smsBody, buffer);
if (1 == gsm.getBattInf(st, str_perc, str_vol)) {
strcat(smsBody, "n");
strcat(smsBody, "Batt ");
strcat(smsBody, str_perc);
strcat(smsBody, ", ");
strcat(smsBody, str_vol);
}
if (1 == (gsm.readCellTimeDate(reply))) {
strcat(smsBody, "n");
strcat(smsBody, reply);
}
#ifdef SMS_ON
sms.SendSMS(1, smsBody);
#endif
#ifdef LOCAL_DEBUG
Serial.print(F("[SMS] "));
Serial.println(smsBody);
#endif
}
}
#ifdef LOCAL_DEBUG
Serial.print(F("####### Authorized ########n"));
#endif
} else {
#ifdef LOCAL_DEBUG
Serial.print(F("###### NOT Authorized #####n"));
#endif
if (!admNrValid) {
//Very first SMS (1 simcard position was empty, so I will set sender as Administrator)
//Pierwszy SMS (pozycja 1 na karcie SIM jest pusta, więc ustawiam nadawcę jako Administratora)
#ifdef LOCAL_DEBUG
Serial.print(F(">> "));
Serial.print(number);
Serial.println(F(", set as Administrator number"));
Serial.print(F("###########################n"));
#endif
gsm.WritePhoneNumber(1, number, "Administrator");
#ifdef SMS_ON
sms.SendSMS(1, "You are Administrator now");
#endif
} else {

//This SMS is NOT Authorized SMS and the Administrator is set. I`m FFD it to the Administrator.
//SMS nieautoryzacyjny i już wpisany numer Administratora. Przesyłam do administratora, niech czyta.
char smsBody[160] = {0};
strcat(smsBody, "From: ");
strcat(smsBody, (char *)number);
strcat(smsBody, ", ");
strcat(smsBody, message);
#ifdef SMS_ON
sms.SendSMS(1, smsBody);
#endif
#ifdef LOCAL_DEBUG
Serial.print(F("[SMS] "));
Serial.println(smsBody);
#endif
}
}

//Now message must be removed
//Na koniec usuwam wiadomość SMS
#ifdef LOCAL_DEBUG
Serial.print(F("n!!!!!!!!!!!!!!!!!!!!!!!!!!!n! deleting messages n! on position "));
Serial.println((int)spos);
int d = 1;
for (int i = 0; i < 5; i++) {
delay(1000);
if (sms.DeleteSMS((int)spos) == 1)
{
Serial.println(F("! successfully completed"));
d = 0;
break;
} else
Serial.println(F("try delete message"));
}
if (d)
{
Serial.println(F("! !failed n! try kill em all"));

//This should not happen, but just in case delate all messages
//Nie powinno mieć miejsca, na wszelki wypadek usuwam wszystkie wiadomości SMS
gsm.SimpleWriteln(F("AT+CMGDA = "DEL ALL""));
}
Serial.print(F("!!!!!!!!!!!!!!!!!!!!!!!!!!!nn"));
#endif
} else
{
#ifdef LOCAL_DEBUG
Serial.println(F("> No SMS"));
#endif
sleepNow();
}
}

byte isPhoneNumber(char *what_nr) {
int found = 0;
//250 max amount contacts on my SIM card phonebook, this loop below costs you 40 seconds
//250 to maksymalna ilość kontaktów na mojej karcie SMS, ta pętla poniżej kosztuje 40 sekund
for (byte i = 1; i < 251; i++) {
// Serial.print("*");
// if ((i % 25) == 0)
// Serial.print("n");
if (1 == gsm.GetPhoneNumber(i, sim_number)) {
if (strstr(sim_number, what_nr))
{
found = i;
break;
}
}
}
return found;
}

I jeszcze kilka zdjęć dla wzrokowców 🙂

Uproszczony schemat.

Zapraszam do komentowania!

Please follow and like us:

7
Dodaj komentarz

avatar
4 Comment threads
3 Thread replies
1 Followers
 
Most reacted comment
Hottest comment thread
4 Comment authors
Michałjackie1234567Michal Recent comment authors
  Subscribe  
najnowszy najstarszy oceniany
Powiadom o
Michal
Gość
Michal

Witam bardo fajny projekcik.
Mam prośbe – czy dało by się dodać bardziej wyraźny schemat połaczeń. Na obecnym moduły nie są zbyt dobrze opisane

PS. nei wiem dlaczego ale moge ywlaczyc CAPSLOCKA tutaj

1234567
Gość
1234567

Relay_controlled_by_phone_call_Advanced:420: error: invalid conversion from 'byte* {aka unsigned char*}' to 'const char*' [-fpermissive] In file included from e:pgpgArduinohardwarearduinoavrcoresarduino/Arduino.h:25:0, from sketchRelay_controlled_by_phone_call_Advanced.ino.cpp:1: e:pgpgarduinohardwaretoolsavravrincludestring.h:133:15: error: initializing argument 1 of 'size_t strlen(const char*)' [-fpermissive] extern size_t strlen(const char *) __ATTR_PURE__; Relay_controlled_by_phone_call_Advanced:423: error: invalid conversion from 'byte* {aka unsigned char*}' to 'const char*' [-fpermissive] In file included from e:pgpgArduinohardwarearduinoavrcoresarduino/Arduino.h:25:0, from sketchRelay_controlled_by_phone_call_Advanced.ino.cpp:1: e:pgpgarduinohardwaretoolsavravrincludestring.h:133:15: error: initializing argument 1 of 'size_t strlen(const char*)' [-fpermissive] extern size_t strlen(const char *) __ATTR_PURE__; ^ exit status 1 invalid conversion from 'byte {aka unsigned char}' to 'const char*' [-fpermissive] A lot of mistakes, please tell me how to solve, thank you very… Czytaj więcej »

jackie
Gość
jackie

log

Arduino:1.6.6 (Windows Server 2008 R2), 开发板:”Arduino Nano, ATmega328″

e:pgpgArduinoarduino-builder -dump-prefs -logger=machine -hardware “e:pgpgArduinohardware” -hardware “C:UsersAdministratorAppDataLocalArduino15packages” -tools “e:pgpgArduinotools-builder” -tools “e:pgpgArduinohardwaretoolsavr” -tools “C:UsersAdministratorAppDataLocalArduino15packages” -built-in-libraries “e:pgpgArduinolibraries” -libraries “C:UsersAdministratorDocumentsArduinolibraries” -fqbn=arduino:avr:nano:cpu=atmega328 -ide-version=10606 -build-path “C:UsersADMINI~1AppDataLocalTempbuilde51375b59d4a0ce0d142645bcbd0e6d1.tmp” -warnings=none -prefs=build.warn_data_percentage=75 -verbose “E:pgpgArduino新建文件夹GSMSIM800LexamplesRelay_controlled_by_phone_call_AdvancedRelay_controlled_by_phone_call_Advanced.ino”
e:pgpgArduinoarduino-builder -compile -logger=machine -hardware “e:pgpgArduinohardware” -hardware “C:UsersAdministratorAppDataLocalArduino15packages” -tools “e:pgpgArduinotools-builder” -tools “e:pgpgArduinohardwaretoolsavr” -tools “C:UsersAdministratorAppDataLocalArduino15packages” -built-in-libraries “e:pgpgArduinolibraries” -libraries “C:UsersAdministratorDocumentsArduinolibraries” -fqbn=arduino:avr:nano:cpu=atmega328 -ide-version=10606 -build-path “C:UsersADMINI~1AppDataLocalTempbuilde51375b59d4a0ce0d142645bcbd0e6d1.tmp” -warnings=none -prefs=build.warn_data_percentage=75 -verbose “E:pgpgArduino新建文件夹GSMSIM800LexamplesRelay_controlled_by_phone_call_AdvancedRelay_controlled_by_phone_call_Advanced.ino”
“e:pgpgArduinohardwaretoolsavr/bin/avr-g++” -c -g -Os -w -std=gnu++11 -fno-exceptions -ffunction-sections -fdata-sections -fno-threadsafe-statics -w -x c++ -M -MG -MP -mmcu=atmega328p -DF_CPU=16000000L -DARDUINO=10606 -DARDUINO_AVR_NANO -DARDUINO_ARCH_AVR “-Ie:pgpgArduinohardwarearduinoavrcoresarduino” “-Ie:pgpgArduinohardwarearduinoavrvariantseightanaloginputs” “C:UsersADMINI~1AppDataLocalTempbuilde51375b59d4a0ce0d142645bcbd0e6d1.tmpsketchRelay_controlled_by_phone_call_Advanced.ino.cpp”
“e:pgpgArduinohardwaretoolsavr/bin/avr-g++” -c -g -Os -w -std=gnu++11 -fno-exceptions -ffunction-sections -fdata-sections -fno-threadsafe-statics -w -x c++ -M -MG -MP -mmcu=atmega328p -DF_CPU=16000000L -DARDUINO=10606 -DARDUINO_AVR_NANO -DARDUINO_ARCH_AVR “-Ie:pgpgArduinohardwarearduinoavrcoresarduino” “-Ie:pgpgArduinohardwarearduinoavrvariantseightanaloginputs” “-Ie:pgpgArduinolibrariesGSMSIM800L” “-Ie:pgpgArduinohardwarearduinoavrlibrariesEEPROM” “C:UsersADMINI~1AppDataLocalTempbuilde51375b59d4a0ce0d142645bcbd0e6d1.tmpsketchRelay_controlled_by_phone_call_Advanced.ino.cpp”
“e:pgpgArduinohardwaretoolsavr/bin/avr-g++” -c -g -Os -w -std=gnu++11 -fno-exceptions -ffunction-sections -fdata-sections -fno-threadsafe-statics -w -x c++ -M -MG -MP -mmcu=atmega328p -DF_CPU=16000000L -DARDUINO=10606 -DARDUINO_AVR_NANO -DARDUINO_ARCH_AVR “-Ie:pgpgArduinohardwarearduinoavrcoresarduino” “-Ie:pgpgArduinohardwarearduinoavrvariantseightanaloginputs” “-Ie:pgpgArduinolibrariesGSMSIM800L” “-Ie:pgpgArduinohardwarearduinoavrlibrariesEEPROM” “-Ie:pgpgArduinohardwarearduinoavrlibrariesSoftwareSerial” “C:UsersADMINI~1AppDataLocalTempbuilde51375b59d4a0ce0d142645bcbd0e6d1.tmpsketchRelay_controlled_by_phone_call_Advanced.ino.cpp”
“e:pgpgArduinohardwaretoolsavr/bin/avr-g++” -c -g -Os -w -std=gnu++11 -fno-exceptions -ffunction-sections -fdata-sections -fno-threadsafe-statics -w -x c++ -M -MG -MP -mmcu=atmega328p -DF_CPU=16000000L -DARDUINO=10606 -DARDUINO_AVR_NANO -DARDUINO_ARCH_AVR “-Ie:pgpgArduinohardwarearduinoavrcoresarduino” “-Ie:pgpgArduinohardwarearduinoavrvariantseightanaloginputs” “-Ie:pgpgArduinolibrariesGSMSIM800L” “-Ie:pgpgArduinohardwarearduinoavrlibrariesEEPROM” “-Ie:pgpgArduinohardwarearduinoavrlibrariesSoftwareSerial” “C:UsersADMINI~1AppDataLocalTempbuilde51375b59d4a0ce0d142645bcbd0e6d1.tmpsketchRelay_controlled_by_phone_call_Advanced.ino.cpp”
“e:pgpgArduinohardwaretoolsavr/bin/avr-g++” -c -g -Os -w -std=gnu++11 -fno-exceptions -ffunction-sections -fdata-sections -fno-threadsafe-statics -w -x c++ -M -MG -MP -mmcu=atmega328p -DF_CPU=16000000L -DARDUINO=10606 -DARDUINO_AVR_NANO -DARDUINO_ARCH_AVR “-Ie:pgpgArduinohardwarearduinoavrcoresarduino” “-Ie:pgpgArduinohardwarearduinoavrvariantseightanaloginputs” “-Ie:pgpgArduinolibrariesGSMSIM800L” “-Ie:pgpgArduinohardwarearduinoavrlibrariesEEPROM” “-Ie:pgpgArduinohardwarearduinoavrlibrariesSoftwareSerial” “e:pgpgArduinolibrariesGSMSIM800LGSM.cpp”
“e:pgpgArduinohardwaretoolsavr/bin/avr-g++” -c -g -Os -w -std=gnu++11 -fno-exceptions -ffunction-sections -fdata-sections -fno-threadsafe-statics -w -x c++ -M -MG -MP -mmcu=atmega328p -DF_CPU=16000000L -DARDUINO=10606 -DARDUINO_AVR_NANO -DARDUINO_ARCH_AVR “-Ie:pgpgArduinohardwarearduinoavrcoresarduino” “-Ie:pgpgArduinohardwarearduinoavrvariantseightanaloginputs” “-Ie:pgpgArduinolibrariesGSMSIM800L” “-Ie:pgpgArduinohardwarearduinoavrlibrariesEEPROM” “-Ie:pgpgArduinohardwarearduinoavrlibrariesSoftwareSerial” “e:pgpgArduinolibrariesGSMSIM800LHWSerial.cpp”
“e:pgpgArduinohardwaretoolsavr/bin/avr-g++” -c -g -Os -w -std=gnu++11 -fno-exceptions -ffunction-sections -fdata-sections -fno-threadsafe-statics -w -x c++ -M -MG -MP -mmcu=atmega328p -DF_CPU=16000000L -DARDUINO=10606 -DARDUINO_AVR_NANO -DARDUINO_ARCH_AVR “-Ie:pgpgArduinohardwarearduinoavrcoresarduino” “-Ie:pgpgArduinohardwarearduinoavrvariantseightanaloginputs” “-Ie:pgpgArduinolibrariesGSMSIM800L” “-Ie:pgpgArduinohardwarearduinoavrlibrariesEEPROM” “-Ie:pgpgArduinohardwarearduinoavrlibrariesSoftwareSerial” “e:pgpgArduinolibrariesGSMSIM800LLOG.cpp”
“e:pgpgArduinohardwaretoolsavr/bin/avr-g++” -c -g -Os -w -std=gnu++11 -fno-exceptions -ffunction-sections -fdata-sections -fno-threadsafe-statics -w -x c++ -M -MG -MP -mmcu=atmega328p -DF_CPU=16000000L -DARDUINO=10606 -DARDUINO_AVR_NANO -DARDUINO_ARCH_AVR “-Ie:pgpgArduinohardwarearduinoavrcoresarduino” “-Ie:pgpgArduinohardwarearduinoavrvariantseightanaloginputs” “-Ie:pgpgArduinohardwarearduinoavrlibrariesEEPROM” “-Ie:pgpgArduinohardwarearduinoavrlibrariesSoftwareSerial” “-Ie:pgpgArduinolibrariesGSMSIM800L” “e:pgpgArduinolibrariesGSMSIM800LSIM900.cpp”
“e:pgpgArduinohardwaretoolsavr/bin/avr-g++” -c -g -Os -w -std=gnu++11 -fno-exceptions -ffunction-sections -fdata-sections -fno-threadsafe-statics -w -x c++ -M -MG -MP -mmcu=atmega328p -DF_CPU=16000000L -DARDUINO=10606 -DARDUINO_AVR_NANO -DARDUINO_ARCH_AVR “-Ie:pgpgArduinohardwarearduinoavrcoresarduino” “-Ie:pgpgArduinohardwarearduinoavrvariantseightanaloginputs” “-Ie:pgpgArduinolibrariesGSMSIM800L” “-Ie:pgpgArduinohardwarearduinoavrlibrariesEEPROM” “-Ie:pgpgArduinohardwarearduinoavrlibrariesSoftwareSerial” “e:pgpgArduinolibrariesGSMSIM800LWideTextFinder.cpp”
“e:pgpgArduinohardwaretoolsavr/bin/avr-g++” -c -g -Os -w -std=gnu++11 -fno-exceptions -ffunction-sections -fdata-sections -fno-threadsafe-statics -w -x c++ -M -MG -MP -mmcu=atmega328p -DF_CPU=16000000L -DARDUINO=10606 -DARDUINO_AVR_NANO -DARDUINO_ARCH_AVR “-Ie:pgpgArduinohardwarearduinoavrcoresarduino” “-Ie:pgpgArduinohardwarearduinoavrvariantseightanaloginputs” “-Ie:pgpgArduinolibrariesGSMSIM800L” “-Ie:pgpgArduinohardwarearduinoavrlibrariesEEPROM” “-Ie:pgpgArduinohardwarearduinoavrlibrariesSoftwareSerial” “e:pgpgArduinolibrariesGSMSIM800Lcall.cpp”
“e:pgpgArduinohardwaretoolsavr/bin/avr-g++” -c -g -Os -w -std=gnu++11 -fno-exceptions -ffunction-sections -fdata-sections -fno-threadsafe-statics -w -x c++ -M -MG -MP -mmcu=atmega328p -DF_CPU=16000000L -DARDUINO=10606 -DARDUINO_AVR_NANO -DARDUINO_ARCH_AVR “-Ie:pgpgArduinohardwarearduinoavrcoresarduino” “-Ie:pgpgArduinohardwarearduinoavrvariantseightanaloginputs” “-Ie:pgpgArduinolibrariesGSMSIM800L” “-Ie:pgpgArduinohardwarearduinoavrlibrariesEEPROM” “-Ie:pgpgArduinohardwarearduinoavrlibrariesSoftwareSerial” “e:pgpgArduinolibrariesGSMSIM800Lgps.cpp”
“e:pgpgArduinohardwaretoolsavr/bin/avr-g++” -c -g -Os -w -std=gnu++11 -fno-exceptions -ffunction-sections -fdata-sections -fno-threadsafe-statics -w -x c++ -M -MG -MP -mmcu=atmega328p -DF_CPU=16000000L -DARDUINO=10606 -DARDUINO_AVR_NANO -DARDUINO_ARCH_AVR “-Ie:pgpgArduinohardwarearduinoavrcoresarduino” “-Ie:pgpgArduinohardwarearduinoavrvariantseightanaloginputs” “-Ie:pgpgArduinolibrariesGSMSIM800L” “-Ie:pgpgArduinohardwarearduinoavrlibrariesEEPROM” “-Ie:pgpgArduinohardwarearduinoavrlibrariesSoftwareSerial” “e:pgpgArduinolibrariesGSMSIM800LinetGSM.cpp”
“e:pgpgArduinohardwaretoolsavr/bin/avr-g++” -c -g -Os -w -std=gnu++11 -fno-exceptions -ffunction-sections -fdata-sections -fno-threadsafe-statics -w -x c++ -M -MG -MP -mmcu=atmega328p -DF_CPU=16000000L -DARDUINO=10606 -DARDUINO_AVR_NANO -DARDUINO_ARCH_AVR “-Ie:pgpgArduinohardwarearduinoavrcoresarduino” “-Ie:pgpgArduinohardwarearduinoavrvariantseightanaloginputs” “-Ie:pgpgArduinolibrariesGSMSIM800L” “-Ie:pgpgArduinohardwarearduinoavrlibrariesEEPROM” “-Ie:pgpgArduinohardwarearduinoavrlibrariesSoftwareSerial” “e:pgpgArduinolibrariesGSMSIM800Lsms.cpp”
“e:pgpgArduinohardwaretoolsavr/bin/avr-g++” -c -g -Os -w -std=gnu++11 -fno-exceptions -ffunction-sections -fdata-sections -fno-threadsafe-statics -w -x c++ -M -MG -MP -mmcu=atmega328p -DF_CPU=16000000L -DARDUINO=10606 -DARDUINO_AVR_NANO -DARDUINO_ARCH_AVR “-Ie:pgpgArduinohardwarearduinoavrcoresarduino” “-Ie:pgpgArduinohardwarearduinoavrvariantseightanaloginputs” “-Ie:pgpgArduinolibrariesGSMSIM800L” “-Ie:pgpgArduinohardwarearduinoavrlibrariesEEPROM” “-Ie:pgpgArduinohardwarearduinoavrlibrariesSoftwareSerial” “e:pgpgArduinohardwarearduinoavrlibrariesSoftwareSerialSoftwareSerial.cpp”
“e:pgpgArduinohardwaretoolsavr/bin/avr-g++” -c -g -Os -w -std=gnu++11 -fno-exceptions -ffunction-sections -fdata-sections -fno-threadsafe-statics -w -x c++ -M -MG -MP -mmcu=atmega328p -DF_CPU=16000000L -DARDUINO=10606 -DARDUINO_AVR_NANO -DARDUINO_ARCH_AVR “-Ie:pgpgArduinohardwarearduinoavrcoresarduino” “-Ie:pgpgArduinohardwarearduinoavrvariantseightanaloginputs” “-Ie:pgpgArduinohardwarearduinoavrlibrariesSoftwareSerial” “-Ie:pgpgArduinolibrariesGSMSIM800L” “-Ie:pgpgArduinohardwarearduinoavrlibrariesEEPROM” “C:UsersADMINI~1AppDataLocalTempbuilde51375b59d4a0ce0d142645bcbd0e6d1.tmpsketchRelay_controlled_by_phone_call_Advanced.ino.cpp”
“e:pgpgArduinohardwaretoolsavr/bin/avr-g++” -c -g -Os -w -std=gnu++11 -fno-exceptions -ffunction-sections -fdata-sections -fno-threadsafe-statics -w -x c++ -E -CC -mmcu=atmega328p -DF_CPU=16000000L -DARDUINO=10606 -DARDUINO_AVR_NANO -DARDUINO_ARCH_AVR “-Ie:pgpgArduinohardwarearduinoavrcoresarduino” “-Ie:pgpgArduinohardwarearduinoavrvariantseightanaloginputs” “-Ie:pgpgArduinolibrariesGSMSIM800L” “-Ie:pgpgArduinohardwarearduinoavrlibrariesEEPROM” “-Ie:pgpgArduinohardwarearduinoavrlibrariesSoftwareSerial” “C:UsersADMINI~1AppDataLocalTempbuilde51375b59d4a0ce0d142645bcbd0e6d1.tmpsketchRelay_controlled_by_phone_call_Advanced.ino.cpp”
“e:pgpgArduinotools-builderctags5.8-arduino2/ctags” -u –language-force=c++ -f – –c++-kinds=svpf –fields=KSTtzns “C:UsersADMINI~1AppDataLocalTempbuilde51375b59d4a0ce0d142645bcbd0e6d1.tmppreprocctags_target.cpp”
“e:pgpgArduinotools-builderctags5.8-arduino2/ctags” -u –language-force=c++ -f – –c++-kinds=svpf –fields=KSTtzns “C:UsersADMINI~1AppDataLocalTempbuilde51375b59d4a0ce0d142645bcbd0e6d1.tmppreprocctags_target.cpp”
“e:pgpgArduinohardwaretoolsavr/bin/avr-g++” -c -g -Os -w -std=gnu++11 -fno-exceptions -ffunction-sections -fdata-sections -fno-threadsafe-statics -MMD -mmcu=atmega328p -DF_CPU=16000000L -DARDUINO=10606 -DARDUINO_AVR_NANO -DARDUINO_ARCH_AVR “-Ie:pgpgArduinohardwarearduinoavrcoresarduino” “-Ie:pgpgArduinohardwarearduinoavrvariantseightanaloginputs” “-Ie:pgpgArduinolibrariesGSMSIM800L” “-Ie:pgpgArduinohardwarearduinoavrlibrariesEEPROM” “-Ie:pgpgArduinohardwarearduinoavrlibrariesSoftwareSerial” “C:UsersADMINI~1AppDataLocalTempbuilde51375b59d4a0ce0d142645bcbd0e6d1.tmpsketchRelay_controlled_by_phone_call_Advanced.ino.cpp” -o “C:UsersADMINI~1AppDataLocalTempbuilde51375b59d4a0ce0d142645bcbd0e6d1.tmpsketchRelay_controlled_by_phone_call_Advanced.ino.cpp.o”
In file included from E:pgpgArduino鏂板缓鏂囦欢澶筡GSMSIM800LexamplesRelay_controlled_by_phone_call_AdvancedRelay_controlled_by_phone_call_Advanced.ino:23:0:

e:pgpgArduinolibrariesGSMSIM800L/sms.h:17:8: error: extra qualification ‘SMSGSM::’ on member ‘IsPhonePresent’ [-fpermissive]

char SMSGSM::IsPhonePresent(char *is_phone_number);

^

E:pgpgArduino鏂板缓鏂囦欢澶筡GSMSIM800LexamplesRelay_controlled_by_phone_call_AdvancedRelay_controlled_by_phone_call_Advanced.ino: In function ‘void checkSMS()’:

Relay_controlled_by_phone_call_Advanced:337: error: invalid conversion from ‘byte {aka unsigned char}’ to ‘const char*’ [-fpermissive]

In file included from e:pgpgArduinohardwarearduinoavrcoresarduino/Arduino.h:25:0,

from C:UsersADMINI~1AppDataLocalTempbuilde51375b59d4a0ce0d142645bcbd0e6d1.tmpsketchRelay_controlled_by_phone_call_Advanced.ino.cpp:1:

e:pgpgarduinohardwaretoolsavravrincludestring.h:122:14: error: initializing argument 2 of ‘char* strcat(char*, const char*)’ [-fpermissive]

extern char *strcat(char *, const char *);

^

Relay_controlled_by_phone_call_Advanced:420: error: invalid conversion from ‘byte* {aka unsigned char*}’ to ‘const char*’ [-fpermissive]

In file included from e:pgpgArduinohardwarearduinoavrcoresarduino/Arduino.h:25:0,

from C:UsersADMINI~1AppDataLocalTempbuilde51375b59d4a0ce0d142645bcbd0e6d1.tmpsketchRelay_controlled_by_phone_call_Advanced.ino.cpp:1:

e:pgpgarduinohardwaretoolsavravrincludestring.h:133:15: error: initializing argument 1 of ‘size_t strlen(const char*)’ [-fpermissive]

extern size_t strlen(const char *) __ATTR_PURE__;

^

Relay_controlled_by_phone_call_Advanced:423: error: invalid conversion from ‘byte* {aka unsigned char*}’ to ‘const char*’ [-fpermissive]

In file included from e:pgpgArduinohardwarearduinoavrcoresarduino/Arduino.h:25:0,

from C:UsersADMINI~1AppDataLocalTempbuilde51375b59d4a0ce0d142645bcbd0e6d1.tmpsketchRelay_controlled_by_phone_call_Advanced.ino.cpp:1:

e:pgpgarduinohardwaretoolsavravrincludestring.h:133:15: error: initializing argument 1 of ‘size_t strlen(const char*)’ [-fpermissive]

extern size_t strlen(const char *) __ATTR_PURE__;

^

使用库 GSMSIM800L 在文件夹: e:pgpgArduinolibrariesGSMSIM800L (legacy)
使用 2.0 版本的库 EEPROM 在文件夹: e:pgpgArduinohardwarearduinoavrlibrariesEEPROM
使用 1.0 版本的库 SoftwareSerial 在文件夹: e:pgpgArduinohardwarearduinoavrlibrariesSoftwareSerial
exit status 1
invalid conversion from ‘byte {aka unsigned char}’ to ‘const char*’ [-fpermissive]

Michał
Gość
Michał

Zasilanie bateryjne sprawdzilo się? Jak długo system jest w stanie wytrzymać?