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

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

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

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

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

what is flip flop in hindi and type of flip flop

what is a flip flop (फ्लिप  फ्लॉप क्या है?) Flip flop यह एक प्रकार की सर्किट है, जसमे दो स्टेज (0 या 1) होता है. तथा इसका इस्तेमाल state information को स्टोर करने के लिए होता है।फिल्प-फ्लॉप एक sequential logic circuit है, जो एक Bit का data स्टोर करने के लिए सक्षम होता है। Flip flop का आउटपुट stable होता है।  और यह दो वैल्यू को ही carry करता है हाई वोल्टेज या लौ वोल्टेज जैसे की एक आउटपुट या तो 0 होगा या फिर 1 होगा। Flip flop यह बाइनरी स्टोरेज डिवाइस है जिसमे binary  bit 0 और 1 स्टोर क्र सकते है।  यह एक कंप्यूटर का सबसे छोटा स्टोरेज यूनिट होता है,यह एक  सिंगल bit का देता स्टोर करता है। एक्सटर्नल इनपुट की संख्या Flip flop के टाइप पर निर्भर  करती है। Flip flop को स्टेबल multi-vibrator  भी कहते है.इसको सबसे पहले जिसने बनया था उसका नाम william Eccels  और F.W.jordan  ने 1918 में विकसित किया था, Flip flop के दो आउटपुट होते है  Q  और  Q    जिसमे आउट एक दूसरे से विपरीत होते है जैसे की एक का ऑउटपु 0 तो दूसे का आउटपुट 1 होग...