Tecnologia vestible

Per començar Elements d'entrada Programació CircuitPython   Recursos CITCEA
Elements no electrònics Elements de sortida Programació Arduino    
Projectes Elements de control Dades pràctiques   Inici

Smart Backpack

Smart Backpack és una motxilla que informa a l'usuari de la seva temperatura corporal així com de la direcció del nord i l'altura.

La llista de materials principals és la següent:

1   Placa Flora

1   Sensor GPS

1   Sensor de temperatura

1   Sensor d'acceleració i camp magnètic

1   NeoPixel

1   NeoPixel Ring de 16 LED

1   Tira de LED

Les següents figures mostren la distribució dels elements a la motxilla.

Vista general

Vista butxaca

A continuació tenim el llistat del programa:

#include <Adafruit_NeoPixel.h>
#include <Wire.h>
#include <Adafruit_Sensor.h>
#include <Adafruit_LSM303.h> 
#include <Adafruit_GPS.h>
Adafruit_NeoPixel cadena = Adafruit_NeoPixel(27, 12, NEO_GRB + NEO_KHZ800);
// Una cadena de 26 NeoPixel a la pota 12
//NeoPixel 0 - Temperatura
//NeoPixel 1-16 - Camp Magnètic
//Neopixel 17-26 - GPS
Adafruit_GPS SensorGPS(&Serial1);  // Definim el sensor i li diem que faci servir la connexió Serial1
Adafruit_LSM303 lsm;
boolean usingInterrupt = false;   // No farem servir interrupcions
uint32_t groc = cadena.Color(255, 255, 0);  // Defineix el color groc
uint32_t vermell = cadena.Color(255, 0, 0);  // Defineix el color vermell
uint32_t verd = cadena.Color(0, 255, 0);  // Defineix el color verd
void setup () {
	cadena.begin (); //Inicialitza els NeoPixels
	cadena.show ();
	Serial.begin(9600); //Temperatura
	pinMode(10, INPUT); //Pin 10 Temperatura
	SensorGPS.begin(9600);    // Comunicació amb el sensor GPS
	SensorGPS.sendCommand(PMTK_SET_NMEA_OUTPUT_RMCGGA); // Configuració del sensor
	SensorGPS.sendCommand(PMTK_SET_NMEA_UPDATE_1HZ);   // El sensor envia dades un cop cada segon (1 Hz)
	delay(1000);    // Espera un segon a que el GPS s'inicialitzi amb la configuració
	lsm.begin ();
}
void loop() {
	//Sensor Temperatura
	float lect=analogRead(A10); //Sensor connectat #10. A10 correspon a l'entrada analògica
	float temp=(lect*0.54)-98.37; //Conversió de lectura a temperatura
	Serial.println("Lectura: ");
	Serial.println(lect);
	Serial.println("Temperatura: ");
	Serial.println(temp);
	if (temp > 35) {
		cadena.setPixelColor(0, 0, 255, 0);  // Pixel 0 verd
		cadena.show(); // Actualitza  
		delay (500);
	}
	if (temp > 33 && temp < 35) {
		cadena.setPixelColor(0, 255, 255, 0);  // Pixel 0 groc
		cadena.show(); // Actualitza  
		delay (500);
	}
	if (temp > 31 && temp < 33) {
		cadena.setPixelColor(0, 255, 0, 0);  // Pixel 0 verd
		cadena.show(); // Actualitza
		delay (500);
	}
	if (temp < 31) {
	    for (int i=0; i<3; i++) {
			cadena.setPixelColor(0, 255, 0, 0);
			cadena.show(); // Actualitza
			delay (500);
			cadena.setPixelColor(0, 0, 0, 0);  // Pixel 0 vermell intermitent
			cadena.show(); // Actualitza
			delay (500);
		}
	}
	//Sensor GPS
	char dades = SensorGPS.read();  // Llegim dades del Sensor GPS
	if (SensorGPS.newNMEAreceived()) {    // Si han arribat dades del sensor
		Serial.println(SensorGPS.lastNMEA());   // Envia a l'ordinador les dades llegides
		if (!SensorGPS.parse(SensorGPS.lastNMEA())) {   // Mira si les dades tenen informació útil
			return;  // Si no, torna a començar el loop per llegir dades noves
		}
	}
	Serial.print("Altitud: ");
	Serial.print(SensorGPS.altitude);
	Serial.println(" m");
	int a = SensorGPS.altitude/500;
	int b=0;
	if (1 <= a < 2){
		b = 1;
		cadena.setPixelColor(26, 255, 0, 255);
		cadena.show ();
	}
	if (2 <= a < 3){
		b = 2;
		cadena.setPixelColor(26, 0, 255, 255);
		cadena.show ();
	}
	if (3 <= a < 4){
		b = 3;
		cadena.setPixelColor(26, 0, 255, 0);
		cadena.show ();
	}
	if (4 <= a < 5){
		b = 4;
		cadena.setPixelColor(26, 255, 255, 0);
		cadena.show ();
	}
	if (5 <= a < 6){
		b = 5;
		cadena.setPixelColor(26, 255, 128, 0);
		cadena.show ();
	}
	if (6 <= a < 7){
		b = 6;
		cadena.setPixelColor(26, 255, 0, 0);
		cadena.show ();
	}
	if ( (a - b)!= 0 ) {
		int num_pixel = (a - b)*10; //Nombre de NeoPixels de la cadena a encendre
		cadena.setPixelColor(26-num_pixel, 255, 255, 255);
		cadena.show ();
	}
	//Sensor Camp Magnètic
	lsm.read();
	Serial.print("Mag X: "); Serial.print((int)lsm.magData.x);     Serial.print(" "); 
	Serial.print("Y: "); Serial.print((int)lsm.magData.y);         Serial.print(" ");
	Serial.print("Z: "); Serial.println((int)lsm.magData.z);       Serial.print(" ");
	delay(1000); //Valors del camp magnètic dels tres eixos
	float Pi = 3.14159;
	float angle = (atan2((int)lsm.magData.y,(int)lsm.magData.x) * 180) / Pi; //Càlcul angle vectors y i z
	if (angle < 0){
		angle = 360 + angle;
	} // Normalize to 0-360
	Serial.print("Angle: ");
	Serial.print(angle); //Escriu l'angle calculat 
	if (angle >= 348.75 or angle < 11.25) {
		cadena.setPixelColor(1, 0, 0, 100);  // Pixel de color blau
		cadena.show(); // Actualitza
	}
	if (angle >= 11.25 && angle < 33.75) {
		cadena.setPixelColor(16, 0, 0, 100);  // Pixel de color blau
		cadena.show(); // Actualitza
	}
	if (angle >= 33.75 && angle < 56.25) {
		cadena.setPixelColor(15, 0, 0, 100);  // Pixel de color blau
		cadena.show(); // Actualitza
	}
	if (angle >= 56.25 && angle < 78.75) {
		cadena.setPixelColor(14, 0, 0, 100);  // Pixel de color blau
		cadena.show(); // Actualitza
	}
	if (angle >= 78.75 && angle < 101.25) {
		cadena.setPixelColor(13, 0, 0, 100);  // Pixel de color blau
		cadena.show(); // Actualitza
	}
	if (angle >= 101.25 && angle < 123.75) {
		cadena.setPixelColor(12, 0, 0, 100);  // Pixel de color blau
		cadena.show(); // Actualitza
	}
	if (angle >= 123.75 && angle < 146.25) {
		cadena.setPixelColor(11, 0, 0, 100);  // Pixel de color blau
		cadena.show(); // Actualitza
	}
	if (angle >= 146.25 && angle < 168.75) {
		cadena.setPixelColor(10, 0, 0, 100);  // Pixel de color blau
		cadena.show(); // Actualitza
	}
	if (angle >= 168.75 && angle < 191.25) {
		cadena.setPixelColor(9, 0, 0, 100);  // Pixel de color blau
		cadena.show(); // Actualitza
	}
	if (angle >= 191.25 && angle < 213.75) {
		cadena.setPixelColor(8, 0, 0, 100);  // Pixel de color blau
		cadena.show(); // Actualitza
	}
	if (angle >= 213.75 && angle < 236.25) {
		cadena.setPixelColor(7, 0, 0, 100);  // Pixel de color blau
		cadena.show(); // Actualitza
	}
	if (angle >= 236.25 && angle < 258.75) {
		cadena.setPixelColor(6, 0, 0, 100);  // Pixel de color blau
		cadena.show(); // Actualitza
	}
	if (angle >= 258.75 && angle < 281.25) {
		cadena.setPixelColor(5, 0, 0, 100);  // Pixel de color blau
		cadena.show(); // Actualitza
	}
	if (angle >= 281.25 && angle < 303.75) {
		cadena.setPixelColor(4, 0, 0, 100);  // Pixel de color blau
		cadena.show(); // Actualitza
	}
	if (angle >= 303.75 && angle < 326.25) {
		cadena.setPixelColor(3, 0, 0, 100);  // Pixel de color blau
		cadena.show(); // Actualitza
	}
	if (angle >= 326.25 && angle < 348.75) {
		cadena.setPixelColor(2, 0, 0, 100);  // Pixel de color blau
		cadena.show(); // Actualitza
	}
	delay (1000); //Mantenim els LED encesos
	for (int i=1; i<27; i++) {
		cadena.setPixelColor(i, 0, 0, 0); //Apaguem tots els LED 
	}
	cadena.show();
}

 

 

 

En aquest web, les fotografies marcades amb [AF] són del web d'Adafruit, les marcades amb [SF] del web d'Sparkfun i les marcades amb [AU] del web d'Arduino.

 

 

 

 

 

 

 

 

 

 

Llicència de Creative Commons
Aquesta obra d'Oriol Boix està llicenciada sota una llicència no importada Reconeixement-NoComercial-SenseObraDerivada 3.0.