bueno ,trabajando sobre de la hipótesis de una placa de control para horno a microondas , como primera medida me di a la tarea de lograr una función que controle tiempo de cocción y potencia (como tiempos on/off aplicados al magnetrón
.. tal cual lo hace un horno , por lo menos el mio
tengo uno a reloj mecánico que anda bien y uno digital que la controladora no tiene los patitos en linea,,,,.
bueno , la funcion aquí expuesta recibe como argumentos
El periodo del ciclo., el TIEMPO on (Duty) en % , el pin que controla, la duracion total del ciclo (tiempo de coccion) y un pin que chequear a modo de interrupcion para cancelar todo (mientras este pin esta HIGH sigue normal
pongo todo el ejemplo y a ver que opinan.. como se podria hacer mas eficiente ,
si interesa provar el codigo , lleva un parlantito de PC en el pin 11 , un led en el 13 y un switch en el 9
¿tal ves usando interrupciones y timers?
byte Led(13);
void setup() {
pinMode(9,INPUT);
digitalWrite(9,HIGH);
pinMode(11,OUTPUT);
pinMode(Led,OUTPUT);
digitalWrite(Led,LOW);
// put your setup code here, to run once:
Serial.begin(9600);
}
void loop() {
pwmBaja(20,50,Led,(5*60),9);
BeepBeep(11,440,10,10); //
while (digitalRead(9)==0){
// Se queda trancado mientras persiste el Pin 9 en LOW //
digitalWrite(Led,HIGH);
}
}
void pwmBaja(float Periodo,float tOn,byte Pin,unsigned long Duracion,byte FlagDeSalida){
Periodo=Periodo*1000;
float tOff=100-tOn;
tOn=(tOn/100)*Periodo;
tOff=(tOff/100)*Periodo;
Duracion=Duracion*1000;
unsigned long Arrancamos=millis();
unsigned long Completamos=Arrancamos+Duracion;
Serial.println(Arrancamos);
Serial.println(Duracion);
Serial.println(Completamos);
while (millis()<=Completamos){
if (FlagDeSalida != 0){ if (digitalRead(FlagDeSalida)==0){Completamos=Arrancamos;}}// se sale si la condicion del sensor asignado es inadecuada
digitalWrite(Pin,HIGH);
delayMillis(tOn,FlagDeSalida);
digitalWrite(Pin,LOW);
delayMillis(tOff,FlagDeSalida);
}
}
//Funcion auxiliar, para no usar delay() , bastante autoeplicada
// Atiende una "interrupcion por hardware " caserita , se podria usar para poner un perro guardian
void delayMillis(unsigned long PorCuanto,byte FlagDeSalida){
unsigned long AhoraMesmo=millis();
unsigned long HastaCuando=AhoraMesmo+PorCuanto;
while (millis()<=HastaCuando){
if (FlagDeSalida != 0){ if (digitalRead(FlagDeSalida)==0){HastaCuando=AhoraMesmo;}}// se sale si la condicion del sensor asignado es inadecuada
//ACA puedo quedarme esperando alguna cosa mas alla del flag de salida
//doy vuelta al pedo aca,, ver que pasa si atiende interrupciones
}
}
/*
funcion auxiliar , hace beep el parlantito conectado en el pin PinBeep a la HzBeep frecuencia , por la duracion de TiempoBeep milisegundos, y repite VecesBeep veces
*/
void BeepBeep(byte PinBeep, int HzBeep, byte TiempoBeep,byte VecesBeep){
for(byte e=1;e<=VecesBeep;e++){
tone(PinBeep, HzBeep,TiempoBeep);
delayMillis(TiempoBeep,0);
noTone(PinBeep);
delayMillis(TiempoBeep,0);
}
}
lo que sigue, la interfaz de usuario..