Salut !
Concernant les tensions : pas plus de 5V mais il y a toujours des moyens pour adapter (pont diviseur, zener ...).
pulseIn() permet de mesurer un temps passer à l'état haut ou à l'état bas. Si ton signal est parfaitement cyclique, alors ça peut marcher puisque ta fréquence sera 1000000/(2xduration) <==> 1s / 2 x demi-période
Si ce n'est pas le cas il faut mesurer le temps qui s'écoule entre deux fronts montants (ou descendants). Pour cela c'est assez simple, il suffit d'utiliser digitalRead() et micros().
Pour une moyenne rien de compliquer non plus : il suffit de créer un tableau pour stocker tes données, d'utiliser une variable pour compter le nombre d'enregistrements, et à partir d'un certain nombre tu fais une moyenne toute bête en faisant une boucle qui fait la somme de toute les valeurs de ton tableau puis tu divises par le nombre de valeur.