#include <Arduino.h>
#include <math.h>
#include <EEPROM.h>
/*---------------------------------
--------VARIABLES GLOBALES---------
---------------------------------*/
//Pulsador:
const int pulsador = 2;
const int buzzer = 3;
int contador = 0;
//Acelerómetro:
#define x_out A0
#define y_out A1
#define z_out A2
int x_adc_value, y_adc_value, z_adc_value;
double x_g_value, y_g_value, z_g_value;
double roll, pitch;
//Sensor flexible
int flexADC;
const int FLEX_PIN = A5;
//Calibración
float arrayMediaRoll[10];
float arrayMediaSensorFlex[10];
float sumaRoll;
float sumaSensorFlex;
float mediaRoll;
float mediaSensorFlex;
float maxRoll;
float maxFlex;
float valorRoll;
float valorFlex;
/*---------------------------------
-------FUNCIONES PRINCIPALES-------
---------------------------------*/
void leer_inclinacion()
{
x_adc_value = analogRead(x_out); /* Digital value of voltage on x_out pin */
y_adc_value = analogRead(y_out); /* Digital value of voltage on y_out pin */
z_adc_value = analogRead(z_out); /* Digital value of voltage on z_out pin */
x_g_value = ( ( ( (double)(x_adc_value * 5)/1024) - 1.65 ) / 0.300 ); /* Acceleration in x-direction in g units */
y_g_value = ( ( ( (double)(y_adc_value * 5)/1024) - 1.65 ) / 0.300 ); /* Acceleration in y-direction in g units */
z_g_value = ( ( ( (double)(z_adc_value * 5)/1024) - 1.80 ) / 0.300 ); /* Acceleration in z-direction in g units */
roll = ( ( (atan2(y_g_value,z_g_value) * 180) / 3.14 ) + 180 ); /* Formula for roll */
Serial.print("Roll = ");
Serial.println(roll);
}
void sensorFlex(){
flexADC = analogRead(FLEX_PIN);
Serial.println(flexADC);
}
void calibracion(){
//Ponemos variables de medias anteriores a 0:
mediaRoll = 0.0;
mediaSensorFlex = 0.0;
sumaRoll = 0;
sumaSensorFlex = 0;
//Guardamos 10 valores de los sensores en los arrays creados:
for(int j = 0; j<10; j++){
leer_inclinacion();
arrayMediaRoll[j] = roll;
delay(100);
}
for(int k = 0; k<10; k++){
sensorFlex();
arrayMediaSensorFlex[k] = flexADC;
delay(100);
}
//Sumamos los valores de cada array:
for(int a = 0; a<10; a++){
sumaRoll += arrayMediaRoll[a];
sumaSensorFlex += arrayMediaSensorFlex[a];
delay(100);
}
//Hacemos la media:
mediaRoll = sumaRoll/10;
mediaSensorFlex = sumaSensorFlex/10;
//Definimos el valor máximo que pueden alcanzar los sensores para una postura correcta:
maxRoll = mediaRoll + 10;
maxFlex = mediaSensorFlex + 10;
EEPROM.put(0,maxRoll);
EEPROM.put(10,maxFlex);
valorRoll = EEPROM.get(0,mediaRoll);
valorFlex = EEPROM.get(10,mediaSensorFlex);
Serial.print("Roll EEPROM: ");
Serial.println(valorRoll);
Serial.print("Flex EEPROM: ");
Serial.println(valorFlex);
tone(buzzer,2000);
delay(100);
tone(buzzer,1600);
delay(100);
tone(buzzer,1200);
delay(100);
tone(buzzer,1000);
delay(100);
tone(buzzer,800);
delay(100);
tone(buzzer,200);
delay(100);
noTone(buzzer);
}
/*---------------------------------
-----------CONFIGURACIÓN-----------
---------------------------------*/
void setup() {
Serial.begin(9600);
//Pulsador:
pinMode(pulsador, INPUT_PULLUP);
//Sensor flexible:
pinMode(FLEX_PIN, INPUT);
pinMode(buzzer,OUTPUT);
valorRoll = EEPROM.get(0,mediaRoll);
valorFlex = EEPROM.get(10,mediaSensorFlex);
Serial.print("Roll EEPROM: ");
Serial.println(valorRoll);
Serial.print("Flex EEPROM: ");
Serial.println(valorFlex);
noTone(buzzer);
digitalWrite(buzzer, 0);
}
void loop() {
int estado = digitalRead(pulsador); // 0 = pulsado ; 1 = no pulsado
Serial.println(estado);
while(estado == 0){
delay(1000);
estado = digitalRead(pulsador);
contador++;
if(contador==3 && estado == 0){
tone(buzzer,2000);
delay(100);
tone(buzzer,1600);
delay(100);
tone(buzzer,1200);
delay(100);
tone(buzzer,1000);
delay(100);
tone(buzzer,800);
delay(100);
tone(buzzer,200);
delay(100);
noTone(buzzer);
calibracion();
contador = 0;
break;
}
if(estado == 1){
contador = 0;
break;
}
}
leer_inclinacion();
sensorFlex();
if(roll > maxRoll){
Serial.println("maxRoll");
tone(buzzer,2000);
delay(500);
}else{
noTone(buzzer);
}
if(flexADC > maxFlex){
Serial.println("maxFlex");
tone(buzzer,2000);
}else{
noTone(buzzer);
}
delay(200);
}