I wrote this code to pulsate a diode for an interval of microseconds after clicking a button. The problem is that the diode pulsates longer than the value in the interval variable because it turns on the whole time that my finger pushes the button (which is longer than some microseconds). What should I correct from this code to get it to just pulsate the microseconds in the interval variable?
const int pinAnalogIn = A0;
const int pinAnalogOut = 9;
const int button = 2;
const long interval = 500;
int valueInPotentio = 0;
int valueOutDiode = 0;
int state = 0;
Here is a simple sketch that toggles the LED when the normally open momentary push button is released.
#include <DebouncedSwitch.h>
int led = 13;
int D4 = 4; // give the pin a name
DebouncedSwitch sw(D4); // monitor a switch connected between input D4 and GND
void setup() {
pinMode(led, OUTPUT); // initially low (OFF)
}
void loop() {
sw.update(); // call this every loop to update switch state
if (sw.isChanged()) { // debounced switch changed state Up or Down
// isChanged() is only true for one loop(), cleared when update() called again
if (!sw.isDown()) { // switch was just released
unsigned long current_uS = micros();
digitalWrite(led,HIGH); //
while((micros() - current_uS) < 1) {
}
digitalWrite(led,LOW);
}
}
}
The actual timing will vary depending on the board.
Using one of the onboard timers might be better but less portable.
Arduino analogWrite is PWM and runs 490Hz with 8-bit resolution on pin 9.
And the value is updated only once every 2 milliseconds.
I think this is not suitable for the output you want.
Unless you have something else in your loop() that can't stand a 1/2-millisecond delay, this should do the trick. Debounces the button and looks for a state change. When the state changes to HIGH, send the 500 microsecond pulse.
const int pinAnalogIn = A0;
const int pinAnalogOut = 9;
const int button = 2;
const unsigned long interval = 500;
int valueInPotentio = 0;
int valueOutDiode = 0;
int PreviousState = LOW;
unsigned long LastStateChangeTime = 0; // Debounce timer
void setup()
{
Serial.begin(9600);
pinMode(button, INPUT);
}
void loop()
{
unsigned long currentMillis = millis();
valueInPotentio = analogRead(pinAnalogIn);
valueOutDiode = map(valueInPotentio, 0, 1023, 0, 255);
int buttonState = digitalRead(button);
// Detect state change
if (buttonState != PreviousState && currentMillis - LastStateChangeTime > 10)
{
PreviousState = buttonState;
LastStateChangeTime = currentMillis;
if (buttonState == HIGH)
{
analogWrite(pinAnalogOut, valueOutDiode);
delayMicroseconds(interval);
analogWrite(pinAnalogOut, 0);
}
}
}