Arduino - lanzar llamada en SIM900 con pulsador

 
Vista:

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
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder