الثلاثاء، 6 أغسطس، 2013

وضع الأسبات Sleep mode الجزء الثاني



في تدوينة سابقة تحدثت عن طريقة الإسبات و الإيقاض للمتحكم الأصغري عن طريق تغيير حالة المدخل خارجياً External Interrupt و هناك طريقة تندرج معها ألا و هي Serial UART WakeUp .

بحيث نسمح للمتحكم بالخروج من حالة الإسبات و العمل مجدداً عندما يستلم معلومات عن طريق السيريال .

هذه الطريقة فعّالة جداً و تطبيقاتها كثيرة .

يمكن تفعيل ذلك من خلال البرمجة أو توصيل مقاومة بين ال Rx و المدخل D2 و عمل مقاطعة خارجية External Interrupt .


لن تحتاج سوى لبطاقة أردوينو و و توصيل مقاومة 1k بين D0 و D2 .




و البرنامج تجدونه هنا .


// Written by : Mohannad Rawashdeh

// http://www.genotronex.com

//this simple code to run arduino on sleep mode .
#include <avr/sleep.h>
#include <avr/power.h>

int SwitchPin=2; // interrupt INT0;


void SleepNow(void){
  digitalWrite(13,LOW);
 // use one of those Sleep mode :
 /*
SLEEP_MODE_IDLE 
SLEEP_MODE_ADC
SLEEP_MODE_PWR_SAVE
SLEEP_MODE_STANDBY
SLEEP_MODE_PWR_DOWN 

Notice :  use SLEEP_MODE_STANDBY with extenal Resonater only
 */
 set_sleep_mode(SLEEP_MODE_PWR_SAVE); 
 sleep_enable();
 attachInterrupt(0,WakeUp,LOW);
 sleep_mode();
 sleep_disable(); // The program will continue from here.
// you can detach interrup here , uncomment this line
detachInterrupt(0);
}
void WakeUp(void){ 
}
//........................

void setup() {
  // put your setup code here, to run once:
Serial.begin(9600);
Serial.setTimeout(500);
delay(100);
pinMode(13,OUTPUT);
pinMode(SwitchPin,INPUT);
}

void loop() {
  // put your main code here, to run repeatedly: 
  
 }
 void serialEvent(){
  digitalWrite(13,HIGH);
 char str[30]={0};
 Serial.readBytesUntil('.',str,30);// read 30 byte or until str[i]='.'
 Serial.println("Wake up !") ;
 //Notice that the str doesn't save the first character .
 delay(50);

 for(int i=0;i<30;i++){
  Serial.print(str[i]);
  delay(20);
 }
 Serial.println(" ");
 Serial.println("Sleep Now ! ");
 delay(50);
 SleepNow();
}


يقوم البرنامج بإيقاظ الأردوينومن حالة الإسبات عندما نرسل لها معلومات عن طريق السيريال فقط , يقوم بعرض النتيجة على الشاشة ثم يدخل في حالة الإسبات مجدداً .


ملاحظة : قد لا يقرأ البرنامج أول قيمة من المدخلات مثلاً اذا كتبنا Mohannad فإن النتيجة المعروضة تكون ohannad يمكن حل المشكلة بترك فراغ قبل كتابة المعلومات .


عند تلقي المعلومات يضيئ ال LED D13 و عند الدخول لوضع الإسبات يطفئ هذا الضوء .



0 التعليقات :

إرسال تعليق

 
Creative Commons License
This work is licensed under a Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International License.