
Antes que pudéssemos derrotar
o barramento CAN , tivemos que derrotar a próxima peça de hardware, a saber, o módulo GPRS. Esta é a sua vida como desenvolvedora - o tempo todo ela tem que ganhar alguém (deve haver um sorriso proibido).
Para um dos projetos personalizados, eu precisava adicionar a capacidade de controlar e receber telemetria via GSM usando SMS. Olhei para a lista de opções disponíveis e decidi pelo GPRS Shield de Amperka. Porque não Parece decente, é produzido por uma empresa conhecida, tem suporte técnico, o preço não é muito diferente dos concorrentes e geralmente causa uma impressão muito boa.
Mas lá estava. Você pode aprender sobre essa missão e os incríveis cursos de educação continuada pelos quais tive que passar, integrando este módulo GPRS ao
Arduino Mega Server , clicando no botão abaixo.
Módulo propriamente dito
Como eu disse,
o próprio módulo causa uma impressão muito boa com sua precisão de execução e relacionamento com uma empresa conhecida. Novamente, o site do fabricante tem exemplos de uso e uma biblioteca nativa. Como o módulo é de marca, há esperança de suporte adequado em caso de problemas com ele.
Olhando para o futuro, direi que o suporte técnico respondeu minhas perguntas corretamente por duas semanas, procurou por bugs na minha biblioteca e até lançou uma nova versão com base no motivo da comunicação comigo. Mas ... eu ainda tinha que fazer o módulo funcionar sozinho.
Projeto
Algumas palavras sobre o
projeto GSM Coop, que exigia um módulo GPRS. Era necessário desenvolver automação para gerenciar o galinheiro. De fato, em um momento incrível em que vivemos, agora o galinheiro precisa ser controlado por meio de um navegador da web, sensores inteligentes sem fio e telemetria GSM. É um objeto estratégico de algum tipo, não um galinheiro.
Mas se for necessário, então é necessário. Compramos componentes, entre os quais o módulo GPRS, e prosseguimos.
Calcanhar de Aquiles
Agora, sobre os recursos do módulo. Basicamente, funciona. Ele trabalha com exemplos apresentados no site do fabricante e, com base nisso, você pode criar um esboço simples. Mas existem três "mas".
Nota Duas placas-mãe foram usadas no projeto: Arduino Mega 2560 e Arduino Due, e o seguinte se aplica especificamente a elas e somente a elas.O primeiro "mas", hardware. O módulo não funciona com o Arduino Due. De jeito nenhum. Mesmo a correspondência de vários dias com o suporte técnico da Amperka não ajudou. Nem eu nem os especialistas da empresa conseguimos que o GPRS Shield funcionasse com o Arduino Due. E isso é muito decepcionante, porque Due é um excelente controlador com grandes recursos e gostaria de poder usá-lo com o GPRS Shield.
O segundo "mas" é sistêmico. O módulo requer que a biblioteca SoftwareSerial funcione. Quando iniciei minha conversa com o GPRS Shield e o suporte técnico da Amperka, essa era uma solução não alternativa. Após nossos procedimentos, uma versão revisada da biblioteca com suporte para trabalhar no Serial de ferro foi lançada, mas ... nunca ganhou Due ou Mega. O que geralmente é difícil de explicar - se um módulo funciona no SoftSerial, o que o impede de trabalhar no ferro Serial?
O terceiro "mas", conceitual. Isso não é tudo. A principal emboscada está no princípio da biblioteca de módulos. Ele funciona no modo fechado, ou seja, bloqueia a operação do controlador enquanto aguarda a chegada do SMS (que é 99% do tempo) e durante todas as outras operações do módulo. O que isso significa? Isso significa que na biblioteca padrão do fabricante, você não pode criar nada além de um esboço de teste. O galinheiro estratégico não brilha para você, pois milhares de aplicativos interessantes, como sistemas de segurança, gerenciamento de efeito estufa, controle doméstico inteligente via GSM, etc., etc. não brilham.
Mais sobre SoftwareSerial
O módulo não funciona no Arduino Due, portanto, falaremos sobre o Arduino Mega. O ponto alto da situação é que, tendo o Mega, possui três portas de hardware livres Serial1, Serial2 e Seria3, somos forçados a conectar e usar a biblioteca SoftwareSerial. De nenhuma maneira imaginável e inconcebível, incluindo rearranjo de jumpers no módulo e interrogatório com o suporte técnico da Amperka, não conseguiu que o GPRS Shield funcionasse com portas de hardware no Arduino Mega.
Ok ... Usamos SoftwareSerial, mas aqui estamos aguardando uma emboscada. O SoftwareSerial pode funcionar com muitos pinos Mega do Arduino, mas, por algum motivo, funciona apenas nos pinos 62 e 63. Por que apenas neles? Esse enigma é ótimo. Para todas as aparências, nunca saberemos a resposta para esta pergunta.
Farinha de escolha
E agora, como sempre, entendemos que a biblioteca padrão não é adequada para uso prático. Ao bloquear o controlador enquanto aguarda para receber uma resposta do módulo GPRS, a biblioteca também bloqueia todos os outros processos. O controlador simplesmente fica fora da realidade 99% do tempo, aguardando até que uma solicitação ou resposta chegue ou o tempo limite termine.
Isso põe fim a qualquer aplicação do GPRS Shield, exceto a do teste: enviou uma solicitação para ligar o soquete - ligou, enviou uma solicitação para desligar - desligou. Não se pode falar de nenhum trabalho do servidor da web, trabalhar com sensores, controle de atuadores e outras coisas; nada disso simplesmente funcionará.
A questão surgiu: ou recusamos a biblioteca do fabricante e escrevemos nosso código de controle GPRS Shield (fácil de dizer), ou abandonamos o próprio módulo e procuramos uma solução alternativa. Mas como o módulo já está lá, foi decidido abandonar a biblioteca e escrever o código de controle do módulo.
A conquista do Everest
Eu pulo todo o processo de criação do código que substitui a biblioteca padrão da Amperka, apenas observo que foi muito, muito difícil e exigiu um trabalho de pesquisa considerável, compilação de um algoritmo sofisticado e esforços consideráveis para testar a solução resultante.
Tudo será simples para você - um pouco de mágica e o código de funcionamento do módulo AMS para suporte ao GPRS Shield está pronto.
Código do módulo AMS completo, substituindo a biblioteca padrão #ifdef GPRS_FEATURE #include <SoftwareSerial.h> #define ALWAYS 1 #define GPRS_ON_PIN 2 #define GPRS_STATE_PIN 3 #define GPRS_RX_PIN 62 #define GPRS_TX_PIN 63 #define MASTER "+7yyyxxxxxxx" #define MESSAGE "Hello" #define CHECK_ERROR 0 #define CHECK_MARKER 1 #define CHECK_OK 2 #define NO_CHECK 3 #define MARKER_OK "OK" #define MARKER_NO_CHECK "-"
O módulo foi desenvolvido e testado na versão 0.16 do AMS para o Arduino Mega. Os testes mostraram uma operação absolutamente estável e confiável do GPRS Shield sob o controle deste módulo.
Conecte ao módulo de suporte AMS GPRS Shield
Para conectar o módulo GPRS Shield ao Arduino Mega Server, você precisa executar algumas etapas simples. Primeiro, adicione as seguintes linhas ao arquivo principal do AMS
#define GPRS_FEATURE
e
byte modulGprs = MODUL_NOT_COMPILLED;
nas seções apropriadas. Lá você precisa adicionar variáveis de teste que, no seu projeto real, serão responsáveis pelos parâmetros controlados (temperatura, status do contato etc.).
float lpTempTemp; byte lpContCont1; byte lpLeakLeak1; byte smokeSmoke; byte relayRelay; byte servoState;
Explicação dos recursos suportados
O módulo contém um conjunto básico de consultas e comandos, mas você pode substituí-los por outros e / ou expandir o conjunto básico de comandos e consultas necessários.
Inquéritos
As solicitações são enviadas via SMS, o sistema envia respostas (também via SMS) contendo informações sobre o parâmetro solicitado. Muito simples: enviamos a solicitação "temp1" do telefone, o sistema em resposta envia o valor atual da temperatura
temp1=20.50
.
temp1 - solicitação de temperatura
cont1 - solicitar status de contato
leak1 - solicita o status do sensor de vazamento
smoke1 - consulta ao status do detector de fumaça
relay1 - solicita o status do relé (chave)
servo1 - solicita o status do servo alimentador
period - solicitação para o período de pacotes de telemetria automática
all - solicita todos os parâmetros do sistema
Em resposta à solicitação "all", o sistema envia uma lista de todos os parâmetros. No caso de enviar um comando não registrado, o sistema enviará uma resposta "Erro". Se os parâmetros monitorados estiverem fora da faixa normal, o próprio sistema poderá enviar mensagens de alarme para o smartphone do operador.
Para gerenciar o sistema que apenas um operador registrado poderia, o sistema possui proteção contra acesso não autorizado - ele responde apenas aos comandos de um número de telefone específico.
Equipas
Os comandos são enviados via SMS, tendo aceito o comando, o sistema altera seu estado e envia respostas com informações sobre o novo estado de seus atuadores ou configurações.
relay1 = - comando de controle do relé (chave)
servo1 = - comando de controle do alimentador
period = - comando para alterar o período de envio automático de telemetria
Um exemplo Comando
relay1=1
, resposta
relay1=ON
. Comando
relay1=0
, resposta
relay1=OFF
.
Explicações de código
Inicialização do módulo GPRS. Inicialização padrão do módulo AMS, o lançamento do SoftwareSerial e um pouco de magia dos comandos GSM AT. O objetivo deste bloco é trazer à vida o módulo GPRS e devolvê-lo do nirvana, se nesse momento o havia deixado por algum motivo fora do nosso controle.
void gprsInit() { initStart("GPRS", true); GPRS.begin(9600); gprsOnOff(); gprsStart(); sendGprs("AT+CFUN=1", "OK"); sendGprs("AT+CNMI=2,1", "OK"); sendGprs("AT+CMGF=1", "OK"); sendGprs("AT+CLIP=1", "OK"); modulGprs = MODUL_ENABLE; initDone(true); }
A principal função de trabalho do módulo. A cada 20 segundos, o Mega Server do Arduino verifica se há SMS recebidos e, no caso de quaisquer solicitações ou comandos, os executa. Como resultado, o atraso médio na execução do comando é de 10 segundos (excluindo o atraso no envio de mensagens SMS pelo operador de telecomunicações). Esse intervalo pode ser configurado, 20 segundos são selecionados como um compromisso entre a velocidade de reação aos comandos do SMS e a inicialização do sistema.
Nesses 20 segundos, o AMS pode fazer o que for necessário, e o SMS que chega nesse período de tempo não é perdido. Ao usar a biblioteca padrão, o sistema não pode fazer nada além de aguardar a chegada do SMS, caso contrário, apenas os perde (e o controlador também não pode fazer nada no momento).
Há também um código de envio de telemetria com um intervalo especificado de 1 hora, 6 horas, 12 horas ou 24 horas. Esse intervalo pode ser alterado enviando o comando apropriado via SMS.
void gprsWorks() { if (cycle20s) { readSms(); } switch (gprsPeriod) { case 1: if (cycle1h) {sendPeriod();} break; case 6: if (cycle6h) {sendPeriod();} break; case 12: if (cycle12h) {sendPeriod();} break; default: if (cycle24h) {sendPeriod();} break; } }
A interação do módulo GPRS e do controlador é realizada usando comandos AT especiais e as seguintes funções formam os comandos do módulo GPRS em códigos que são compreensíveis para ele.
Função de envio de SMS. Nos parâmetros da função, o número de telefone de destino e o comando ou solicitação são transmitidos em forma de texto.
bool sendSms(char *number, String data) { String numstr = "AT+CMGS=\"" + String(number) + "\""; String messtr = data + String((char)26); if (sendGprs(numstr, ">")) { if (sendGprs(messtr, MARKER_NO_CHECK)) { return true; } } return false; }
Função de leitura de SMS. Os valores aceitos são colocados nas variáveis mensagem, telefone e data e hora, que contêm, respectivamente, o comando recebido, número de telefone e horário de envio.
void readSms() { byte result = sendGprs("AT+CMGR=1,1", "+CMGR:"); if (result == CHECK_MARKER) { parseSms(message, phone, datetime); Serial.print(F("Number: ")); Serial.println(phone); Serial.print(F("Datetime: ")); Serial.println(datetime); Serial.print(F("Message: ")); Serial.println(message); deleteSms(); if (String(phone) == String(MASTER)) { Serial.println(F("Message from MASTER!")); gprsAnswer(); } } else if (result == CHECK_OK) { Serial.println(F("No SMS")); } else { Serial.println(F("Error read SMS")); } }
A função de formar uma resposta às solicitações e comandos do SMS. Essa função é específica para cada projeto e você pode alterá-la em seus projetos de acordo com a lógica do seu sistema.
void gprsAnswer() { String s = ""; String mess = String(message); String data = ""; if (mess == DATA_TEMP1) {s += mkTemp1();} else if (mess == DATA_CONT1) {s += mkCont1();} else if (mess == DATA_LEAK1) {s += mkLeak1();} else if (mess == DATA_SMOKE1) {s += mkSmoke1();} else if (mess == DATA_RELAY1) {s += mkRelay1();} else if (mess == DATA_SERVO1) {s += mkServo1();} else if (mess == DATA_PERIOD) {s += mkPeriod();} else if (mess == DATA_ALL) {s += mkAll();} else if (mess.indexOf(F("=")) >= 0) { byte p = mess.indexOf(F("=")); if (mess.indexOf(CMD_RELAY1) >= 0) {data = mess.substring(p + 1); gprsSetRelay(data.toInt()); s += DATA_RELAY1; s += '='; s += stringSens(relayRelay);} else if (mess.indexOf(CMD_SERVO1) >= 0) {data = mess.substring(p + 1); gprsSetServo(data.toInt()); s += DATA_SERVO1; s += '='; s += stringSens(servoState);} else if (mess.indexOf(CMD_PERIOD) >= 0) {data = mess.substring(p + 1); gprsPeriod = data.toInt(); s += DATA_PERIOD; s += '='; s += String(gprsPeriod);} } else { Serial.println(F("Not command!")); }
Funções de formação de respostas. São funções que formam as respostas que o sistema envia via SMS ao smartphone do usuário em resposta a uma solicitação ou a seu critério, de acordo com o programa estabelecido.
String stringSens(byte v) String stringLeak(byte v) String stringSmoke(byte v) String mkTemp1() String mkCont1() String mkLeak1() String mkSmoke1() String mkRelay1() String mkServo1() String mkPeriod() String mkAll()
E as funções de execução de comandos. Essas são funções executadas pelos comandos do SMS e alteram o estado do sistema, ou seja, alteram suas configurações ou ativam ou desativam os atuadores.
void gprsSetRelay(byte v) void gprsSetServo(byte v)
As demais funções são puramente técnicas, fazendo todo o trabalho difícil de atender à interação entre o GPRS Shield e o microcontrolador.
Um pouco mais sobre o SoftwareSerial
Todas as opções acima não são suficientes para o GPRS Shield funcionar em um modo transparente e parar de bloquear outros processos em execução no microcontrolador. Você também precisa modificar o código da biblioteca SoftwareSerial. O fato é que seu buffer padrão de 64 bytes não é suficiente para digerir a maioria dos comandos AT GSM e manter a interação dinâmica entre o módulo e o controlador.
Você precisa aumentar esse buffer para pelo menos 128 bytes e somente depois disso a mágica funcionará e o GPRS Shield começará a funcionar normalmente no modo transparente. Isso é feito no arquivo
SoftwareSerial.h
. Linha
#define _SS_MAX_RX_BUFF 64
precisa mudar para
#define _SS_MAX_RX_BUFF 128
Conclusão
Você vê a troca de comandos do operador e respostas do sistema na tela do smartphone. E enquanto o sistema executa dezenas de processos no modo pseudo-multitarefa. E o GPRS Shield começou a ocupar menos de 1% do tempo do processador, em vez de 99% como antes, liberando o restante do tempo para o servidor da web e outras tarefas para gerenciar o galinheiro.
Isso é tudo: integramos o GPRS Shield ao
AMS , superamos todos os obstáculos, fizemos funcionar de modo transparente, sem bloquear outros processos, como um servidor web, a operação de sensores e atuadores sem fio, e isso abre perspectivas atraentes para a construção de um grande número de sistemas com controle de SMS GSM e controle baseado no AMS - estufas, sistemas de segurança e aquecimento, várias opções para uma casa inteligente, etc., etc. quase ad infinitum.