Вы находитесь на странице: 1из 71

I

ESCOLA TCNICA SAMATEC


CURSO TCNICO DE AUTOMAO

ARTHUR MUNIZ
BRUNO BRAZ
ELAINE LOPES
MILTHOR FERNANDES

ACIONAMENTO REMOTO DE PORTO ELTRICO


CELULAR ATRAVS DE MICROCONTROLADOR

SO MATEUS
2015

VIA

II

ARTHUR MUNIZ
BRUNO BRAZ
ELAINE LOPES
MILTHOR FERNADES

ACIONAMENTO REMOTO DE PORTO ELTRICO VIA


CELULAR ATRAVS DE MICROCONTROLADOR

Trabalho final apresentado ao Curso


Tcnico de Automao da Escola
Tcnica

Samatec,

como

requisito

parcial para obteno do Grau de


Tcnico em Automao.
Orientador: Kathia Rossini
Co- Prof. Maykened Pinheiro

SO MATEUS
2015

III

ARTHUR MUNIZ
BRUNO BRAZ
ELAINE LOPES
MILTHOR FERNADES
ACIONAMENTO REMOTO DE PORTO ELTRICO VIA
CELULAR ATRAVS DE MICROCONTROLADOR

Trabalho final apresentado ao Curso Tcnico de Automao da Escola Tcnica


Samatec, como requisito parcial para obteno do Grau de Tcnico em
Automao.
Aprovada em 07 de Agosto de 2015.

COMISSO EXAMINADORA

Prof. Orientador Escola Tcnica Samatec

Prof. - Co-orientador Escola Tcnica Samatec

Prof. - Convidado

IV

AGRADECIMENTOS

nossa famlia, por todo o carinho e dedicao. Aos nossos amigos e


colegas que sempre nos apoiaram nos momentos em que precisamos.
nossa orientadora que nos forneceu todo o suporte e incentivo necessrio
para a elaborao e concretizao do projeto final. A Escola Tcnica Samatec
pelo apoio e incentivo que nos permitiro concretizar nosso projeto, aos
professores que contriburam de forma direta e indireta.
E todos que colaboraram de alguma forma com o desenvolvimento e a
realizao deste trabalho.

RESUMO
Este projeto apresenta um dispositivo de acionamento remoto de portes
eltricos via celular utilizando micro controlador. O projeto integra a placa
Arduino UNO, cujo micro controlador ATmega328, uma placa com mdulo
GSM SIM900 e uma placa com mdulos rels num nico prottipo. O prottipo
realiza cadastro de usurios, adicionando novos ou removendo cadastros j
existentes, atravs de mensagem de texto enviada por um administrador do
sistema o primeiro usurio a mandar um SMS ao prottipo. O prottipo, ao
receber a mensagem, faz a identificao e a compara aos telefones cadastrados
em seu SIM Card; e envia um pulso eltrico ao mdulo rel acionando o porto
eltrico caso o usurio seja cadastrado. A linguagem de programao utilizada
para o desenvolvimento foi a Arduino que implementa as linguagens Processing
e C.

Palavras-chave: Automao, Acionamento Remoto, GSM, Arduino, ATmega328,


Processing, C, SMS, SIM Card.

VI

SUMRIO

LISTA DE FIGURAS ..................................................................... VIII


LISTA DE TABELAS ...................................................................... IX
LISTA DE SIGLAS E ABREVIATURAS .......................................... X
CAPTULO 1 INTRODUO ...................................................... 11
1.1 Apresentao do Problema ....................................................... 11
1.2 Objetivos do Trabalho ................................................................ 11
1.3 Metodologias............................................................................... 12
1.4 Estrutura da Monografia ............................................................ 13
2.1 Segurana Residencial .............................................................. 14
2.2 Comodidade ................................................................................ 14
2.3 Solues Existentes ................................................................... 15
2.4 Benefcios do Dispositivo Proposto e suas Restries .......... 16

CAPTULO 3 REFERENCIAL TERICO ................................... 17


3.1 Microcontroladores .................................................................... 17
3.1.1 Arduino ............................................................................ 17
3.2 Rede GSM .................................................................................... 18
3.3 SMS .............................................................................................. 19
3.4 SIM Card ...................................................................................... 19

CAPTULO 4 DESCRIO DE HARDWARE E SOFTWARE ... 21


4.1 Arduino UNO ............................................................................... 21
4.1.1 Especificaes ................................................................ 21
4.1.2 Pinagem Utilizada ........................................................... 22
4.2 Arduino IDE ................................................................................. 23
4.3 Placa com Mdulo GSM SIM900 ................................................ 25
4.4 Comandos AT ............................................................................. 26
4.5 Placa com Mdulos Rels .......................................................... 28

CAPTULO 5 IMPLEMENTAO .............................................. 30

VII
5.1 Modelagem do sistema .............................................................. 30
5.2 Elaborao do cdigo fonte ...................................................... 31
5.2.1 Escrita do cdigo fonte .................................................... 31
5.3 Montagem do prottipo .............................................................. 34

CAPTULO 6 RESULTADOS OBTIDOS .................................... 35


6.1 Simulaes .................................................................................. 35
texto como administrador do sistema .......................................... 36
6.1.2 Adicionar usurios atravs de SMS do administrador ..... 37
6.1.3 Remover usurios atravs de SMS do administrador ..... 38
cadastrado enviar uma SMS ao mdulo GSM ............................ 38
6.2 Problemas encontrados ............................................................. 39

CAPTULO 7 CONSIDERAES FINAIS .................................. 41


7.1 Concluses ................................................................................. 41
7.2 Propostas para trabalhos futuros ............................................. 41

REFERNCIAS BIBLIOGRFICAS .............................................. 43


APNDICE A PLANILHA DE CUSTOS ..................................... 44
APNDICE B CDIGO FONTE FINAL ...................................... 45
ANEXO A ESQUEMTICO: ARDUINO UNO............................. 71

VIII

LISTA DE FIGURAS
Figura 2.1 Dispositivo (2), TiDiGino............................................................17
Figura 2.2 Ilustrao do funcionamento do dispositivo (1)......................18
Figura 3.1 Placa Arduino UNO.....................................................................20
Figura 3.2 Logo GSM desde 2000................................................................20
Figura 3.3 SIM Card usado no projeto........................................................22
Figura 4.1 Modelo Arduino UNO..................................................................23
Figura 4.2 Interface do Arduino IDE verso 0022 (AUTOR)......................26
Figura 4.3 Circuito esquemtico da placa com modulo GSM SIM900.....27
Figura 4.4 Mdulo GSM SIM900...................................................................28
Figura 4.5 Placa do porto ( esquerda) e botoeira em destaque (
direita)...............................................................................................................31
Figura 4.6 Tenso em volts ( esquerda) e a corrente em A ( direita)
do porto eltrico utilizado no projeto..........................................................31
Figura 4.7 Placa com 8 mdulos rels........................................................32
Figura 4.8 Circuito do modulo rel..............................................................32
Figura 5.1 Fluxograma geral........................................................................34
Figura 5.2 Fluxograma Trata SMS.............................................................34
Figura 5.3 Cdigo fonte: Diretivas e Variveis...........................................36
Figura 5.4 Cdigo fonte: Funo setup......................................................37
Figura 6.0 Placa Aruino UNO em funcionamento......................................46

IX

LISTA DE TABELAS
Tabela 4.1 Principais caractersticas da placa Arduino UNO...................24
Tabela 4.2 Pinagem da placa Arduino UNO utilizada neste projeto........25
Tabela 4.3 Descrio da interface do Arduino IDE....................................26
Tabela 4.4 Sintaxe dos comandos AT.........................................................29
Tabela 4.5 Comandos AT utilizados............................................................30
Tabela 5.1 Comandos da funo setup......................................................38

LISTA DE SIGLAS E ABREVIATURAS


AT
cm

Hayes AT Commands
Centmetros

EEPROM

Erasable Electronically Programmable Read Only Memory

FTDI

Future Technology Devices International

GSM

Global System for Mobile Communications

IDE

Integrated Development Enviroment

KB

Kilo Bytes

Micro Ampere

MHz

Mega Hertz

PWM

Pulse Width Modulation

SRAM

Static Random Access Memory

USB

Universal Serial Bus

Volts

11

CAPTULO 1 INTRODUO
1.1 Apresentao do Problema
Nos ltimos anos, tem sido uma tendncia a utilizao da tecnologia no dia a dia
do ser humano, em diversos setores de sua vida. No que diz respeito ao controle
e automao residencial, h diversas ofertas de produtos para um mercado
crescente, que pode pagar por mais comodidade e segurana.
Dentre as diversas tecnologias que tm sido trazidas s residncias, portes
eltricos acionados por controle remoto uma destas tecnologias mais simples
e presentes em casas e condomnios. Essa tecnologia permite um acesso mais
gil, seja residncia, ao condomnio, etc., tornando esse acesso mais seguro,
evitando que o usurio tenha que sair do veculo para abrir o porto. No entanto,
o controle remoto responsvel pelo acionamento do porto eltrico no faz
distino de quem o aciona, tornando possvel o acesso de qualquer indivduo
que tenha este controle em mos.
Outro problema gerado pelo acionamento remoto o fato do usurio ter
que carregar consigo at mais de um controle, como no caso de condomnios em
que necessrio um controle para o acesso ao condomnio e outro para a prpria
residncia. Como solucionar ou evitar estes problemas?

1.2 Objetivos do Trabalho


Este projeto tem como objetivo geral apresentar uma soluo alternativa para os
problemas apresentados na seo anterior, com a criao de um dispositivo de
acionamento remoto de portes eltricos via celular atravs de microcontrolador
que substitua o atual controle remoto.
Como objetivo especfico, neste projeto desenvolvido um prottipo que tem
como funes cadastrar e remover usurios de seu SIM Card, atravs do envio
de mensagens de texto, e enviar um pulso eltrico para o acionamento remoto
de um porto eltrico quando este dispositivo receber um SMS de um usurio
cadastrado. Utilizando a placa microcontrolada, Arduino UNO, juntamente com
o mdulo GSM SIM900, ao receber a primeira mensagem de texto o prottipo

12
cadastra o cliente que a enviou como administrador do sistema o nico capaz
de cadastrar e remover usurios. Aps a definio do administrador, possvel
realizar o cadastro de novos usurios atravs do envio de um SMS com o nmero
de telefone do cliente. Caso seja necessria a remoo de um usurio, basta que
o administrador envie outro SMS com o nmero deste cliente para que o sistema
o apague da memria. Assim, ao receber um SMS, o prottipo verifica o cadastro
e aciona o porto eltrico para os usurios registrados.

1.3 Metodologias
Para o desenvolvimento deste projeto foram realizadas pesquisas bibliogrficas
como ponto de partida para o desenvolvimento da idia do prottipo. Diversas
pesquisas foram feitas no site oficial do microcontrolador escolhido para a
determinao dos componentes de hardware como a placa Arduino UNO e o
mdulo GSM SIM900 e software o ambiente de desenvolvimento Arduino
(IDE) que foram utilizados ao longo do desenvolvimento do projeto.
Foram realizados estudos sobre a tecnologia da telefonia mvel, como a rede
GSM e o envio de mensagens de texto, e tambm sobre as caractersticas fsicas
dos componentes utilizados no projeto. Todos os componentes eletrnicos foram
estudados atravs de manuais e sites oficiais para o desenvolvimento do
prottipo. Estes componentes foram testados atravs de medies com
multmetro, bem como suas ligaes.
O desenvolvimento do sistema teve como incio a elaborao de um fluxograma
geral do programa que serviu como base para a escrita do cdigo fonte. Foi
desenvolvido um fluxograma, para o tratamento de SMS , para auxiliar tanto na
compreenso quanto na elaborao do destas das funes. Aps a escrita do
cdigo fonte, este foi compilado e carregado no microcontrolador para que ento
fosse realizada a montagem do prottipo. O dispositivo teve como base um
quadrado de madeira onde foram fixados os componentes eletrnicos e, depois,
colocados dentro de uma caixa de papelo adaptada.
Os testes realizados foram executados atravs de celular comum com chip da
operadora Vivo. Estes testes tm como objetivo avaliar o desempenho do

13
sistema nas seguintes tarefas: definio do administrador, cadastro de novos
usurios, remoo de usurios e acionamento remoto do porto eltrico.

1.4 Estrutura da Monografia


Este documento dividido em sete captulos. O primeiro, INTRODUO, trata
da apresentao do problema, dos objetivos deste trabalho, as metodologias
utilizadas para seu desenvolvimento e a estrutura da monografia.
O segundo captulo, APRESENTAO DO PROBLEMA, trata em detalhes as
motivaes que levaram ao desenvolvimento deste projeto, apresentando
tambm solues existentes ao problema e os benefcios do dispositivo proposto
e suas restries.
O terceiro captulo, REFERENCIAL TORICO, aborda o embasamento terico
necessrio para melhor compreenso e desenvolvimento do projeto, como
introdues a microcontroladores, rede GSM e SIM Card.
O quarto captulo, DESCRIO DE HARDWARE E SOFTWARE, detalha
tecnicamente os componentes fsicos e lgicos com nfase no que ser utilizado.
No quinto captulo, IMPLEMENTAO, so apresentados os passos
necessrios para o desenvolvimento e compreenso do projeto.
O sexto captulo, RESULTADOS OBTIDOS, contm simulaes que tm como
finalidade observar o desempenho de todas as funcionalidades do projeto num
ambiente real, assim como os problemas encontrados.
O stimo captulo, CONSIDERAES FINAIS, contm as concluses do
projeto e sugestes para trabalhos futuros.

14

CAPTULO 2 APRESENTAO DO PROBLEMA


Este captulo visa detalhar as motivaes para o desenvolvimento deste projeto,
previamente descritas na seo Apresentao do Problema do captulo
anterior. Algumas solues semelhantes ao proposto por este documento so
apresentadas tambm e, no final deste captulo, so apresentados os benefcios
do prottipo obtido e suas restries.

2.1 Segurana Residencial


O nmero de assaltos a residncias e homicdios no ES cresceu em
2014. Segundo dados da Secretaria de Segurana Pblica, os roubos
a casas subiram 40% de 2014 para 2015... (A GAZETA, 2015)

No de hoje que se observa o aumento dos furtos residncia. Por todos os


veculos de comunicao tem-se relatos e nmeros crescentes de assaltos todos
os dias. Segundo o site de notcias, G1 (2015), o nmero de furtos em casas do
Jardim Camburi, bairro de Vitria-ES, quase dobrou no ms julho. Foram 14
casas furtadas no ms, seis a mais do que no mesmo perodo do ano passado.
Por esses motivos, muitos cidados tm procurado formas de melhorar a
segurana do lar. A automao pode ser um meio de prover este aumento de
segurana, como atravs de cmeras de vigilncia, sensores de proximidade e
alarmes residenciais. O meio proposto por este projeto o controle do acesso
residncia atravs do acionamento do porto eltrico.

2.2 Comodidade
O avano tecnolgico contnuo observado nas mais diversas reas, como na
medicina, construo civil, engenharia da computao e, com isso, tem
adentrado hospitais, escritrios e residncias.
A tecnologia surge tambm como uma fonte geradora de conforto. Desde um
simples controle remoto da televiso at geladeiras que informam quando os
alimentos esto acabando so possibilidades.

15
O prottipo resultante deste projeto tem como objetivo trazer mais comodidade
ao usurio, tendo o controle de acionamento remoto do porto eltrico ao alcance
de um SMS.

2.3 Solues Existentes


Depois de pesquisar dispositivos similares que tivessem o mesmo propsito do
prottipo deste projeto, encontrou-se alguns prximos que so brevemente
descritos.

Figura 2.1 Dispositivo (2), TiDiGino. Fonte: TIDIGINO

Os dispositivos so GSM Remote Control 2 IN and 2 OUT(1) e TiDiGino, the


Arduino-based GSM Remote Control(2). Ambos possuem um design e
funcionalidade muito prximos. No entanto, o dispositivo (1) possui o
PIC18F46K20-I/PT como microcontrolador, enquanto o outro dispositivo (2)
utiliza o microcontrolador ATmega 2560.

16

Figura 2.2 Ilustrao do funcionamento do dispositivo (1). Fonte: GSM REMOTE CONTROL

Ambos os dispositivos (1) e (2) citados funcionam como um controle


remoto atravs do envio de mensagens de texto seguidas de cdigos numricos
pr-estabelecidos pelos fabricantes.

2.4 Benefcios do Dispositivo Proposto e suas Restries


O prottipo obtido com o desenvolvimento deste projeto tem como finalidade
promover o acionamento remoto de um porto eltrico atravs de um SMS. Os
elementos eletrnicos so de fcil acesso e o desenvolvimento do prottipo
simplificado.
Este dispositivo tambm dever identificar o nmero da mensagem recebida e,
verificar se este est no cadastro para, em caso afirmativo, acionar o porto
eltrico.
O prottipo no tem como funcionalidade a leitura do estado de abertura do
porto eltrico (aberto, fechado, abrindo ou fechando), ou seja, funciona de modo
similar a um controle remoto. A leitura do estado do porto eltrico feita pelo
usurio, decidindo acionar remotamente seja para abertura como para o
fechamento do porto.

17

CAPTULO 3 REFERENCIAL TERICO


Para compreenso e desenvolvimento deste trabalho so necessrios alguns
conceitos que se relacionam diretamente ao projeto. Esses conceitos, apesar de
muito amplos, sero citados com o foco neste projeto.

3.1 Microcontroladores
Segundo Gimenez (2005), o microcontrolador um dispositivo semicondutor
em forma de circuito integrado, que integra as partes bsicas de um
microcomputador microprocessador, memrias no-volteis e volteis e portas
de entrada e sada.
Microcontroladores so usados com frequncia em tarefas especficas que no
exijam grandes quantidades de dados, como em automao residencial mais
especificamente, placas de portes eltricos , pois geralmente possuem pouca
memria de armazenamento.

3.1.1 Arduino
O Arduino uma plataforma de computao fsica de fonte aberta, com base em
uma placa simples de entrada/sada (input/output, ou I/O), assim como em um
ambiente de desenvolvimento que implementa a linguagem Processing 1 . O
Arduino pode ser utilizado para desenvolver objetos interativos independentes,
ou conectado a softwares de seu computador (BANZI, 2011).

Processing uma linguagem de programao de cdigo aberto que foi inicialmente desenvolvida
para ensinar fundamentos da programao computacional num contexto visual.

18

Figura 3.1 Placa Arduino UNO. Fonte: ARDUINO

O arduino foi escolhido por se tratar de um ambiente multiplataforma, ou seja,


pode ser executado no Linux, Mac OS e Windows. Alm dessa vantagem, o
arduino tem como base o IDE de programao Processing, um ambiente de
desenvolvimento amigvel e de fcil utilizao. Finalmente, o arduino UNO pode
ser programado atravs do cabo USB, sem a necessidade de se utilizar uma
porta serial que vem sido cada vez menos presente nos computadores
modernos.

3.2 Rede GSM


Originalmente sigla para Groupe Special Mobile (Grupo Especial de telefonia
mvel, traduo livre), GSM agora a abreviao de Global System for Mobile
Communications ou Sistema Global para Comunicaes Mveis.

Figura 3.2 Logo GSM desde 2000. Fonte: WIKIPEDIA

Criada em 1982, a rede GSM uma tecnologia digital para celulares usada para
transmisso mvel de voz e dados. A rede GSM permite que indivduos sejam

19
contatados atravs do mesmo nmero de celular em at 219 pases. As redes
GSM terrestres cobrem mais de 90% da populao mundial e a tecnologia
roaming 2 GSM de satlites estende essa cobertura para reas que a rede
terrestre no alcana. Hoje, as conexes mveis globais superam 6 bilhes
(GSM,2012).

3.3 SMS
De acordo com Hillebrand (2010), o conceito do Servio de Mensagens Curtas
(do ingls, Short Message Service) foi desenvolvido em 1984 numa cooperao
franco-germnica. A idia seria aproveitar o sistema telefnico da poca, que
mandava mensagens de sinalizao atravs de canais telefnicos para controle
de trfego durante certos perodos do dia, para enviar mensagens de texto a um
baixo custo quando este sistema estivesse ocioso. No entanto, essas
mensagens seriam limitadas a 128 bytes (futuramente aumentadas para 140
bytes ou 160 dgitos de 7 bits), o tamanho padro das mensagens de sinalizao
utilizadas.
Atualmente, as mensagens de texto esto presentes no cotidiano dos usurios
de telefones celulares como uma forma barata e rpida de se comunicar.
Segundo o site de estudos estatsticos, Statista3 (2012), durante o ano de 2010
mais de 192 mil mensagens de textos foram enviadas a cada segundo em todo
o globo.

3.4 SIM Card


O Subscriber Identification Module (mdulo de identificao do assinante), ou
SIM Card tambm chamado de Carto SIM um circuito integrado do tipo

Roaming, tambm chamado de itinerncia, um termo empregado na telefonia mvel que


designa a capacidade de um usurio de uma rede obter conectividade em reas fora da
localidade geogrfica onde est registrado.
3
Statista um site de pesquisas e estudos estatsticos parceiro de DOWJONES entre outras.
Site da empresa: http://www.statista.com/

20
chip que utilizado para identificar um usurio na rede GSM e tambm para
controlar e armazenar dados de telefones celulares.
Na Figura 3.3 ilustrado o SIM Card utilizado neste projeto. Este possui 128 KB
de memria e dimenses padres de 25 milmetros comprimento e 15 milmetros
de largura.

Figura 3.3 SIM Card usado no projeto. Fonte: AUTOR

O SIM Card possui uma memria do tipo EEPROM, uma memria no voltil,
que armazena, no s os nmeros de telefones e o cdigo de identificao do
chip, mas as configuraes e dados das outras funcionalidades. Algumas dessas
funcionalidades so:

SIM Tool Kit (STK)

Autenticao do usurio

Servios OTA (Over The Air)

21

CAPTULO 4 DESCRIO DE HARDWARE E


SOFTWARE
4.1 Arduino UNO
A placa Arduino UNO a mais recente dentre as sries de placas Arduino USB.
Essa placa difere das outras da famlia Arduino por no utilizar o chip
conversor FTDI USB para Serial, facilitando o upload 1 do cdigo fonte do
computador para a placa. O esquemtico da placa pode ser encontrado no
Anexo A Esquemtico: Arduino UNO.

4.1.1 Especificaes
A placa Arduino UNO baseada no microcontrolador ATmega328, produzido
pela Atmel. A figura 4.1 ilustra o modelo da placa utilizada neste projeto.

Figura 4.1 Modelo Arduino UNO. Fonte: ARDUINO UNO

As principais caractersticas desta placa so apresentadas na tabela 4.1


abaixo:

Upload, ou carregamento, a transferncia de dados de um computador local para outro, como


a placa Arduino.

22

Tabela 4.1 Principais caractersticas da placa Arduino UNO


Nome

Descrio

Microcontrolador

ATmega328

Voltagem de operao

5V

Alimentao (Recomendada)

7 12 V

Alimentao (Limite)

6 20 V
14 (de 0 at 13, dos quais 6 podem prover

Pinos de E/S digitais

sadas PWM)

Pinos de entrada analgica

6 (de A0 at A5)

Corrente contnua por pino de E/S

40 mA

Corrente contnua para pino 3,3V

50 mA

Memria Flash

32 KB (ATmega328)

SRAM

2 KB (ATmega328)

EEPROM

1 KB (ATmega328)

Frequncia de clock2

16 MHz

Fonte: AUTOR

Esta placa possui 3 pinos GND (do ingls Ground, ou Terra), dois pinos que
fornecem uma voltagem regulada de 3,3 V e 5 V cada, um pino Vin que fornece
a voltagem advinda diretamente da alimentao seja por USB ou por fonte
externa e um pino de entrada para referncia analgica (AREF).

4.1.2 Pinagem Utilizada


A tabela 4.2 detalha a pinagem utilizada descrevendo o pino e sua
funcionalidade especfica neste projeto.

Tabela 4.2 Pinagem da placa Arduino UNO utilizada neste projeto


Pino

Utilizao

Frequncia de clock representa o nmero de ciclos realizados pelo microcontrolador no perodo


de um segundo.

23
Vin

Alimentao do Mdulo GSM

5V

Alimentao da placa de Rels

GND

Aterramento da placa de Rels


Porta RX Virtual para controle do Mdulo

4
5

GSM
Porta TX Virtual para controle do Mdulo GSM
Acionamento de um dos rels da placa de

Rels

Fonte: AUTOR

4.2 Arduino IDE


O Arduino IDE um programa que permite a criao de novos programas
chamados de sketches 3 para a placa Arduino numa linguagem simples,
modelada a partir da linguagem Processing. Esse ambiente de desenvolvimento
responsvel pelo envio do cdigo fonte para o compilador avr-gcc2 que
converte o cdigo para a linguagem de programao C para finalmente traduzir
o resultado em linguagem de mquina, compreendida pelo microcontrolador. A
figura 4.2 traz a interface do Arduino IDE numerada pelo autor para melhor
descrio na tabela 4.3.

Do ingls, esboos ou rascunhos. 2 Software de cdigo aberto com compilador C (encontrado


na pgina web: winavr.sourceforge.net/ )

24

Figura 4.2 Interface do Arduino IDE verso 0022. Fonte: AUTOR

Tabela 4.3 Descrio da interface do Arduino IDE


Nmero

Nome

Descrio
Item composto do nome da

Ttulo | Verso

sketch e da verso do
Arduino IDE

Verify

Compila o cdigo fonte

Stop

Para a execuo ou
compilao do programa

New

Gera uma nova sketch

Open

Abre sketches salvas

Save

Salva a sketch atual

Upload

Efetua a compilao do

1
2

cdigo e transmite para a

placa
7

Fonte: AUTOR

Serial Monitor

Abre um monitor serial que


simula a comunicao do
computador com a placa

25

4.3 Placa com Mdulo GSM SIM900


A placa com mdulo GSM SIM900, tambm chamada de shield4 GSM, uma
placa que pode ser conectada facilmente sobre a placa Arduino UNO estendendo
as funcionalidades do mdulo GSM ao conjunto resultante. Como esta placa
empilhada sobre a placa Arduino UNO, atravs de todos seus pinos, a placa com
mdulo GSM SIM900 utiliza esta estrutura para sua alimentao e
funcionamento. A figura 4.3 ilustra o circuito desta placa.

Figura 4.3 Circuito esquemtico da placa com modulo GSM SIM900.


Fonte: ARDUINO GSM SHIELD

O mdulo GSM SIM900, produzido pela SIM Com, o responsvel pela


comunicao com a rede GSM tornando possvel a efetuao e o recebimento
de ligaes telefnicas e mensagens de texto. O modelo utilizado neste projeto
ilustrado na figura 4.4.

Shield do ingls, escudo. Utilizada neste contexto como placa empilhvel em formato compatvel
com a placa Arduino UNO.

26

Figura 4.4 Mdulo GSM SIM900.


Fonte: AUTOR

O funcionamento deste mdulo controlado atravs do programa carregado no


microcontrolador por meio de comandos AT que sero discutidos a seguir.

4.4 Comandos AT
Os comandos AT so linhas de cdigo com solicitaes de servios
reconhecidas pelo mdulo GSM SIM900. Esses comandos so fornecidos pelo
fabricante e seguem um padro de sintaxe descrito brevemente a seguir na
tabela 4.4.
Tabela 4.4 Sintaxe dos comandos AT
Nome

Sintaxe

Descrio

Comando de Teste

AT+<comando>=?

O mdulo GSM retorna uma


lista de parmetros e valores
possveis para o comando

Comando de Leitura

AT+<comando>?

Retorna o valor do parmetro


ou o parmetro atual
Escreve os valores de

Comando de Escrita

AT+<comando>=<...>

parmetros definidos por


usurio

27
Executa parmetros no
Comando de Execuo

variveis afetados por

AT+<comando>

processos internos do mdulo


Fonte: SIMCom, SIM900_AT Command Manual_V1.03, p.13

Apesar do mdulo GSM SIM900 reconhecer uma vasta lista de comandos AT,
apenas

alguns

desses

foram

utilizados

direta

ou

indiretamente

no

desenvolvimento deste projeto. A tabela 4.5 traz esses comandos e suas


respectivas descries.

Tabela 4.5 Comandos AT utilizados


Comando

Descrio

AT

Verifica comunicao com o mdulo


Define a taxa de comunicao do mdulo

AT+IPR=9600

(bauds)

AT&F

Define as configuraes de fbrica do mdulo

AT+CLIP=1

Ativa a identificao de chamada

AT+CMEE=0

Desabilita mensagem com cdigo de erro e,


ao invs, utiliza mensagem ERROR

AT+CMGF=1

Define modo texto para mensagens de texto

AT+CPBS=SM

Define o tipo de armazenamento da agenda


para armazenamento em SIMCard
Desabilita o eco das informaes recebidas

ATE0
AT+CPBR=i

no mdulo
Retorna o registro na posio i do SIM Card
Escreve o nmero de telefone 06199998888

AT+CPBW=i,06199998888

na posio i do SIM Card

AT+CPAS

Retorna o status da atividade do mdulo

AT+CLCC

Retorna a lista atual de chamadas

AT+CMGL=ALL

Lista todas mensagens de texto presentes

AT+CMGR=i

Retorna o nmero de telefone que enviou a


mensagem de texto e o contedo do SMS

28
Apaga todas mensagens de texto do local de
AT+CMGD=1,4
ATH

armazenamento atual
Desliga quaisquer chamadas e/ou ligaes

Fonte: SIMCom, SIM900_AT Command Manual_V1.03

4.5 Placa com Mdulos Rels


Rels so dispositivos eletromecnicos capazes de controlar circuitos de
grandes tenses e correntes (1) a partir de pequenas tenses e correntes de
outro circuito (2). O funcionamento de um rel se d pela seguinte forma: quando
o circuito de controle (2) com pequenas tenses e correntes envia uma
corrente para a bobina do rel, este gera um campo magntico que atrai o
contato, fechando o circuito de carga (1).
Para a definio dos rels a serem utilizados no prottipo foi necessria a
anlise do circuito de carga do projeto, neste caso, o porto eltrico. A placa do
porto ilustrada na figura 4.5, com um destaque para a botoeira.

Figura 4.5 Placa do porto ( esquerda) e botoeira em destaque ( direita). Fonte: AUTOR

Em seguida, foram medidas a tenso e a corrente da botoeira com um


multmetro como ilustra a figura 4.6. A tenso obtida foi de 4,78 V e a corrente
de 295 A.

29
Como o prottipo visa abranger um grande nmero de portes eltricos e suas
botoeiras o rel escolhido foi o comum SRD-05VDC-SL-C da SONGLE que
requer a alimentao de 5 V que a placa Arduino UNO pode fornecer.
A placa com mdulos rels utilizada neste projeto se caracteriza pela associao
de um opto-acoplador (U1) utilizado para proteo das placas Arduino UNO e
shield GSM , um transistor (Q1) que controla o fluxo da corrente no rel, um
diodo (D1) e um rel, para cada de mdulo rel. Apesar da placa utilizada possuir
8 mdulos rels, apenas um utilizado para o acionamento do porto eltrico.

Figura 4.8 Circuito do modulo rel. Fonte: MODULO RELE

30

CAPTULO 5 IMPLEMENTAO
Neste captulo so descritos, detalhadamente, os procedimentos necessrios
para o desenvolvimento deste projeto. Esses procedimentos foram divididos da
seguinte forma:

Modelagem do sistema;

Elaborao do cdigo fonte;

Montagem do prottipo;

5.1 Modelagem do sistema


Na primeira etapa da implementao foi realizada a modelagem do sistema
proposto e, para tal, foram desenvolvidos trs fluxogramas para melhor ilustrar o
funcionamento desejado do prottipo.
No primeiro estgio o fluxo geral do sistema, numa viso macroscpica de suas
funcionalidades como a verificao se o mdulo GSM recebeu alguma
mensagem de texto.
No segundo fluxograma mostrado na figura 5.2 , ilustrado o fluxo do
processo Trata SMS, detalhando as funes contidas nele. Este fluxograma
demonstra a lgica de registro ou remoo de usurio atravs de uma
mensagem de texto, assim como o registro do Administrador que ser o
responsvel pelo registro de novos usurios ou remoo de usurios que no
podero mais acionar o porto eltrico.

Figura 5.2 Fluxograma Trata SMS. Fonte: AUTOR

31

Aps o processo do fluxograma anterior, verificado se o usurio que est


enviando o SMS est ou no cadastrado no SIM Card e libera a linha do mdulo
GSM para a no obstruo do seu canal de comunicao. neste processo que
o usurio aciona o porto eltrico, caso esteja cadastrado.

5.2 Elaborao do cdigo fonte


Aps a modelagem do sistema, j possvel a elaborao do cdigo fonte que
ser salvo no microcontrolador. Para melhor observao do comportamento do
sistema, foram desenvolvidos dois cdigos fonte similares: o cdigo fonte para
fase de teste e o cdigo fonte para prottipo final. O cdigo de teste possui
apenas duas diferenas funcionais:

Comunicao serial:
O

cdigo fonte de teste faz com que o prottipo envie ao monitor serial

do Arduino IDE todas etapas ocorridas em forma de texto, facilitando a


visualizao de toda a atividade realizada pelo prottipo.

Relatrio peridico:
O

cdigo fonte envia a cada perodo de tempo (pr-definido pelo

autor) um relatrio com todos os telefones cadastrados no SIM Card


para o monitor serial, possibilitando o acompanhamento da atualizao
dos registros.
Apesar dessas duas funes adicionais do cdigo fonte de teste, ambos
os cdigos executam o que esperado do modelo apresentado na seo 5.1
Modelagem do sistema. Ambos os cdigos foram desenvolvidos, compilados e
testados no Arduino IDE.

5.2.1 Escrita do cdigo fonte


Todo o cdigo foi escrito na linguagem de programao do Arduino, que
implementa Processing e C. De acordo com o fluxograma apresentado na seo

32
5.1 Modelagem do sistema e a pinagem utilizada definida na tabela 4.2
Pinagem da placa Arduino UNO utilizada neste projeto possvel definir as
diretivas de pr-compilao e as variveis.
Aps definir as diretivas de pr-compilao e as variveis, necessrio definir
que parte do cdigo fonte deve executar apenas uma nica vez. Na linguagem
de programao Arduino, utiliza-se a funo setup para o que se executar
apenas na inicializao do sistema.
Essa funo de inicializao basicamente define qual pino ser utilizado para
enviar o pulso eltrico (pinoRele), inicia a comunicao serial para o envio de
informaes ao monitor serial, liga e configura o mdulo GSM de acordo com a
necessidade do prottipo. A tabela 5.1 mostra cada funo utilizada e uma breve
descrio dessas.
Tabela 5.1 Comandos da funo setup
Nome

Descrio

pinMode(i,OUTPUT)

Define o pino i como sada

Serial.begin(9600)

Inicia comunicao serial na taxa escolhida


Inicia mdulo GSM na taxa escolhida e

gsm.TurnOn(9600)

verifica comunicao com o mdulo atravs


do comando AT
Configura mdulo GSM de acordo com os
comandos pr-determinados:
- AT&F

gsm.InitParam(1)

- AT+CLIP=1
- AT+CMEE=0
- AT+CMGF=1
- AT+CPBS=SM
Desabilita eco das informaes no mdulo

gsm.Echo(0)
Serial.println(texto) ou Serial.print(texto)

GSM atravs do comando: ATE0


Envia texto para o monitor serial

33
Verifica se existe algum nmero de telefone
na posio i e carrega este nmero em
gsm.GetPhoneNumber(i,telefone)

telefone atravs do comando AT+CPBR=i.


Retorna 1 caso encontre registro e 0 se no
encontrar nada na posio i.

Fonte: AUTOR

Depois de inicializado, o sistema entra em lao de repetio infinito, definido na


linguagem de programao Arduino coma a funo loop.

Neste lao de repetio infinito tem-se o corpo principal do sistema, onde se ir


tratar o SMS recebido para cadastro ou remoo de usurios , e outro SMS
acionando o porto eltrico para o usurio cadastrado e, para a fase de teste,
gerar um relatrio a cada minuto (60000 milissegundos) dos telefones
cadastrados.
Quando o mdulo GSM receber uma mensagem de texto, a funo
trataSMS ir seguir os seguintes passos:
1. Verificar se este o primeiro SMS recebido, no caso positivo, registra o
usurio que enviou o SMS como Administrado do sistema o nico capaz
de cadastrar ou remover usurios e avana para o prximo passo. Caso
j exista algum cadastro pula este passo.
2. Verifica se o corpo do SMS contem apenas nmeros (de 0 at 9), em caso
positivo, avana para o prximo passo. Em caso negativo, pula para passo
6.
3. Verifica se o nmero no corpo do SMS j est cadastrado. Em caso
positivo avana para o prximo passo e em caso negativo pula para o
passo 5.
4. Apaga nmero j existente no cadastro, ou seja, remove o usurio.
Avana para passo 6.
5. Verifica se existe espao para cadastrar um novo nmero. Em caso
positivo, cadastra o nmero do corpo do SMS na primeira posio
disponvel. Em caso negativo, avana para prximo passo.

34
6. Apaga SMS recebido para economizar espao de memria.

5.3 Montagem do prottipo


Para a montagem do prottipo foi cortado um quadrado de madeira de 13,5cm
de lado e aparafusados tanto a placa Arduino UNO quanto a placa com os 8
mdulos rels, como mostra a figura .
Depois de conectar os circuitos, foi inserido o SIM Card no mdulo GSM. O
quadrado de madeira com os componentes foi colocado dentro de uma caixa
madeira, com base quadrada com 14 cm de lado e altura de 7 cm, cortada de
acordo com as necessidades do prottipo. Foram tambm conectados a antena
para recepo de sinal telefnico e a alimentao do prottipo um
transformador de 12 V comum.
Finalmente, aps todas as etapas, a caixa de madeira foi fechada para a viso
esteticamente mais agradvel do prottipo, deixando apenas a antena e as
conexes para os mdulos rels onde sero ligados os fios da botoeira do
porto eltrico expostos.

35

CAPTULO 6 RESULTADOS OBTIDOS


Neste captulo so apresentados os resultados obtidos atravs de testes e
simulaes para chegar soluo do problema apresentado, atingindo os
objetivos propostos. Sero apresentados nesse captulo, tambm, alguns
problemas encontrados no decorrer do desenvolvimento deste projeto.
Devido dificuldade de documentao por meio de fotografias, do acionamento
do porto eltrico via celular atravs de microcontrolador.

6.1 Simulaes
Nessa seo, so testadas todas as funcionalidades propostas ao sistema, no
intuito de simular um ambiente real. As funcionalidades simuladas tiveram como
objetivo atingir as seguintes metas:

Cadastrar o primeiro usurio que enviar mensagem de texto como


administrador do sistema;

Adicionar usurios atravs de SMS do administrador;

Remover usurios atravs de SMS do administrador;

Acionar remotamente o porto eltrico quando usurio cadastrado quando


enviar uma mensagem ao mdulo GSM;

Antes de realizar as simulaes, todos os componentes foram testados. A figura


6.1 ilustra a verificao da placa Arduino UNO atravs de seu acionamento.

36

Figura 6.0 Placa Aruino UNO em funcionamento. Fonte: AUTOR

6.1.1 Cadastrar o primeiro usurio que enviar mensagem de


texto como administrador do sistema
Esta simulao tem como finalidade observar o funcionamento do dispositivo
desde o momento em que ligado at o cadastro do primeiro usurio que enviar
um SMS como administrador do sistema. Tambm foi testado, nesta simulao,
o caso em que um usurio envia uma mensagem antes do cadastramento do
administrador. Este teste foi executado para a operadora: Vivo. O autor, que
envia o SMS, repetiu a simulao 10 vezes a operadora citada, totalizando 30
simulaes. As etapas realizadas nesta simulao foram:
1. Ligar o prottipo utilizando um transformador de 12V, conectar o cabo
USB na placa Arduino UNO e no computador do autor e, finalmente, iniciar
a execuo do programa com a inicializao do monitor serial.
2. Enviar SMS ao sistema antes de cadastrar o administrador.
3. Enviar primeiro SMS ao sistema para a definio do administrador e o
cadastrado do nmero enviado no corpo do SMS.

37
4. Confirmar cadastro do administrador e do nmero enviado por SMS
atravs de relatrio peridico do sistema.
Os resultados obtidos nessas simulaes do sistema demonstraram
funcionamento do prottipo da forma esperada. Em todos os testes o sistema
no demonstrou falhas na fase de inicializao do prottipo at a execuo da
etapa 1. Em todos os testes realizados, na etapa 2, o sistema funcionou como
esperado, no autorizando o usurio no cadastrado. Na etapa 3, o tempo para
o recebimento da mensagem de texto pelo prottipo oscilou entre 10 e 30
segundos para 27 das 30 simulaes.

6.1.2 Adicionar usurios atravs de SMS do administrador


Esta simulao teve como finalidade observar o funcionamento do sistema j
acionado, aps a definio do administrador, quando este tenta cadastrar um
novo usurio do sistema. Tambm foi testado nesta simulao o caso em que
outro indivduo, outro que o administrador, tenta realizar o cadastro de um novo
usurio.
1. Enviar solicitao de cadastro via SMS por um telefone, que no o
administrador, e aguardar confirmao do NO cadastramento via
relatrio peridico.
2. Enviar solicitao de cadastro via SMS atravs do telefone administrador
e aguardar confirmao do cadastro via relatrio peridico.
Os resultados obtidos nessas simulaes do sistema demonstraram
funcionamento esperado do prottipo. Em todas as simulaes da etapa 1, onde
o usurio que no administrador tenta cadastrar um novo usurio, o sistema
no autorizou tal operao e, atravs o relatrio, foi confirmado o no
cadastramento. Em todas as simulaes da etapa 2, onde o administrador tenta
cadastrar um novo usurio, a operao foi autorizada e confirmada no relatrio
de nmeros cadastrados.

38

6.1.3 Remover usurios atravs de SMS do administrador


Esta simulao teve como finalidade observar o funcionamento do sistema j
acionado, aps a definio do administrador e do cadastro de algum usurio,
quando o administrador tenta remover um usurio j existente no sistema.
Tambm foi testado nesta simulao o caso em que outro indivduo, outro que o
administrador, tenta realizar a remoo de um usurio cadastrado.
1. Enviar solicitao de remoo via SMS por um telefone, que no o
administrador, e aguardar confirmao de que NO houve remoo do
cadastro via relatrio peridico.
2. Enviar solicitao de remoo via SMS atravs do telefone administrador
e aguardar confirmao da remoo via relatrio peridico.

Os

resultados

obtidos

nessas

simulaes

do

sistema

demonstraram

funcionamento esperado do prottipo. Em todas as simulaes da etapa 1, onde


o usurio que no administrador tenta remover um usurio, o sistema no
autorizou tal operao e, atravs o relatrio, foi confirmado que a remoo no
foi efetuada. Em todas as simulaes da etapa 2, onde o administrador tenta
remover um usurio j cadastrado, a operao foi autorizada e confirmada no
relatrio de nmeros cadastrados.

6.1.4 Acionar remotamente o porto eltrico quando usurio


cadastrado enviar uma SMS ao mdulo GSM
Esta simulao teve como finalidade observar o funcionamento do sistema j
acionado, aps a definio do administrador e do cadastro de algum usurio,
quando algum usurio cadastrado envia um SMS ao prottipo e aciona o porto
eltrico. Tambm foi testado nesta simulao o caso em que outro indivduo, no
cadastrado, tenta acionar o porto eltrico atravs de uma mensagem ao
prottipo.

39
1. Enviar um SMS de um usurio cadastrado e confirmar o acionamento
do porto eltrico atravs de mensagem mostrada no monitor serial.
2. Enviar SMS de um usurio no cadastrado e confirmar o NO
acionamento do porto eltrico atravs de mensagem mostrada no
monitor serial.
Os

resultados

obtidos

nessas

simulaes

do

sistema

demonstraram

funcionamento esperado do prottipo. Em todas as simulaes da etapa 1, onde


o usurio cadastrado enviar um SMS ao prottipo, o sistema autorizou tal
operao e, atravs de mensagens no monitor serial, foi confirmado o
acionamento do porto eltrico. Em todas as simulaes da etapa 2, onde um
usurio no cadastrado tenta acionar o porto eltrico atravs de SMS ao
prottipo, a operao no foi autorizada e mostrada atravs de mensagens no
monitor serial.

6.2 Problemas encontrados


Durante o desenvolvimento do sistema, alguns problemas surgiram ao que se
refere autorizao de usurios cadastrados. Inicialmente foi verificado que nem
todos os usurios disponibilizam o celular para identificao das SMS, ou seja,
bloqueiam o nmero do telefone, com isso o prottipo no capaz de identificar
a mensagem e, conseqentemente, no capaz de acionar o dispositivo.
Outro problema encontrado referente ao cadastramento e remoo de
usurios. Inicialmente foi sugerido que todos os usurios cadastrados pudessem
adicionar ou remover cadastros do sistema, com isso surgiu um problema de
controle de nmeros que esto ou no cadastrados no sistema. Para isso, foi
definido que apenas o primeiro cadastro, definido como administrador do
sistema, capaz de cadastrar novos usurios ou remover cadastros. Um dos
problemas gerados com essa deciso surgiu na hiptese do administrador perder
a linha telefnica (por perda/roubo do celular, por exemplo), com isso ser
necessria a aquisio de um novo SIM Card para o dispositivo caso os usurios
desejem adicionar ou remover cadastros.
Finalmente, por se tratar de um dispositivo que no mostra ao usurio a
confirmao de cadastramento ou remoo de outros usurios e que nem todas

40
as mensagens de texto enviadas durante o desenvolvimento e simulao do
prottipo foram recebidas, existe a possibilidade que tanto o cadastro quanto a
remoo de usurios no ocorra, se fazendo necessria uma verificao
adicional, como a tentativa de um novo usurio acionar o porto eltrico para
garantir seu cadastro.

41

CAPTULO 7 CONSIDERAES FINAIS


7.1 Concluses
Neste trabalho foi desenvolvido um prottipo com o objetivo de solucionar os
problemas apresentados no incio deste documento, como o controle do
acionamento do porto eltrico apenas para usurios cadastrados e a
substituio do tradicional controle remoto de portes eltricos por um SMS que
pode ser efetuada de um celular que j faz parte da lista de perifricos que a
maioria das pessoas carrega diariamente.
Apesar dos problemas encontrados no desenvolvimento deste projeto, os
objetivos foram alcanados. Atravs de todos os testes realizados foi possvel
avaliar o desempenho do prottipo como satisfatrio para as funcionalidades
propostas, como a definio do administrador do sistema, a adio e remoo
de usurios no cadastro do SIM Card e o acionamento remoto do porto eltrico
apenas para clientes registrados.
No entanto, existe a possibilidade das mensagens de texto no chegarem ao
dispositivo e esta possibilidade foi atribuda s operadoras de telefonia. No caso
de perda da linha telefnica do administrador do sistema, se far necessria a
troca do SIM Card do prottipo, que atualmente custa por volta de R$10 R$20.
possvel, portanto, concluir que os resultados obtidos com o desenvolvimento
deste projeto cumpriram as propostas e objetivos planejados e que o prottipo
encontra-se em funcionamento e operando de acordo com o previsto e
programado.

7.2 Propostas para trabalhos futuros


Controle e automao residencial tem se provado uma rea em grande
crescimento nos ltimos anos e, com isso, projetos como este tem ganhado
espao no mercado atual. Algumas propostas de desenvolvimento para este
projeto so:

42

Desenvolver uma placa apenas com os itens necessrios para o prottipo,


no intuito de baixar o custo final do produto.

Desenvolver sistema de envio de mensagens de texto ao administrador


confirmando o cadastro ou a remoo de um usurio.

Aplicar o conceito de acionamento remoto via celular atravs de


microcontrolador para utenslios domsticos para maior automao
residencial.

43

REFERNCIAS BIBLIOGRFICAS

ARDUINO, Site do Projeto Arduino. Arduino. Disponvel em: <arduino.cc/>


Acesso: 10 mai. 2015.
ARDUINO GSM SHIELD. Open Eletronics, Open source eletronic projects.
Disponvel em: <http://www.open-electronics.org/arduino-gsm-shield/> Acesso:
10 mai. 2015.
ARDUINO UNO, Arduino UNO Front. Arduino UNO Board. Disponvel em:
<http://arduino.cc/en/uploads/Main/ArduinoUnoFront.jpg> Acesso: 10 mai. 2015.
GSM REMOTE CONTROL 2 IN and 2 OUT Part 2 Schematic Open
Eletronics, Open source eletronic projects. Publicado em: 7 jan. 2011.
Disponvel em: <http://www.open-electronics.org/gsm-remote-control-2-in-and2out-part-2-schematic/> Acesso em: 10 mai. 2015.
MODULO RELE. Mdulo de Rels com 8 canais. Disponvel em:
<http://produto.mercadolivre.com.br/MLB-427565012-modulo-de-reles-8canais5v-arduino-arm-avr-pic-automaco-_JM> Acesso: 10 mai.2015.

WIKIPEDIA,

enciclopdia

livre.

Wikipdia.

Disponvel

em:

<http://pt.wikipedia.org/wiki/GSM> Acesso: 10 jun. 2015.


ROSRIO, Joo Mauricio. Automao Industrial - So Paulo: Barrana,2009.

44

APNDICE A PLANILHA DE CUSTOS

45

APNDICE B CDIGO FONTE FINAL


#include "SIM900.h"
#include "Streaming.h"
#define _GSM_CONNECTION_TOUT_ 5
#define _TCP_CONNECTION_TOUT_ 20
#define _GSM_DATA_TOUT_ 10
//#define RESETPIN 7
SIMCOM900 gsm;
SIMCOM900::SIMCOM900() {};
SIMCOM900::~SIMCOM900() {};
/**********************************************************
Function: This function premits to wake up the module
(only for SIM908) when it goes in energy saving
mode.
Author: Marco Martines
Created: unknown
Modified: 18/02/2014
Output: none
Comments: It would be nice to call this function
automatically when gsm.begin is called (of course
only if a SIM908 is used).
**********************************************************/
char SIMCOM900::forceON()
{
char ret_val=0;
char *p_char;
char *p_char1;
SimpleWriteln(F("AT+CREG?"));
WaitResp(5000, 100, str_ok);
if(IsStringReceived(str_ok)) {
ret_val=1;
}
p_char = strchr((char *)(gsm.comm_buf),',');
p_char1 = p_char+1;
*(p_char1+2)=0;
p_char = strchr((char *)(p_char1), ',');
if (p_char != NULL) {
*p_char = 0;

46
}
if((*p_char1)=='4') {
digitalWrite(GSM_ON, HIGH);
delay(1200);
digitalWrite(GSM_ON, LOW);
delay(10000);
ret_val=2;
}
return ret_val;
}
int SIMCOM900::configandwait(char* pin)
{
int connCode;
//_tf.setTimeout(_GSM_CONNECTION_TOUT_);
if(pin) setPIN(pin); //syv
// Try 10 times to register in the network. Note this can take some time!
for(int i=0; i<10; i++) {
//Ask for register status to GPRS network.
SimpleWriteln(F("AT+CGREG?"));
//Se espera la unsolicited response de registered to network.
while(gsm.WaitResp(5000, 50, "+CGREG: 0,")!=RX_FINISHED_STR_RECV)
//while (_tf.find("+CGREG: 0,")) // CHANGE!!!!
{
//connCode=_tf.getValue();
connCode=_cell.read();
if((connCode==1)||(connCode==5)) {
setStatus(READY);
SimpleWriteln(F("AT+CMGF=1")); //SMS text mode.
delay(200);
// Buah, we should take this to readCall()
SimpleWriteln(F("AT+CLIP=1")); //SMS text mode.
delay(200);
//_cell << "AT+QIDEACT" << _DEC(cr) << endl; //To make sure not pending
connection.
//delay(1000);
return 1;
}
}
}
return 0;
}
/**

47
* SIMCOM900::read(char* buffer, int buffersize)
*
* Waits for data to be readable from the gsm module, reads data until
* no more is available or the buffer has been filled
*
* returns number of bytes read
*
*/
int SIMCOM900::read(char* result, int resultlength)
{
char temp;
int i=0;
#ifdef DEBUG_ON
Serial.print(F("Starting read..\nWaiting for Data.."));
#endif
// Wait until we start receiving data
while(gsm.available()<1) {
delay(100);
#ifdef DEBUG_ON
Serial.print(F("."));
#endif
}
while(gsm.available()>0 && i<(resultlength-1)) {
temp=_cell.read();
if(temp>0) {
#ifdef DEBUG_ON
Serial.print(temp);
#endif
result[i]=temp;
i++;
}
delay(1);
}
// Terminate the string
result[resultlength-1]='\0';
#ifdef DEBUG_ON
Serial.println(F("\nDone.."));
#endif
return i;
}
int SIMCOM900::readCellData(int &mcc, int &mnc, long &lac, long &cellid)
{
if (getStatus()==IDLE)
return 0;
//_tf.setTimeout(_GSM_DATA_TOUT_);

48
//_cell.flush();
SimpleWriteln(F("AT+QENG=1,0"));
SimpleWriteln(F("AT+QENG?"));
if(gsm.WaitResp(5000, 50, "+QENG")!=RX_FINISHED_STR_NOT_RECV)
return 0;
//mcc=_tf.getValue(); // The first one is 0
mcc=_cell.read();
//mcc=_tf.getValue();
mcc=_cell.read();
//mnc=_tf.getValue();
mnc=_cell.read();
//lac=_tf.getValue();
lac=_cell.read();
//cellid=_tf.getValue();
cellid=_cell.read();
gsm.WaitResp(5000, 50, "+OK");
SimpleWriteln(F("AT+QENG=1,0"));
gsm.WaitResp(5000, 50, "+OK");
return 1;
}
boolean SIMCOM900::readSMS(char* msg, int msglength, char* number, int nlength)
{
Serial.println(F("This method is deprecated! Please use GetSMS in the SMS class."));
long index;
char *p_char;
char *p_char1;
/*
if (getStatus()==IDLE)
return false;
*/
#ifdef UNO
_tf.setTimeout(_GSM_DATA_TOUT_);
#endif
//_cell.flush();
WaitResp(500, 500);
SimpleWriteln(F("AT+CMGL=\"REC UNREAD\",1"));
WaitResp(5000, 500);
if(gsm.IsStringReceived("+CMGL")) {
//index
p_char = strchr((char *)(gsm.comm_buf),'+CMGL');
p_char1 = p_char+3; //we are on the first char of string
p_char = p_char1+1;
*p_char = 0;
index=atoi(p_char1);

49
p_char1 = p_char+1;
p_char = strstr((char *)(p_char1), "\",\"");
p_char1 = p_char+3;
p_char = strstr((char *)(p_char1), "\",\"");
if (p_char != NULL) {
*p_char = 0;
}
strcpy(number, (char *)(p_char1));
//////
p_char1 = p_char+3;
p_char = strstr((char *)(p_char1), "\",\"");
p_char1 = p_char+3;
p_char = strstr((char *)(p_char1), "\n");
p_char1 = p_char+1;
p_char = strstr((char *)(p_char1), "\n");
if (p_char != NULL) {
*p_char = 0;
}
strcpy(msg, (char *)(p_char1));
// #ifdef UNO
// index=_tf.getValue();
// #endif
// #ifdef MEGA
//index=_cell.read();
// #endif
// Serial.println("DEBUG");
// #ifdef UNO
// _tf.getString("\",\"", "\"", number, nlength);
// #endif
// Serial.println("PRIMA");
// #ifdef MEGA
// _cell.getString("\",\"", "\"", number, nlength);
// #endif
// Serial.println("DEBUG");
// #ifdef UNO
// _tf.getString("\n", "\nOK", msg, msglength);
// #endif
// #ifdef MEGA
// _cell.getString("\n", "\nOK", msg, msglength);
// #endif
SimpleWrite(F("AT+CMGD="));
SimpleWriteln(index);
// Serial.print("VAL= ");
// Serial.println(index);
gsm.WaitResp(5000, 50, str_ok);
return true;
};

50
return false;
};
boolean SIMCOM900::readCall(char* number, int nlength)
{
int index;
if (getStatus()==IDLE)
return false;
//_tf.setTimeout(_GSM_DATA_TOUT_);
if(gsm.WaitResp(5000, 50, "+CLIP: \"")!=RX_FINISHED_STR_RECV)
//if(_tf.find("+CLIP: \""))
{
#ifdef UNO
_tf.getString("", "\"", number, nlength);
#endif
#ifdef MEGA
_cell.getString("", "\"", number, nlength);
#endif
SimpleWriteln(F("ATH"));
delay(1000);
//_cell.flush();
return true;
};
return false;
};
boolean SIMCOM900::call(char* number, unsigned int milliseconds)
{
if (getStatus()==IDLE)
return false;
//_tf.setTimeout(_GSM_DATA_TOUT_);
SimpleWrite(F("ATD"));
SimpleWrite(number);
SimpleWriteln(F(";"));
delay(milliseconds);
SimpleWriteln(F("ATH"));
return true;
}
int SIMCOM900::setPIN(char *pin)
{
//Status = READY or ATTACHED.
if((getStatus() != IDLE))
return 2;

51
//_tf.setTimeout(_GSM_DATA_TOUT_); //Timeout for expecting modem responses.
//_cell.flush();
//AT command to set PIN.
SimpleWrite(F("AT+CPIN="));
SimpleWriteln(pin);
//Expect str_ok.
if(gsm.WaitResp(5000, 50, str_ok)!=RX_FINISHED_STR_NOT_RECV)
return 0;
else
return 1;
}
int SIMCOM900::changeNSIPmode(char mode)
{
//_tf.setTimeout(_TCP_CONNECTION_TOUT_);
//if (getStatus()!=ATTACHED)
// return 0;
//_cell.flush();
SimpleWrite(F("AT+QIDNSIP="));
SimpleWriteln(mode);
if(gsm.WaitResp(5000, 50, str_ok)!=RX_FINISHED_STR_NOT_RECV) return 0;
//if(!_tf.find(str_ok)) return 0;
return 1;
}
int SIMCOM900::getCCI(char *cci)
{
//Status must be READY
if((getStatus() != READY))
return 2;
//_tf.setTimeout(_GSM_DATA_TOUT_); //Timeout for expecting modem responses.
//_cell.flush();
//AT command to get CCID.
SimpleWriteln(F("AT+QCCID"));
//Read response from modem
#ifdef UNO
_tf.getString("AT+QCCID\r\r\r\n","\r\n",cci, 21);
#endif
#ifdef MEGA

52
_cell.getString("AT+QCCID\r\r\r\n","\r\n",cci, 21);
#endif
//Expect str_ok.
if(gsm.WaitResp(5000, 50, str_ok)!=RX_FINISHED_STR_NOT_RECV)
return 0;
else
return 1;
}
int SIMCOM900::getIMEI(char *imei)
{
//_tf.setTimeout(_GSM_DATA_TOUT_); //Timeout for expecting modem responses.
//_cell.flush();
//AT command to get IMEI.
SimpleWriteln(F("AT+GSN"));
//Read response from modem
#ifdef UNO
_tf.getString("\r\n","\r\n",imei, 16);
#endif
#ifdef MEGA
_cell.getString("\r\n","\r\n",imei, 16);
#endif
//Expect str_ok.
if(gsm.WaitResp(5000, 50, str_ok)!=RX_FINISHED_STR_NOT_RECV)
return 0;
else
return 1;
}
int SIMCOM900::available()
{
return _cell.available();
}
uint8_t SIMCOM900::read()
{
return _cell.read();
}
void SIMCOM900::SimpleRead()
{
char datain;
if(_cell.available()>0) {
datain=_cell.read();
if(datain>0) {

53
Serial.print(datain);
}
}
}
void SIMCOM900::SimpleWrite(char *comm)
{
_cell.print(comm);
}
void SIMCOM900::SimpleWrite(const char *comm)
{
_cell.print(comm);
}
void SIMCOM900::SimpleWrite(int comm)
{
_cell.print(comm);
}
void SIMCOM900::SimpleWrite(const __FlashStringHelper *pgmstr)
{
_cell.print(pgmstr);
}
void SIMCOM900::SimpleWriteln(char *comm)
{
_cell.println(comm);
}
void SIMCOM900::SimpleWriteln(const __FlashStringHelper *pgmstr)
{
_cell.println(pgmstr);
}
void SIMCOM900::SimpleWriteln(char const *comm)
{
_cell.println(comm);
}
void SIMCOM900::SimpleWriteln(int comm)
{
_cell.println(comm);
}
void SIMCOM900::WhileSimpleRead()
{
char datain;
while(_cell.available()>0) {
datain=_cell.read();
if(datain>0) {

54
Serial.print(datain);
}
}
}
//--------------------------------------------/**********************************************************
Turns on/off the speaker
off_on: 0 - off
1 - on
**********************************************************/
void GSM::SetSpeaker(byte off_on)
{
if (CLS_FREE != GetCommLineStatus()) return;
SetCommLineStatus(CLS_ATCMD);
if (off_on) {
//SendATCmdWaitResp("AT#GPIO=5,1,2", 500, 50, "#GPIO:", 1);
} else {
//SendATCmdWaitResp("AT#GPIO=5,0,2", 500, 50, "#GPIO:", 1);
}
SetCommLineStatus(CLS_FREE);
}

byte GSM::IsRegistered(void)
{
return (module_status & STATUS_REGISTERED);
}
byte GSM::IsInitialized(void)
{
return (module_status & STATUS_INITIALIZED);
}

/**********************************************************
Method checks if the GSM module is registered in the GSM net
- this method communicates directly with the GSM module
in contrast to the method IsRegistered() which reads the
flag from the module_status (this flag is set inside this method)
- must be called regularly - from 1sec. to cca. 10 sec.
return values:
REG_NOT_REGISTERED - not registered
REG_REGISTERED
- GSM module is registered
REG_NO_RESPONSE - GSM doesn't response
REG_COMM_LINE_BUSY - comm line between GSM module and Arduino is not free
for communication
**********************************************************/

55
byte GSM::CheckRegistration(void)
{
byte status;
byte ret_val = REG_NOT_REGISTERED;
if (CLS_FREE != GetCommLineStatus()) return (REG_COMM_LINE_BUSY);
SetCommLineStatus(CLS_ATCMD);
_cell.println(F("AT+CREG?"));
// 5 sec. for initial comm tmout
// 50 msec. for inter character timeout
status = WaitResp(5000, 50);
if (status == RX_FINISHED) {
// something was received but what was received?
// --------------------------------------------if(IsStringReceived("+CREG: 0,1")
|| IsStringReceived("+CREG: 0,5")) {
// it means module is registered
// ---------------------------module_status |= STATUS_REGISTERED;

// in case GSM module is registered first time after reset


// sets flag STATUS_INITIALIZED
// it is used for sending some init commands which
// must be sent only after registration
// -------------------------------------------if (!IsInitialized()) {
module_status |= STATUS_INITIALIZED;
SetCommLineStatus(CLS_FREE);
InitParam(PARAM_SET_1);
}
ret_val = REG_REGISTERED;
} else {
// NOT registered
// -------------module_status &= ~STATUS_REGISTERED;
ret_val = REG_NOT_REGISTERED;
}
} else {
// nothing was received
// -------------------ret_val = REG_NO_RESPONSE;
}
SetCommLineStatus(CLS_FREE);

return (ret_val);
}

56
/**********************************************************
Method sets speaker volume
speaker_volume: volume in range 0..14
return:
ERROR ret. val:
---------------1 - comm. line to the GSM module is not free
-2 - GSM module did not answer in timeout
-3 - GSM module has answered "ERROR" string
OK ret val:
----------0..14 current speaker volume
**********************************************************/
/*
char GSM::SetSpeakerVolume(byte speaker_volume)
{
char ret_val = -1;
if (CLS_FREE != GetCommLineStatus()) return (ret_val);
SetCommLineStatus(CLS_ATCMD);
// remember set value as last value
if (speaker_volume > 14) speaker_volume = 14;
// select speaker volume (0 to 14)
// AT+CLVL=X<CR> X<0..14>
_cell.print("AT+CLVL=");
_cell.print((int)speaker_volume);
_cell.print("\r"); // send <CR>
// 10 sec. for initial comm tmout
// 50 msec. for inter character timeout
if (RX_TMOUT_ERR == WaitResp(10000, 50)) {
ret_val = -2; // ERROR
}
else {
if(IsStringReceived(str_ok)) {
last_speaker_volume = speaker_volume;
ret_val = last_speaker_volume; // OK
}
else ret_val = -3; // ERROR
}
SetCommLineStatus(CLS_FREE);
return (ret_val);
}
*/
/**********************************************************
Method increases speaker volume

57
return:
ERROR ret. val:
---------------1 - comm. line to the GSM module is not free
-2 - GSM module did not answer in timeout
-3 - GSM module has answered "ERROR" string
OK ret val:
----------0..14 current speaker volume
**********************************************************/
/*
char GSM::IncSpeakerVolume(void)
{
char ret_val;
byte current_speaker_value;
current_speaker_value = last_speaker_volume;
if (current_speaker_value < 14) {
current_speaker_value++;
ret_val = SetSpeakerVolume(current_speaker_value);
}
else ret_val = 14;
return (ret_val);
}
*/
/**********************************************************
Method decreases speaker volume
return:
ERROR ret. val:
---------------1 - comm. line to the GSM module is not free
-2 - GSM module did not answer in timeout
-3 - GSM module has answered "ERROR" string
OK ret val:
----------0..14 current speaker volume
**********************************************************/
/*
char GSM::DecSpeakerVolume(void)
{
char ret_val;
byte current_speaker_value;
current_speaker_value = last_speaker_volume;
if (current_speaker_value > 0) {
current_speaker_value--;
ret_val = SetSpeakerVolume(current_speaker_value);

58
}
else ret_val = 0;
return (ret_val);
}
*/
/**********************************************************
Method sends DTMF signal
This function only works when call is in progress
dtmf_tone: tone to send 0..15
return:
ERROR ret. val:
---------------1 - comm. line to the GSM module is not free
-2 - GSM module didn't answer in timeout
-3 - GSM module has answered "ERROR" string
OK ret val:
----------0.. tone
**********************************************************/
/*
char GSM::SendDTMFSignal(byte dtmf_tone)
{
char ret_val = -1;
if (CLS_FREE != GetCommLineStatus()) return (ret_val);
SetCommLineStatus(CLS_ATCMD);
// e.g. AT+VTS=5<CR>
_cell.print("AT+VTS=");
_cell.print((int)dtmf_tone);
_cell.print("\r");
// 1 sec. for initial comm tmout
// 50 msec. for inter character timeout
if (RX_TMOUT_ERR == WaitResp(1000, 50)) {
ret_val = -2; // ERROR
}
else {
if(IsStringReceived(str_ok)) {
ret_val = dtmf_tone; // OK
}
else ret_val = -3; // ERROR
}
SetCommLineStatus(CLS_FREE);
return (ret_val);
}
*/

59

/**********************************************************
Method returns state of user button

return: 0 - not pushed = released


1 - pushed
**********************************************************/
byte GSM::IsUserButtonPushed(void)
{
byte ret_val = 0;
if (CLS_FREE != GetCommLineStatus()) return(0);
SetCommLineStatus(CLS_ATCMD);
//if (AT_RESP_OK == SendATCmdWaitResp("AT#GPIO=9,2", 500, 50, "#GPIO: 0,0", 1)) {
// user button is pushed
// ret_val = 1;
//}
//else ret_val = 0;
//SetCommLineStatus(CLS_FREE);
//return (ret_val);
}

/**********************************************************
Method reads phone number string from specified SIM position
position:

SMS position <1..20>

return:
ERROR ret. val:
---------------1 - comm. line to the GSM module is not free
-2 - GSM module didn't answer in timeout
-3 - position must be > 0
phone_number is empty string
OK ret val:
----------0 - there is no phone number on the position
1 - phone number was found
phone_number is filled by the phone number string finished by 0x00
so it is necessary to define string with at least
15 bytes(including also 0x00 termination character)
an example of usage:
GSM gsm;
char phone_num[20]; // array for the phone number string
if (1 == gsm.GetPhoneNumber(1, phone_num)) {
// valid phone number on SIM pos. #1

60
// phone number string is copied to the phone_num array
#ifdef DEBUG_PRINT
gsm.DebugPrint("DEBUG phone number: ", 0);
gsm.DebugPrint(phone_num, 1);
#endif
}
else {
// there is not valid phone number on the SIM pos.#1
#ifdef DEBUG_PRINT
gsm.DebugPrint("DEBUG there is no phone number", 1);
#endif
}
**********************************************************/

char GSM::GetPhoneNumber(byte position, char *phone_number)


{
char ret_val = -1;
char *p_char;
char *p_char1;
if (position == 0) return (-3);
if (CLS_FREE != GetCommLineStatus()) return (ret_val);
SetCommLineStatus(CLS_ATCMD);
ret_val = 0; // not found yet
phone_number[0] = 0; // phone number not found yet => empty string
//send "AT+CPBR=XY" - where XY = position
_cell.print(F("AT+CPBR="));
_cell.print((int)position);
_cell.print("\r");
// 5000 msec. for initial comm tmout
// 50 msec. for inter character timeout
switch (WaitResp(5000, 50, "+CPBR")) {
case RX_TMOUT_ERR:
// response was not received in specific time
ret_val = -2;
break;
case RX_FINISHED_STR_RECV:
// response in case valid phone number stored:
// <CR><LF>+CPBR: <index>,<number>,<type>,<text><CR><LF>
// <CR><LF>OK<CR><LF>
// response in case there is not phone number:
// <CR><LF>OK<CR><LF>
p_char = strstr((char *)(comm_buf),",\"");
if (p_char != NULL) {
p_char++;

61
p_char++;
// we are on the first phone number character
// find out '"' as finish character of phone number string
p_char1 = strchr((char *)(p_char),'"');
if (p_char1 != NULL) {
*p_char1 = 0; // end of string
}
// extract phone number string
strcpy(phone_number, (char *)(p_char));
// output value = we have found out phone number string
ret_val = 1;
}
break;
case RX_FINISHED_STR_NOT_RECV:
// only OK or ERROR => no phone number
ret_val = 0;
break;
}
SetCommLineStatus(CLS_FREE);
return (ret_val);
}
/**********************************************************
Method writes phone number string to the specified SIM position
position: SMS position <1..20>
phone_number: phone number string for the writing
return:
ERROR ret. val:
---------------1 - comm. line to the GSM module is not free
-2 - GSM module didn't answer in timeout
-3 - position must be > 0
OK ret val:
----------0 - phone number was not written
1 - phone number was written
**********************************************************/
char GSM::WritePhoneNumber(byte position, char *phone_number)
{
char ret_val = -1;
if (position == 0) return (-3);
if (CLS_FREE != GetCommLineStatus()) return (ret_val);
SetCommLineStatus(CLS_ATCMD);
ret_val = 0; // phone number was not written yet
//send: AT+CPBW=XY,"00420123456789"

62
// where XY = position,
//
"00420123456789" = phone number string
_cell.print(F("AT+CPBW="));
_cell.print((int)position);
_cell.print(F(",\""));
_cell.print(phone_number);
_cell.print(F("\"\r"));
// 5000 msec. for initial comm tmout
// 50 msec. for inter character timeout
switch (WaitResp(5000, 50, str_ok)) {
case RX_TMOUT_ERR:
// response was not received in specific time
break;
case RX_FINISHED_STR_RECV:
// response is OK = has been written
ret_val = 1;
break;
case RX_FINISHED_STR_NOT_RECV:
// other response: e.g. ERROR
break;
}
SetCommLineStatus(CLS_FREE);
return (ret_val);
}

/**********************************************************
Method del phone number from the specified SIM position
position:

SMS position <1..20>

return:
ERROR ret. val:
---------------1 - comm. line to the GSM module is not free
-2 - GSM module didn't answer in timeout
-3 - position must be > 0
OK ret val:
----------0 - phone number was not deleted
1 - phone number was deleted
**********************************************************/
char GSM::DelPhoneNumber(byte position)
{
char ret_val = -1;

63
if (position == 0) return (-3);
if (CLS_FREE != GetCommLineStatus()) return (ret_val);
SetCommLineStatus(CLS_ATCMD);
ret_val = 0; // phone number was not written yet
//send: AT+CPBW=XY
// where XY = position
_cell.print(F("AT+CPBW="));
_cell.print((int)position);
_cell.print(F("\r"));
// 5000 msec. for initial comm tmout
// 50 msec. for inter character timeout
switch (WaitResp(5000, 50, str_ok)) {
case RX_TMOUT_ERR:
// response was not received in specific time
break;
case RX_FINISHED_STR_RECV:
// response is OK = has been written
ret_val = 1;
break;
case RX_FINISHED_STR_NOT_RECV:
// other response: e.g. ERROR
break;
}
SetCommLineStatus(CLS_FREE);
return (ret_val);
}

/**********************************************************
Function compares specified phone number string
with phone number stored at the specified SIM position
position:
SMS position <1..20>
phone_number: phone number string which should be compare
return:
ERROR ret. val:
---------------1 - comm. line to the GSM module is not free
-2 - GSM module didn't answer in timeout
-3 - position must be > 0
OK ret val:

64
----------0 - phone numbers are different
1 - phone numbers are the same

an example of usage:
if (1 == gsm.ComparePhoneNumber(1, "123456789")) {
// the phone num. "123456789" is stored on the SIM pos. #1
// phone number string is copied to the phone_num array
#ifdef DEBUG_PRINT
gsm.DebugPrint("DEBUG phone numbers are the same", 1);
#endif
}
else {
#ifdef DEBUG_PRINT
gsm.DebugPrint("DEBUG phone numbers are different", 1);
#endif
}
**********************************************************/
char GSM::ComparePhoneNumber(byte position, char *phone_number)
{
char ret_val = -1;
char sim_phone_number[20];

ret_val = 0; // numbers are not the same so far


if (position == 0) return (-3);
if (1 == GetPhoneNumber(position, sim_phone_number)) {
//Serial.print("CHIAMANTE ");
//Serial.println(phone_number);
//Serial.print("SALVATO ");
//Serial.println(sim_phone_number);
// there is a valid number at the spec. SIM position
// ------------------------------------------------if (0 == strcmp(phone_number, sim_phone_number)) {
// phone numbers are the same
// -------------------------ret_val = 1;
}
}
return (ret_val);
}
//-----------------------------------------------------

==============================BIBLIOTECA SERIAL
GSM=======================================================================
==

65
// SerialGSM version 1.1
// by Meir Michanie
// meirm@riunx.com

// error codes
// http://www.developershome.com/sms/resultCodes2.asp
#include <SerialGSM.h>
SerialGSM::SerialGSM(int rxpin,int txpin):
SoftwareSerial(rxpin,txpin)
{
verbose=false;
}
void SerialGSM::FwdSMS2Serial(){
Serial.println("AT+CMGF=1"); // set SMS mode to text
this->println("AT+CMGF=1"); // set SMS mode to text
delay(200);
this->ReadLine();
Serial.println("AT+CNMI=3,3,0,0"); // set module to send SMS data to serial out upon receipt
this->println("AT+CNMI=3,3,0,0"); // set module to send SMS data to serial out upon receipt
delay(200);
this->ReadLine();
}
void SerialGSM::SendSMS(char * cellnumber,char * outmsg){
this->Rcpt(cellnumber);
if (verbose) Serial.println(rcpt);
this->StartSMS();
this->Message(outmsg);
Serial.print(outmessage);
this->print(outmessage);
this->EndSMS();
delay(500);
this->ReadLine();
}
void SerialGSM::SendSMS(){
if (verbose) Serial.println(rcpt);
if (verbose) Serial.println(outmessage);
this->StartSMS();
Serial.print(outmessage);
this->print(outmessage);
this->EndSMS();
delay(500);
this->ReadLine();
}

66

void SerialGSM::DeleteAllSMS(){
Serial.println("AT+CMGD=1,4"); // delete all SMS
this->println("AT+CMGD=1,4"); // delete all SMS
delay(200);
this->ReadLine();
}
void SerialGSM::Reset(){
Serial.println("AT+CFUN=1,1"); // Reset Modem
this->println("AT+CFUN=1,1"); // Reset Modem
delay(200);
this->ReadLine();
}

void SerialGSM::EndSMS(){
this->print(char(26)); // ASCII equivalent of Ctrl-Z
Serial.println();
//delay(5 * 1000); // the SMS module needs time to return to OK status
}
void SerialGSM::StartSMS(){
Serial.println("AT+CMGF=1"); // set SMS mode to text
this->println("AT+CMGF=1"); // set SMS mode to text
delay(200);
this->ReadLine();
Serial.print("AT+CMGS=");
this->print("AT+CMGS=");
this->print(char(34)); // ASCII equivalent of "
Serial.print(rcpt);
this->print(rcpt);
this->println(char(34)); // ASCII equivalent of "
delay(500); // give the module some thinking time
this->ReadLine();
}
int SerialGSM::ReadLine(){
static int pos=0;
char nc;
while (this->available()){
nc=this->read();
if (nc == '\n' or (pos > MAXMSGLEN) or ((millis()> lastrec + SERIALTIMEOUT)and (pos > 0)) ){

67
nc='\0';
lastrec=millis();
inmessage[pos]=nc;
pos=0;
if (verbose) Serial.println(inmessage);
return 1;
}
else if (nc=='\r') {
}
else{
inmessage[pos++]=nc;
lastrec=millis();
}
}
return 0;
}

int SerialGSM::ReceiveSMS(){
static boolean insms=0;
if (this->ReadLine()){
// Get the number of the sms sender in order to be able to reply
if ( strstr(inmessage, "CMT: ") != NULL ){
insms=1;
int sf=6;
if(strstr(inmessage, "+CMT:")) sf++;
for (int i=0;i < PHONESIZE-1;i++){
sendernumber[i]=inmessage[sf+i];
}
sendernumber[PHONESIZE]='\0';
return 0;
}else{
if(insms) {
insms=0;
return 1;
}
}
}
return 0;
}

boolean SerialGSM::Verbose(){
return verbose;
}
void SerialGSM::Verbose(boolean var1){
verbose=var1;
}
char * SerialGSM::Sender(){

68
return sendernumber;
}

char * SerialGSM::Rcpt(){
return rcpt;
}
char * SerialGSM::Message(){
return inmessage;
}

void SerialGSM::Sender(char * var1){


sprintf(sendernumber,"%s",var1);
}

void SerialGSM::Rcpt(char * var1){


sprintf(rcpt,"%s",var1);
}
void SerialGSM::Message(char * var1){
sprintf(outmessage,"%s",var1);
}
void SerialGSM::Boot(){
int counter=0;
while(counter++ < 15){
if (verbose) Serial.print(".");
delay(1000);
}
if (verbose) Serial.println();
}

============================================LOGICA
UTILIZADA================================================================
#include "SIM900.h"
#include <SoftwareSerial.h>
#include "sms.h"
SMSGSM sms;

69
char number[]="998919094";
char message[180];
char pos;
char *p;
void setup()
{
Serial.begin(9600);
if (gsm.begin(2400))
Serial.println("\nstatus=READY");
else Serial.println("\nstatus=IDLE");
};
void loop()
{
pos=sms.IsSMSPresent(SMS_UNREAD);
Serial.println((int)pos);
if((int)pos>0&&(int)pos<=20){
Serial.print("NOVA MENSSAGEM, POS=");
Serial.println((int)pos);
message[0]='\0';
sms.GetSMS((int)pos,number,message,180);
p=strstr(message,"testpwd");
if(p){
Serial.println("PSWD OK");
p=strstr(message,"ABRIR");
if(p){
Serial.println("LED ON");

70

digitalWrite(13,HIGH);
delay(900);
digitalWrite(13,LOW);
}
else{
p=strstr(message,"FECHAR");
if(p){
Serial.println("LED OFF");
digitalWrite(12, HIGH);
delay(900);
digitalWrite(12, LOW);

}
}
}
sms.DeleteSMS((int)pos);
}
delay(5000);
};

71

ANEXO A ESQUEMTICO: ARDUINO UNO

Вам также может понравиться