That is reallly neat! Did you have to protect the smoke alarm peizos with any coating?

I have used 4046's to multiply up the frequency from a shaft encoder so that I could get good more resolution. I always found them a bit difficult to work with.

I just wrote a little routine for a PIC that does a good job of detecting frequecies around 3Khz. It can be changed for other freqs. It should be able to detect the change in 2 cycles or less.

It is running in a 40Mhz PIC, so the values would have to be changed if you ran it slower.

Code:
       define PULSIN_MAX 400
Top:        
        pulsin PORTD.1,0,LowVal
        Pulsin PortD.1,1,HighVal
       
        Period = LowVal+HighVal     ; just in case the duty cycle isn't 50% ; period in uSec
        
        Select case Period
           Case is > 350 
              Hserout [CR,LF,"Too Low"]
           case is > 310
              hserout[CR,LF,"Just Right"]
           case 0
              hserout[CR,LF,"No Signal"]
           case else   
              hserout [CR,LF,"Too High"]
         end select     
         goto top