Skip to main content

program

#include <avr/io.h>
#include <avr/interrupt.h>
#include <TM1637TinyDisplay.h>

#define CLK_PIN 2      // CLK pin to D0
#define DIO_PIN 0      // DIO pin to D1
#define POT_PIN A2     // Potentiometer pin to A0
#define LED_PIN 1      // LED pin
#define BUTTON_PIN 3   // Pin PB3 for button input

#define BUTTON_PRESSED() (!(PINB & (1 << BUTTON_PIN)))

volatile bool relayOn = false;          // Flag to track relay status
volatile uint32_t timerMillis = 0;      // Variable to store elapsed milliseconds
volatile uint32_t startTime = 0;        // Variable to store the start time when the button is pressed
volatile uint32_t blinkCounter = 0;     // Counter for LED blinking
const uint32_t timerResolution = 1000;  // Timer resolution in Hz  


TM1637TinyDisplay display(CLK_PIN, DIO_PIN);

void setupTimer0() {
  // Configure Timer0
  TCCR0A = 0; // Clear Timer0 control registers
  TCCR0B = 0;

  // Set CTC (Clear Timer on Compare Match) mode
  TCCR0A |= (1 << WGM01);

  // Set prescaler to 64
  TCCR0B |= (1 << CS01) | (1 << CS00);

  // Set Timer0 compare value for 1ms
  OCR0A = 125; // (clock frequency / (prescaler * desired frequency)) - 1

  // Enable Timer0 compare interrupt
  TIMSK |= (1 << OCIE0A);
}

void setup() {
  display.begin();
  display.setBrightness(3); // Set brightness to a value between 0 and 7
  DDRB |= (1 << LED_PIN);
  PORTB |= (1 << BUTTON_PIN);

  // Enable global interrupts
  sei();

  // Setup Timer0
  setupTimer0();
}


void loop() {
  static int prevCounterValue = 0; // Variable to store the previous counter value
  int potValue = analogRead(POT_PIN); // Read the value of the potentiometer
  int mappedValue = map(potValue, 0, 1023, 1, 10); // Map the potentiometer value to the range of 1 to 10

  if (BUTTON_PRESSED() && !relayOn) {
    startTime = timerMillis; // Record the time when the button is pressed
    relayOn = true;          // Turn on the relay
    PORTB |= (1 << LED_PIN);
  }

  if (relayOn) {
    if (timerMillis - startTime >= mappedValue * 60000) {
      relayOn = false;
      PORTB &= ~(1 << LED_PIN);
    }
  }

  if (relayOn && blinkCounter >= 1000) {
    uint32_t elapsedTime = timerMillis - startTime;
    uint32_t remainingTime = mappedValue * 60000 - elapsedTime;
    int secondsRemaining = remainingTime / 1000;

    // Update the display only if the counter value has changed significantly
    if (secondsRemaining != prevCounterValue) {
      display.showNumberDec(secondsRemaining, false);
      prevCounterValue = secondsRemaining; // Update the previous counter value
    }
  } else if (!relayOn) {
    // If the relay is off, display the mapped value
    if (mappedValue != prevCounterValue) {
      display.showNumberDec(mappedValue, false);
      prevCounterValue = mappedValue; // Update the previous counter value
    }
  }
}

//void loop(){
//   if (BUTTON_PRESSED() && !relayOn) {
//     startTime = timerMillis; // Record the time when the button is pressed
//     relayOn = true;          // Turn on the relay
//     PORTB |= (1 << LED_PIN);
//   }

//   int potValue = analogRead(POT_PIN); // Read the value of the potentiometer
//   int mappedValue = map(potValue, 0, 1023, 1, 10); // Map the potentiometer value to the range of 1 to 10

//   display.showNumberDec(mappedValue, false); // Display the mapped value on the TM1637 display
//   //delay(50); // Delay for stability, adjust as needed

//   if (relayOn) {
//     if (timerMillis - startTime >= mappedValue * 60000) {
//       relayOn = false;
//       PORTB &= ~(1 << LED_PIN);
//     }
//   }
//     if (relayOn && blinkCounter >= 1000) {
//         uint32_t elapsedTime = timerMillis - startTime;
//         uint32_t remainingTime = mappedValue * 60000 - elapsedTime;
//         int secondsRemaining = remainingTime / 1000;

//         // Display the remaining time in seconds
//         display.showNumberDec(secondsRemaining, false);
//     }
//     else if (!relayOn)
//     {
//       display.showNumberDec(mappedValue, false);
//       // delay(50);
//     }

// }

ISR(TIMER0_COMPA_vect)
{
   timerMillis++;  // Increment elapsed milliseconds
   blinkCounter++; // Increment blink counter
}

Comments

Popular posts from this blog

Stabilizer in Hindi स्टेबलाइजर की पूरी जानकारी हिंदी में

स्टेबलाइजर क्या होता है घर के लिए सही वोल्टेज स्टेबलाइजर आपने वोल्टेज स्टेबलाइजर के बारे में जरूर सुना होगा और आपके घर में stabilizer जरूर होगा। लेकिन क्या आप जानते हैं कि स्टेबलाइजर क्या होता है?(what is stabilizer ?) क्या आप जानते हैं कि स्टेबलाइजर का काम क्या है और स्टेबलाइजर कितने प्रकार के होता है? क्या आप जानते हैं कि स्टेबलाइजर कैसे काम करता है? यदि नहीं जानते हैं तो हमारा ये पोस्ट जरूर पढ़ें। इस पोस्ट में आज हम स्टेबलाइजर की पूरी जानकारी हिंदी(stabilizer in Hindi) में देने जा रहे हैं। स्टेबलाइजर एक ऐसी डिवाइस होती है जो कि Fix Value की वोल्टेज प्रदान करता है.हमारे घर में कुछ ऐसे उपकरण होते हैं जिन्हें कम से कम 240 V की सप्लाई की जरूरत होती है और कुछ कारणवश हमारे घर में अगर सप्लाई 240V से कम आती है तो वह उपकरण ठीक प्रकार से कार्य नहीं कर पाता इसीलिए उसके लिए स्टेबलाइजर की जरूरत पड़ती है. जो कि हमारे घर में आने वाली सप्लाई को 240V पर Fix कर के उपकरण को 240V की सप्लाई प्रदान करता है. स्टेबलाइजर का इस्तेमाल ज्यादातर रेफ्रिजरेटर  (फ्रिज) एयर कंडीशनर इत्यादि पर किया जाता ...

वायर जॉइंट के Different प्रकार

 Different Types of Wire Joint Requirement:- किसी भी तार में जॉइंट बनाने की जरुरत क्यों पड़ती है किसी भी वायर में जॉइंट बनाने की जरुरत इसलिए पड़ती है ताकि किसी भी चालक तार की लम्बाई बढ़ाई जा सके और किसी चालक लाइन में से किसी अन्य लाइन को जॉइंट बनाकर उसे स्थाई रूप से जोड़ा जा सके जॉइंट ऐसा होना चाहिए की वह लाइन को अच्छे कनेक्ट तथा लाइन को पर्याप्त सुद्रढ़ता भी प्रदान कर सके,,इन जोइन्टो को विभिन्न प्रकार से तैयार किया जाता है यह चालक तार की मोटाई,जोड़ की किस्म,जॉइंट किस लाइन में लगाना है इत्यादि पर निर्भर करती है  ।   Different Types of  Joints:-ओवर हेड लाइन्स तथा घरेलु वायरिंग में मुख्यतः निम्न जोड़ प्रचलित है  Twisted Joint(ऐंठा हुआ जोड़) :- इस प्रकार के जॉइंट में तारो अथवा केबल के चालक सिरों को आपस में ऐंठ कर उनके अंतिम समापन सिरों को जोड़ की और मोड़ देते है इस प्रकार का जॉइंट ओवर हेड लाइन में खम्बो के ऊपर लगे इंसुलेटर पर लगाया जाता है इसे किसी लाइन के मध्य में नहीं लगाया जाता है इसे Pig Tail अथवा Rat-Tail Joint जॉइंट भी कहते है।    Married Joint(मै...

Star Delta Starter In Hindi | स्टार डेल्टा स्टार्टर | का प्रयोग मोटर में क्यों किया जाता है ?

स्टार डेल्टा स्टार्टर |Star Delta Starter इस Article मे स्टार डेल्टा कनेक्शन, Star Delta Formula, स्टार डेल्टा स्टार्टर का सिद्धांत, पावर डायग्राम, कन्ट्रोल डायग्राम, स्टार डेल्टा स्टार्टर के लाभ एवम नुकशान और स्टार डेल्टा स्टार्टर से संबधित इंटरव्यू में पूछे जाने वाले सवाल पे भी विस्तृत में जानकारी देने की कोशिश की हे। आशा हे आप के लिए मददगार होगी। Star Delta Starter मोटर को सलामती पूर्वक चालू करने के लिए, मोटर का रक्षण करने के लिए एवम मोटर का स्टार्टिंग करंट कम करने के लिए उपयोग किया जाता हे। मोटर को स्टार्ट करने के लिए और भी कही टाइप के स्टार्टर हे। जैसे की डायरेक्ट ऑन लाइन स्टार्टर, स्टार डेल्टा स्टार्टर, ऑटो ट्रांसफार्मर स्टार्टर, सॉफ्ट स्टार्टर, vfd (Variable Frequency Drive) और रोटर रेजिस्टेंस स्टार्टर, जो मोटर को सलामती पूर्वक चालू भी करते हे,और सुरक्षा भी प्रदान करते हे। स्टार डेल्टा स्टार्टर क्या है? एक स्टार्टर का काम हे स्टार्ट करना। यहां एक इलेक्ट्रिक मोटर स्टार्टर की बात हे। स्टार डेल्टा स्टार्टर याने, एक इलेक्ट्रिकल उपकरण जो कही उपकरणों को एकत्रित करके तैयार किया जाता ह...