Hola amigos del foro.
estoy intentando hacer un pequeño proyectillo didactico, sobre las RPM de un motor, mediante la lectura de un diodo emisor y un photo-transistor, sobre un encoder, con arreglo a las interrupciones optengo las revoluciones, hasta ahi bien, aunque no esta muy depurada su programacion al menos optengo las RPM.
ahora me gustaria hacer, que cuando el motor esta funcionando, y por encima de unas determinadas RPM (en mi caso 3000RPM), un diodo esta encendido permanentemente, y el buzzer en estado bajo (LOW), apagado.
Pero, cuando el motor baja de unas determinadas RPM (3000), el motor se para y el led, siempre encendido pasa a parpadear y el buzzer a sonar.
Aunque me funciona (de esas maneras), soy consciente de que no esta bien, por eso recurro a Vds.
os paso el codigo y me aconsejais, (todabia soy aprendiz no me hecheis los perros..jajajajaj).
Lo que pretendo es que como veis en el codigo esque me ejecute una secuencia de tonos, cuando se cumple que el motor se para y que el led parpadee (pase de estar siempre encendido a parpadear).
y esto lo consigo (parpadeo del led), pero el buzzer solo me genera una nota fija, constante y seguida, no la cadena de tonos que tengo en las variables.
// Contador de RPM by: kikorro
// Conexion de la entrada de la interrupcion 0 por el PIN 2
// Configurar el monitor serial a 9600 Baudios para visualizar los RPM
volatile int contador = 0; // Variable entera que se almacena en la RAM del Micro
int paramotor=4; //para motor;
const int LUD_MARCHA = 13;
// const int SONIDO_PARO = 12;
int BUZZER = 8;
int i = 1;
int tonos [] = {261, 277, 294, 311, 330, 349, 370, 392, 415, 440, 466, 494};
void setup() {
Serial.begin(9600);
pinMode(2, INPUT); // set pin to input
pinMode (paramotor, OUTPUT);
//pinMode (habilitarMotor, OUTPUT);
pinMode (LUD_MARCHA, OUTPUT);
pinMode (BUZZER, OUTPUT);
attachInterrupt(0,interrupcion0,RISING); // Interrupcion 0 (pin2), LOW, CHANGE, RISING, FALLING
}
void loop() {
contador = 0;
delay(999); // retardo de 1 segundo
Serial.print(contador *10); // Como son seis interrupciones por vuelta (contador * (60/6))
Serial.println(" RPM"); // El numero 6 depende del numero aspas del encoder
// analogWrite(habilitarMotor,senalPWM); // habilitar potencia motor
// Condición por la cual queremos que el código se ejecute
// si una variable 'x' es menor que 3000 RPM
if (contador > 300){
digitalWrite(paramotor,LOW);
digitalWrite(LUD_MARCHA, HIGH);
noTone(BUZZER);
}
else if (contador < 300){
digitalWrite(paramotor,HIGH);
digitalWrite(LUD_MARCHA, LOW);
delay (200);
digitalWrite(LUD_MARCHA, HIGH); // enciende el LED (on)
delay(200); // espera por un segundo
digitalWrite(LUD_MARCHA, LOW); // apaga el LED (off)
delay(200); // espera por un segundo
//if (i=0; i<12; i++){
// if(digitalRead(i)==HIGH){
tone(BUZZER, tonos[i]);
delay(500);
}
}
void interrupcion0() // Funcion que se ejecuta durante cada interrupion
{
contador++; // Se incrementa en uno el contador
}
