محول الأنظمة العددية باستخدام الاردوينو

متوسط

image_pdf

مقدمة

في هذا الدرس سنتعلم طريقة برمجة محول الأنظمة العددية باستخدام الاردوينو ولوحة المفاتيح 4*4. بحيث يتمكن المستخدم من كتابة الرقم ثم تحويله إلى أي قيمة عددية آخرى وذلك بالنقر على الأحرف A و B و C و D.

الأنظمة العددية

الأنظمة العددية

الأنظمة العددية تحوّل الأرقام المتعارف عليها إلى صيغ فريدة ومختلفة وذلك عن طريق استخدام أرقام أخرى أو مجموعة حروف أو رموز بطريقة متناسقة.

1- النظام العشري: هو النظام المستخدم فى الحياة اليومية والأساس له 10
2- النظام الثنائي: هو النظام المستخدم في أجهزة الحاسب وهو يكون 0 أو 1 والأساس له 2
3- النظام الثماني: هو النظام يكون 0 1 2 3 4 5 6 7  والأساس له 8
4- النظام السادس عشر: هو النظام يكون 0 1 2 3 4 5 6 7 8 9 F E D C B A والأساس له 16

الأنظمة العددية

المواد والأدوات

number-conversion-by-arduino

1× اردوينو اونو

number-conversion-by-arduino

1× سلك الاردوينو

number-conversion-by-arduino

لوحة مفاتيح

مهاراتك في الرياضيات

 1× شاشة كرستالية

الأنظمة العددية

1× 40 رأس دبوس

الأنظمة العددية

 حزمة أسلاك توصيل (ذكر- ذكر)

الأنظمة العددية

حزمة أسلاك توصيل (ذكر – أنثى)

الأنظمة العددية

1× 2C / IIC Serial Interface Module

توصيل الدائرة

سنقوم بتوصيل الدائرة الكهربائية كما في الشكل:الأنظمة العددية

البرمجة

سنقوم برفع الكود البرمجي لمشروع محول الأنظمة العددية على لوحة الاردوينو باستخدام برنامج اردوينو IDE.

#include <LiquidCrystal_I2C.h>

LiquidCrystal_I2C lcd(0x27,20,4); // set the LCD address to 0x27 for a 16 chars and 2 line display


int NumberToBeDisplayed = 0;
int TempNum = 0;
/*Rows of keypad connected to D6-D9 of Arduino*/
int r1=6;
int r2=7;
int r3=8;
int r4=9;
/*Colums of keypad connected to D10-D13 of Arduino*/
int c1=10;
int c2=11;
int c3=12;
int c4=13;
/*Declared four variable to read colums status*/
int col1;
int col2;
int col3;
int col4;
void setup()
{
/*Declared Row pins as OUTPUT*/
pinMode(r1,OUTPUT);
pinMode(r2,OUTPUT);
pinMode(r3,OUTPUT);
pinMode(r4,OUTPUT);
/*Declared Column pins as OUTPUT*/
pinMode(c1,INPUT);
pinMode(c2,INPUT);
pinMode(c3,INPUT);
pinMode(c4,INPUT);
digitalWrite(c1,HIGH);
digitalWrite(c2,HIGH);
digitalWrite(c3,HIGH);
digitalWrite(c4,HIGH);
pinMode(4,OUTPUT);
/*lcd brightness terminal connected*/
digitalWrite(4,0);
lcd.begin();
lcd.setCursor(0,0);
lcd.print("A:Oct B:Binary");
lcd.setCursor(0,1);
lcd.print("C:Hex D:Decimal");
lcd.setCursor(0,1);
delay(2000);
lcd.clear();
lcd.setCursor(0,1);
}
void loop()
{
digitalWrite(r1,LOW);
digitalWrite(r2,HIGH);
digitalWrite(r3,HIGH);
digitalWrite(r4,HIGH);
col1=digitalRead(c1);
col2=digitalRead(c2);
col3=digitalRead(c3);
col4=digitalRead(c4);
if(col1==LOW)
{
lcd.print("1");
delay(50);
NumberToBeDisplayed = (NumberToBeDisplayed*10) + 1;
while(digitalRead(c1) == LOW);
}
else if(col2==LOW)
{
lcd.print("2");
delay(50);
NumberToBeDisplayed = (NumberToBeDisplayed*10) + 2;
while(digitalRead(c2) == LOW);
}
else if(col3==LOW)
{
lcd.print("3");
delay(50);
NumberToBeDisplayed = (NumberToBeDisplayed*10) + 3;
while(digitalRead(c3) == LOW);
}
else if(col4==0)
{
lcd.clear();
lcd.print("—- OCTAL —–");
lcd.setCursor(0,1);
TempNum = ConvertDecimalToBase(NumberToBeDisplayed,8);
lcd.print(TempNum);
while(digitalRead(c4) == LOW);
}
digitalWrite(r1,HIGH);
digitalWrite(r2,LOW);
digitalWrite(r3,HIGH);
digitalWrite(r4,HIGH);
col1=digitalRead(c1);
col2=digitalRead(c2);
col3=digitalRead(c3);
col4=digitalRead(c4);
if(col1==LOW)
{
lcd.print("4");
delay(50);
NumberToBeDisplayed = (NumberToBeDisplayed*10) + 4;
while(digitalRead(c1) == LOW);
}
else if(col2==LOW)
{
lcd.print("5");
delay(50);
NumberToBeDisplayed = (NumberToBeDisplayed*10) + 5;
while(digitalRead(c2) == LOW);
}
else if(col3==LOW)
{
lcd.print("6");
delay(50);
NumberToBeDisplayed = (NumberToBeDisplayed*10) + 6;
while(digitalRead(c3) == LOW);
}
else if(col4==LOW)
{
delay(50);
lcd.clear();
lcd.print("—- BINARY —-");
lcd.setCursor(0,1);
for(int i=15 ; i>=0 ;i--)
{
lcd.print((NumberToBeDisplayed >> i & 1));
}
while(digitalRead(c4) == LOW);
}
digitalWrite(r1,HIGH);
digitalWrite(r2,HIGH);
digitalWrite(r3,LOW);
digitalWrite(r4,HIGH);
col1=digitalRead(c1);
col2=digitalRead(c2);
col3=digitalRead(c3);
col4=digitalRead(c4);
if(col1==LOW)
{
lcd.print("7");
delay(50);
NumberToBeDisplayed = (NumberToBeDisplayed*10) + 7;
while(digitalRead(c1) == LOW);
}
else if(col2==LOW)
{
lcd.print("8");
delay(50);
NumberToBeDisplayed = (NumberToBeDisplayed*10) + 8;
while(digitalRead(c2) == LOW);
}
else if(col3==LOW)
{
lcd.print("9");
delay(50);
NumberToBeDisplayed = (NumberToBeDisplayed*10) + 9;
while(digitalRead(c3) == LOW);
}
else if(col4==LOW)
{
delay(50);
lcd.clear();
lcd.print("- HEXADECIMAL –");
lcd.setCursor(0,1);
TempNum = NumberToBeDisplayed;
ConvertDecimalToHex(TempNum);
while(digitalRead(c4) == LOW);
}
digitalWrite(r1,HIGH);
digitalWrite(r2,HIGH);
digitalWrite(r3,HIGH);
digitalWrite(r4,LOW);
col1=digitalRead(c1);
col2=digitalRead(c2);
col3=digitalRead(c3);
col4=digitalRead(c4);
if(col1==LOW)
{
delay(50);
lcd.clear();
lcd.setCursor(0,0);
lcd.print("A:Oct B:Binary");
lcd.setCursor(0,1);
lcd.print(":Hex D:Decimal");
lcd.setCursor(0,1);
delay(2000);
lcd.clear();
NumberToBeDisplayed = 0;
while(digitalRead(c2) == LOW);
}
else if(col2==LOW)
{
lcd.print("0");
delay(50);
NumberToBeDisplayed = (NumberToBeDisplayed*10) + 0;
while(digitalRead(c2) == LOW);
}
else if(col3==LOW)
{
delay(50);
lcd.clear();
lcd.print("—- OCTAL —–");
lcd.setCursor(0,1);
TempNum = ConvertDecimalToBase(NumberToBeDisplayed,8);
lcd.print(TempNum);
delay(1000);
lcd.clear();
lcd.print("—- BINARY —-");
lcd.setCursor(0,1);
for(int i=15 ; i>=0 ; i--)
{
lcd.print((NumberToBeDisplayed >> i & 1));
}
delay(1000);
lcd.clear();
lcd.print("- HEXADECIMAL –");
lcd.setCursor(0,1);
TempNum = NumberToBeDisplayed;
ConvertDecimalToHex(TempNum);
delay(1000);
lcd.clear();
lcd.print("— DECIMAL —-");
lcd.setCursor(0,1);
lcd.print(NumberToBeDisplayed);
delay(1000);
lcd.clear();
NumberToBeDisplayed = 0;
lcd.setCursor(0,0);
lcd.print("A:Oct B:Binary");
lcd.setCursor(0,1);
lcd.print("C:Hex D:Decimal");
lcd.setCursor(0,1);
delay(2000);
lcd.clear();
lcd.setCursor(0,1);
while(digitalRead(c3) == LOW);
}
else if(col4==LOW)
{
delay(50);
lcd.clear();
lcd.print("— DECIMAL —-");
lcd.setCursor(0,1);
lcd.print(NumberToBeDisplayed);
while(digitalRead(c4) == LOW);
}
}
int ConvertDecimalToBase(int n, int b)
{
int r=0, digitPos=1;
while (n)
{
r += (n%b)*digitPos;
n /= b;
digitPos *= 10;
}
return r;
}
void ConvertDecimalToHex(long int num)
{
long int rem[50],i=0,length=0;
while(num>0)
{
rem[i]=num%16;
num=num/16;
i++;
length++;
}
for(i=length-1 ; i>=0 ; i--)
{
switch(rem[i])
{
case 10:
lcd.print("A");
break;
case 11:
lcd.print("B");
break;
case 12:
lcd.print("C");
break;
case 13:
lcd.print("D");
break;
case 14:
lcd.print("E");
break;
case 15:
lcd.print("F");
break;
default :
lcd.print(rem[i]);
}
}
}

شرح الكود البرمجي

سنقوم في البداية باستدعاء مكتبة (LiquidCrystal_I2C.h) الخاصة بوحدة i2c والتي تحتوي على مجموعة أوامر برمجية نحتاجها في مشروع تحديد الاتجاهات.

ثم نضيفها للاردوينو IDE.

بتتبع المسار التالي:

Sketch > Include libraries > Add ZIP library 

ونضيف المجلد الذي قمنا بتحميله.

#include <LiquidCrystal_I2C.h>

نعرف عنوان وحدة i2c.

LiquidCrystal_I2C lcd(0x27,20,4); // set the LCD address to 0x27 for a 16 chars and 2 line display

سيتم تعيين القيمة 0 للمتغير NumberToBeDisplayed.

int NumberToBeDisplayed = 0;

هنا يتم إيضاح طريقة ربط منافذ لوحة المفاتيح مع منافذ لوحة الاردوينو الرقمية.

/*Rows of keypad connected to D6-D9 of Arduino*/
int r1=6;
int r2=7;
int r3=8;
int r4=9;
/*Colums of keypad connected to D10-D13 of Arduino*/
int c1=10;
int c2=11;
int c3=12;
int c4=13;
/*Declared four variable to read colums status*/
int col1;
int col2;
int col3;
int col4;

 في الدالة Setup يتم تهيئة الشاشة الكرستالية استعدادًا لطباعة القيم عليها.

كما يتم تهيئة منافذ لوحة المفاتيح r1, r2,r3,r4, c1,c2,c3,c4.

void setup()
{
/*Declared Row pins as OUTPUT*/
pinMode(r1,OUTPUT);
pinMode(r2,OUTPUT);
pinMode(r3,OUTPUT);
pinMode(r4,OUTPUT);
/*Declared Column pins as OUTPUT*/
pinMode(c1,INPUT);
pinMode(c2,INPUT);
pinMode(c3,INPUT);
pinMode(c4,INPUT);
digitalWrite(c1,HIGH);
digitalWrite(c2,HIGH);
digitalWrite(c3,HIGH);
digitalWrite(c4,HIGH);
pinMode(4,OUTPUT);
/*lcd brightness terminal connected*/
digitalWrite(4,0);
lcd.begin();
lcd.setCursor(0,0);
lcd.print("A:Oct B:Binary");
lcd.setCursor(0,1);
lcd.print("C:Hex D:Decimal");
lcd.setCursor(0,1);
delay(2000);
lcd.clear();
lcd.setCursor(0,1);
}

في الدالة Loop سيتم برمجة الشاشة الكرستالية لتحتوي في البداية على واجهة تعريفية للمستخدم.

A: OCT (النظام الثماني)

B: Binary (النظام الثنائي)

C: Hex (النظام السادس عشر)

D: Dec (النظام العشري)

بعد ذلك ستظهر واجهة فارغة للمستخدم يمكن من خلالها كتابة أي رقم يريده وبعد ذلك يختار ما بين الأنظمة العددية (A,B, D و C)

ثم سيقوم النظام مباشرة بالتحويل حسب المطلوب.

لمسح الشاشة والبدء من جديد اضغظ على علامة النجمة *.

void loop()
{
digitalWrite(r1,LOW);
digitalWrite(r2,HIGH);
digitalWrite(r3,HIGH);
digitalWrite(r4,HIGH);
col1=digitalRead(c1);
col2=digitalRead(c2);
col3=digitalRead(c3);
col4=digitalRead(c4);
if(col1==LOW)
{
lcd.print("1");
delay(50);
NumberToBeDisplayed = (NumberToBeDisplayed*10) + 1;
while(digitalRead(c1) == LOW);
}
else if(col2==LOW)
{
lcd.print("2");
delay(50);
NumberToBeDisplayed = (NumberToBeDisplayed*10) + 2;
while(digitalRead(c2) == LOW);
}
else if(col3==LOW)
{
lcd.print("3");
delay(50);
NumberToBeDisplayed = (NumberToBeDisplayed*10) + 3;
while(digitalRead(c3) == LOW);
}
else if(col4==0)
{
lcd.clear();
lcd.print("—- OCTAL —–");
lcd.setCursor(0,1);
TempNum = ConvertDecimalToBase(NumberToBeDisplayed,8);
lcd.print(TempNum);
while(digitalRead(c4) == LOW);
}
digitalWrite(r1,HIGH);
digitalWrite(r2,LOW);
digitalWrite(r3,HIGH);
digitalWrite(r4,HIGH);
col1=digitalRead(c1);
col2=digitalRead(c2);
col3=digitalRead(c3);
col4=digitalRead(c4);
if(col1==LOW)
{
lcd.print("4");
delay(50);
NumberToBeDisplayed = (NumberToBeDisplayed*10) + 4;
while(digitalRead(c1) == LOW);
}
else if(col2==LOW)
{
lcd.print("5");
delay(50);
NumberToBeDisplayed = (NumberToBeDisplayed*10) + 5;
while(digitalRead(c2) == LOW);
}
else if(col3==LOW)
{
lcd.print("6");
delay(50);
NumberToBeDisplayed = (NumberToBeDisplayed*10) + 6;
while(digitalRead(c3) == LOW);
}
else if(col4==LOW)
{
delay(50);
lcd.clear();
lcd.print("—- BINARY —-");
lcd.setCursor(0,1);
for(int i=15 ; i>=0 ;i--)
{
lcd.print((NumberToBeDisplayed >> i & 1));
}
while(digitalRead(c4) == LOW);
}
digitalWrite(r1,HIGH);
digitalWrite(r2,HIGH);
digitalWrite(r3,LOW);
digitalWrite(r4,HIGH);
col1=digitalRead(c1);
col2=digitalRead(c2);
col3=digitalRead(c3);
col4=digitalRead(c4);
if(col1==LOW)
{
lcd.print("7");
delay(50);
NumberToBeDisplayed = (NumberToBeDisplayed*10) + 7;
while(digitalRead(c1) == LOW);
}
else if(col2==LOW)
{
lcd.print("8");
delay(50);
NumberToBeDisplayed = (NumberToBeDisplayed*10) + 8;
while(digitalRead(c2) == LOW);
}
else if(col3==LOW)
{
lcd.print("9");
delay(50);
NumberToBeDisplayed = (NumberToBeDisplayed*10) + 9;
while(digitalRead(c3) == LOW);
}
else if(col4==LOW)
{
delay(50);
lcd.clear();
lcd.print("- HEXADECIMAL –");
lcd.setCursor(0,1);
TempNum = NumberToBeDisplayed;
ConvertDecimalToHex(TempNum);
while(digitalRead(c4) == LOW);
}
digitalWrite(r1,HIGH);
digitalWrite(r2,HIGH);
digitalWrite(r3,HIGH);
digitalWrite(r4,LOW);
col1=digitalRead(c1);
col2=digitalRead(c2);
col3=digitalRead(c3);
col4=digitalRead(c4);
if(col1==LOW)
{
delay(50);
lcd.clear();
lcd.setCursor(0,0);
lcd.print("A:Oct B:Binary");
lcd.setCursor(0,1);
lcd.print(":Hex D:Decimal");
lcd.setCursor(0,1);
delay(2000);
lcd.clear();
NumberToBeDisplayed = 0;
while(digitalRead(c2) == LOW);
}
else if(col2==LOW)
{
lcd.print("0");
delay(50);
NumberToBeDisplayed = (NumberToBeDisplayed*10) + 0;
while(digitalRead(c2) == LOW);
}
else if(col3==LOW)
{
delay(50);
lcd.clear();
lcd.print("—- OCTAL —–");
lcd.setCursor(0,1);
TempNum = ConvertDecimalToBase(NumberToBeDisplayed,8);
lcd.print(TempNum);
delay(1000);
lcd.clear();
lcd.print("—- BINARY —-");
lcd.setCursor(0,1);
for(int i=15 ; i>=0 ; i--)
{
lcd.print((NumberToBeDisplayed >> i & 1));
}
delay(1000);
lcd.clear();
lcd.print("- HEXADECIMAL –");
lcd.setCursor(0,1);
TempNum = NumberToBeDisplayed;
ConvertDecimalToHex(TempNum);
delay(1000);
lcd.clear();
lcd.print("— DECIMAL —-");
lcd.setCursor(0,1);
lcd.print(NumberToBeDisplayed);
delay(1000);
lcd.clear();
NumberToBeDisplayed = 0;
lcd.setCursor(0,0);
lcd.print("A:Oct B:Binary");
lcd.setCursor(0,1);
lcd.print("C:Hex D:Decimal");
lcd.setCursor(0,1);
delay(2000);
lcd.clear();
lcd.setCursor(0,1);
while(digitalRead(c3) == LOW);
}
else if(col4==LOW)
{
delay(50);
lcd.clear();
lcd.print("— DECIMAL —-");
lcd.setCursor(0,1);
lcd.print(NumberToBeDisplayed);
while(digitalRead(c4) == LOW);
}
}
int ConvertDecimalToBase(int n, int b)
{
int r=0, digitPos=1;
while (n)
{
r += (n%b)*digitPos;
n /= b;
digitPos *= 10;
}
return r;
}
void ConvertDecimalToHex(long int num)
{
long int rem[50],i=0,length=0;
while(num>0)
{
rem[i]=num%16;
num=num/16;
i++;
length++;
}
for(i=length-1 ; i>=0 ; i--)
{
switch(rem[i])
{
case 10:
lcd.print("A");
break;
case 11:
lcd.print("B");
break;
case 12:
lcd.print("C");
break;
case 13:
lcd.print("D");
break;
case 14:
lcd.print("E");
break;
case 15:
lcd.print("F");
break;
default :
lcd.print(rem[i]);
}
}
}

لا تنسَ فصل مصدر الطاقة بعد الانتهاء من استخدام برمجة محول الأنظمة العددية باستخدام الاردوينو.

 

X
تم إضافة المنتج إلى السلة بنجاح