domingo, 25 de septiembre de 2016

PHP, JavaScript/AJAX, Gmaps & SIM900 GPRS

SIM900 GPRS, PHP, JS/AJAX, Gmaps
SIM900 GSM/GPRS

Este ejemplo básico consiste en enviar mediante GPRS del SIM900 datos a un sitio web para ser presentados adecuadamente, en nuestro caso los datos a enviar son: Latitud, Longitud, Fecha de adquisición, Hora de adquisición. Por lo tanto necesitamos de GMAPS para visualizar los datos correctamente.

Mediante la página web presentamos los datos de "geo-localización" los cuales son enviados por el SIM900 o cualquier otro módulo GPRS. La interfaz de visualización consiste en un sitio usando PHP, JavaScript/AJAX, Gmaps, MySQL, etc.

En el mapa del sitio se puede observar un marcador. Este marcador corresponde al último dato que ha recibido el servidor de parte del dispositivo AVL, es decir el último dato almacenado en la base de datos MySQL. Además el sitio nos permite ver la hora y fecha de adquisición del último dato mostrado. Todo dato enviado por el SIM900 al servidor será automáticamente marcado en el mapa y podremos observar cómo se va marcando la trayectoria del dispositivo.

La actualización del mapa con el último dato en servidor se realiza mediante AJAX, con ayuda de este preguntamos frecuentemente al servidor por el último dato recibido del dispositivo, y si el dato es el mismo no lo marca más. En caso de que un nuevo dato ha sido recibido por el servidor pero su valor corresponde al mismo punto marcado anteriormente entonces el sitio solo actualiza la fecha y hora del dato.

Este es un ejemplo básico, obviamente sería necesario un formulario para validar usuarios, cookies, ademas de control y protección de los scripts, keys, etc.


Sistema


último dato en MySQL DB -> Gmaps

Conexión
-
GET, GPRS SIM900

MySQL database/table

CREATE TABLE gprs.samples (
   sampleId INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
   sampleDate DATE NOT NULL,
   sampleTime TIME NOT NULL,
   sampleLat VARCHAR(20) NOT NULL,
   sampleLon VARCHAR(20)NOT NULL
)default character set utf8;

INSERT INTO gprs.samples(sampleDate, sampleTime, sampleLat, sampleLon)
VALUES ("2016-02-02", "14:35:43", "12.1006", "-86.2435");

Insertar datos (GET):
localhost/site/scripts/update.php?date=2016-12-12&time=01:41:40&lat=12.1006&lon=-86.2435

Comandos AT (SIM900):

Recordar que [CR] = 0x0D, [LF] = 0x0A, [SUB] = 0x1A, (26), <ctrl+z>

AT [CR][LF]
AT+CPIN? [CR][LF]
AT+CSQ [CR][LF]
AT+CREG? [CR][LF]
AT+CGATT? [CR][LF]
AT+CGATT=1 [CR][LF]

AT+CSTT [CR][LF]
AT+CIICR [CR][LF]
AT+CIFSR [CR][LF]

AT+CIPSTATUS [CR][LF]

AT+CIPSTART="TCP","website.com",80 [CR][LF]
AT+CIPSEND [CR][LF]

GET /scripts/update.php?date=2016-12-12&time=01:41:40&lat=12.1006&lon=-86.2435 HTTP/1.0 [CR][LF]
Host: website.com [CR][LF]
Connection: close [CR][LF]
[CR][LF]
[SUB] 

Terminal:

Para este ejemplo he usado una simple terminal que he programado en QT5 framework C++, pero tu puedes usar cualquier terminal disponible Putty, TeraTerm, minicom, moserial, etc.

sydbernard terminal (QT5 C++)

Descargar Código fuente
Disculpen si no respondí antes, password: "sydbernard", "sydbernard1", "maniacmansion" ,"maniacmanison1". Alguno ha de servir.



SIM900 GPRS

GET (mysql,php)


sábado, 17 de septiembre de 2016

SD card, BMP file & TFT [PIC24/dsPIC33]


Leer un archivo BMP almacenado en una SDC mediante la librería ELM-Chan y posteriormente presentar la imagen en un Display (320x240) TFT 2.8 (ILI9325) usando una librería de SEEED studio. La librería incluye funciones para dibujar círculos, cuadros, caracteres, strings, etc.

En el caso de la librería ElM-Chan está en capacidad de leer y escribir archivos en la SDC.

Más información sobre el formato BMP.

Microcontrolador (16 bits)
dsPIC33FJ64GP202
PIC24HJ64GP802

dsPIC33FJ
schmtcs


Descargar Código fuente  (C Code)



SD Card, ElM-Chan Lib






miércoles, 7 de septiembre de 2016

MPL3115A2 sensor (GCC), Linux MySQL/postgreSQL

MPL3115A2 (Language C) Linux MySQL (Banana Pi/Raspberry Pi)

The MPL3115A2 is a compact piezoresistive absolute pressure sensor with an I2C interface. MPL3115A2 has a wide operating range of 20 kPa to 110 kPa, a range that covers all surface elevations on earth. The fully internally compensated MEMS in conjunction with an embedded high resolution 24-bit equivalent ADC provide accurate pressure (Pascals)/altitude (meters) and temperature (°C) data.(see DataSheet, AN4481, AN4519)

Direct reading:

Pressure: 20-bit measurement (Pascals)
Altitude: 20-bit measurement (meters)
Temperature: 12-bit measurement (°C)

MPL3115A2
Simple test MPL3115A2 with a BananaPi. Using the I2C library functions (WiringPi), we communicate with the sensor, then the data is stored in MySQL/postgreSQL database.


CREATE DATABASE sensor;


CREATE TABLE sensor.samples(
 sampleId INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
 sampleDate DATE,
 sampleTime TIME,
 sampleTemperature DOUBLE,
 sampleAltitude DOUBLE,
 samplePressure DOUBLE) default character  set utf8;

Download source code


   MYSQL *conn;
   MYSQL_RES *res;
   //MYSQL_ROW fila;

   char *server = "localhost";
   char *user = "sydbernard";
   char *password = "secreto";
   char *database = "sensor";
   
   conn = mysql_init(NULL);
   
   // Connect to database //
   if (!mysql_real_connect(conn, server,
         user, password, database, 0, NULL, 0)) {
      fprintf(stderr, "%s\n", mysql_error(conn));
      exit(1);
   }

   ...

   /* send SQL query */
   if (mysql_query(conn, buffer)) {
       fprintf(stderr, "%s\n", mysql_error(conn));
       exit(1);
   }
    

To Compile:

$ gcc -Wall -c main.c MPL3115A2.c
$ gcc -Wall -o mpl main.o MPL3115A2.o -l wiringPi -lmysqlclient

wiringBPi



Table MySQL


MySQL

PostgreSQL

PostgreSQL is an object-relational SQL database management system.

Header files and static library for compiling C programs to link with the libpq library in order to communicate with a PostgreSQL database backend.

sudo apt-get install libpq-dev
____________________________

create table samples(
 sampleId SERIAL PRIMARY KEY,
 sampleTemperature DOUBLE precision,
 sampleAltitude DOUBLE precision,
 samplePressure DOUBLE precision
);

PGresult *res;
PGconn *pgConn = PQconnectdb("dbname=sensor hostaddr=127.0.0.1 \
                               user=sydbernard password=snoopy");
if (PQstatus(pgConn) != CONNECTION_OK)
{
   fprintf(stderr, "Connection to database failed: %s",
   PQerrorMessage(pgConn));
}

...

sprintf(buffer,"INSERT INTO samples (sampleTemperature,sampleAltitude,samplePressure) \
VALUES (%.2f, %.2f, %.2f);",temperature, altitude, pressure);

/* send SQL query */
res = PQexec(pgConn, buffer);
if (PQresultStatus(res) != PGRES_COMMAND_OK)
{
 fprintf(stderr, ">%s", PQerrorMessage(pgConn));
 PQclear(res);
       
}
 
Source Code Download
 
postgreSQL