Modificación Base de Datos:
Se realizaron modificaciones también a la Base de datos, se crearon dos tablas en una misma Base de Datos.
Bitácora: Proyecto Alarma con Arduino
martes, 10 de junio de 2014
Modificación Paginas PHP
Modificación Paginas PHP:
Para culminar el proyecto fue necesario realizar algunas modificaciones a la Base de Datos, con el fin de mejorar la inserción en la Información se realizó lo siguiente:
Se usarion dos Insert Into en vez de uno así: sensor.php
<?php
$pir = $_GET['pir'];
$tem = $_GET['tem'];
$dia = date('d');
$mes = date('m');
$anio = date('Y');
$hora = date('h');
$minuto = date('i');
$segundo = date('s');
$conexion = mysql_connect("10.245.74.55", "php", "123");
mysql_select_db("alarma",$conexion);
$sql1 = "INSERT INTO `datos_alar`(`id`, `dia`, `mes`, `anio`, `hora`, `minuto`, `segundo`, `pir`) VALUES
(NULL,'$dia','$mes','$anio','$hora','$minuto','$segundo','$pir')";
$res1 = mysql_query($sql1, $conexion) or die ("Error en la consulta");
$sql2 = "INSERT INTO `sensor_tem`(`id`, `dia`, `mes`, `anio`, `hora`, `minuto`, `segundo`, `tem`) VALUES
(NULL,'$dia','$mes','$anio','$hora','$minuto','$segundo','$tem')";
$res2 = mysql_query($sql2, $conexion) or die ("Error en la consulta");
?>
mostrar.php:
Se utilizaron en una misma pagina las dos conexiones a una misma base de datos, pero a tablas diferentes.
<?php
$conexion = mysql_connect("10.245.74.55", "php", "123");
mysql_select_db("alarma",$conexion);
$sql1 = "SELECT * FROM `datos_alar`";
$res1 = mysql_query($sql1, $conexion) or die ("Error en la consulta");
$sql2 = "SELECT * FROM `sensor_tem`";
$res2 = mysql_query($sql2, $conexion) or die ("Error en la consulta");
$total1 = mysql_num_rows($res1);
$total2 = mysql_num_rows($res2);
if ($total1 > 0)
{
echo "<table border = 1 align = left>"
."<tr>\n<td colspan=8 width=159 align=center>Datos Hora y Fecha para Alarma</td></tr>\n"
."<tr>\n"
."<th>id</th>\n"
."<th>Dia</th>\n"
."<th>Mes</th>\n"
."<th>Anio</th>\n"
."<th>Hora</th>\n"
."<th>Minuto</th>\n"
."<th>Segundo</th>\n"
."<th>pir</th>\n"
."</tr>\n"
."</div>";
while($reg = mysql_fetch_array($res1))
{
print "<td>".$reg['id']."</td>";
print "<td>".$reg['dia']."</td>";
print "<td>".$reg['mes']."</td>";
print "<td>".$reg['anio']."</td>";
print "<td>".$reg['hora']."</td>";
print "<td>".$reg['minuto']."</td>";
print "<td>".$reg['segundo']."</td>";
print "<td>".$reg['pir']."</td>";
print "</tr>";
}
}
if ($total2 > 0)
{
echo "<table border = 1 align = right>"
."<tr>\n<td colspan=8 width=159 align=center>Datos Hora Fecha y Temperatura para Sensor</td></tr>\n"
."<tr>\n"
."<th>id</th>\n"
."<th>Dia</th>\n"
."<th>Mes</th>\n"
."<th>Anio</th>\n"
."<th>Hora</th>\n"
."<th>Minuto</th>\n"
."<th>Segundo</th>\n"
."<th>tem</th>\n"
."</tr>\n"
."</div>";
while($reg = mysql_fetch_array($res2))
{
print "<td>".$reg['id']."</td>";
print "<td>".$reg['dia']."</td>";
print "<td>".$reg['mes']."</td>";
print "<td>".$reg['anio']."</td>";
print "<td>".$reg['hora']."</td>";
print "<td>".$reg['minuto']."</td>";
print "<td>".$reg['segundo']."</td>";
print "<td>".$reg['tem']."</td>";
print "</tr>";
}
}
?>
<html>
<head>
<title>mostrar.php</title>
<script language="JavaScript">
function mueveReloj(){
momentoActual = new Date()
hora = momentoActual.getHours()
minuto = momentoActual.getMinutes()
segundo = momentoActual.getSeconds()
str_segundo = new String (segundo)
if (str_segundo.length == 1)
segundo = "0" + segundo
str_minuto = new String (minuto)
if (str_minuto.length == 1)
minuto = "0" + minuto
str_hora = new String (hora)
if (str_hora.length == 1)
hora = "0" + hora
horaImprimible = hora + " : " + minuto + " : " + segundo
document.form_reloj.reloj.value = horaImprimible
setTimeout("mueveReloj()",1000)
}
</script>
</head>
<body onload="mueveReloj()">
<form name="form_reloj">
<input type="text" name="reloj" size="113" style="background-color : Black; color : White; font-family : Verdana, Arial, Helvetica; font-size : 8pt; text-align : center;" onfocus="window.document.form_reloj.reloj.blur()">
</form>
</body>
</html>
Para culminar el proyecto fue necesario realizar algunas modificaciones a la Base de Datos, con el fin de mejorar la inserción en la Información se realizó lo siguiente:
Se usarion dos Insert Into en vez de uno así: sensor.php
<?php
$pir = $_GET['pir'];
$tem = $_GET['tem'];
$dia = date('d');
$mes = date('m');
$anio = date('Y');
$hora = date('h');
$minuto = date('i');
$segundo = date('s');
$conexion = mysql_connect("10.245.74.55", "php", "123");
mysql_select_db("alarma",$conexion);
$sql1 = "INSERT INTO `datos_alar`(`id`, `dia`, `mes`, `anio`, `hora`, `minuto`, `segundo`, `pir`) VALUES
(NULL,'$dia','$mes','$anio','$hora','$minuto','$segundo','$pir')";
$res1 = mysql_query($sql1, $conexion) or die ("Error en la consulta");
$sql2 = "INSERT INTO `sensor_tem`(`id`, `dia`, `mes`, `anio`, `hora`, `minuto`, `segundo`, `tem`) VALUES
(NULL,'$dia','$mes','$anio','$hora','$minuto','$segundo','$tem')";
$res2 = mysql_query($sql2, $conexion) or die ("Error en la consulta");
?>
mostrar.php:
Se utilizaron en una misma pagina las dos conexiones a una misma base de datos, pero a tablas diferentes.
<?php
$conexion = mysql_connect("10.245.74.55", "php", "123");
mysql_select_db("alarma",$conexion);
$sql1 = "SELECT * FROM `datos_alar`";
$res1 = mysql_query($sql1, $conexion) or die ("Error en la consulta");
$sql2 = "SELECT * FROM `sensor_tem`";
$res2 = mysql_query($sql2, $conexion) or die ("Error en la consulta");
$total1 = mysql_num_rows($res1);
$total2 = mysql_num_rows($res2);
if ($total1 > 0)
{
echo "<table border = 1 align = left>"
."<tr>\n<td colspan=8 width=159 align=center>Datos Hora y Fecha para Alarma</td></tr>\n"
."<tr>\n"
."<th>id</th>\n"
."<th>Dia</th>\n"
."<th>Mes</th>\n"
."<th>Anio</th>\n"
."<th>Hora</th>\n"
."<th>Minuto</th>\n"
."<th>Segundo</th>\n"
."<th>pir</th>\n"
."</tr>\n"
."</div>";
while($reg = mysql_fetch_array($res1))
{
print "<td>".$reg['id']."</td>";
print "<td>".$reg['dia']."</td>";
print "<td>".$reg['mes']."</td>";
print "<td>".$reg['anio']."</td>";
print "<td>".$reg['hora']."</td>";
print "<td>".$reg['minuto']."</td>";
print "<td>".$reg['segundo']."</td>";
print "<td>".$reg['pir']."</td>";
print "</tr>";
}
}
if ($total2 > 0)
{
echo "<table border = 1 align = right>"
."<tr>\n<td colspan=8 width=159 align=center>Datos Hora Fecha y Temperatura para Sensor</td></tr>\n"
."<tr>\n"
."<th>id</th>\n"
."<th>Dia</th>\n"
."<th>Mes</th>\n"
."<th>Anio</th>\n"
."<th>Hora</th>\n"
."<th>Minuto</th>\n"
."<th>Segundo</th>\n"
."<th>tem</th>\n"
."</tr>\n"
."</div>";
while($reg = mysql_fetch_array($res2))
{
print "<td>".$reg['id']."</td>";
print "<td>".$reg['dia']."</td>";
print "<td>".$reg['mes']."</td>";
print "<td>".$reg['anio']."</td>";
print "<td>".$reg['hora']."</td>";
print "<td>".$reg['minuto']."</td>";
print "<td>".$reg['segundo']."</td>";
print "<td>".$reg['tem']."</td>";
print "</tr>";
}
}
?>
<html>
<head>
<title>mostrar.php</title>
<script language="JavaScript">
function mueveReloj(){
momentoActual = new Date()
hora = momentoActual.getHours()
minuto = momentoActual.getMinutes()
segundo = momentoActual.getSeconds()
str_segundo = new String (segundo)
if (str_segundo.length == 1)
segundo = "0" + segundo
str_minuto = new String (minuto)
if (str_minuto.length == 1)
minuto = "0" + minuto
str_hora = new String (hora)
if (str_hora.length == 1)
hora = "0" + hora
horaImprimible = hora + " : " + minuto + " : " + segundo
document.form_reloj.reloj.value = horaImprimible
setTimeout("mueveReloj()",1000)
}
</script>
</head>
<body onload="mueveReloj()">
<form name="form_reloj">
<input type="text" name="reloj" size="113" style="background-color : Black; color : White; font-family : Verdana, Arial, Helvetica; font-size : 8pt; text-align : center;" onfocus="window.document.form_reloj.reloj.blur()">
</form>
</body>
</html>
Creación de la Casa
Creación de la Casa:
Para este proyecto, se realizó una casa con dimensiones de 40* 60* 50, con el fin de poder mostrar el sistema integralmente simulando una casa.
Adjunto Fotos:
Para este proyecto, se realizó una casa con dimensiones de 40* 60* 50, con el fin de poder mostrar el sistema integralmente simulando una casa.
Adjunto Fotos:
Prueba de Conexión por Hyperterminal
Prueba de Conexión por Hyperterminal:
Se realiza la conexión por Hyperterminal, desarrollando paso a paso cada linea de código, con resultados exitosos.
Prueba de Inserción:
.png)
Prueba de Mensaje:
Se realiza la conexión por Hyperterminal, desarrollando paso a paso cada linea de código, con resultados exitosos.
Prueba de Inserción:
.png)
Prueba de Mensaje:
Comandos AT
Comandos AT
PARA CONEXION HTTP:
AT+SPBR: 3,1
Configura el Perfil de la Protadora
AT+SAPBR=3,1,"CONTYPE","GPRS"
AT+SAPBR=3,1,"APN","internet.comcel.com.co"
AT+SAPBR=3,1,"comcel",""
AT+SAPBR=3,1,"comcel",""
AT+SPBR: 1,1
Abre un Contexto GPRS
AT+SAPBR=1,1
AT+HTTPINIT
Abre el servicio GPRS
AT+HTTPINIT
AT+HTTPPARA
Establecer parámetros para la sesión HTTPS
AT+HTTPPARA="CID","1"
AT+HTTPPARA="URL","http://190.248.13.124/insertar.php?activacion=1"
Establecer el parámetro de redirección
AT+HTTPPARA="REDIR","1"
Consigue el inicio de la sesión
AT+HTTPACTION=0
Termina el servicio HTTP
AT+HTTPTERM
Ajuste de SMS en modo Texto
AT+CMGF=1
Envío del mensjade de texto al movil establecido:
AT+CMGS
PARA CONEXION HTTP:
AT+SPBR: 3,1
Configura el Perfil de la Protadora
AT+SAPBR=3,1,"CONTYPE","GPRS"
AT+SAPBR=3,1,"APN","internet.comcel.com.co"
AT+SAPBR=3,1,"comcel",""
AT+SAPBR=3,1,"comcel",""
AT+SPBR: 1,1
Abre un Contexto GPRS
AT+SAPBR=1,1
AT+HTTPINIT
Abre el servicio GPRS
AT+HTTPINIT
AT+HTTPPARA
Establecer parámetros para la sesión HTTPS
AT+HTTPPARA="CID","1"
AT+HTTPPARA="URL","http://190.248.13.124/insertar.php?activacion=1"
Establecer el parámetro de redirección
AT+HTTPPARA="REDIR","1"
Consigue el inicio de la sesión
AT+HTTPACTION=0
Termina el servicio HTTP
AT+HTTPTERM
Cierra el contexto de GPRS
AT+SAPBR=0,1
PARA ENVIO DE SMS:
Ajuste de SMS en modo Texto
AT+CMGF=1
Envío del mensjade de texto al movil establecido:
AT+CMGS
lunes, 2 de junio de 2014
Código
Para la realización del código primero se hicieron varias pruebas aisladamente con cada dispositivo desarrollando su respectivo código, después de ver que todo funcionara se hizo una integración de todo el código para que el sistema funcionara y tuviera una respuesta satisfactoria. A continuación se mostraran los pasos que se siguieron para realizar las pruebas y finalmente llegar al código terminado.
Pasos:
1. Código prueba para enviar mensajes de texto:
codigoGprs:
boolean flag1 = true;
void setup()
{
pinMode(13, OUTPUT);
pinMode(2, OUTPUT);
Serial.begin(9600); //velocidad de conexión con módulo GPRS
activarGprs(); //activar el módulo GPRS
}
void loop()
{
if(flag1)
{
SMS();
flag1 = false;
}
}
activarGprs:
//procedimiento para activar el módulo GPRS
void activarGprs()
{
for(int i = 0 ; i<6; i++)
{
delay(5000); //esperamos 20 segundos a que se active el módulo GPRS
}
digitalWrite(2, HIGH);
delay(5000);
digitalWrite(2, LOW);
for(int i = 0 ; i<8; i++)
{
delay(5000); //esperamos 20 segundos a que se active el módulo GPRS
}
digitalWrite(13,HIGH);
}
SMS:
void SMS()
{
Serial.println("AT+CMGF=1");//activamos el modo SMS
delay(1500);
Serial.print("AT+CMGS="); // comando AT para enviar SMS
Serial.write( byte(34)); // enviar caracter "
Serial.print("3007799491"); // numero de movil receptor del SMS
Serial.write( byte(34)); // enviar caracter "
Serial.println();
delay(1500);
//body
Serial.print("Envio de mensaje desde Arduino ElectivaI"); //texto del SMS
delay(10000);
//END OF SMS
Serial.write(0x1A);
Serial.write(0x0D);
Serial.write(0x0A);
}
Nota: Este código es el que permite enviar mensajes de texto, principalmente lo que hace es encender el modem SIM900. Este tarda en prender 45 segundos, después de estar prendido envía por medio de los comandos AT las ordenes para que se envíe el sms al numero de celular deseado.
2. Código de sensores:
sensorPir: //Sensor de movimiento
void sensorPir()
{
pinMode(12, OUTPUT); // Pin zumbador.
pinMode(8, INPUT);//Pin pir.
int PIR = digitalRead(8);//Lectura digital del estado del sensor (1 si hay movimiento 0 si no lo hay).
if (PIR == HIGH)
{
digitalWrite(12, HIGH);//Zumbador encendido.
delay(200);
digitalWrite(12, LOW);//Se apaga el zumbador a los 0,2 segundos.
}
}
sensorTemp: //Sensor de temperatura
void sensorTemp()
{
float temperatura = 0;
int valorSensor = 0;
pinMode(A0, INPUT);
valorSensor = analogRead(A0);//Lee lo el valor que esta arrojando el sensor.
temperatura = (5.0 * valorSensor * 100.0)/1024.0;//Convierte el valor que esta leyendo el sensor en grados centigrados.
}
Nota: Este es el código de los dos sensores, es el que permite guardar en las variables temperatura y pir que valores están leyendo los sensores.
3. Prueba para la conexión al servidor y envió de información a la base de datos:
conectarBd: //Se conecta al servidor y envía a la base de datos un registro en las tablas correspondientes según las variables asignándole a pir un '1' y a tem un 23.
void conectarBd()
{
Serial.println("AT+SAPBR=3,1,\"CONTYPE\",\"GPRS\"");
delay(500);
Serial.println("AT+SAPBR=3,1,\"APN\",\"web.colombiamovil.com.co\"");
delay(500);
Serial.println("AT+SAPBR=3,1,\"USER\",\"\"");
delay(500);
Serial.println("AT+SAPBR=3,1,\"PWD\",\"\"");
delay(500);
Serial.println("AT+SAPBR=1,1");
delay(10000);
Serial.println("AT+HTTPINIT");
delay(2000);
Serial.println("AT+HTTPPARA=\"CID\",\"1\"");
delay(2000);
Serial.print("AT+HTTPPARA=\"URL\",\"http://190.248.13.124/sensor.php?pir=1&tem=23"\"");
delay(2000);
Serial.println("AT+HTTPACTION=0");
delay(10000);
Serial.println("AT+HTTPTERM");
delay(2000);
Serial.println("AT+SAPBR=0,1");
delay(2000);
}
Nota: Este código permite conectarse al servidor y enviar los dos datos requeridos por el método GET a la tabla correspondiente de la base de datos.
4. Código para verificar si hay una alarma:
checkAlarma:
void checkAlarma()
{
if(checkPir.equalsIgnoreCase("1"))
{
if(PIR == 1)//PIR es la variable en la que se carga el valor que se esta leyendo en el sensor de movimiento.
{
alarmaPir = 1;
}
else
{
alarmaPir = 0;
}
}
else
{
alarmaPir = 0;
}
if(checkTemp.equalsIgnoreCase("1"))
{
if(temperatura < limInfeTemp) //temperatura es la variable que lee el sensor.
{
alarmaTemp = 1;
digitalWrite(9, LOW); //Apaga el ventilador.
}
if(temperatura > limSupTemp)
{
alarmaTemp = 1;
activarVentilador();
}
else
{
alarmaTemp = 0;
}
}
else
{
alarmaTemp = 0;
}
}
Nota: Este código permite saber si hay una alarma, en el caso del sensor pir si se detecta movimiento la alarma se activa y en el caso del sensor de temperatura, de acuerdo a lo que este leyendo el sensor si la temperatura esta afuera del rango establecido (limite superior: 22°C, limite inferior: 18°C) se activa de igual forma la alarma.
5. Afinamiento de tiempos de las alertas tempranas y el envió de información a la base de datos:
codigoGprs:
String checkPir = "1";
int alarmaPir = 0;
String checkTemp = "1";
double limInfeTemp = 18;
double limSupTemp = 22;
int alarmaTemp = 0;
double PIR = 0;
double temperatura = 0;
boolean onceAlert = true;
boolean onceRegistro = true;
unsigned long smsMillis = 0;
unsigned long registMillis = 0;
unsigned long smsTime = 300000; // 5 minutos.
void setup()
{
pinMode(13, OUTPUT);
pinMode(2, OUTPUT);
Serial.begin(9600); //velocidad de conexión con módulo GPRS
activarGprs(); //activar el módulo GPRS
}
void loop()
{
leerSensores();
checkAlarma();
//Envia alertas tempranas y el registro de estas.
if(!onceAlert && (smsMillis + smsTime < millis()) )
{
onceAlert = true;
}
if( (alarmaPir == 1 || alarmaTemp == 1) && onceAlert == true)
{
onceAlert = false;
smsMillis = millis();
if(alarmaPir == 1)
{
smsPir();
conectarBd();
}
if(alarmaTemp == 1)
{
conectarBd();
smsTemp();
}
}
//Envia datos cada 5 minutos a la base de datos.
if((registMillis + smsTime < millis()) || onceRegistro)
{
onceRegistro = false;
registMillis = millis();
conectarBd();
}
}
Nota: Esta es la modificación del código que conecta al servidor y envía información a la base de datos según el valor que cada sensor este leyendo, esta inserción de datos ya no se hace de una manera estática si no que se hace dinámicamente ya que se esta enviando el valor correspondiente de la variable y no un dato en especifico ingresado desde la url.
7. Es importante recalcar que el código de conexión y envió de información a la base de datos requiere de un control de flujo el cual es el encargado de verificar que los comandos AT si hayan tenido una respuesta exitosa, si la respuesta captada del comando es un error este control de flujo enviara nuevamente los comandos hasta que haya una respuesta positiva, esto permitirá mayor fluides y eficiencia en el funcionamiento del sistema. En este caso el control de flujo que se diseño para este proyecto no sirvió de la forma adecuada ya que evitaba que el proyecto funcionara como se esperaba. De igual forma se dará a conocer a continuación:
imprimirLn: Este código es el que verifica si la respuesta del comando es positiva o negativa, si es buena retorna un true y si es un error retorna un false.
boolean ImprimirLn(String atCommand)
{
Serial.println(atCommand);
delay (5000);
int a=0;
do
{
a++;
delay(1000);
} while(!Serial.available() && a>30);
String response = "";
if(Serial.available() > 0)
{
response += (char)Serial.read();
}
String responseCutted = "";
response.trim();
response.replace(" ", "?");
response.replace("\n","?");
int n = response.length();
responseCutted = response.substring(n-2,n);
if(!responseCutted.equalsIgnoreCase("ok"))
{
responseCutted = response.substring(response.indexOf("+"),(response.lastIndexOf(",")+1));
if(responseCutted.equalsIgnoreCase("ok") || responseCutted.equalsIgnoreCase("+HTTPACTION:0,200,"))
{
return true;
}
else
{
return false;
}
}
else
{
return false;
}
}
conectarBd: Este código es el control de flujo, es el que le da los tiempos a cada comando para imprimirlos, si hay un error en la respuesta este se encarga de volver a imprimirlos hasta que responda exitosamente.
void conectarBd()
{
String URLServidor="";
URLServidor="AT+HTTPPARA=\"URL\",\"190.248.13.124/sensor.php?";
URLServidor += "tem=";
char tmp1 [80];
String StringsensorTemp = dtostrf(temperatura, 1, 2, tmp1);
URLServidor += StringsensorTemp;
URLServidor += "&pir=";
char tmp2 [80];
String StringsensorAlar = dtostrf(PIR, 1, 2, tmp2);
URLServidor += StringsensorAlar;
URLServidor += "\"";
boolean flowOK = false;
int flowBucle=0;
Inicio:
if (flowBucle >= 5)
{
if(!ImprimirLn("AT"))
{
flowBucle++;
}
goto Fin;
}
if(!ImprimirLn("AT+SAPBR=3,1,\"Contype\",\"GPRS\""))
{
flowBucle++;
goto Inicio;
}
if(!ImprimirLn("AT+SAPBR=3,1,\"APN\",\"web.colombiamovil.com.co\""))
{
flowBucle++;
goto Inicio;
}
if(!ImprimirLn("AT+SAPBR=3,1,\"USER\",\"\""))
{
flowBucle++;
goto Inicio;
}
if(!ImprimirLn("AT+SAPBR=3,1,\"PWD\",\""))
{
flowBucle++;
goto Inicio;
}
if(!ImprimirLn("AT+SAPBR=1,1"))
{
flowBucle++;
goto CerrarGPRS;
}
if(!ImprimirLn("AT+HTTPINIT"))
{
flowBucle++;
goto CerrarHTTP;
}
if(!ImprimirLn("AT+HTTPPARA=\"CID\",\"1\""))
{
flowBucle++;
goto CerrarHTTP;
}
if(!ImprimirLn(URLServidor))
{
flowBucle++;
goto CerrarHTTP;
}
if(!ImprimirLn("AT+HTTPACTION=0"))
{
flowBucle++;
goto CerrarHTTP;
}
delay(20000);
//leerHTTP("AT+HTTPREAD=0, 200");
flowOK = true;
CerrarHTTP:
if (!ImprimirLn("AT+HTTPTERM"))
{
goto Inicio;
}
CerrarGPRS:
if((ImprimirLn("AT+SAPBR=0,1 ")) || (!flowOK))
{
if (flowBucle <= 5)
{
goto Inicio;
}
else
{
if(!ImprimirLn("AT"))
{
flowBucle++;
goto Inicio;
}
goto Fin;
}
}
delay (20000);
Fin:
URLServidor = "";
}
Pasos:
1. Código prueba para enviar mensajes de texto:
codigoGprs:
boolean flag1 = true;
void setup()
{
pinMode(13, OUTPUT);
pinMode(2, OUTPUT);
Serial.begin(9600); //velocidad de conexión con módulo GPRS
activarGprs(); //activar el módulo GPRS
}
void loop()
{
if(flag1)
{
SMS();
flag1 = false;
}
}
activarGprs:
//procedimiento para activar el módulo GPRS
void activarGprs()
{
for(int i = 0 ; i<6; i++)
{
delay(5000); //esperamos 20 segundos a que se active el módulo GPRS
}
digitalWrite(2, HIGH);
delay(5000);
digitalWrite(2, LOW);
for(int i = 0 ; i<8; i++)
{
delay(5000); //esperamos 20 segundos a que se active el módulo GPRS
}
digitalWrite(13,HIGH);
}
SMS:
void SMS()
{
Serial.println("AT+CMGF=1");//activamos el modo SMS
delay(1500);
Serial.print("AT+CMGS="); // comando AT para enviar SMS
Serial.write( byte(34)); // enviar caracter "
Serial.print("3007799491"); // numero de movil receptor del SMS
Serial.write( byte(34)); // enviar caracter "
Serial.println();
delay(1500);
//body
Serial.print("Envio de mensaje desde Arduino ElectivaI"); //texto del SMS
delay(10000);
//END OF SMS
Serial.write(0x1A);
Serial.write(0x0D);
Serial.write(0x0A);
}
Nota: Este código es el que permite enviar mensajes de texto, principalmente lo que hace es encender el modem SIM900. Este tarda en prender 45 segundos, después de estar prendido envía por medio de los comandos AT las ordenes para que se envíe el sms al numero de celular deseado.
2. Código de sensores:
sensorPir: //Sensor de movimiento
void sensorPir()
{
pinMode(12, OUTPUT); // Pin zumbador.
pinMode(8, INPUT);//Pin pir.
int PIR = digitalRead(8);//Lectura digital del estado del sensor (1 si hay movimiento 0 si no lo hay).
if (PIR == HIGH)
{
digitalWrite(12, HIGH);//Zumbador encendido.
delay(200);
digitalWrite(12, LOW);//Se apaga el zumbador a los 0,2 segundos.
}
}
sensorTemp: //Sensor de temperatura
void sensorTemp()
{
float temperatura = 0;
int valorSensor = 0;
pinMode(A0, INPUT);
valorSensor = analogRead(A0);//Lee lo el valor que esta arrojando el sensor.
temperatura = (5.0 * valorSensor * 100.0)/1024.0;//Convierte el valor que esta leyendo el sensor en grados centigrados.
}
Nota: Este es el código de los dos sensores, es el que permite guardar en las variables temperatura y pir que valores están leyendo los sensores.
3. Prueba para la conexión al servidor y envió de información a la base de datos:
conectarBd: //Se conecta al servidor y envía a la base de datos un registro en las tablas correspondientes según las variables asignándole a pir un '1' y a tem un 23.
void conectarBd()
{
Serial.println("AT+SAPBR=3,1,\"CONTYPE\",\"GPRS\"");
delay(500);
Serial.println("AT+SAPBR=3,1,\"APN\",\"web.colombiamovil.com.co\"");
delay(500);
Serial.println("AT+SAPBR=3,1,\"USER\",\"\"");
delay(500);
Serial.println("AT+SAPBR=3,1,\"PWD\",\"\"");
delay(500);
Serial.println("AT+SAPBR=1,1");
delay(10000);
Serial.println("AT+HTTPINIT");
delay(2000);
Serial.println("AT+HTTPPARA=\"CID\",\"1\"");
delay(2000);
Serial.print("AT+HTTPPARA=\"URL\",\"http://190.248.13.124/sensor.php?pir=1&tem=23"\"");
delay(2000);
Serial.println("AT+HTTPACTION=0");
delay(10000);
Serial.println("AT+HTTPTERM");
delay(2000);
Serial.println("AT+SAPBR=0,1");
delay(2000);
}
Nota: Este código permite conectarse al servidor y enviar los dos datos requeridos por el método GET a la tabla correspondiente de la base de datos.
4. Código para verificar si hay una alarma:
checkAlarma:
void checkAlarma()
{
if(checkPir.equalsIgnoreCase("1"))
{
if(PIR == 1)//PIR es la variable en la que se carga el valor que se esta leyendo en el sensor de movimiento.
{
alarmaPir = 1;
}
else
{
alarmaPir = 0;
}
}
else
{
alarmaPir = 0;
}
if(checkTemp.equalsIgnoreCase("1"))
{
if(temperatura < limInfeTemp) //temperatura es la variable que lee el sensor.
{
alarmaTemp = 1;
digitalWrite(9, LOW); //Apaga el ventilador.
}
if(temperatura > limSupTemp)
{
alarmaTemp = 1;
activarVentilador();
}
else
{
alarmaTemp = 0;
}
}
else
{
alarmaTemp = 0;
}
}
Nota: Este código permite saber si hay una alarma, en el caso del sensor pir si se detecta movimiento la alarma se activa y en el caso del sensor de temperatura, de acuerdo a lo que este leyendo el sensor si la temperatura esta afuera del rango establecido (limite superior: 22°C, limite inferior: 18°C) se activa de igual forma la alarma.
5. Afinamiento de tiempos de las alertas tempranas y el envió de información a la base de datos:
codigoGprs:
String checkPir = "1";
int alarmaPir = 0;
String checkTemp = "1";
double limInfeTemp = 18;
double limSupTemp = 22;
int alarmaTemp = 0;
double PIR = 0;
double temperatura = 0;
boolean onceAlert = true;
boolean onceRegistro = true;
unsigned long smsMillis = 0;
unsigned long registMillis = 0;
unsigned long smsTime = 300000; // 5 minutos.
void setup()
{
pinMode(13, OUTPUT);
pinMode(2, OUTPUT);
Serial.begin(9600); //velocidad de conexión con módulo GPRS
activarGprs(); //activar el módulo GPRS
}
void loop()
{
leerSensores();
checkAlarma();
//Envia alertas tempranas y el registro de estas.
if(!onceAlert && (smsMillis + smsTime < millis()) )
{
onceAlert = true;
}
if( (alarmaPir == 1 || alarmaTemp == 1) && onceAlert == true)
{
onceAlert = false;
smsMillis = millis();
if(alarmaPir == 1)
{
smsPir();
conectarBd();
}
if(alarmaTemp == 1)
{
conectarBd();
smsTemp();
}
}
//Envia datos cada 5 minutos a la base de datos.
if((registMillis + smsTime < millis()) || onceRegistro)
{
onceRegistro = false;
registMillis = millis();
conectarBd();
}
}
Nota: Este es el código modificado que permite enviar los mensajes de texto(alertas tempranas) y la inserción de información a la base de datos con tiempos establecidos según el código de checkAlarma ya expuesto en el punto anterior.
6. Envió de información a la base de datos con variables:
conectarBD:
conectarBD:
void conectarBd()
{
Serial.println("AT+SAPBR=3,1,\"CONTYPE\",\"GPRS\"");
delay(500);
Serial.println("AT+SAPBR=3,1,\"APN\",\"web.colombiamovil.com.co\"");
delay(500);
Serial.println("AT+SAPBR=3,1,\"USER\",\"\"");
delay(500);
Serial.println("AT+SAPBR=3,1,\"PWD\",\"\"");
delay(500);
Serial.println("AT+SAPBR=1,1");
delay(10000);
Serial.println("AT+HTTPINIT");
delay(2000);
Serial.println("AT+HTTPPARA=\"CID\",\"1\"");
delay(2000);
Serial.print("AT+HTTPPARA=\"URL\",\"http://190.248.13.124/sensor.php?pir=");
Serial.print(PIR);
Serial.print("&");
Serial.print("tem=");
Serial.print(temperatura);
Serial.println("\"");
delay(2000);
Serial.println("AT+HTTPACTION=0");
delay(10000);
Serial.println("AT+HTTPTERM");
delay(2000);
Serial.println("AT+SAPBR=0,1");
delay(2000);
}
{
Serial.println("AT+SAPBR=3,1,\"CONTYPE\",\"GPRS\"");
delay(500);
Serial.println("AT+SAPBR=3,1,\"APN\",\"web.colombiamovil.com.co\"");
delay(500);
Serial.println("AT+SAPBR=3,1,\"USER\",\"\"");
delay(500);
Serial.println("AT+SAPBR=3,1,\"PWD\",\"\"");
delay(500);
Serial.println("AT+SAPBR=1,1");
delay(10000);
Serial.println("AT+HTTPINIT");
delay(2000);
Serial.println("AT+HTTPPARA=\"CID\",\"1\"");
delay(2000);
Serial.print("AT+HTTPPARA=\"URL\",\"http://190.248.13.124/sensor.php?pir=");
Serial.print(PIR);
Serial.print("&");
Serial.print("tem=");
Serial.print(temperatura);
Serial.println("\"");
delay(2000);
Serial.println("AT+HTTPACTION=0");
delay(10000);
Serial.println("AT+HTTPTERM");
delay(2000);
Serial.println("AT+SAPBR=0,1");
delay(2000);
}
Nota: Esta es la modificación del código que conecta al servidor y envía información a la base de datos según el valor que cada sensor este leyendo, esta inserción de datos ya no se hace de una manera estática si no que se hace dinámicamente ya que se esta enviando el valor correspondiente de la variable y no un dato en especifico ingresado desde la url.
7. Es importante recalcar que el código de conexión y envió de información a la base de datos requiere de un control de flujo el cual es el encargado de verificar que los comandos AT si hayan tenido una respuesta exitosa, si la respuesta captada del comando es un error este control de flujo enviara nuevamente los comandos hasta que haya una respuesta positiva, esto permitirá mayor fluides y eficiencia en el funcionamiento del sistema. En este caso el control de flujo que se diseño para este proyecto no sirvió de la forma adecuada ya que evitaba que el proyecto funcionara como se esperaba. De igual forma se dará a conocer a continuación:
imprimirLn: Este código es el que verifica si la respuesta del comando es positiva o negativa, si es buena retorna un true y si es un error retorna un false.
boolean ImprimirLn(String atCommand)
{
Serial.println(atCommand);
delay (5000);
int a=0;
do
{
a++;
delay(1000);
} while(!Serial.available() && a>30);
String response = "";
if(Serial.available() > 0)
{
response += (char)Serial.read();
}
String responseCutted = "";
response.trim();
response.replace(" ", "?");
response.replace("\n","?");
int n = response.length();
responseCutted = response.substring(n-2,n);
if(!responseCutted.equalsIgnoreCase("ok"))
{
responseCutted = response.substring(response.indexOf("+"),(response.lastIndexOf(",")+1));
if(responseCutted.equalsIgnoreCase("ok") || responseCutted.equalsIgnoreCase("+HTTPACTION:0,200,"))
{
return true;
}
else
{
return false;
}
}
else
{
return false;
}
}
conectarBd: Este código es el control de flujo, es el que le da los tiempos a cada comando para imprimirlos, si hay un error en la respuesta este se encarga de volver a imprimirlos hasta que responda exitosamente.
void conectarBd()
{
String URLServidor="";
URLServidor="AT+HTTPPARA=\"URL\",\"190.248.13.124/sensor.php?";
URLServidor += "tem=";
char tmp1 [80];
String StringsensorTemp = dtostrf(temperatura, 1, 2, tmp1);
URLServidor += StringsensorTemp;
URLServidor += "&pir=";
char tmp2 [80];
String StringsensorAlar = dtostrf(PIR, 1, 2, tmp2);
URLServidor += StringsensorAlar;
URLServidor += "\"";
boolean flowOK = false;
int flowBucle=0;
Inicio:
if (flowBucle >= 5)
{
if(!ImprimirLn("AT"))
{
flowBucle++;
}
goto Fin;
}
if(!ImprimirLn("AT+SAPBR=3,1,\"Contype\",\"GPRS\""))
{
flowBucle++;
goto Inicio;
}
if(!ImprimirLn("AT+SAPBR=3,1,\"APN\",\"web.colombiamovil.com.co\""))
{
flowBucle++;
goto Inicio;
}
if(!ImprimirLn("AT+SAPBR=3,1,\"USER\",\"\""))
{
flowBucle++;
goto Inicio;
}
if(!ImprimirLn("AT+SAPBR=3,1,\"PWD\",\""))
{
flowBucle++;
goto Inicio;
}
if(!ImprimirLn("AT+SAPBR=1,1"))
{
flowBucle++;
goto CerrarGPRS;
}
if(!ImprimirLn("AT+HTTPINIT"))
{
flowBucle++;
goto CerrarHTTP;
}
if(!ImprimirLn("AT+HTTPPARA=\"CID\",\"1\""))
{
flowBucle++;
goto CerrarHTTP;
}
if(!ImprimirLn(URLServidor))
{
flowBucle++;
goto CerrarHTTP;
}
if(!ImprimirLn("AT+HTTPACTION=0"))
{
flowBucle++;
goto CerrarHTTP;
}
delay(20000);
//leerHTTP("AT+HTTPREAD=0, 200");
flowOK = true;
CerrarHTTP:
if (!ImprimirLn("AT+HTTPTERM"))
{
goto Inicio;
}
CerrarGPRS:
if((ImprimirLn("AT+SAPBR=0,1 ")) || (!flowOK))
{
if (flowBucle <= 5)
{
goto Inicio;
}
else
{
if(!ImprimirLn("AT"))
{
flowBucle++;
goto Inicio;
}
goto Fin;
}
}
delay (20000);
Fin:
URLServidor = "";
}
Sensores Y Ventilador
SENSORES
Definición: un sensor es un dispositivo eléctrico y/o mecánico que convierte magnitudes físicas (luz, magnetismo, presión, etc.) en valores medibles de dicha magnitud. Esto se realiza en tres fases:
- Un fenómeno físico a ser medido es captado por un sensor, y muestra en su salida una señal eléctrica dependiente del valor de la variable física.
- La señal eléctrica es modificada por un sistema de acondicionamiento de señal, cuya salida es un voltaje.
- El sensor dispone de una circuitería que transforma y/o amplifica la tensión de salida, la cuál pasa a un conversor A/D, conectado a un PC. El convertidor A/D transforma la señal de tensión continua en una señal
discreta.
SENSORES A UTILIZAR
Sensor de movimiento PIR.
Fig. 1. Detector de movimiento PIR.
CARACTERÍSTICAS TÉCNICAS
Voltaje de Alimentación =5 VDC.
Rango de medición = hasta 6 m.
Salida = estado de un pin TTL.
Polaridad de activación de salida seleccionable.
Mínimo tiempo de calibración.
El sensor PIR cuenta solamente con tres terminales. Dos de ellos se utilizan para la alimentación y el restante es la salida de detección de movimiento. La conexión al microcontrolador requiere del uso de este sólo terminal. La figura muestra como se conectará el PIR para los ejemplos descritos en este documento.
TEORÍA DE OPERACIÓN
Los dispositivos piroeléctricos, como el PIR, poseen elementos fabricados de un material cristalino que genera una carga eléctrica cuando se expone a la radiación infrarroja. Los cambios en la cantidad de radiación producen cambios de voltaje los cuales son medidos por un amplificador. El PIR contiene unos filtros especiales llamados lentes de Fresnel que enfocan las señales infrarrojas sobre el elemento sensor.
Cuando las señales infrarrojas del ambiente donde se encuentra el sensor cambian rápidamente, el amplificador activa la salida para indicar movimiento. Esta salida permanece activa durante algunos segundos
permitiendo al microcontrolador saber si hubo movimiento.
CALIBRACIÓN
Al energizarse el sensor PIR requiere de un tiempo de
preparación para comenzar a operar de forma adecuada. Esto
se debe a que tiene que ocurrir la adaptación a las condiciones
propias de operación del ambiente donde fue instalado.
Durante este período el sensor “aprende” a reconocer el
estado de reposo o no movimiento del ambiente. La duración
de esta calibración puede estar entre 10 y 60 segundos y es
altamente recomendable la ausencia de personas en la
vecindad del sensor mientras se calibra.
SENSOR DE TEMPERATURA
LM35 Sensor de precisión
El LM35 es un sensor de temperatura integrado de precisión, cuya tensión de salida es linealmente proporcional a temperatura en ºC (grados centígrados). El LM35 por lo tanto tiene una ventaja sobre los sensores de temperatura lineal calibrada en grados Kelvin: que el usuario no está obligado a restar una gran tensión constante para obtener grados centígrados. El LM35 no requiere ninguna calibración externa o ajuste para proporcionar una precisión típica de ± 1.4 ºC a temperatura ambiente y ± 3.4 ºC a lo largo de su rango de temperatura (de -55 a 150 ºC). El dispositivo se ajusta y calibra durante el proceso de producción. La baja impedancia de salida, la salida lineal y la precisa calibración inherente, permiten la creación de circuitos de lectura o control especialmente sencillos. El LM35 puede funcionar con alimentación simple o alimentación doble (+ y -).
Requiere sólo 60 µA para alimentarse, y bajo factor de auto-calentamiento, menos de 0,1 ºC en aire estático. El LM35 está preparado para trabajar en una gama de temperaturas que abarca desde los- 55 ºC bajo cero a 150 ºC, mientras que el LM35C está preparado para trabajar entre -40 ºC y 110 ºC (con mayor precisión).
Características
- Calibrado directamente en grados Celsius (Centígrados)
- Factor de escala lineal de +10 mV / ºC
- 0,5ºC de precisión a +25 ºC
- Rango de trabajo: -55 ºC a +150 ºC
- Apropiado para aplicaciones remotas
- Bajo coste
- Funciona con alimentaciones entre 4V y 30V
- Menos de 60 µA de consumo
- Bajo auto-calentamiento (0,08 ºC en aire estático)
- Baja impedancia de salida, 0,1W para cargas de 1mA
Diagrama de conexión
APLICACIONES TÍPICAS
VENTILADOR
jueves, 1 de mayo de 2014
Propuesta: Definición del Proyecto
Definición del Proyecto:
El presente proyecto tiene como fin desarrollar un proceso que funcione remotamente, el cual implemente la telemetría y el telecontrol. Por la
parte de telemetría se enviarán los datos y las variables a una base de datos por medio de un servidor y en la parte de telecontrol, manipular y controlar dichas variables
para que el sistema realice una acción determinada. En este caso el sistema a utilizar será una
alarma contra robos la cual enviara por medio de un modem y un servidor
mensajes de alerta a la base de datos en tiempos preestablecidos, para saber si la
alarma se ha activado o no (Telemetría),
otra función del sistema es tener la posibilidad de controlar
ciertas variables para que realice una acción, por ejemplo activar o desactivar la alarma, apagar o encender la luz de alguna
habitación de la casa (Telecontrol).
lunes, 28 de abril de 2014
Montaje Sensor Infrarrojo
Montaje Sensor Infrarrojo:
Se verifican los componentes a utilizar en el proyecto asi:
1. Sensor Infrarrojo FBII MX200
2. Sensor Magnetico
3. Modem GSM- GPRS- SIM 900
4. Definición de Maqueta para Probar el Proyecto.
Fotos:
lunes, 21 de abril de 2014
Mostrar Datos Por IP Publica: 190.248.13.124
Mostrar Datos Por IP Publica: 190.248.13.124
Se muestra la información, insertada previamente por la pagina WEB, así:
Ip Pública: http://190.248.13.124/conectar.php?activacion=1 enviado por GET,
El Resultado es el siguiente:
http://190.248.13.124/mostrar.php
id | Dia | Mes | Anio | Hora | Minuto | Segundo | Activacion |
---|---|---|---|---|---|---|---|
21 | 17 | 4 | 14 | 3 | 45 | 50 | 1 |
22 | 17 | 4 | 2014 | 15 | 50 | 20 | 0 |
23 | 17 | 4 | 2014 | 15 | 55 | 7 | 1 |
24 | 17 | 4 | 2014 | 3 | 58 | 7 | 1 |
25 | 17 | 4 | 2014 | 3 | 59 | 16 | 1 |
26 | 17 | 4 | 2014 | 4 | 2 | 21 | 1 |
27 | 22 | 4 | 2014 | 2 | 28 | 20 | 0 |
28 | 22 | 4 | 2014 | 2 | 51 | 0 | 0 |
29 | 22 | 4 | 2014 | 2 | 51 | 12 | 1 |
30 | 22 | 4 | 2014 | 2 | 51 | 16 | 1 |
31 | 22 | 4 | 2014 | 2 | 51 | 18 | 1 |
32 | 21 | 4 | 2014 | 10 | 1 | 31 | 1 |
33 | 21 | 4 | 2014 | 10 | 1 | 33 | 1 |
34 | 21 | 4 | 2014 | 10 | 1 | 34 | 1 |
35 | 21 | 4 | 2014 | 10 | 1 | 35 | 1 |
36 | 21 | 4 | 2014 | 10 | 1 | 36 | 1 |
37 | 21 | 4 | 2014 | 10 | 1 | 36 | 1 |
38 | 21 | 4 | 2014 | 10 | 1 | 37 | 1 |
39 | 21 | 4 | 2014 | 10 | 2 | 25 | 1 |
40 | 21 | 4 | 2014 | 10 | 2 | 27 | 1 |
41 | 21 | 4 | 2014 | 10 | 2 | 28 | 1 |
42 | 21 | 4 | 2014 | 10 | 2 | 29 | 1 |
Los Registros del ID 21 al 31, fueron pruebas sin haber cambiado "UTC".
Los Registros del ID 32 al 42 fueron pruebas cambiando el regsitro timezone por ."AMERICA/BOGOTA"
domingo, 20 de abril de 2014
Creación Pagina PHP
Creación Pagina PHP
Se crean tres paginas así:
Conectar:
Se crea la pagina php, "conectar.php", con el fin de realizar la conexión con la Base de Datos así:
<?php
$activacion = $_GET['activacion'];
$dia = date('d');
$mes = date('m');
$anio = date('Y');
$hora = date('h');
$minuto = date('i');
$segundo = date('s');
$conexion = mysql_connect("localhost", "php", "123");
mysql_select_db("alarma",$conexion);
$sql = "INSERT INTO `datos`(`id`, `dia`, `mes`, `anio`, `hora`, `minuto`, `segundo`, `activacion`) VALUES
(NULL,'$dia','$mes','$anio','$hora','$minuto','$segundo','$activacion')";
$res = mysql_query($sql, $conexion) or die ("Error en la consulta");
?>
Insertar:
Se crea la Pagina php, "insertar.php", con el fin de probar la pagina y la inserción a la Base de Datos así:
<html>
<head>
<title></title>
</head>
<body>
<form action = "conectar.php" method = "GET"><br><br>
Dia: <input type = "text" name = txtDia><br>
Mes: <input type = "text" name = txtMes><br>
Anio: <input type = "text" name = txtAnio><br>
Hora: <input type = "text" name = txtHora><br>
Minuto: <input type = "text" name = txtMinuto><br>
Segundo: <input type = "text" name = txtSegundo><br>
<input type = "submit" value = "Ok">
</body>
</html>
Mostrar:
Se crea la pagina "mostrar.php", con el fin de mostrar los datos que se insertan en la Base de Datos así:
<?php
$conexion = mysql_connect("localhost", "php", "123");
mysql_select_db("alarma",$conexion);
$sql = "SELECT * FROM `datos`";
$res = mysql_query($sql, $conexion) or die ("Error en la consulta");
$total = mysql_num_rows($res);
if ($total > 0)
{
echo "<table border = 1 align = center>"
."<tr>\n"
."<th>id</th>\n"
."<th>Dia</th>\n"
."<th>Mes</th>\n"
."<th>Anio</th>\n"
."<th>Hora</th>\n"
."<th>Minuto</th>\n"
."<th>Segundo</th>\n"
."<th>Activacion</th>\n"
."</tr>\n";
while($reg = mysql_fetch_array($res))
{
print "<td>".$reg['id']."</td>";
print "<td>".$reg['dia']."</td>";
print "<td>".$reg['mes']."</td>";
print "<td>".$reg['anio']."</td>";
print "<td>".$reg['hora']."</td>";
print "<td>".$reg['minuto']."</td>";
print "<td>".$reg['segundo']."</td>";
print "<td>".$reg['activacion']."</td>";
print "</tr>";
}
}
?>
.
Suscribirse a:
Entradas (Atom)