Narcosimetro

Para aquellos manitas que saben hacer lo que los demás compramos.
Responder
Mensaje
Autor
Mr Bomori
Open Weber Diver 1*
Open Weber Diver 1*
Mensajes: 67
Registrado: 07/May/2019, 10:31

Narcosimetro

#1 Mensaje por Mr Bomori »

Buenas,
supongo que más de uno, está familiarizado con el "experimento" de DAN, para medir los efectos de la narcosis...
Se trata de un dispositivo, un una lucecita parpadeando cada vez más rápido... y llega un punto, que el que realiza el experimento, deja de ver una luz parpadeante, y ve una luz fija.
Entonces se apunta la frecuencia del parpadeo, y se realiza la misma prueba: a diferentes profundidades, después de un buceo profundo, etc etc....
Más info en:
https://alertdiver.eu/es_ES/articulos/m ... gas-inerte

Pues el tema, es que me he propuesto fabricar el aparatito este... con un Arduino mini , una pila de 9v, un led... i un par de botones.
Para solucionar el tema de la estanqueidad, por ahora voy a usar una caja de una GoPro.. así ya puedo usar los botones incluidos en la caja...
Os pongo el código del Arduino que he hecho... por ahora, así como una foto del simulador con el circuito... Lo tengo a medio montar... cuanto tenga un poco más avanzado el proyecto, si queréis fotos, las puedo colgar....
Si algún iluminado con la programación en Arduino, quiere mejorar el código... será más que bienvenida cualquier mejora.

La simulación, la hago con el "SimulIDE"...

Código: Seleccionar todo

// Incluimos la libreria LiquidCrystal SOLO
// para el SIMULADOR, REMOVER EN PROYECTO FINAL
#include <LiquidCrystal.h>   

// Librerias para Display 7 Segmentos x 4 y gestión de botones
#include <TM1637Display.h>
#include <Bounce2.h>

// Pines de Botones y Display
#define PinUP 0
#define PinDOWN 1
#define PinON 4
// Pines del display 7 Segmentos
#define CLK 2
#define DIO 3

// REMOVER EN PROYECTO FINAL
LiquidCrystal lcd(7, 8, 9, 10, 11, 12, 13); //(RS,RW, E, D4,D5, D6, D7)

// Definiciion de Botones:
Bounce btON = Bounce();
Bounce btUP = Bounce();
Bounce btDOWN = Bounce();

// Pin Usado para iluminar al LED
const int PIN_PARPADEO = 5;

// Ya tenemos en uso todos los pines del MiniArduino (del 0 al 5)

// Definicion de Variables del programa
unsigned long INTERVALO_CAMBIO=300UL;
unsigned long INTERVALO_LED = 40000UL;
unsigned long intervalo = 20UL;
unsigned long evento_parpadeo;
unsigned long evento_cambio;
bool seguir= false;
int cont = 0;

// Definicion de mensajes para el Display 7 Segmentos
const uint8_t SEG_DONE[] = {
  SEG_B | SEG_C | SEG_D | SEG_E | SEG_G,           // d
  SEG_A | SEG_B | SEG_C | SEG_D | SEG_E | SEG_F,   // O
  SEG_C | SEG_E | SEG_G,                           // n
  SEG_A | SEG_D | SEG_E | SEG_F | SEG_G            // E
  };
const uint8_t SEG_ON[] = {
  SEG_A | SEG_B | SEG_C | SEG_D | SEG_E | SEG_F,   // O
  SEG_C | SEG_E | SEG_G                            // n
  };  
const uint8_t SEG_OFF[] = {
  SEG_A | SEG_B | SEG_C | SEG_D | SEG_E | SEG_F,   // O
  SEG_A | SEG_E | SEG_G | SEG_F,                   // f
  SEG_A | SEG_E | SEG_G | SEG_F                    // f
  };

// Definicion del objeto Display 
TM1637Display display(CLK, DIO);

// Funcion para realizar el parpadeo en el led indicado
void toggleLed(int LED){
  if( digitalRead( LED ) ) {
      digitalWrite(LED, LOW);
  }  else {
      digitalWrite(LED, HIGH);
  }
}

void setup() {
	
	btON.attach( PinON ,  INPUT_PULLUP ); 
	btUP.attach( PinUP ,  INPUT_PULLUP ); 
	btDOWN.attach( PinDOWN ,  INPUT_PULLUP ); 

	// INTERVALO DEBOUNCE EN MILISEGUNDOS
  	btON.interval(5); 
  	btUP.interval(5); 
  	btDOWN.interval(5);

  	// CONFIGURAR PIN DE LED COMO SALIDA
  	pinMode(PIN_PARPADEO, OUTPUT);
  	
	cont=0;
	
	display.showNumberDec(0, true); 
	// REMOVER EN PROYECTO FINAL	
	lcd.begin(16, 2);
	
}

void loop() {
  // Gestion del tiempo: 
  unsigned long actual = millis();
  unsigned long Mactual = micros();
  
  // Actualizamos estado de los botones: 
  btON.update();
  btUP.update();
  btDOWN.update();
  
  // Si se pulsa el boton, cambia el estado (si restaba, para, si estaba parado, sigue)
  if (btON.changed()) {
	cont=cont +1;
    if (cont >=2) {
		cont=0;
		if (seguir) {
		  display.clear();
		  //display.setSegments(SEG_OFF, 3, 1);
		  display.showNumberDec(INTERVALO_LED);  
		  
		  // REMOVER EN PROYECTO FINAL	
		  borrarLCD();
		  lcd.setCursor(0, 0);   	// Pone el cursor en la primera fila: Coordenadas (0,0)
		  lcd.print("STOP     ");   // Escribe el LCD
		  lcd.setCursor(0, 1);   	// Ponemos el cursor en la segunda Fila: Coordenadas (0,1)
		  lcd.print(INTERVALO_LED); // Escribe el LCD
		  
		  
		} else {
		  //display.setSegments(SEG_ON,2,2);
		  display.clear();
		  
		  // REMOVER EN PROYECTO FINAL	
		  borrarLCD();
		  lcd.setCursor(0, 0);   
		  lcd.print("Restando    "); 
		  
		 }
		 seguir=!seguir;
	}
   }
	if (btUP.changed()) {
		cont=cont +1;
		if (cont >=2) {
			cont=0;
			INTERVALO_LED += 1UL;
			
			// REMOVER EN PROYECTO FINAL	
			lcd.setCursor(0, 1);   
	      	lcd.print(INTERVALO_LED);
		}
	}
	if (btDOWN.changed()) {
		cont=cont +1;
		if (cont >=2) {
			cont=0;
			INTERVALO_LED -= 1UL;
			
			// REMOVER EN PROYECTO FINAL	
			lcd.setCursor(0, 1);   
	      	lcd.print(INTERVALO_LED);
		}
	}

  if( Mactual > evento_parpadeo ){
    toggleLed(PIN_PARPADEO);
    evento_parpadeo += INTERVALO_LED;
  }
  
  if( actual > evento_cambio ){
    evento_cambio += INTERVALO_CAMBIO;
    if (seguir) {
      if (INTERVALO_LED> 200 ) {
        intervalo = 10UL;
      } else 
      	if (INTERVALO_LED > 50 ) {
        		intervalo = 5UL;      
      	} else
      		if (INTERVALO_LED > 10 ) {
		    		intervalo = 2UL;   
        			INTERVALO_CAMBIO=400UL;   
			} else 
		      if (INTERVALO_LED < 10 ) {
				intervalo = 1UL;
		        INTERVALO_CAMBIO=800UL;   
      		  } 
      	      if ( INTERVALO_LED > 1 ) {
        			INTERVALO_LED -= intervalo; 
		      } else 
		        intervalo = 0;
	}
	  
	  // REMOVER EN PROYECTO FINAL	
	  lcd.setCursor(0, 1);
	  lcd.print(INTERVALO_LED);
  	}
	
	// Revisamos si pulsan el boton ON durante mas de dos segundos.
	int debouncedState = btON.read();
	if ( debouncedState == LOW && btON.currentDuration() > 2000 ) {
		resetCONTADOR();
	} 
}

// REMOVER EN PROYECTO FINAL	
void borrarLCD() {
	lcd.setCursor(0, 0);
	lcd.print("                ");
	lcd.setCursor(0, 1);
	lcd.print("                ");
}

void resetCONTADOR(){
    INTERVALO_LED = 500UL;  
    INTERVALO_CAMBIO=300UL;
    display.clear();
    display.setSegments(SEG_DONE);
	
	// REMOVER EN PROYECTO FINAL	
	lcd.setCursor(0, 0);  
	lcd.print("RESETTING. . . .  ");   
	lcd.setCursor(0, 1);   
	lcd.print(". . . .  .. . . .  ");  
}
Saludos!

Frogmen
El Renegado
El Renegado
Mensajes: 3011
Registrado: 31/May/2018, 12:11
Ubicación: Amed, Bali.

Re: Narcosimetro

#2 Mensaje por Frogmen »

Mr Bomori escribió:Os pongo el código del Arduino que he hecho... por ahora, así como una foto del simulador con el circuito
Te falta el circuito. :disim: :disim:
Rebreather KISS Sidewinder. (Full Cave y Trimix Normoxico/Hipoxico)
Canon R5C con carcasa Nauticam NA-R5C
Monitor Atomos Shinobi con Carcasa Nauticam NA-SHINOBI
CANON RF 100mm f2.8L MACRO IS USM + Nauticam SMC-1
CANON EF-S 60mm f2.8 MACRO USM
CANON EF 8-15mm f4L FISHEYE USM
CANON RF-24/50mm f4.5/6.3 IS STM + WACP-1
Flash INON Z-330 x2
Foco Bigblue VL15000 P PRO x2
Foco Bigblue VL9000 P x2

Mis fotos: https://www.flickr.com/photos/170438718@N08/
https://instagram.com/frogmen1964?utm_source=qr

Mr Bomori
Open Weber Diver 1*
Open Weber Diver 1*
Mensajes: 67
Registrado: 07/May/2019, 10:31

Re: Narcosimetro

#3 Mensaje por Mr Bomori »

Frogmen escribió:
Mr Bomori escribió:Os pongo el código del Arduino que he hecho... por ahora, así como una foto del simulador con el circuito
Te falta el circuito. :disim: :disim:
Toda la razon.
Para cargar el circuito en el simulador https://www.simulide.com/p/downloads.html)

Queria poner el archivo .simu i .ino, para ahorraros el trabajo de diseñar el circuito y poner el codigo... pero no se porque, no se los "come"... (o sí, porque no aparecen).

he modificado el programa para trabajar en "Hertzios", por si a alguien le interesa...
No tienes los permisos requeridos para ver los archivos adjuntos a este mensaje.

Mr Bomori
Open Weber Diver 1*
Open Weber Diver 1*
Mensajes: 67
Registrado: 07/May/2019, 10:31

Re: Narcosimetro

#4 Mensaje por Mr Bomori »

Comentar que en el simulador, hay un display LCD de 16x2, y un arduino UNO.

Esta claro que eso, no cabe en una GoPro... en la practica, uso un DigiSpark, y un display de 4 displays 7 segmentos (TM1637Display).
Y eso si que cabe... A ver si lo ensamblo todo y os mando fotitos...

Mr Bomori
Open Weber Diver 1*
Open Weber Diver 1*
Mensajes: 67
Registrado: 07/May/2019, 10:31

Re: Narcosimetro

#5 Mensaje por Mr Bomori »

Fotitos de como queda... aunque no esta todo colocado todavia...
Screen Shot 09-09-21 at 12.48 PM 001.PNG
Screen Shot 09-09-21 at 12.48 PM.PNG
No tienes los permisos requeridos para ver los archivos adjuntos a este mensaje.

Frogmen
El Renegado
El Renegado
Mensajes: 3011
Registrado: 31/May/2018, 12:11
Ubicación: Amed, Bali.

Re: Narcosimetro

#6 Mensaje por Frogmen »

Queda de pm. Ya tengo ganas de probarlo. :ok1:
Rebreather KISS Sidewinder. (Full Cave y Trimix Normoxico/Hipoxico)
Canon R5C con carcasa Nauticam NA-R5C
Monitor Atomos Shinobi con Carcasa Nauticam NA-SHINOBI
CANON RF 100mm f2.8L MACRO IS USM + Nauticam SMC-1
CANON EF-S 60mm f2.8 MACRO USM
CANON EF 8-15mm f4L FISHEYE USM
CANON RF-24/50mm f4.5/6.3 IS STM + WACP-1
Flash INON Z-330 x2
Foco Bigblue VL15000 P PRO x2
Foco Bigblue VL9000 P x2

Mis fotos: https://www.flickr.com/photos/170438718@N08/
https://instagram.com/frogmen1964?utm_source=qr

Avatar de Usuario
Trojan83
Rescue Weber Diver
Rescue Weber Diver
Mensajes: 944
Registrado: 10/Nov/2017, 12:39
Ubicación: Bilbo

Re: Narcosimetro

#7 Mensaje por Trojan83 »

Que gran idea! Y te ha quedado genial la verdad :plas: :chin:

Avatar de Usuario
JuanGi
Dive Monster Weber
Dive Monster Weber
Mensajes: 3359
Registrado: 24/Nov/2014, 08:26

Re: Narcosimetro

#8 Mensaje por JuanGi »

Enhorabuena, muy interesante.

Avatar de Usuario
JuanGi
Dive Monster Weber
Dive Monster Weber
Mensajes: 3359
Registrado: 24/Nov/2014, 08:26

Re: Narcosimetro

#9 Mensaje por JuanGi »

Mr Bomori escribió: Más info en:
https://alertdiver.eu/es_ES/articulos/m ... gas-inerte
Interesante el artículo, e interesante también las conclusiones sobre el efecto narcótico del O2
alertdiver.eu escribió: Es probable que los buceadores experimenten menos narcosis buceando con nitrox

Avatar de Usuario
Grodenauer
Dive Monster Weber Platinum
Dive Monster Weber Platinum
Mensajes: 10298
Registrado: 03/Ago/2008, 11:40

Re: Narcosimetro

#10 Mensaje por Grodenauer »

:plas: :plas: :plas: :plas: :plas:
En acabar la temporada me pongo a hacerme uno, pero pitando. ¡Qué pasada! Dudo que sea capaz de mejorar el código que seguro te has currado estupendamente, si viera algo a mejorar te lo diría en privado, pero insisto, lo dudo.
Gracias por compartirlo.

Mr Bomori
Open Weber Diver 1*
Open Weber Diver 1*
Mensajes: 67
Registrado: 07/May/2019, 10:31

Re: Narcosimetro

#11 Mensaje por Mr Bomori »

El código es muuuuy mejorable, de hecho, he pasado el tiempo de parpadeos a frecuencia… y es mucho mejor… puedes subir la frecuencia todo lo que quieras… y pasas de valores fijos de microsegundos y milisegundos…
A ver cuando me puedo pelear con el… que no tengo tiempo y no lo tengo acabado… snifff

Pala96
Open Weber Diver
Open Weber Diver
Mensajes: 4
Registrado: 20/Sep/2019, 14:47
Ubicación: Alicante

Re: Narcosimetro

#12 Mensaje por Pala96 »

Mr Bomori escribió: 12/Sep/2021, 13:54 El código es muuuuy mejorable, de hecho, he pasado el tiempo de parpadeos a frecuencia… y es mucho mejor… puedes subir la frecuencia todo lo que quieras… y pasas de valores fijos de microsegundos y milisegundos…
A ver cuando me puedo pelear con el… que no tengo tiempo y no lo tengo acabado… snifff
Buenas Mr Bomori, las fotos ya no están disponibles. ¿Podrías volver a subirlas?
Parece un experimento de lo más interesante!! ¿Pudiste llegar a probarlo en la práctica?

Responder

Volver a “Brico-Sub”