First, filtering can be touchy. A moving average is kind of destroying the information contained in the signal. It would be of use in situations where the real signal doesn't vary much, such as if you were reading a noisy DC voltage and wanted to have an good idea of the average voltage. I don't want to get into all the details of using a moving average (and I can't pretend I know them all), but since the signal of you photodiode sensor varies quickly, a moving average will smooth it indiscriminately from noise.
Next, you should give at look at the frequency response of your butterworth filter. Again, don't want to get into to much details but when you use a filter, you generally need to use lower and upper frequencies a little bit lower and higher than the min and max ones present in your signal. The reason is that a real (non-ideal) filter won't simply cut everything lower than 0.75Hz and higher than 4Hz and allow the rest to pass undeterred; it starts to attenuate the signal before the cutoff frequency and finishes after. You could check the frequency response on an illustration on the Wikipedia article.
Then, is your signal of interest somewhat of a characteristic signature? I mean, do you have an idea of what it is supposed to look like?
If yes, you could use an auto correlation technique. The idea is to convolve a copy of the known signal to your noisy input signal.
Example: Imagine that you have a (somewhat simplified) sonar and that you emit a chirp signal, which is of a known form. You listen with an antenna for echoes of the chirp who could have bounced on some object. The signal you get form your antenna is pretty noisy and you cannot distinguish the chirp from the noise. Still, you want to detect it because the time elapsed since it's emission (and the speed of sound) allows to calculate the distance at which the object is in regard to the chirp emitter.
A good and simple way to go would be to auto correlate the chirp with the antenna signal. You could think of it as a kind of AND operation, in the sense that as a result you will have a signal where the amplitude would be very low where the chirp is not present and higher where the chirp is present. For more visual people it should look like something like this:
The top "x(n)" shows two "chirps" emitted at some time. (There is no link between them, just an image I generated in the past for an assignment.) In the middle, there is the signal "y(n)" captured by the antenna. At the bottom, you have the output signal "Rxy3", which is the result of the autocorrelation between "x(n)" and "y(n)". As you can see, some time after the emission of the chirp, you can identify the location of the echoes (the peaks).
As for how to implement it, you could check at this example: http://www.mathworks.com/help/signal/examples/measuring-signal-similarities.html