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(". . . . .. . . . ");
}