Para hacer un programa que me dispare el triac en el cruce por cero:
Como debería leer los pulsos de paso por cero? Solo empiezo leyendo el pin o se debe poner algún retardo para comenzar a leer?
Una vez que se detecta el cruce por cero, se debe esperar un tiempo para activar el triac? Como saber cuánto tiempo?
Como te dijeron... usando el optoaislador el MOC3041, directamente pones un 1 y listo, no necesitas "leer" cruces por cero, te ahorras gran parte del circuito.
¿Queres activar algunos picos y otros no? Entonces usa un timer para controlar cuanto presionas.

(Falta red snubber)
No entiendo porque insistís en hacerlo de otra forma si solo vas a hacerlo en los cruces por cero.
Si vos queres esperar tiempo, lo que vas a hacer es recortar la onda. Esto hace que tengas que poner un TRIAC mas potente, la onda deja de ser senoidal, lo aviso por la carga que tengas. Y existen otros métodos de "regulación" según el tipo de carga.
Si quieres seguir en tu método entonces:
- Lees el pin, detectaste el cruce por cero (ya sea usando interrupcion por flanco, etc, depende de tu circuito)
- Esperas o no dependiendo de tu circuito de deteccion, si este genera el pulso justo apenas hace el 0, entonces lo activas de inmediato, sino esperas un ratito antes de disparar, el tiempo máximo que tenes para dispararlo es de la mitad del periodo de la red de linea, ejemplo con 50Hz, son 20ms, es decir el tiempo maximo de espera es de 10ms +margen de seguridad, te quedaría en 9ms aprox.
- Al activarlo es recomendable que se hagan varios pulsos y por un ratito. Ya que el pin de gate consume corriente. y es mejor proporcionarsela momentaneamente de a pulsos que de forma continua, se hacen varios para asegurarse que realmente se activo el TRIAC.
- Una ves activo solo se va a desactivar (nuevamente dependiendo de la carga)