| 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 é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.

La llista de materials principals és la següent:
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.

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.

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