Hi Steve,
Now I'm jealous! You have the scope I wanted. And a ESR70. I wonder what other goodies? It took me a long time to realise that having a decent set of tools saves a lot of frustration and false leads. Making do with a multimeter and a slightly faulty set ot second hand test equipment held me back I'm sure. It's why I'm the sort of person who diagnoses electronic faults best when the broken bit is actually smoking.
Last night I was able to write a simple sketch to prove that an Arduino really can reset the 555. The code was harder than I expected, but it does work.
I had to use a 30mS LOW pulse to reliably discharge the capacitor. One thing I hadn't thought of is that the Arduino and 555 aren't synchronised. If the 555 has only just started to recharge the capacitor, a very short pulse from the Arduino will discharge it. On the other hand the same LOW pulse arriving when the capacitor is nearly fully charged won't fully discharge it, and the Arduino gets an unwanted reset shortly after.
This screen-shot shows a successful heartbeat followed by a reset. I pulled the heartbeat lead on the Arduino immediately after the successful heartbeat tick and then watched the 555 reset the Arduino when it didn't get another heartbeat. The blue line is the reset line and the yellow line is the capacitor.
I'm pretty sure that you were right early on when you suggested that something simple is wrong with the circuit, or perhaps with the code. It's odd that 47k works when 1M doesn't. On the code side I had to do a bit of a hack to stop the heartbeat back charging the capacitor. You can't let the heartbeat pin go HIGH after you've forced it LOW, which is what normally happens with digitalWrite(). Here's how I did it, there may be a better way!
void heartbeat()
{
// Sends a LOW pulse to discharge the 555's timing capacitor.
// Note the pin is reset to be an input at the end, ie neither high nor low.
// Done because making the pin HIGH rather than LOW charges the capacitor
// and messes up the 555's timing!!!
pinMode(HeartbeatPin,OUTPUT);
digitalWrite( HeartbeatPin, LOW ); // Start the pulse
Serial.print("Tickn"; // only needed to show heartbeat is working
delay(30); // 30mS needed to reliably discharge 22uF via 560 ohms
pinMode(HeartbeatPin,INPUT); // End the pulse
}
I like helping people too. At the moment I've had much more help from the forum than I've returned. It's not only that my direct questions get good answers, it's the wealth of knowledge I've harvested from all the other threads. I'm pleased you found my comments useful and you sound exactly to be the kind of guy who helps solve my multitudinous mechanical issues.
By the way I found this example of fun with an SDS1102CML on the web. I wish I knew how he did it!
Cheers,
Dave
Edited By SillyOldDuffer on 23/04/2016 11:39:34