Leer estado de rele externo

Yo no te di la respuesta final, sino el camino para que lo trabajes tu.
El código que puse lo adapté en 2 min de un dimmer. Asi que puede tener fallos.

if (XtimePeriod > 9750) // mayor que 9750 useg      // ajusta este tiempo a ver si va bien
     zero_cross = 1;                                 // set the boolean to true to tell our dimming function that a zero cross has occured
 }
 else 
     zero_cross = 0;

en un ambiente de 50 hz la señal tiene dos semiperíodos de 10 mseg.
En un ambiente de 60 hz la señal tiene dos semiperiódos de 8.333mseg
Entonces corrige ese 9750 porque estaba pensado para 50 hz (mi frecuencia de red) y ajusta a tu caso.
Ya que hablas de 110VAC supongo que será 60Hz.
Prueba esa parte del código para que detecte un cruce x cero 60/50Hz