Arduino - uso de comunicaciones

Enunciado del problema

Se trata de realizar un proyecto donde se use alguno de los protocolos de comunicaciones. A ser posible almacenar datos de alguna manera (todas las placas Arduino tienen almacenamiento EEPROM).

Ejercicio propuesto

Se propone realizar un montaje que incluya un sensor de presencia PIR y un pulsador. El sistema debe contabilizar el número de detecciones realizadas y almacenarlas en la memoria EEPROM. Es importante tener en cuenta que cada celda de memoria tiene un tamaño de 1 byte por lo que el rango de posibles valores a almacenar está comprendido entre 0 y 255. Por otro lado, también es importante tener en cuenta que la memoria consta de 512 celdas.

Cada vez que se presione el pulsador se mostrará por la salida estándar del PC el número de detecciones realizadas hasta el momento. La pulsación del botón se tratará mediante interrupciones.

Montaje

Para resolver el ejercicio, se ha utilizado un arduino UNO, un pulsador y un sensor PIR para la detección de presencia.

El pulsador está montado con el uso de una resistencia y conectado al pin 2 para el tratamiento de interrupciones.

El sensor PIR dispone de 3 cables; uno de ellos debe ir conectado a la toma de corriente de 5v, otro a tierra (gnd) y, finalmente, el tercero a una de las entradas digitales para realizar la lectura (1 detecta movimiento, 0 no existe presencia).

Software desarrollado

En el software desarrollado se realiza la declaración de tres variables:

    • pinPIR: pin en Arduino donde está conectado el sensor de presencia.

    • Direccion: dirección de la memoria EEPROM donde se realizará la escritura.

    • Ndetecciones: número de detecciones realizadas hasta el momento por el sensor

En la función setup() se realiza la siguiente configuración:

    • sensor PIR como elemento digital de entrada

    • Se inicializa la comunicación en serie para poder imprimir por la pantalla del PC el número de detecciones, cuando se presione el pulsador.

    • Definición de interrupciones: attachInterrupt(0, pulsacion, CHANGE); Cuando se detecte la interrupción automáticamente se realiza la llamada a la función pulsacion(). El pulsador está conectado al pin 2, debido a que la interrupción cero está asociada a este pin por definición.

En la función loop() siempre se repite el mismo proceso:

    1. Si el sensor de presencia detecta movimiento o, lo que es lo mismo, su valor de salida es HIGH:

        1. Se incrementa el número de detecciones, almacenadas en la variable ndetecciones.

        2. Si el número de detecciones supera el valor 255 (1 byte):

            1. Se vuelve a poner a 1

            2. Se incrementa la dirección en 1.

            3. Si la dirección es igual al valor 512 (posiciones de memoria de la 0 a la 511), entonces vuelve a ponerse a cero, sobreescribiendo el valor anterior.

La idea se almacenar un máximo de 255 detecciones por cada una de las celdas de memoria.

La función pulsación() se activa cada vez que se presiona el botón (capturado mediante interrupciones) y se suman los valores numéricos almacenados en las celdas de memoria, desde la posición o dirección cero hasta el valor que indique la variable direccion.

Código fuente

/* Sensor de presencia que registra en la memoria EEPROM las detecciones realizadas Cuando se presiona un pulsador se muestra por la salida estandar, el numero total de detecciones realizadas desde que se inicio arduino. Importante tener en cuenta que en cada celda de memoria solo se puede guardar un byte. Por este motivo, cuando se sobrepasen 255 detecciones hay que utilizar la siguiente celda de memoria */

#include <EEPROM.h>

int pinPIR= 4; //sensor PIR de presencia int direccion = 0; //direccion de memoria en EEPROM int ndetecciones = 0;

void setup() { // declare the ledPin as an OUTPUT: pinMode(pinPIR, INPUT);

//inicializacion de la salida estandar Serial.begin(9600);

//definicion de interrupcion attachInterrupt(0, pulsacion, CHANGE); }

void loop() {

if (digitalRead(pinPIR) == HIGH){ ndetecciones = ndetecciones + 1;

if (ndetecciones > 255){ //en una celda de memoria solo se pueden guardar valores direccion = direccion + 1; //si la direccion sobrepasa el maximo (512) volvemos a la direccion cero if (direccion == 512) direccion = 0; ndetecciones = 1; } EEPROM.write(direccion, ndetecciones); } delay(50); }

//funcion a la que se llama cuando se presiona el pulsador void pulsacion(){ //se muestra el total de detecciones int total = 0; for (int i = 0; i <= direccion; i++) total = total + EEPROM.read(i); Serial.println(total); }