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

أدوات الموضوع

الصورة الرمزية F.Abdelaziz
F.Abdelaziz
:: استاذ و مشرف قسم الالكترونيات ::
تاريخ التسجيل: May 2007
المشاركات: 6,894
نشاط [ F.Abdelaziz ]
قوة السمعة:333
قديم 10-02-2020, 08:57 AM المشاركة 1   
افتراضي التحكم فى السفن سيجمنت والمشغل MAX7219 بواسطة الاردوينو مع المكتبة LedControl : Twitter FaceBook Google+



التحكم فى السفن سيجمنت والمشغل MAX7219 بواسطة الاردوينو مع المكتبة LedControl :



سوف نستحدم الوحدة (الموديول) المكون من الدائرة المتكاملة MAX7219 مع شاشة عرض سفن سيجمنت مكونة من حتى ثمانى أرقام digits والمبينة أدناه . يمكن توصيل حتى ثمانى وحدات على التتالى cascade .

هناك مكتبة مطلوبة ليتم تضمينها للعمل مع هذه الوحدة وتسمى LedControl ، يتم تحميلها من الرابط أدناه وثبيتها فى بيئة تطوير الاردوينو .
https://github.com/wayoda/LedControl

التوصيل :
المديول به 5 أطراف للتوصيل وهى سهلة التوصيل . يتوفر الموديول مع خيار للتتالي cascading مع المزيد من الموديولات من نوعه ، وبالتالي تشكيل شاشة أكبر. لنفكر فقط في وحدة واحدة للبساطة.
يتم إجراء الاتصالات على النحو التالي :

VCC- 5v of arduino
GND- gnd of arduino
Din- pin 12
CS(Load)-pin 10
Clk-pin 11
Dout is connected to the Din of the next module.





اعلانات

الصورة الرمزية F.Abdelaziz
F.Abdelaziz
:: استاذ و مشرف قسم الالكترونيات ::
تاريخ التسجيل: May 2007
المشاركات: 6,894
نشاط [ F.Abdelaziz ]
قوة السمعة:333
قديم 10-02-2020, 09:15 AM المشاركة 2   
افتراضي


البرمجة :
مثال المكتبة :
البرنامج :



كود:
//We always have to include the library
#include "LedControl.h"

/*
 Now we need a LedControl to work with.
 ***** These pin numbers will probably not work with your hardware *****
 pin 12 is connected to the DataIn 
 pin 11 is connected to the CLK 
 pin 10 is connected to LOAD 
 We have only a single MAX72XX.
 */
LedControl lc=LedControl(12,11,10,1);

/* we always wait a bit between updates of the display */
unsigned long delaytime=250;

void setup() {
  /*
   The MAX72XX is in power-saving mode on startup,
   we have to do a wakeup call
   */
  lc.shutdown(0,false);
  /* Set the brightness to a medium values */
  lc.setIntensity(0,8);
  /* and clear the display */
  lc.clearDisplay(0);
}


/*
 This method will display the characters for the
 word "Arduino" one after the other on digit 0. 
 */
void writeArduinoOn7Segment() {
  lc.setChar(0,0,'a',false);
  delay(delaytime);

  lc.setRow(0,0,0x05);// r
  delay(delaytime);

  lc.setChar(0,0,'d',false);
  delay(delaytime);

  lc.setRow(0,0,0x1c);//u
  delay(delaytime);

  lc.setRow(0,0,B00010000);//i
  delay(delaytime);

  lc.setRow(0,0,0x15);//n
  delay(delaytime);

  lc.setRow(0,0,0x1D);//o
  delay(delaytime);
  lc.clearDisplay(0);
  delay(delaytime);
} 

/*
  This method will scroll all the hexa-decimal
 numbers and letters on the display. You will need at least
 four 7-Segment digits. otherwise it won't really look that good.
 */
void scrollDigits() {
  for(int i=0;i<13;i++) {
    lc.setDigit(0,3,i,false);
    lc.setDigit(0,2,i+1,false);
    lc.setDigit(0,1,i+2,false);
    lc.setDigit(0,0,i+3,false);
    delay(delaytime);
  }
  lc.clearDisplay(0);
  delay(delaytime);
}

void loop() { 
  writeArduinoOn7Segment();
  scrollDigits();
}


الوصف :

1- فى بداية البرنامج (الاسكيتش) يجب تضمين ملف رأس المكتبة :

كود:
 //We always have to include the library
#include "LedControl.h"

ثم يتم تحديد أطراف الاتصال بين الوحدة والاردوينو ، ومن ثم يتم إنشاء كائن من فئة المكتبة :

كود:
/*
 Now we need a LedControl to work with.
 ***** These pin numbers will probably not work with your hardware *****
 pin 12 is connected to the DataIn 
 pin 11 is connected to the CLK 
 pin 10 is connected to LOAD 
 We have only a single MAX72XX.
 */

LedControl lc=LedControl(12,11,10,1);

الدوال المستخدمة :

الدالة :

كود:
LedControl new_disp = LedControl(dataPin, clkPin,  csPin,  Devices)

• تؤدي هذه الدالة (تسمى دالة المنشىء) إلى إنشاء كائن من فئة LEDControl (اسم الكائن هنا ، new_disp ؛ يمكن استخدام أي اسم صالح آخر ) وهى تتخاطب مع MAX7219 الموجودة على وحدة (موديول) العرض المكون من السفن سيجمنت .
• dataPine هو طرف Arduino الذي يتصل بطرف دخل البيانات DIN بالوحدة (الموديول) . وهو طرف الاردوينو حيث يتم نقل (إزاحة) البيانات للخارج .
• clkPin هو طرف Arduino الذي يتصل بالطرف CLK على الوحدة . وهو طرف الساعة clock .
• csPin هو طرف Arduino المتصل بالطرف CS / Load على الوحدة. هذا الطرف لتحديد (اختيار) الجهاز عندما يتم إرسال البيانات.
• Devices تحدد الحد الأقصى لعدد الأجهزة التي يمكن التحكم فيها. يمكن أن يتراوح ما بين 1 إلى 8. وهو عدد الأجهزة المتصلة في تتالي cascade .
• الجهاز المتصل مباشرةً بالأطراف المحددة يكون له العنوان address 0 . الجهاز الموجود بجواره المتتالي مباشرةً يكون له العنوان 1. الجهاز الثامن (الجهاز الأخير في اتصال التسلسل) يكون له العنوان 7.

الدالة :

كود:
new_disp.shutdown(addr, status)

• تستخدم هذه الدالة لتوفير الطاقة.
• إذا كانت الحالة status صواب true ، ينتقل الجهاز المقابل للعنوان addr إلى وضع إيقاف التشغيل. إذا كانت الحالة status خطأ false ، فإن الجهاز يعمل بشكل طبيعي.

الدالة :

كود:
new_disp.setIntensity(addr, intensity)

• تستخدم هذه الدالة لضبط سطوع الشاشة التي عنوانها addr.
• يمكن أن تتراوح الشدة بين 1 و 15. 1 كحد أدنى و 15 كحد أقصى.

الدالة :

كود:
 new_disp.setDigit(addr, digit, value, dp)

• تستخدم هذه الدالة لعرض رقم number ، المشار إليه بالبارامتر (value) ، على الشاشة بالعنوان addr . يتم عرض الرقم في الموضع (الأحاد units ، العشرات tens ، وما إلى ذلك) المذكورة بواسطة البارامتر digit (يمكن أن تكون من 0 إلى 7) . البارامتر dp يحدد الفاصلة العشرية. إذا كان dp خطأ false ، فستكون النقطة العشرية معطلة.

الدالة :

كود:
new_disp.setChar(addr, digit, value, dp)

• تستخدم هذه الدالة لعرض حرف character ، المشار إليه بالبارامتر (value) على الشاشة بالعنوان addr . يتم عرض الحرف في الموضع (الأحاد units ، العشرات tens ، وما إلى ذلك) المذكورة بواسطة البارامتر digit (يمكن أن تكون من 0 إلى 7). يحدد البارامتر dp الفاصلة العشرية. إذا كان dp خطأ ً false ، فستكون النقطة العشرية معطلة.
• يمكن فقط عرض بعض الحروف .

2- دائما ما ننتظر قليلا ما بين تحديث الشاشة :

كود:
/* we always wait a bit between updates of the display */
unsigned long delaytime=250;

3- نأتى إلى دالة الإعداد setup . فى البداية ، ونظرا لأن MAX72XX يبدأ العمل فى وضع "توفير القدرة" ، فعلينا إيقاظه ، وضبط شدة إضاءة الشاشة ، ومسح الشاشة للتهيئة للعمل :

كود:
 
void setup() {
  /*
   The MAX72XX is in power-saving mode on startup,
   we have to do a wakeup call
   */
  lc.shutdown(0,false);

  /* Set the brightness to a medium values */
  lc.setIntensity(0,8);
  /* and clear the display */
  lc.clearDisplay(0);
}


طباعة الأرقام Printing numbers
الاستخدام الأكثر شيوعًا لشاشات العرض السفن سيجمنت هو إظهار الأرقام numbers . الدالة الأولى التي ننظر إليها setDigit تأخذ وسيط نوع البايت وتطبع الرقم المقابل في العمود المحدد. يعمل نطاق القيم الصالحة من 0..15 . تتم طباعة جميع القيم بين 0..9 كأرقام digits ، ويتم طباعة القيم بين 10..15 كمكافئها السداسي عشر.
سيتم ببساطة تجاهل أي قيمة أخرى ، مما يعني أنه لن تتم طباعة أي شيء. لن يتم إفراغ blanked العمود الموجود على الشاشة ، بل سيحتفظ ببساطة بقيمته الصالحة الأخيرة. يمكن تشغيل الفاصلة العشرية في العمود أو إيقاف تشغيله باستخدام وسيط إضافى .
فيما يلي مثال صغير يطبع قيمة نوع int هى (-999..999) على شاشة مكونة من 4 أرقام digits .


كود:
void printNumber(int v) {
    int ones;
    int tens;
    int hundreds;
    boolean negative;	

    if(v < -999 || v > 999) 
       return;

    if(v<0) {
        negative=true;
        v=v*-1;
    }

    ones=v%10;
    v=v/10;
    tens=v%10;
    v=v/10;
    hundreds=v;
			
    if(negative) {
       //print character '-' in the leftmost column	
       lc.setChar(0,3,'-',false);
    }
    else {
       //print a blank in the sign column
       lc.setChar(0,3,' ',false);
    }
    //Now print the number digit by digit
    lc.setDigit(0,2,(byte)hundreds,false);
    lc.setDigit(0,1,(byte)tens,false);
    lc.setDigit(0,0,(byte)ones,false);
}

فيما يلى النموذج الأولي prototype للدالة :

كود:
/* 
 * Display a (hexadecimal) digit on a 7-Segment Display
 * Params:
 * addr  address of the display
 * digit the position of the digit on the display (0..7)
 * value the value to be displayed. (0x00..0x0F)
 * dp    sets the decimal point.
 */

void setDigit(int addr, int digit, byte value, boolean dp);

يجب أن يكون الوسيط digit فى النطاق 0..7 لأن MAX72XX يمكنه أن يقود ما يصل إلى ثمانية شاشات عرض سفن سيجمنت . الفهرس index يبدأ من 0 كالمعتاد.

طباعة الأحرف Printing characters

هناك مجموعة محدودة من الأحرف التى يمكن عرضها على شاشة السفن سيجمنت . الاستخدام الشائع سيكون الحرف '-' للقيم السالبة والحروف الستة 'A'..'F' للقيم السداسية.
الدالة setChar(addr,digit,value,dp) - تقبل قيمة value من نوع char للنطاق الكامل لتكويد أسكى ASCII ذات 7 بت. نظرًا لأن الأنماط التي يمكن التعرف عليها محدودة ، أشهر الأحرف المحددة (المعرفة) هي حرف الفراغ <space> . ولكن هناك عدد قليل من الأحرف التي لها معنى على شاشة السفن سيجمنت . فيما يلي مجموعة الأحرف القابلة للطباعة:

• 0 1 2 3 4 5 6 7 8 9
• A a (prints upper case)
• B b (prints lower case)
• C c (prints lower case)
• D d (prints lower case)
• E e (prints upper case)
• F f (prints upper case)
• H h (prints upper case)
• L l (prints upper case)
• P p (prints upper case)
• - (the minus sign)
• ., (lights up the decimal-point)
• _ (the underscore)
• <SPACE> (the blank or space char)

من أجل راحتك ، تم أيضًا إعادة تعريف الأحرف السداسية عشرية بقيم الأحرف 0x00...0x0F . إذا كنت ترغب في مزج الأرقام digits والحروف characters على الشاشة ، يمكنك ببساطة أن تأخذ نفس وسيط البايت التي كنت ستستخدمها للدالة setDigit() وستطبع القيمة السداسية العشرية.

النموذج الأولي للدالة هو نفسه تقريبا لعرض الأرقام digits .

كود:
/* 
 * Display a character on a 7-Segment display.
 * There are only a few characters that make sense here :
 * '0','1','2','3','4','5','6','7','8','9','0',
 * 'A','b','c','d','E','F','H','L','P',
 * '.','-','_',' ' 
 * Params:
 * addr	  address of the display
 * digit  the position of the character on the display (0..7)
 * value  the character to be displayed. 
 * dp     sets the decimal point.
*/

void setChar(int addr, int digit, char value, boolean dp);

يمكن رسم أي حرف آخر باستخدام الدالة setRow() . على سبيل المثال ، إذا كنت تريد عرض شيء يشبه الحرف الصغير 't' :



4- عودة إلى برنامج مثال المكتبة : إنشاء دالة لعرض حروف الكلمة "Arduino" حرف تلو الآخر على خانة الرقم digit 0 من الوحدة :

كود:
/*
 This method will display the characters for the
 word "Arduino" one after the other on digit 0. 
 */
void writeArduinoOn7Segment() {

  lc.setChar(0,0,'a',false);
  delay(delaytime);

  lc.setRow(0,0,0x05);// r
  delay(delaytime);

  lc.setChar(0,0,'d',false);
  delay(delaytime);

  lc.setRow(0,0,0x1c);//u
  delay(delaytime);

  lc.setRow(0,0,B00010000);//i
  delay(delaytime);

  lc.setRow(0,0,0x15);//n
  delay(delaytime);

  lc.setRow(0,0,0x1D);//o
  delay(delaytime);

  lc.clearDisplay(0);
  delay(delaytime);
}

5- إنشاء دالة لتمرير جميع الأعداد السداسية عشر والأحرف على الشاشة ، سوف تحتاج لأربعة أرقام digits على الأقل وإلا لن يكون العرض بالشكل الجيد .


كود:
/*
  This method will scroll all the hexa-decimal
 numbers and letters on the display. You will need at least
 four 7-Segment digits. otherwise it won't really look that good.
 */
void scrollDigits() {
  for(int i=0;i<13;i++) {
    lc.setDigit(0,3,i,false);
    lc.setDigit(0,2,i+1,false);
    lc.setDigit(0,1,i+2,false);
    lc.setDigit(0,0,i+3,false);
    delay(delaytime);
  }

  lc.clearDisplay(0);
  delay(delaytime);
}

6- أخيرا ، فى الدالة loop يتم استدعاء الدالتين للتنفيذ :


كود:
void loop() { 
  writeArduinoOn7Segment();
  scrollDigits();
}

النتائج :








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

الصورة الرمزية F.Abdelaziz
F.Abdelaziz
:: استاذ و مشرف قسم الالكترونيات ::
تاريخ التسجيل: May 2007
المشاركات: 6,894
نشاط [ F.Abdelaziz ]
قوة السمعة:333
قديم 10-02-2020, 10:05 AM المشاركة 3   
افتراضي


تدريب :

كود:
//We always have to include the library
#include "LedControl.h"

/*
Now we need a LedControl to work with.
***** These pin numbers will probably not work with your hardware *****
pin 12 is connected to the DataIn
pin 11 is connected to the CLK
pin 10 is connected to LOAD
We have only a single MAX72XX.
*/
LedControl lc=LedControl(12,11,10,1);

/* we always wait a bit between updates of the display */
unsigned long delaytime=500;

void setup() {
/* The MAX72XX is in power-saving mode on startup, we have to do a wakeup call */
lc.shutdown(0,false);

/* Set the brightness to a medium values */
lc.setIntensity(0,8);

/* and clear the display */
lc.clearDisplay(0);
}

void hello(){
lc.setChar(0,0,'H',false);
lc.setChar(0,1,'E',false);
lc.setChar(0,2,'L',false);
lc.setChar(0,3,'L',false);
lc.setChar(0,4,'0',false);
lc.setChar(0,5,'.',false);
lc.setChar(0,6,'.',false);
lc.setChar(0,7,'.',false);
delay(delaytime+1000);

lc.clearDisplay(0);
delay(delaytime);

lc.setDigit(0,0,1,false);
delay(delaytime);
lc.setDigit(0,1,2,false);
delay(delaytime);
lc.setDigit(0,2,3,false);
delay(delaytime);
lc.setDigit(0,3,4,false);
delay(delaytime);
lc.setDigit(0,4,5,false);
delay(delaytime);
lc.setDigit(0,5,6,false);
delay(delaytime);
lc.setDigit(0,6,7,false);
delay(delaytime);
lc.setDigit(0,7,8,false);
delay(1500);

lc.clearDisplay(0);
delay(delaytime);
}

void loop() {
hello();
}

النتائج :





الصورة الرمزية F.Abdelaziz
F.Abdelaziz
:: استاذ و مشرف قسم الالكترونيات ::
تاريخ التسجيل: May 2007
المشاركات: 6,894
نشاط [ F.Abdelaziz ]
قوة السمعة:333
قديم 10-02-2020, 10:15 AM المشاركة 4   
افتراضي


تدريب : قراءة مدخل تناظرى والعرض على السفن سيجمنت والمشغل MAX7219 :

كود:
 #include "LedControl.h"

LedControl lc=LedControl(12,11,10,1);

void setup() {
       Serial.begin(9600);
     lc.shutdown(0,false);
     lc.setIntensity(0,8);
     lc.clearDisplay(0);
}

void loop() { 

int adc = analogRead(A0);

  lc.setDigit(0,0,adc/1000,false);//thousands : 1023/1000 = 1 
  lc.setDigit(0,1,(adc/100)%10,false);// hundreds : (1023/100) %10 = (10)%10 = 0 
  lc.setDigit(0,2,(adc/10)%10,false);// tens : (1023/10) %10 = (102) %10 = 2 
  lc.setDigit(0,3,adc%10,false);// ones : 1023%10 = 3 

Serial.println(adc);
  delay(100);
  
}

النتيجة :




تعديل البرنامج لقياس درجة الحرارة باستخدام الحساس LM35 :

كود:
#include "LedControl.h"

LedControl lc=LedControl(12,11,10,1);

void setup() {
       Serial.begin(9600);
     lc.shutdown(0,false);
     lc.setIntensity(0,8);
     lc.clearDisplay(0);
}

void loop() { 

int adc = analogRead(A0);
adc = adc* 0.489; // transfer factor 

  lc.setDigit(0,0,adc/100,false);//digit 0  , hundred , 150/100 = 1
  lc.setDigit(0,1,(adc/10)%10,false);// digit 1 , ten , 150 /10 =15 %10 =5
  lc.setDigit(0,2, adc%10,false);// digit 2 , one ,  150 %10 =0
  //lc.setDigit(0,3,adc%10,false);// digit 3
lc.setRow(0,3,0x4E);//Addr 0 , Position 3 ,Value “C”
Serial.println(adc);
  delay(100);
  
}


النتيجة :




تعديل البرنامج بحيث لا تظهر الأصفار على الشمال :

كود:
#include "LedControl.h"

LedControl lc=LedControl(12,11,10,1);

void setup() {
       Serial.begin(9600);
     lc.shutdown(0,false);
     lc.setIntensity(0,8);
     lc.clearDisplay(0);
}

void loop() { 

int adc = analogRead(A0);//Reading 
int temp = adc* 0.489; // Change reading to temperature (0-150 degrees)  

int hundred = temp /100;// digit 0
int ten = (temp /10)%10;// digit 1
int one = temp %10;// digit 2

if(temp <100) 
lc.setChar(0,0,' ',false); // Print space char in digit 0
else 
lc.setDigit(0,0, hundred,false);//Print hundred digit 

if(temp <10)
lc.setChar(0,1,' ',false); // Print space char in digit 1
else 
lc.setDigit(0,1, ten,false);//Print ten digit

 lc.setDigit(0,2, one,false);// digit 2 , Print one digit 
 
lc.setRow(0,3,0x4E);// digit 3 , Addr 0 , Position 3 ,Value “C” , print ‘C’

Serial.println(temp);
  delay(100);
  
}

النتيجة :






إضافة رد

العلامات المرجعية

«     الموضوع السابق       الموضوع التالي    »
أدوات الموضوع

الانتقال السريع إلى


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

Powered by vBulletin® Version 3.8.6, Copyright ©2000 - 2025