/**********************************
# English explanation of the code
english_text = """
This script controls three LEDs connected to an Arduino. 
First, the LEDs blink simultaneously for 20 seconds. 
The blink effect is achieved by turning the LEDs on and off every
 half second. 
After 20 seconds, the LEDs fade in and out smoothly for another 
20 seconds. 
The fading uses a gamma correction table to adjust the brightness 
in a way that looks smooth to the human eye. 
Serial communication is used to print debug messages when the LEDs
 are blinking or fading.


# Hindi explanation of the code
hindi_text = """
यह स्क्रिप्ट तीन एलईडी को नियंत्रित करती है जो एक Arduino से जुड़े हैं।
पहले, एलईडी 20 सेकंड तक एक साथ चमकते हैं। 
चमकने का प्रभाव एलईडी को हर आधे सेकंड में चालू और बंद करके प्राप्त किया जाता है।
20 सेकंड के बाद, एलईडी एक और 20 सेकंड के लिए धीरे-धीरे बढ़ते और घटते हैं। 
फेडिंग में एक गामा करेक्शन टेबल का उपयोग किया जाता है जो मानव आंखों के लिए 
प्रकाश को चिकना दिखने में मदद करता है।
सीरियल कम्युनिकेशन का उपयोग एलईडी के चमकने या फेड होने पर डिबग मैसेज प्रिंट
 करने के लिए किया जाता है।




arvind ptil 12/10/24
**********************************************************/


#define RED_PIN 3   // PWM pin for Red LED
#define GREEN_PIN 6 // PWM pin for Green LED
#define BLUE_PIN  10  // PWM pin for Blue LED
#define FADE_SPEED 10 // lower is faster
#define BLINK_DELAY 500 // milliseconds delay for blinking

// Gamma table for brightness correction
const uint8_t PROGMEM gamma8[] = {
  // (same gamma table as before)
};

void setup() {
  pinMode(RED_PIN, OUTPUT);
  pinMode(GREEN_PIN, OUTPUT);
  pinMode(BLUE_PIN, OUTPUT);
  
  // Initialize serial communication for debugging
  Serial.begin(9600);
  Serial.println("Program started: LEDs will blink and fade simultaneously.");
}

void loop() {
  // Blink all LEDs simultaneously for 20 seconds
  Serial.println("Blinking LEDs...");
  unsigned long startBlinkTime = millis(); // Record the start time
  while (millis() - startBlinkTime < 20000) { // Blink for 20 seconds
    digitalWrite(RED_PIN, HIGH);
    digitalWrite(GREEN_PIN, HIGH);
    digitalWrite(BLUE_PIN, HIGH);
    delay(BLINK_DELAY); // Keep LEDs on for BLINK_DELAY

    digitalWrite(RED_PIN, LOW);
    digitalWrite(GREEN_PIN, LOW);
    digitalWrite(BLUE_PIN, LOW);
    delay(BLINK_DELAY); // Keep LEDs off for BLINK_DELAY
  }

  // Fade all LEDs simultaneously for 20 seconds
  Serial.println("Fading LEDs...");
  unsigned long startFadeTime = millis(); // Record the start time
  while (millis() - startFadeTime < 20000) { // Fade for 20 seconds
    // Fade in all LEDs simultaneously
    for (int i = 0; i < 255; i++) {
      uint8_t brightness = pgm_read_byte(&gamma8[i]);
      analogWrite(RED_PIN, brightness);
      analogWrite(GREEN_PIN, brightness);
      analogWrite(BLUE_PIN, brightness);
      delay(FADE_SPEED);
    }

    // Fade out all LEDs simultaneously
    for (int i = 255; i > 0; i--) {
      uint8_t brightness = pgm_read_byte(&gamma8[i]);
      analogWrite(RED_PIN, brightness);
      analogWrite(GREEN_PIN, brightness);
      analogWrite(BLUE_PIN, brightness);
      delay(FADE_SPEED);
    }
  }
}