নীচের কোডটি যা জিজ্ঞাসা করছে তা অর্জন করে:
#include <avr/sleep.h>
#include <avr/power.h>
const byte AWAKE_LED = 8;
const byte GREEN_LED = 9;
const unsigned long WAIT_TIME = 5000;
ISR (PCINT2_vect)
{
// handle pin change interrupt for D0 to D7 here
} // end of PCINT2_vect
void setup()
{
pinMode (GREEN_LED, OUTPUT);
pinMode (AWAKE_LED, OUTPUT);
digitalWrite (AWAKE_LED, HIGH);
Serial.begin (9600);
} // end of setup
unsigned long lastSleep;
void loop()
{
if (millis () - lastSleep >= WAIT_TIME)
{
lastSleep = millis ();
noInterrupts ();
byte old_ADCSRA = ADCSRA;
// disable ADC
ADCSRA = 0;
// pin change interrupt (example for D0)
PCMSK2 |= bit (PCINT16); // want pin 0
PCIFR |= bit (PCIF2); // clear any outstanding interrupts
PCICR |= bit (PCIE2); // enable pin change interrupts for D0 to D7
set_sleep_mode (SLEEP_MODE_PWR_DOWN);
power_adc_disable();
power_spi_disable();
power_timer0_disable();
power_timer1_disable();
power_timer2_disable();
power_twi_disable();
UCSR0B &= ~bit (RXEN0); // disable receiver
UCSR0B &= ~bit (TXEN0); // disable transmitter
sleep_enable();
digitalWrite (AWAKE_LED, LOW);
interrupts ();
sleep_cpu ();
digitalWrite (AWAKE_LED, HIGH);
sleep_disable();
power_all_enable();
ADCSRA = old_ADCSRA;
PCICR &= ~bit (PCIE2); // disable pin change interrupts for D0 to D7
UCSR0B |= bit (RXEN0); // enable receiver
UCSR0B |= bit (TXEN0); // enable transmitter
} // end of time to sleep
if (Serial.available () > 0)
{
byte flashes = Serial.read () - '0';
if (flashes > 0 && flashes < 10)
{
// flash LED x times
for (byte i = 0; i < flashes; i++)
{
digitalWrite (GREEN_LED, HIGH);
delay (200);
digitalWrite (GREEN_LED, LOW);
delay (200);
}
}
} // end of if
} // end of loop
সিরিয়াল ডেটা কখন উপস্থিত হবে তা লক্ষ করার জন্য আমি আরএক্স পিনে একটি পিন-পরিবর্তন বাধা ব্যবহার করেছি। এই পরীক্ষায় 5 সেকেন্ড পরে কোনও তত্পরতা না থাকলে বোর্ড ঘুমাতে যায় ("জাগ্রত" এলইডি চলে যায়)। আগত সিরিয়াল ডেটা বোর্ডকে জাগাতে পিন-পরিবর্তন বাধা দেয়। এটি একটি সংখ্যার সন্ধান করে এবং সেই সংখ্যাটি "সবুজ" এলইডি জ্বলজ্বল করে।
বর্তমানের পরিমাপ
5 ভি-তে চালানো, আমি ঘুমানোর সময় প্রায় 120 এনএ বর্তমানের পরিমাপ করেছি (0.120 µA)।
জাগরণ বার্তা
তবে একটি সমস্যা হ'ল প্রথম আগমনকারী বাইটটি এই কারণে হারিয়ে গেছে যে সিরিয়াল হার্ডওয়্যারটি Rx (স্টার্ট বিট) এর একটি পতন স্তর প্রত্যাশা করে যা এটি পুরোপুরি জাগ্রত হওয়ার সময় ইতিমধ্যে পৌঁছেছে।
আমি প্রস্তাব দিচ্ছি (জ্যামিতিকের জবাব হিসাবে) আপনি প্রথমে একটি "জাগ্রত" বার্তা প্রেরণ করুন এবং তারপরে অল্প সময়ের জন্য বিরতি দিন । বিরতি হ'ল হার্ডওয়্যারটি জাগ্রত বার্তার অংশ হিসাবে পরবর্তী বাইটটি ব্যাখ্যা করে না তা নিশ্চিত করা to এর পরে এটি ঠিকঠাক কাজ করা উচিত।
যেহেতু এটি একটি পিন-পরিবর্তন বিঘ্নিত ব্যবহার করে অন্য কোনও হার্ডওয়্যার প্রয়োজন হয় না।
সফ্টওয়্যারসিরাল ব্যবহার করে সংশোধিত সংস্করণ
নীচের সংস্করণটি সিরিয়ালে প্রাপ্ত প্রথম বাইট সফলভাবে প্রক্রিয়া করে। এটি এর দ্বারা করে:
ফারো দ্বারা একটি মন্তব্যে অনুপ্রাণিত হয়ে এটি প্রসেসরটিকে 6 টি ঘড়ির চক্র (750 এনএস) এ জাগতে দেয়। 9600 বাউডে প্রতি বিট সময় 1/9600 (104.2 µs) হয় তাই অতিরিক্ত বিলম্ব তুচ্ছ।
#include <avr/sleep.h>
#include <avr/power.h>
#include <SoftwareSerial.h>
const byte AWAKE_LED = 8;
const byte GREEN_LED = 9;
const unsigned long WAIT_TIME = 5000;
const byte RX_PIN = 4;
const byte TX_PIN = 5;
SoftwareSerial mySerial(RX_PIN, TX_PIN); // RX, TX
void setup()
{
pinMode (GREEN_LED, OUTPUT);
pinMode (AWAKE_LED, OUTPUT);
digitalWrite (AWAKE_LED, HIGH);
mySerial.begin(9600);
} // end of setup
unsigned long lastSleep;
void loop()
{
if (millis () - lastSleep >= WAIT_TIME)
{
lastSleep = millis ();
noInterrupts ();
byte old_ADCSRA = ADCSRA;
// disable ADC
ADCSRA = 0;
set_sleep_mode (SLEEP_MODE_PWR_DOWN);
power_adc_disable();
power_spi_disable();
power_timer0_disable();
power_timer1_disable();
power_timer2_disable();
power_twi_disable();
sleep_enable();
digitalWrite (AWAKE_LED, LOW);
interrupts ();
sleep_cpu ();
digitalWrite (AWAKE_LED, HIGH);
sleep_disable();
power_all_enable();
ADCSRA = old_ADCSRA;
} // end of time to sleep
if (mySerial.available () > 0)
{
byte flashes = mySerial.read () - '0';
if (flashes > 0 && flashes < 10)
{
// flash LED x times
for (byte i = 0; i < flashes; i++)
{
digitalWrite (GREEN_LED, HIGH);
delay (200);
digitalWrite (GREEN_LED, LOW);
delay (200);
}
}
} // end of if
} // end of loop
ঘুমানোর সময় বিদ্যুত ব্যবহার 260 এনএ (0.260 µA) হিসাবে পরিমাপ করা হয় যাতে প্রয়োজন হয় না তখন এটি খুব কম খরচ হয়।
নোট করুন যে ফিউজগুলি সেটির মতো সেট করে প্রসেসরটি 8 মেগাহার্টজ এ চলে। সুতরাং আপনাকে সেই বিষয়ে আইডিই বলতে হবে (উদাঃ বোর্ডের ধরণ হিসাবে "লিলিপ্যাড" নির্বাচন করুন)। এইভাবে বিলম্ব এবং সফটওয়্যারসরিয়াল সঠিক গতিতে কাজ করবে।