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

SureSurf

SureSurf és un sistema de salvament per a esports aquàtics. El sistema mesura el ritme cardíac i quan detecta que hi ha un risc per a l'usuari perfora la vàlvula d'una bombona de CO2 que infla un flotador.

Per perforar la vàlvula de la bombona fan servir un actuador lineal accionat per un solenoide. Atès que la força d'aquest actuador no és suficient, es fa servir un detonador basat en unes molles pretensades que s'alliberen quan s'activa el solenoide. La fotografia següent mostra el sistema disparador.

disparador

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

1   Placa Flora

1   Sensor de ritme cardíac

1   Actuador linial

1   Transistor Darlington TIP120

1   Díode 1N4004

1   NeoPixel

1   Polsador

1   Resistència de 10 kΩ

La figura següent mostra l'esquema de connexions.

esquema

A continuació tenim el llistat del programa:

#include <PulseSensorPlayground.h>
#include <Adafruit_NeoPixel.h>
#define USE_ARDUINO_INTERRUPTS true
Adafruit_NeoPixel cadena = Adafruit_NeoPixel(1, 10, NEO_GRB + NEO_KHZ800);   // Deu NeoPixel a la pota
//defineix colors
uint32_t groc = cadena.Color(255, 255, 0);
uint32_t blau = cadena.Color(0, 0, 255);
uint32_t verd = cadena.Color(0, 255, 0);
uint32_t tronja = cadena.Color(255, 105, 0);
unsigned long time;
//defineix pins d'entrada: polsador 12  led 10  sensor de pols 7a (6 en versio analogica)
const int PIN_INPUT = A7;
const int PIN_BLINK = 7;    // Pin 13 is the on-board LED
const int PIN_FADE = 5;
const int THRESHOLD = 450;   // Adjust this number to avoid noise when idle
const int OUTPUT_TYPE = SERIAL_PLOTTER;
//Variables de pins diferents al del sensor
int pols = 12;
int lectura;
int solenoidPin = 0;
//Variables d'inicialitzacio i finialtzacio del sistema
int iniciar = 0;
int finalitzar = 0;
//Variables de comprovacio de lectures de pols, s'executen abans de
// poder activar el sistema i tot just despres de apagar-lo.
int check = 0;
int recheck = 0;
//Variables comprovacio de auxili
int risk = 0;
int normal = 0;
//Variable que controla els cops que s'ha accionat el solenoide
int flotador = 0;
PulseSensorPlayground pulseSensor;
void setup() {
	Serial.begin(115200);
	time = millis();
	pinMode(pols, INPUT); // El polsador és una entrada
	cadena.setPixelColor(0, verd);  // Pixel 0 vermell
	cadena.begin();  // Inicialitza els NeoPixels
	cadena.show();
	pulseSensor.analogInput(PIN_INPUT);
	pulseSensor.blinkOnPulse(PIN_BLINK);
	pulseSensor.fadeOnPulse(PIN_FADE);
	pulseSensor.setSerial(Serial);
	pulseSensor.setOutputType(OUTPUT_TYPE);
	pulseSensor.setThreshold(THRESHOLD);
	pinMode(solenoidPin, OUTPUT);
	if (!pulseSensor.begin()) {
    	/*
		PulseSensor initialization failed,
		likely because our particular Arduino platform interrupts
		aren't supported yet.
		If your Sketch hangs here, try ProcessEverySample.ino,
		which doesn't use interrupts.
		*/
		for (;;) {
			Flash the led to show things didn't work.
			digitalWrite(PIN_BLINK, LOW);
			delay(50);
			digitalWrite(PIN_BLINK, HIGH);
			delay(50);
		}
	}
}
void loop(){
	delay(20);
	// write the latest sample to Serial.
	pulseSensor.outputSample();
	/*
	If a beat has happened since we last checked,
	write the per-beat information to Serial.
	*/
	if (iniciar == 0) {
		if (pulseSensor.sawStartOfBeat()) {
			cadena.setBrightness(0);
			cadena.show();
			delay(35);
			pulseSensor.outputBeat();
			check = check + 1;
			recheck = 0;
		} else {
			recheck = recheck + 1;
			if (recheck == 800) {
				check = 0;
				recheck = 0;
			}
		}
	}
	if (iniciar < 250) {
		Serial.print("Comprovant lectures de pols: \n");
		Serial.print("Contador check: ");
		Serial.println(check);
		Serial.print("Contador recheck: ");
		Serial.println(recheck);
	}
	lectura = digitalRead(pols); // Llegim el polsador
	iniciar = iniciar + lectura; //Suma un cada COP QUE FA EL LOOP i que tenim el polsador apretat
	//Serial.println(lectura);
	if (iniciar < 250) {
		Serial.print("Compte d'inicialitzacio: ");
		Serial.println(iniciar);
	}
	Serial.print("BPM; ");
	Serial.println(pulseSensor.getBeatsPerMinute());
	if (check >= 30) {
		if (iniciar < 250) {
			Serial.print("El Sistema  pot ser Activat. \n");
		}
		if (iniciar >= 250) { // Si està premut EL TEMPS NECESSARI PER A QUE INICIAR ARRIBI A 250
			if (pulseSensor.sawStartOfBeat()) {
				cadena.setBrightness(0);
				cadena.show();
				delay(35);
			}
			Serial.print("Sistema Activat. f");
			cadena.setBrightness(10);
			cadena.setPixelColor(0, blau);
			cadena.show();
			Serial.print("SOS; ");
			Serial.println(risk);
			Serial.print("OK;  ");
			Serial.println(normal);
			//aqui va el if del solenoide
			if (pulseSensor.getBeatsPerMinute() > 180 or pulseSensor.getBeatsPerMinute() < 20) {
				if (risk == 0 && normal > 0) {
					normal = 10;
				}
				risk = risk + 1;
				normal = normal - 1;
			} else {
				normal = normal + 1;
			}
			if (risk < 100 && normal > 400) {
				risk = 0;
				normal = 0;
			}
			if (risk >= 100) {
				flotador = flotador + 1;
				digitalWrite(solenoidPin, HIGH);
				Serial.print("FLOTADOR!!!\n");
				cadena.setPixelColor(0, tronja);
				cadena.show();
				delay(1000);
				cadena.setPixelColor(0, blau);
				cadena.show();
				delay(1000);
				cadena.setPixelColor(0, groc);
				cadena.show();
				delay(1000);
				digitalWrite(solenoidPin, LOW);
				if (flotador == 3) {
					risk = 0;
					flotador = 0;
				}
			}
			finalitzar = finalitzar * lectura;
			if (lectura == HIGH) { //Si es torna a premer el polsador
				cadena.setPixelColor(0, groc);
				cadena.show();
				finalitzar = finalitzar + lectura;
				Serial.print("Compte de finalitzacio: ");
				Serial.println(finalitzar);
				if (finalitzar >= 320) {
					iniciar = 0;
					finalitzar = 0;
					Serial.print("Sistema Desactivat. \n");
					Serial.print("Reiniciem comprovacio lectures de pols \n");
					check = 0;
				}
			}
		} else {
			finalitzar = finalitzar * lectura;
			iniciar = iniciar * lectura;
			cadena.setBrightness(10);
			cadena.setPixelColor(0, verd);
			cadena.show();
		}
	} else {
		cadena.setBrightness(10);
		cadena.setPixelColor(0, tronja);
		cadena.show();
		iniciar = 0;
	}
}

 

 

 

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.