Here is a "stripped down version" of a sketch I used to replicate the Clap On, Clap Off lamp switch we had in the 1980's.  It works with the KY-038 sound sensor module you currently have. You will need to install the [VirtualDelay][1] Library.


  [1]: https://github.com/avandalen/VirtualDelay

The sound sensor module is very sensitive. A quarter turn of the potentiometer around the "sweet spot" makes a huge difference. Too sensitive, and the digital output is constantly high. If it's not sensitive enough, then you have to physically "tap" the microphone to get a high/low transition out of it.

Please note: This sketch uses delay() which is "blocking code" and it's use is usually not recommended.

    #include "avdweb_VirtualDelay.h"
    byte clapCounter = 0;
    const byte soundSensorPin = 2;
    const unsigned long loopDelay = 1;
    const unsigned long clapCounterDelay = 400;
    unsigned long clapCounterTimerDuration = 1000;
    unsigned long previousMillis = 0;
    
    void setup(){
      pinMode(LED_BUILTIN, OUTPUT);
    }
    
    void loop(){
    
      // Timer object.
      static VirtualDelay clapCounterTimer;
    
      // Get the current time.
      unsigned long currentMillis = millis();
    
      // Check for a clapping sound (1 ms works good). If too much time
      // elapses here, you could miss the "beginning" of the clap.
      if(myTimer1(loopDelay, currentMillis) == 1){
    
        // Clap detected.
        if(digitalRead(soundSensorPin) == 1){
    
          clapCounter += 1;
    
          // When the first the clap is detected, start a timer
          // to reset the clap counter to 0 after 1 second.
          if(clapCounter == 1){
            clapCounterTimer.start(clapCounterTimerDuration);
          }
    
          // Delay execution of the loop. 400 ms works good.
          delay(clapCounterDelay);
    
          // If a second clap is detected, toggle the LED ON/OFF.
          if(clapCounter > 1){
            digitalWrite(LED_BUILTIN, !digitalRead(LED_BUILTIN));
          }
    
        }
      }
    
      // Reset the clap counter to 0 after 1 second. If
      // you don't do this, you could clap once, wait a
      // minute, then clap again and the LED will change state.
      if(clapCounterTimer.elapsed()){
        clapCounter = 0;
      }
    
    }
    
    // Clap loop timer.
    byte myTimer1(unsigned long loopDelay, unsigned long currentMillis){
      if(currentMillis - previousMillis >= loopDelay){previousMillis += loopDelay;return 1;}
      else{return 0;}
    }