
Tutorial Sensores Avanzados
Ok es cierto, ya sabemos leer datos de un sensor de Temperatura y Humedad. Estos son datos que podemos obtener fácilmente de muchas fuentes. Pero si quisiéramos datos mas específicos como para hacer una estación ambiental?
Requisitos:
- Computadora (mac)
- Arduino UNO. Aqui utilizamos la UNO por el pinout que es identico al del Grove Shield. El pinout (osea las conexiones) de la MEGA son ligeramente distintas.
- Sensores CO2 & Polvo (Dust) tipo Grove
- Breadboard
- Grove Shield
- Arduino IDE (https://www.arduino.cc/en/Main/Software)
La tarjeta Grove Shield es una shield y como tal se ensambla sobre la UNO.

Esta shield tiene 4 puertos para sensores análogos, 8 puertos para sensores digitales y 4 puertos para sensores con conexión tipo I2C que es un protocolo de conexión digital avanzada.
Nosotros estaremos usando 2 sensores; (1) de CO2 y (2) de Dust o Polvo. Iniciemos con el sensor de polvo:

Es tan sencillo como conectarlo a uno de los puertos digitales marcados con una “D” en la Grove shield y luego ensamblar la Grove Shield sobre la UNO de la siguiente manera:

El código es aun mas sencillo:
int pin = 2;
unsigned long duration;
unsigned long starttime;
unsigned long sampletime_ms = 30000;//sampe 30s ;
unsigned long lowpulseoccupancy = 0;
float ratio = 0;
float concentration = 0;
void setup() {
Serial.begin(9600);
pinMode(8,INPUT);
starttime = millis();//get the current time;
}
void loop() {
duration = pulseIn(pin, LOW);
lowpulseoccupancy = lowpulseoccupancy+duration;
if ((millis()-starttime) > sampletime_ms)//if the sampel time == 30s
{
ratio = lowpulseoccupancy/(sampletime_ms*10.0); // Integer percentage 0=>100
concentration = 1.1*pow(ratio,3)-3.8*pow(ratio,2)+520*ratio+0.62; // using spec sheet curve
Serial.print(lowpulseoccupancy);
Serial.print(",");
Serial.print(ratio);
Serial.print(",");
Serial.println(concentration);
lowpulseoccupancy = 0;
starttime = millis();
}
}
De donde sale el código para saber que el dato que genera el sensor, aqui leido como pulseIn, es lo que es y que significa? Facil! El fabricante de los sensores suele proveer la documentación que define los datos:
http://www.seeedstudio.com/wiki/Grove_-_Dust_Sensor
En este caso el fabricante de la Grove Shield da la información necesaria pero los fabricantes de los módulos también.
Subamos el código a la UNO.
El resultado de este proyecto se puede ver aquí:

También tenemos a disposición un sensor de CO2. En este caso conectas el sensor al D8 de la Grove Shield (D8 usa los pines 7 & 8). El sensor es este:

El código es un poco mas complejo pero repasémoslo brevemente:
#include <SoftwareSerial.h>
#define DEBUG 0
const int pinRx = 8;
const int pinTx = 7;
SoftwareSerial sensor(pinTx,pinRx); //Definimos los pines Rx/Tx
const unsigned char cmd_get_sensor[] = {
0xff, 0x01, 0x86, 0x00, 0x00,
0x00, 0x00, 0x00, 0x79
};
unsigned char dataReceive[9]; //Creamos un array de data
int temperature;
int CO2PPM; //Creamos un par de variables
void setup() {
sensor.begin(9600);
Serial.begin(115200);
Serial.println("get a 'g', begin to read from sensor!");
Serial.println("********************************************************");
Serial.println(); // iniciamos el monitor serial
}
void loop() {
if(dataReceive()) {
Serial.print("Temperature: ");
Serial.print(temperature);
Serial.print(" CO2: ");
Serial.print(CO2PPM);
Serial.println(""); //Si recibimos data, la imprimimos
}
delay(1000);
}
bool dataReceive(void) { //la data la pedimos al sensor
byte data[9];
int i = 0;
//transmit command data
for(i=0; i<sizeof(cmd_get_sensor); i++) {
sensor.write(cmd_get_sensor[i]);
}
delay(10);
//begin reveiceing data
if(sensor.available()) { //Si el sensor esta disponible...
while(sensor.available()) {
for(int i=0;i<9; i++) {
data[i] = sensor.read(); //Leemos la data
}
}
}
#if DEBUG
for(int j=0; j<9; j++) {
Serial.print(data[j]);
Serial.print(" ");
}
Serial.println("");
#endif
if((i != 9) || (1 + (0xFF ^ (byte)(data[1] + data[2] + data[3]
+ data[4] + data[5] + data[6] + data[7]))) != data[8]) {
return false; //Verificamos que la data es valida
}
CO2PPM = (int)data[2] * 256 + (int)data[3];
temperature = (int)data[4] - 40;
return true; //Si es valida, la almacenamos en las variables creadas
}
Los resultados son así:

Ok ya sabemos utilizar varios sensores para crear una estación de datos (en este caso ambiental) que genere los datos. Que tal si:
- Pudiéramos comunicar esos datos a otros dispositivos?
- Y si esos dispositivos estuvieran conectados al internet?
- Quizás podríamos crear un web service que provea datos al publico!
Que interesante! Veamos como podemos ahora conectar una MEGA al internet 🙂