lanzar llamada en SIM900 con pulsador
Publicado por 21 (1 intervención) el 23/08/2019 17:44:25
Hola. Estoy tratandode hacer que el módulo SIM900 de mi arduino me llame y me envie un sms cuando pulso un interruptor, pero me he perdido en algun lugar y no consigo salir adelante. pueden ayudarme por favor??
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
#include <SoftwareSerial.h>
SoftwareSerial SIM900(7, 8); // Configura el puerto serial para el SIM900.
int pulsador = 12;
int val=0;
int respuesta;
char aux_str[50];
//Contenido del sms que enviamos. \x1A corresponde al caracter de finalizacion
char sms[] = "Mensaje enviado desde el Arduino de Ferreiro do Matodoso \x1A \r\n";
void setup()
{
pinMode(pulsador, INPUT_PULLUP); //entrada con pull-up --> conectar pulsador N/A a GND en este pin.
SIM900.begin(19200); //Configura velocidad del puerto serie para el SIM900
Serial.begin(19200); //Configura velocidad del puerto serie del Arduino
delay(1000);
Serial.println("Iniciando...");
power_on();
iniciar();
}
void loop()
{
if (Serial.available())
switch (Serial.read())
{
val = digitalRead(pulsador); //leer continuamente el pulsador. Siempre esta an HIGH (por la pull-up) y pasa a LOW al presionarlo.
if (val==LOW) {
Serial.println("Encendido");
llamar(); //al presionar el boton, llamar a un numero.
delay(30000);
mensaje_sms();}
else {
Serial.println("Apagado");
}
}
if (SIM900.available()) {
Serial.write(SIM900.read());
}
}
int enviarAT(char* ATcommand, char* resp_correcta, unsigned int tiempo)
{
int x = 0;
bool correcto = 0;
char respuesta[100];
unsigned long anterior;
memset(respuesta, '\0', 100); // Inicializa el string
delay(100);
while ( SIM900.available() > 0) SIM900.read(); // Limpia el buffer de entrada
SIM900.println(ATcommand); // Envia el comando AT
x = 0;
anterior = millis();
// Espera una respuesta
do {
// si hay datos el buffer de entrada del UART lee y comprueba la respuesta
if (SIM900.available() != 0)
{
//Comprueba que no haya desbordamiento en la capacidad del buffer
if (x < 99) {
respuesta[x] = SIM900.read();
x++;
}
else Serial.println("Desbordamiento!");
// Comprueba si la respuesta del modulo es la 1
if (strstr(respuesta, resp_correcta) != NULL)
{
correcto = 1;
}
}
}
// Espera hasta tener una respuesta
while ((correcto == 0) && ((millis() - anterior) < tiempo));
Serial.println(respuesta);
return correcto;
}
void power_on()
{
int respuesta = 0;
// Comprueba que el modulo SIM900 esta arrancado
if (enviarAT("AT", "OK", 2000) == 0) //comprueba la conexion a la red
{
Serial.println("Encendiendo el GPRS...");
pinMode(9, OUTPUT);
digitalWrite(9, HIGH);
delay(1000);
digitalWrite(9, LOW);
delay(1000);
// Espera la respuesta del modulo SIM900
while (respuesta == 0) {
// Envia un comando AT cada 2 segundos y espera la respuesta
respuesta = enviarAT("AT", "OK", 2000);
SIM900.println(respuesta);
}
}
}
void power_off()
{
digitalWrite(9, HIGH);
delay(1000);
digitalWrite(9, LOW);
delay(1000);
}
void reiniciar()
{
Serial.println("Reiniciando...");
power_off();
delay (5000);
power_on();
}
void iniciar()
{
enviarAT("AT+CPIN=\"9775\"", "OK", 1000);
Serial.println("Conectando a la red...");
delay (20000);
//espera hasta estar conectado a la red movil
while ( enviarAT("AT+CREG?", "+CREG: 1,5", 3000) == 0 )
{
}
Serial.println("Conectado a la red.");
enviarAT("AT+CLIP=1\r", "OK", 1000); // Activamos la identificacion de llamadas
enviarAT("AT+CMGF=1\r", "OK", 1000); //Configura el modo texto para enviar o recibir mensajes
enviarAT("AT+CNMI=2,2,0,0,0\r", "OK", 1000); //Configuramos el modulo para que nos muestre los SMS recibidos por comunicacion serie
Serial.println("Preparado.");
}
void mensaje_sms()
{
if (enviarAT("AT+CREG?", "+CREG: 1,5", 1000) == 1) //comprueba la conexion a la red
{
Serial.println("Enviando SMS...");
enviarAT("AT+CMGF=1\r", "OK", 1000); //Comando AT para mandar un SMS
sprintf(aux_str, "AT+CMGS=\"667294455\"", strlen(sms)); //Numero al que vamos a enviar el mensaje
//Texto del mensaje
if (enviarAT(aux_str, ">", 10000) == 1)
{
enviarAT(sms, "OK", 10000);
}
Serial.println("SMS enviado");
}
else
{
reiniciar();
iniciar();
}
}
void llamar()
{
if (enviarAT("AT+CREG?", "+CREG: 1,5", 1000) == 1) //Comprueba la conexion a la red
{
Serial.println("Realizando llamada...");
enviarAT("ATD667294455;", "OK", 1000);
delay(20000); // Espera 20 segundos mientras realiza la llamada
enviarAT("ATH", "OK", 1000); // Cuelga la llamada
Serial.println("Llamada finalizada");
}
else
{
reiniciar();
iniciar();
}
}
Valora esta pregunta


0