Horno de microondas, placa de control

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..

hola. quisiera saber como hace para modificar la potencia del horno.

como hace la variación de potencia, a donde tiene que llegar la señal de control?

agradezco su ayuda.

Normalmente los hornos de microondas no regulan la potencia del magnetrón sino que lo que hacen es una especie de PWM en baja frecuencia. O sea, a partir de un período fijo ( puede ser de 10 seg. ) enciende el porcentaje indicado y apaga el resto. Por ejemplo , si yo le indico que funcione 1 minuto al 70% lo que va a hacer es encender el magnetrón 7 segundos y apagarlo 3 segundos y así sucesivamente.

Hilo revivido del 2016. Fuera de normas.
Hilo cerrado.
@jsneiderpc Crea un nuevo hilo