قسم الميكروكنترولر والروبوت ودوائر الاتصال بالحاسب الالي قسم المتحكمات الـ microcontroller و المعالجات microprocessor و التحكم الرقمي بالكمبيوتر CNC والانظمة الآلية والروبوت Robots

   

الصورة الرمزية F.Abdelaziz
F.Abdelaziz
:: استاذ و مشرف قسم الالكترونيات ::
تاريخ التسجيل: May 2007
المشاركات: 6,832
نشاط [ F.Abdelaziz ]
قوة السمعة:
قديم 03-03-2020, 09:45 PM المشاركة 89   
افتراضي قفل رقمي مشفر بكلمة مرور باستخدام Arduino,Keypad,EEPROM,LCD :



قفل رقمي مشفر بكلمة مرور باستخدام Arduino,Keypad,EEPROM,LCD :

الدائرة الكهربية :



البرنامج :

كود:
#include <Keypad.h>
#include<LiquidCrystal.h>
#include<EEPROM.h>

LiquidCrystal lcd(A0,A1,A2,A3,A4,A5);//RS,E,D4,D5,D6,D7

const byte ROWS = 4; //four rows
const byte COLS = 4; //four columns
char hexaKeys[ROWS][COLS] = {
{'1','2','3','A'},
{'4','5','6','B'},
{'7','8','9','C'},
{'*','0','#','D'}
};
byte rowPins[ROWS] = {2,3,4,5}; //connect to the row pinouts of the keypad
byte colPins[COLS] = {6,7,8,9};   //connect to the column pinouts of the keypad
//initialize an instance of class NewKeypad
Keypad customKeypad = Keypad( makeKeymap(hexaKeys), rowPins, colPins, ROWS, COLS);


char password[4];// Input password
char pass[4],pass1[4];
char customKey=0;

int i=0;// password  characters counter
int led=12;//Green LED connected to pin 12
int buzzer = 10;//Buzzer connected to pin 10 
int relay = 11; //relay connected to pin 11

void setup()
{
  lcd.begin(16,2);

  pinMode(relay, OUTPUT);//Relay output
  pinMode(led, OUTPUT);
  pinMode(buzzer, OUTPUT);

  
  lcd.print(" Electronic ");
  lcd.setCursor(0,1);
  lcd.print(" Keypad Lock ");
  delay(2000);
  lcd.clear();

  lcd.print("Enter Ur Passkey:");
  lcd.setCursor(0,1);

//This part must remove after first run 
  for(int j=0;j<4;j++)
    EEPROM.write(j, j+49); //49 = character ‘1’
  for(int j=0;j<4;j++)
    pass[j]=EEPROM.read(j);
}

void loop()
{
  digitalWrite(relay, HIGH);//Key locked

  customKey = customKeypad.getKey();

  if(customKey=='#')
    change();

  if (customKey)
  {
    password[i++]=customKey;// Input password
    lcd.print(customKey);
    beep();
  }

  if(i==4)//No. of input characters
  {
    delay(200);

    for(int j=0;j<4;j++)
      pass[j]=EEPROM.read(j);//Saved password
   
 if(!(strncmp(password, pass,4)))// compare password with pass only the first four characters. returns 0, if both are equal
    { //if match
      digitalWrite(led, HIGH);//Open indication
      beep();
      lcd.clear();

      lcd.print("Passkey Accepted");
      digitalWrite(relay, LOW);//Relay off , lock open
      delay(2000);

      lcd.setCursor(0,1);
      lcd.print("#.Change Passkey");
      delay(2000);
      lcd.clear();

      lcd.print("Enter Passkey:");
      lcd.setCursor(0,1);
      i=0;
      digitalWrite(led, LOW);
    }

    else // if not match
    {
      digitalWrite(relay, HIGH);
      digitalWrite(buzzer, HIGH);
      lcd.clear();
      lcd.print("Access Denied...");
      lcd.setCursor(0,1);
      lcd.print("#.Change Passkey");
      delay(2000);
      lcd.clear();
      lcd.print("Enter Passkey:");
      lcd.setCursor(0,1);
      i=0;
      digitalWrite(buzzer, LOW);
    }//end of if…else
  }//end of if(i==4)
}// end of loop


void change()
{
  int j=0;
  lcd.clear();
  lcd.print("UR Current Passk");
  lcd.setCursor(0,1);

  while(j<4)
  {
    char key=customKeypad.getKey();

    if(key)
    {
      pass1[j++]=key;
      lcd.print(key);
      beep();
    }//end if

    key=0;
  }//end while

  delay(500);

  if((strncmp(pass1, pass, 4)))
  {
    lcd.clear();
    lcd.print("Wrong Passkey...");
    lcd.setCursor(0,1);
    lcd.print("Better Luck Again");
    delay(1000);
  }

  else
  {
    j=0;
    lcd.clear();
    lcd.print("Enter New Passk:");
    lcd.setCursor(0,1);

    while(j<4)
    {
      char key=customKeypad.getKey();

      if(key)
      {
        pass[j]=key;
        lcd.print(key);
        EEPROM.write(j,key);
        j++;
        beep();
      }//end if

    }//end while

    lcd.print(" Done......");
    delay(1000);
  }//end else

  lcd.clear();
  lcd.print("Enter Ur Passk:");
  lcd.setCursor(0,1);

  customKey=0;

} // end of void change

void beep()
{
  digitalWrite(buzzer, HIGH);
  delay(20);
  digitalWrite(buzzer, LOW);
}


اعلانات

الصورة الرمزية F.Abdelaziz
F.Abdelaziz
:: استاذ و مشرف قسم الالكترونيات ::
تاريخ التسجيل: May 2007
المشاركات: 6,832
نشاط [ F.Abdelaziz ]
قوة السمعة:
قديم 03-03-2020, 09:51 PM المشاركة 90   
افتراضي


تفاصيل البرنامج :

أولا : مقدمة (رأس) البرنامج :
1- يتم تضمين #include ملفات الرأس للمكتبات Keypad.h و LiquidCrystal.h و EEPROM.h .
2- إنشاء الكائن lcd من الفئة LiquidCrystal مع تحديد أطراف توصيل LCD بالاردوينو (9,8,7,6,5,4) .
3- تعريفات لوحة المفاتيح وتشمل : عدد الصفوف ROWS ، وعدد الأعمدة COLS ، والأحرف المستخدمة hexaKeys ، وأطراف توصيل الصفوف rowPins ، وأطراف توصيل الأعمدة colPins ، وأخيرا إنشاء الكائن customKeypad من الفئة Keypad بالوسائط hexaKeys و rowPins و colPins و ROWS و COLS .
4- إعلان المتغيرات العمومية Global المستخدمة فى البرنامج .


كود:
#include <Keypad.h>
#include<LiquidCrystal.h>
#include<EEPROM.h>

LiquidCrystal lcd(A0,A1,A2,A3,A4,A5);//RS,E,D4,D5,D6,D7

const byte ROWS = 4; //four rows
const byte COLS = 4; //four columns
char hexaKeys[ROWS][COLS] = {
{'1','2','3','A'},
{'4','5','6','B'},
{'7','8','9','C'},
{'*','0','#','D'}
};
byte rowPins[ROWS] = {2,3,4,5}; //connect to the row pinouts of the keypad
byte colPins[COLS] = {6,7,8,9};   //connect to the column pinouts of the keypad
//initialize an instance of class NewKeypad
Keypad customKeypad = Keypad( makeKeymap(hexaKeys), rowPins, colPins, ROWS, COLS);


char password[4];// Input password
char pass[4],pass1[4];
char customKey=0;

int i=0;// password  characters counter
int led=12;//Green LED connected to pin 12
int buzzer = 10;//Buzzer connected to pin 10 
int relay = 11; //relay connected to pin 11

ثانيا : دالة الإعداد setup :
1- تهيئة شاشة LCD بالدالة lcd.begin .
2- تحديد وضع الأطراف relay و led و buzzer كمخارج OUTPUT .
3- طباعة رسالة افتتاحية : Electronic فى السطر الأول من الشاشة و Keypad Lock فى السطر الثانى مع تأخير 2 ثانية ومسح الشاشة .
4- طباعة العبارة Enter Ur Passkey: فى السطر الأول ، ثم وضع المؤشر على أول السطر الثانى (0,1) تمهيدا لطباعة كلمة المرور المدخلة من لوحة المفاتيح .
5- سوف نستخدم EEPROM الخاص بالاردوينو لحفظ كلمة المرور ، لذلك عندما نقوم بتشغيل هذه الدائرة لأول مرة ، يقرأ البرنامج البيانات النفايات garbage من EEPROM الخاص بالاردوينو ومقارنتها بكلمة مرور الإدخال وإعطاء رسالة على شاشة LCD تم رفض الوصول Access Denied بسبب عدم مطابقة كلمة المرور. لحل هذه المشكلة ، نحتاج إلى تعيين كلمة مرور افتراضية لأول مرة باستخدام البرمجة الواردة أدناه:

كود:
for(int j=0;j<4;j++)
    EEPROM.write(j, j+49); //49 = character ‘1’
  for(int j=0;j<4;j++)
    pass[j]=EEPROM.read(j);

سيؤدي هذا إلى ضبط كلمة المرور على "1234" على EEPROM للاردوينو وتخزينها فى المصفوفة pass .
بعد تشغيل البرنامج لأول مرة ، نحتاج إلى إزالة هذا الجزء من البرنامج ثم كتابة الكود مرة أخرى فى الاردوينو وتشغيله. الآن سوف يعمل نظامك بشكل جيد. كلمة المرور المستخدمة الآن هى "1234". يمكنك الآن تغييرها عن طريق الضغط على الزر # ثم إدخال كلمة المرور الحالية ثم إدخال كلمة المرور الجديدة.



كود:
void setup()
{
  lcd.begin(16,2);

  pinMode(relay, OUTPUT);//Relay output
  pinMode(led, OUTPUT);
  pinMode(buzzer, OUTPUT);

  
  lcd.print(" Electronic ");
  lcd.setCursor(0,1);
  lcd.print(" Keypad Lock ");
  delay(2000);
  lcd.clear();

  lcd.print("Enter Ur Passkey:");
  lcd.setCursor(0,1);

//This part must remove after first run 
  for(int j=0;j<4;j++)
    EEPROM.write(j, j+49); //49 = character ‘1’
  for(int j=0;j<4;j++)
    pass[j]=EEPROM.read(j);
}

ثالثا : الدالة loop :
1- فى البداية يتم تشغيل relay ليقوم بالغلق .
2- باستخدام الدالة getKey نحصل على الحرف المقابل للزر الذى تم الضغط عليه وتخزينه فى المتغير customKey
3- إذا كان الزر هو المقابل للحرف '#' يتم إستدعاء الدالة change المذكورة بعد الدالة loop .
4- إذا كان الزر أى زر آخر تكون customKey بالقيمة true ويتم تخزين الحرف فى المصفوفة password ثم بعد ذلك زيادة متغير العداد i بواحد مع طباعة الحرف على الشاشة print(customKey) ، واستدعاء الدالة beep لإصدار صفارة عند الضغط على الزر .
5- عندما يصل عداد أحرف كلمة المرور i إلى 4 أى if(i==4) ، بعد تأخير قليل يتم قراءة أحرف كلمة المرور المخزنة فى eeprom وحفظها فى المصفوفة pass >
6- تستخدم الدالة strncmp(password, pass,4) لمقارنة السلسلة password مع السلسلة pass فى مدى الأربع حروف الأولى . إذا حدث تطابق بينهما يكون عائد الدالة “0” ويكون المعكوس بالقيمة true ويتم تنفيذ ما يلى :
أ‌- تشغيل الليد الأخضر لبيان صحة كلمة المرور والتأهل لفتح القفل .
ب‌- إستدعاء الدالة beep لإطلاق صفارة .
ت‌- مسح الشاشة clear .
ث‌- طباعة Passkey Accepted .
ج‌- فصل الريلاى (relay, LOW) مما يؤدى لفتح القفل .
ح‌- التأخير 2 ثانية للسماح بقتح القفل .
خ‌- فى السطر الثانى يتم طباعة #.Change Passkey .
د‌- التأخير 2 ثانية للسماح بتغيير كلمة المرور عند الرغبة .
ذ‌- مسح الشاشة .
ر‌- طباعة Enter Passkey: مرة أخرى ووضع المؤشر على بداية السطر الثانى .
ز‌- تصفير متغير عداد أحرف كلمة المرور i .
س‌- فصل الليد الأخضر لبيان .

إذا لم else تتطابق سلسلة كلمة المرور المدخلة مع سلسلة كلمة المرور المخزنة فى eeprom يتم تنفيذ ما يلى :
أ‌- تأكيد تشغيل الريلاى (الغلق) (relay, HIGH) .
ب‌- تشغيل الصفارة (buzzer, HIGH) .
ت‌- مسح الشاشة clear .
ث‌- طباعة Access Denied... فى السطر الأول .
ج‌- وضع المؤشر على بداية السطر الثانى (0,1) .
ح‌- طباعة #.Change Passkey .
خ‌- التأخير 2 ثانية .
د‌- مسح الشاشة .
ذ‌- كتابة Enter Passkey: فى السطر الأول .
ر‌- وضع المؤشر على بداية السطر الثانى .
ز‌- تصفير متغير عداد أحرف كلمة المرور المدخلة i .
س‌- فصل الصفارة (buzzer, LOW) .


كود:
 void loop()
{
  digitalWrite(relay, HIGH);//Key locked

  customKey = customKeypad.getKey();

  if(customKey=='#')
    change();

  if (customKey)
  {
    password[i++]=customKey;// Input password
    lcd.print(customKey);
    beep();
  }

  if(i==4)//No. of input characters
  {
    delay(200);

    for(int j=0;j<4;j++)
      pass[j]=EEPROM.read(j);//Saved password
   
 if(!(strncmp(password, pass,4)))// compare password with pass only the first four characters. returns 0, if both are equal
    { //if match
      digitalWrite(led, HIGH);//Open indication
      beep();
      lcd.clear();

      lcd.print("Passkey Accepted");
      digitalWrite(relay, LOW);//Relay off , lock open
      delay(2000);

      lcd.setCursor(0,1);
      lcd.print("#.Change Passkey");
      delay(2000);
      lcd.clear();

      lcd.print("Enter Passkey:");
      lcd.setCursor(0,1);
      i=0;
      digitalWrite(led, LOW);
    }

    else // if not match
    {
      digitalWrite(relay, HIGH);
      digitalWrite(buzzer, HIGH);
      lcd.clear();
      lcd.print("Access Denied...");
      lcd.setCursor(0,1);
      lcd.print("#.Change Passkey");
      delay(2000);
      lcd.clear();
      lcd.print("Enter Passkey:");
      lcd.setCursor(0,1);
      i=0;
      digitalWrite(buzzer, LOW);
    }//end of if…else
  }//end of if(i==4)
}// end of loop

رابعا : الدالة change :
والتى تستدعى عند الضغط على الزر # وفيها يتم :
1- إعلان متغير محلى j كعداد لأحرف كلمة المرور المعدلة مع تعيينه بالقيمة صفر .
2- مسح الشاشة وتبعا لها وضع المؤشر فى بداية السطر الأول .
3- طباعة الرسالة UR Current Passk .
4- وضع المؤشر عند بداية السطر الثانى .
5- إنشاء حلقة while بالشرط j<4 للتكرار 4 مرات ، وفى كل مرة :
أ‌- الحصول على الحرف المقابل للزر المضغوط getKey وحفظه فى المتغير key .
ب‌- التحقق من الحرف if(key) ، وإذا كانت النتيجة true يتم :
• نسخ محتويات المتغير key إلى المصفوفة pass1 ثم زيادة العداد j بواحد .
• طباعة الحرف المقابل للمفتاح key .
• إصدار صفارة عند كل ضغطة على زر.
6- تصفير المتغير key للإعداد للحرف التالى حتى يتم الحصول على 4 أحرف .
7- التأخير 500 مللى ثانية .
8- المقارنة بين السلسلة pass1 (التعديل) والسلسلة pass (المخزنة فى eeprom ) . إذا كان هناك عدم تطابق يتم :
• مسح الشاشة .
• طباعة الرسالة Wrong Passkey... .
• وضع المؤشر عند بداية السطر الثانى .
• طباعة الرسالة Better Luck Again .
• التأخير 1 ثانية .
إما إذا كان هناك تطابق فيتم الآتى (بعد أن تم التأكيد من تطابق كلمة المرور مع كلمة المرور المحفوظة سابقا) :
• إعادة تصفير العداد j .
• مسح الشاشة .
• طباعة الرسالة Enter New Passk: .
• وضع المؤشر عند بداية السطر الثانى .
• إنشاء حلقة while بالشرط j<4 للتكرار 4 مرات وفى كل مرة يتم :
1- الحصول على الحرف المقابل للزر المضغوط وحفظه فى المتغير key .
2- اختبار حالة المتغير key فإذا كانت النتيجة true يتم :
• نسخ محتويات المتغير key إلى المصفوفة pass .
• طباعة الحرف key .
• كتابة write(j,key) الحرف (البايت) key عند العنوان j فى ذاكرة eeprom .
• زيادة متغير العداد j بواحد .
• إصدار صوت الصفارة (بيب) beep عند كل ضغطة على زر .
• التكرار 4 مرات للحصول على كلمة المرور pass المكونة من أربع أحرف .
• طباعة الرسالة Done...... .
• التأخير 1 ثانية .
• مسح الشاشة .
• طباعة الرسالة Enter Ur Passk: .
• وضع المؤشر عند بداية السطر الثانى .
• تصفير المتغير customKey والذى تغير فى loop .


كود:
void change()
{
  int j=0;
  lcd.clear();
  lcd.print("UR Current Passk");
  lcd.setCursor(0,1);

  while(j<4)
  {
    char key=customKeypad.getKey();

    if(key)
    {
      pass1[j++]=key;
      lcd.print(key);
      beep();
    }//end if

    key=0;
  }//end while

  delay(500);

  if((strncmp(pass1, pass, 4)))
  {
    lcd.clear();
    lcd.print("Wrong Passkey...");
    lcd.setCursor(0,1);
    lcd.print("Better Luck Again");
    delay(1000);
  }

  else
  {
    j=0;
    lcd.clear();
    lcd.print("Enter New Passk:");
    lcd.setCursor(0,1);

    while(j<4)
    {
      char key=customKeypad.getKey();

      if(key)
      {
        pass[j]=key;
        lcd.print(key);
        EEPROM.write(j,key);
        j++;
        beep();
      }//end if

    }//end while

    lcd.print(" Done......");
    delay(1000);
  }//end else

  lcd.clear();
  lcd.print("Enter Ur Passk:");
  lcd.setCursor(0,1);

  customKey=0;

} // end of void change


خامسا : الدالة beep
وفيها يتم تشغيل الصفارة ، والتأخير 20 مللى ثانية ، ثم فصل الصفارة .

كود:
void beep()
{
  digitalWrite(buzzer, HIGH);
  delay(20);
  digitalWrite(buzzer, LOW);
}


اعلانات اضافية ( قم بتسجيل الدخول لاخفائها )

الصورة الرمزية Bahaa599599
Bahaa599599
:: مهندس متميز ::
تاريخ التسجيل: Nov 2017
الدولة: فلسطين
المشاركات: 404
نشاط [ Bahaa599599 ]
قوة السمعة:
قديم 04-03-2020, 07:12 PM المشاركة 91   
افتراضي


السلام عليكم
انا اواجه مشكلة بسيطة في كود ال RTC ف هي لا تتعرف عندي كما موضح بالصورة بالاسفل
نزلت من النت عدة اكواد للتاكد من صحة الكود لكن حتى بهذه الاكواد تظهر رسالة خطا
هذا كود ال RTC الاساسي في الصورة اتمنى ايجاد الحل
البرنامج اخر تحديث من مجر ميكروسوفت



الصورة الرمزية F.Abdelaziz
F.Abdelaziz
:: استاذ و مشرف قسم الالكترونيات ::
تاريخ التسجيل: May 2007
المشاركات: 6,832
نشاط [ F.Abdelaziz ]
قوة السمعة:
قديم 04-03-2020, 09:38 PM المشاركة 92   
افتراضي


السلام عليكم
انا اواجه مشكلة بسيطة في كود ال RTC ف هي لا تتعرف عندي كما موضح بالصورة بالاسفل
نزلت من النت عدة اكواد للتاكد من صحة الكود لكن حتى بهذه الاكواد تظهر رسالة خطا
هذا كود ال RTC الاساسي في الصورة اتمنى ايجاد الحل
البرنامج اخر تحديث من مجر ميكروسوفت

أخى الكريم

الرسالة تعتى أنه لم يتم تضمين المكتبة أو تم تضمين مكتبة غير صحيحة

علما يأنه تم تجربة ترجمة البرنامج الموجود ضمن الامثلة وهو يعمل بصورة جيدة

مع العلم أننى أعمل على المكتبة RTClib by Adafruit Version 1.3.3

هناك مكتبة أخرى بنفس الاسم

مع تمنياتى بدوام التوفيق


التعديل الأخير تم بواسطة : F.Abdelaziz بتاريخ 04-03-2020 الساعة 10:04 PM

الصورة الرمزية Bahaa599599
Bahaa599599
:: مهندس متميز ::
تاريخ التسجيل: Nov 2017
الدولة: فلسطين
المشاركات: 404
نشاط [ Bahaa599599 ]
قوة السمعة:
قديم 05-03-2020, 05:25 AM المشاركة 93   
افتراضي


السلام عليكم
مع كامل احترامي
لكن لا اعرف كيف يتم اضافة المكتبات لهذا البرنامج


الصورة الرمزية F.Abdelaziz
F.Abdelaziz
:: استاذ و مشرف قسم الالكترونيات ::
تاريخ التسجيل: May 2007
المشاركات: 6,832
نشاط [ F.Abdelaziz ]
قوة السمعة:
قديم 05-03-2020, 01:17 PM المشاركة 94   
افتراضي


السلام عليكم
مع كامل احترامي
لكن لا اعرف كيف يتم اضافة المكتبات لهذا البرنامج
طريقة إضافة مكتبة إلى بيئة تطوير الاردوينو :

1- فى بيئة تطوير الاردوينو إذهب إلى القائمة sketch ومنها إلى الخيار Include Library ومنها إلى الخيار Mange Libraries يظهر لك نافذة إدارة المكتبات انتظر حتى يتم تحميل الملفات .
2- فى الحقل Topic اكتب اسم المكتبة ولتكن RTClib تظهر لك قائمة بالمكتبات المتاحة .
3- اختار المكتبة الأنسب واختار رقم الإصدار وانقر على Install يتم على الفور تثبيتها قى بيئة التطوير وتظهر فى قائمة المكتبات .

فى حالة عدم وجود المكتبة المطلوبة فى مدير المكتبات يمكنك تنزيل المكتبة المطلوبة من على الانترنت فى صيغة ملف مضغوط وبعد الذهاب إلى Include Libraries يتم الذهاب إلى Add.ZIP library تظهر لك نافذة عن طريقها يتم إدخال ملف النافذة المضغوط حيث تقوم بيئة التطوير بعمل اللازم لإضافة المكتبة ومكوناتها .

مع تمنياتى بالتوفيق


الصورة الرمزية Bahaa599599
Bahaa599599
:: مهندس متميز ::
تاريخ التسجيل: Nov 2017
الدولة: فلسطين
المشاركات: 404
نشاط [ Bahaa599599 ]
قوة السمعة:
قديم 05-03-2020, 01:50 PM المشاركة 95   
افتراضي


طريقة إضافة مكتبة إلى بيئة تطوير الاردوينو :

1- فى بيئة تطوير الاردوينو إذهب إلى القائمة sketch ومنها إلى الخيار Include Library ومنها إلى الخيار Mange Libraries يظهر لك نافذة إدارة المكتبات انتظر حتى يتم تحميل الملفات .
2- فى الحقل Topic اكتب اسم المكتبة ولتكن RTClib تظهر لك قائمة بالمكتبات المتاحة .
3- اختار المكتبة الأنسب واختار رقم الإصدار وانقر على Install يتم على الفور تثبيتها قى بيئة التطوير وتظهر فى قائمة المكتبات .

فى حالة عدم وجود المكتبة المطلوبة فى مدير المكتبات يمكنك تنزيل المكتبة المطلوبة من على الانترنت فى صيغة ملف مضغوط وبعد الذهاب إلى Include Libraries يتم الذهاب إلى Add.ZIP library تظهر لك نافذة عن طريقها يتم إدخال ملف النافذة المضغوط حيث تقوم بيئة التطوير بعمل اللازم لإضافة المكتبة ومكوناتها .

مع تمنياتى بالتوفيق
من قلبي اجمل التحيات
الف شكر
تم بنجاح اضافة المكتبة بفضل الله
والسلام عليكم


الصورة الرمزية F.Abdelaziz
F.Abdelaziz
:: استاذ و مشرف قسم الالكترونيات ::
تاريخ التسجيل: May 2007
المشاركات: 6,832
نشاط [ F.Abdelaziz ]
قوة السمعة:
قديم 05-03-2020, 09:30 PM المشاركة 96   
افتراضي مقياس تردد باستخدام الاردوينو


مقياس تردد باستخدام الاردوينو :
الدائرة الكهربية




يحتوي الاردوينو على دالة خاصة pulseIn ، والتي تمكننا من تحديد مدة duration الحالة الموجبة أو مدة الحالة السالبة لموجة مستطيلة معينة :

كود:
Htime = pulseIn(8,HIGH);
Ltime = pulseIn(8, LOW);

تقيس الدالة الوقت الذي يوجد فيه المستوى المرتفع High أو المنخفض Low الموجود على الطرف 8 من الاردوينو . لذلك في دورة واحدة من الموجة ، سيكون لدينا مدة للمستوى الموجب Htime ومدة للمستوى السالب Ltime بالميكروثانية . الدالة pulseIn تقيس الوقت بالميكروثانية . في إشارة معينة ، نفترض أن لدينا وقت مرتفع Htime وليكن 10ms ووقت منخفض Ltime وليكن 30ms ويكون زمن الدورة 10+30=40ms ، ويكون التردد 1000/40 = 25 Hz . سيتم تخزين 30000 في العدد الصحيح Ltime و 10000 في Htime. عندما نضيفهم معًا ، سنحصل على مدة الدورة ، ومن خلال المعكوس (المقلوب) سنحصل على التردد.

البرنامج :


كود:
#include <LiquidCrystal.h>
LiquidCrystal lcd(2, 3, 4, 5, 6, 7);
int Htime;              //integer for storing high time
int Ltime;                //integer for storing low time
float Ttime;            // integer for storing total time of a cycle
float frequency;        //storing frequency
void setup()
{
    pinMode(8,INPUT);
    lcd.begin(16, 2);
}
void loop()
{
    lcd.clear();
    lcd.setCursor(0,0);
    lcd.print("Frequency : ");
    Htime=pulseIn(8,HIGH);      //read high time
    Ltime=pulseIn(8,LOW);        //read low time
    
    Ttime = Htime+Ltime;
    frequency=1000000/Ttime;    //getting frequency with Ttime is in Micro seconds
    lcd.setCursor(0,1);
    lcd.print(frequency);
    lcd.print(" Hz");
    delay(500);
}



الساعة معتمدة بتوقيت جرينتش +3 الساعة الآن: 07:27 AM
موقع القرية الالكترونية غير مسؤول عن أي اتفاق تجاري أو تعاوني بين الأعضاء
فعلى كل شخص تحمل مسئولية نفسه إتجاه مايقوم به من بيع وشراء وإتفاق وأعطاء معلومات موقعه
التعليقات المنشورة لا تعبر عن رأي موقع القرية الالكترونية ولايتحمل الموقع أي مسؤولية قانونية حيال ذلك (ويتحمل كاتبها مسؤولية النشر)