آردوینو آردوینو Arduino Uno آموزش آردوینو پروژه های آردوینو

آموزش ساخت اسکنر وای فای شبکه‌های ۲٫۴GHz با ماژول رادیویی nRF24L01

نوشته شده توسط CiferTech

در این پروژه یک اسکنر شبکه های ۲٫۴GHz از نوع Wlan در محدوده ۲٫۴GHz با استفاده از برد رادیویی nRF24L01 خواهیم ساخت. پیش از این روش راه اندازی برد NRF24L01 با بردهای آردوینو در دیجی اسپارک آموزش داده شده است. در این پروژه خروجی تمام تداخل ها و اطلاعات موجود در محدوده اسکن شده را به صورت کدهای ASCII تحویل می‌دهد. در پروژه ساخت اسکنر وای فای از آردوینو نانو به عنوان پردازنده استفاده خواهیم کرد. در بخش دوم این پروزه یک نمایشگر Oled اضافه خواهیم کرد و مقادیر اسکن شده را بصورت گراف و نمودار نمایش خواهیم داد. توسط ماژول nRF24 میتوانیم کل شبکه ۲٫۴GHz را اسکن و مشاهده کنیم. این موضوع کمک میکند وضعیت سیگنال‌ها را در شبکه بتوانیم بررسی کنیم. در ادامه این آموزش با مرجع تخصصی آردوینو به زبان فارسی، دیجی اسپارک همراه باشید.

ساخت اسکنر 2.4GHz با ماژول NRF24L01 و برد آردوینو OLED - دیجی اسپارک

 


برد nRF24L01


این ماژول یک transceiver به حساب می آید به این معنی که هر دو فرآیند ارسال (send) و دریافت (receive) را انجام می دهد. این ماژول ها بسیار ارزان با اندازه کوچک عرضه می شوند، ولتاژ کاری این ماژول nRF24L01 از ۱٫۹ تا ۳٫۶ ولت است، پایه های MOSI, MISO و SCK پایه های SPI ماژول هستند. باید به پایه های مربوط به پروتکل SPI در آردوینو متصل شوند. پایه های CSN و  CE برای تنظیم ماژول به حالت فعال و تعویض بین حالت فرمان و انتقال اطلاعات هستند. این دو پایه را می توان به هر پایه دیجیتال در آردوینو متصل کرد. پین IRQ پین وقفه است و لازم به اتصال آن نیست.

ماژول فرستنده گیرنده رادیویی NRF24L01 در باند 2.4GHz - دیجی اسپارک

برخی از مشخصات این ماژول ها به شرح زیر است:

  • مصرف انرژی هنگام ارسال اطلاعات، حدود ۱۲ میلی آمپر است.
  • رنج،در صورت استفاده در فضای باز و با آنتن می تواند تا ۱۰۰ متر هم برسد
  • می تواند داده ها را همزمان ارسال و دریافت کند.
  • هر ماژول می تواند با حداکثر ۶ ماژول دیگر ارتباط برقرار کند.
  • از باند ۲٫۴ گیگاهرتز استفاده می کند.
  • می تواند ۱ تا ۲۵ بایت داده خام با سرعت ۱ مگابایت ارسال کند.

 


تداخل در باند شبکه های ۲.۴ گیگاهرتز


دستگاه های مختلفی وجود دارند که در رنج ۲٫۴GHz کار می‌کنند مانند؛ تلفن، بلوتوث، وای‌فای، دزدگیر ماشین، مایکروویو که به همین تداخلی در این رنج وجود دارند که با استفاده از این پروژه قادر خواهیم بود این مقادیر را اندازه گیری و نمایش دهیم. به‌طور معمول پیدا کردن تداخل خیلی سخت نیست. محصولاتی به بازار ارزان می‌آیند که به عنوان تجزیه و تحلیل طیف عمل می‌کنند و از یک رابط USB استاندارد به یک لپ تاپ استفاده می‌کنند، به این معنی که منبع تداخل می‌تواند به آسانی با یک آنتن برای پیدا کردن دخالت استفاده شود.

 


نمایشگر Oled 0.96 SSD1306


معمولا در پروژه های اینترنت اشیا و دیگر پروژه های امبدد از برای نمایش متن و مقادیر مختلف از نمایشگر های Oled استفاده می شود، این ماژول ها بدر انواع مختلق بسته به نوع درایور اندازه یافت می شوند که یکی از پرطرفدار ترین آن ها SSD1306 می باشد، این نوع از Oled ها معمولا در اندازه های ۰٫۹۶ و ۱٫۳ اینچ ساخته می شوند همچنین پروتکل ارتباطی Oled ها I2C می باشد. صفحه نمایش دیود ساطع کننده نور (OLED) که ما در این آموزش استفاده خواهیم کرد مدل SSD1306 است، یک صفحه نمایش تک رنگ، ۰٫۹۶ اینچی با ۱۲۸ × ۶۴ پیکسل همانطور که در شکل زیر نشان داده شده است. نمایشگر OLED نیازی به نور پس زمینه ندارد، که نتیجه آن ایجاد تضاد بسیار خوب در محیط های تاریک است. همچنین پیکسل های آن فقط هنگام روشن بودن انرژی مصرف می کنند، بنابراین صفحه نمایش OLED در مقایسه با سایر نمایشگرها، مصرف برق کمتری دارد.

 


برد آردوینو Arduino


مجموعه بردهای آردوینو از جمله بردهای توسعه پرطرفدار بین مهندسین امبدد هستند که در مدل های مختلفی از جمله Micro ,  proMini , Nano , Uno و همچنین Mega قابل تهیه هستند، هسته مرکزی این برد های محبوب از سری AtMega328 می باشد. آردوینو پلتفرم سخت‌افزاری و نرم‌افزاری متن‌باز است. همان طور که قبل تر اشاره کردیم، پلتفرم آردوینو شامل یک میکروکنترلر تک‌بردی متن‌باز است که قسمت سخت‌افزار آردوینو را تشکیل می‌دهد. علاوه بر این، پلتفرم آردوینو یک نرم‌افزار آردوینو IDE که به منظور برنامه‌نویسی برای بردهای آردوینو طراحی شده‌است و یک بوت لودر نرم‌افزاری که بر روی میکروکنترلر بارگذاری می‌شود را در بر می‌گیرد.

 

برد آردوینو نانو Nano - دیجی اسپارک

 


روش کار پروژه


فعالیت برد رادیویی RF مدل nRF24 از طریق رابط سریال به برد Arduino منتقل شده و هر نوع فعالیتی را به صورت کد های ASCII نمایش می‌دهد. دامنه در کانالهای مختلف با کمک یک نقشه برداری ساده نمایش داده می شود. در این پروژه اسکنر شبکه های ۲٫۴GHz حتی تداخل امواج مایکروویو و دوربین های وایرلس را نمایش می‌دهد. البته شاید این سوال برای شما پیش آمده باشد که تفاوت این اسکنر با پکت مانیتور ها چیست؟! در جواب باید این مورد را ذکر کنم که در پک مانیتور تنها در نهایت ۱۴ کانال موجود برای شبکه های WiFi را مانیتور میکند اما در این پروژه ما هر فرکانسی که در رنج ۲٫۴ باشد را می‌توانیم تشخیص دهیم و در واقع ببینیم. در پارت دوم به این مورد بیشتر می‌پردازیم. در ادامه این مقادیر را با استفاده از نمایشگر Oled بصورت نمودار هایی نمایش خواهیم داد، مقادیر نمودار بر اساس پاور مصرفی nRF در لحظه اسکن است که در این سناریو با دیتا ورودی رابطه مستقیم دارند.

 


وسایل مورد نیاز


برد آردوینو Arduino

ماژول NRF24L01

نمایشگر Oled 0.96

سیم برد برد

 


نصب کتابخانه مورد نیاز


ابتدا در نرم افزار Arduino IDE اقدام به نصب کتابخانه مورد نیاز خواهیم‌کرد. مراحل زیر را دنبال کنید:

  1. این مسیر را دنبال کنید Sketch Include Library > Manage Libraries
  2. کلمه Adafruit SSD1306  را جستجو کنید.
  3. کتابخانه را نصب کنید.
  • سپس کلمه “GFX” را جستجو کنید و آن را نصب کنید.

 


اتصالات و راه‌اندازی


برای راه‌اندازی ابتدایی این پروژه ابتدا اتصالات بین ماژول nRF24 و آردوینو را برقرار خواهیم کرد، برای برقراری اتصالات از جدول و شماتیک زیر استفاده کنید.

اتصالات ماژول NRF24L01 با برد آردوینو Arduino - دیجی اسپارک

 

  • شماتیک پروژه اسکنر شبکه های ۲٫۴GHz با استفاده از nRF24L01

 

در این مرحله بخش های مهمی از کد که نیاز به توضیح دارند را بررسی خواهیم کرد. در قسمت اول کتابخانه مورد نیاز را فراخوانی خواهیم کرد.

#include <SPI.h>

 

در این قسمت مقیاس نمایش مقادیر که به آن مقیاس خاکستری می‌گویند را مشخص خواهیم کرد.

char grey[] = " .:-=+*aRW";

 

در این بخش تنظیمان مربوط به پروتکل SPI را راه‌اندازی می‌کنیم.

 SPI.begin();
 SPI.setDataMode(SPI_MODE0);
 SPI.setClockDivider(SPI_CLOCK_DIV2);
 SPI.setBitOrder(MSBFIRST);

 

این بخش مربوط به اسکن تمام مقادیر در باند ۲٫۴GHz است.

void scanChannels(void)
{
 disable();
 for( int j=0 ; j<200  ; j++)
 {
   for( int i=0 ; i<CHANNELS ; i++)
   {
     
     setRegister(_NRF24_RF_CH,(128*i)/CHANNELS);
     
     setRX();
     
     delayMicroseconds(40);
     
     disable();
     
     if( getRegister(_NRF24_RPD)>0 )   channel[i]++;
   }
 }
}

 

این قسمت مقادیر نمودار grey را مشخص می‌کنیم و در ادامه این مقادیر را در سریال مانیتور پرینت خواهیم کرد.

   if( norm!=0 ) pos = (channel[i]*10)/norm;
   else          pos = 0;
   
   if( pos==0 && channel[i]>0 ) pos++;

   if( pos>9 ) pos = 9;

   Serial.print(grey[pos]);
   channel[i] = 0;

 

کد کامل پروژه اسکنر شبکه های۲٫۴ GHz با استفاده از nRF24L01

#include <SPI.h>

#define CE  9

#define CHANNELS  64
int channel[CHANNELS];

int  line;
char grey[] = " .:-=+*aRW";

// nRF24L01P registers we need
#define _NRF24_CONFIG      0x00
#define _NRF24_EN_AA       0x01
#define _NRF24_RF_CH       0x05
#define _NRF24_RF_SETUP    0x06
#define _NRF24_RPD         0x09

byte getRegister(byte r)
{
 byte c;
 
 PORTB &=~_BV(2);
 c = SPI.transfer(r&0x1F);
 c = SPI.transfer(0);  
 PORTB |= _BV(2);

 return(c);
}

void setRegister(byte r, byte v)
{
 PORTB &=~_BV(2);
 SPI.transfer((r&0x1F)|0x20);
 SPI.transfer(v);
 PORTB |= _BV(2);
}
 
void powerUp(void)
{
 setRegister(_NRF24_CONFIG,getRegister(_NRF24_CONFIG)|0x02);
 delayMicroseconds(130);
}

void powerDown(void)
{
 setRegister(_NRF24_CONFIG,getRegister(_NRF24_CONFIG)&~0x02);
}

void enable(void)
{
   PORTB |= _BV(1);
}

void disable(void)
{
   PORTB &=~_BV(1);
}

void setRX(void)
{
 setRegister(_NRF24_CONFIG,getRegister(_NRF24_CONFIG)|0x01);
 enable();
 // this is slightly shorter than
 // the recommended delay of 130 usec
 // - but it works for me and speeds things up a little...
 delayMicroseconds(100);
}

void scanChannels(void)
{
 disable();
 for( int j=0 ; j<200  ; j++)
 {
   for( int i=0 ; i<CHANNELS ; i++)
   {
     setRegister(_NRF24_RF_CH,(128*i)/CHANNELS);
     
     setRX();
     
     delayMicroseconds(40);
     
     disable();

     if( getRegister(_NRF24_RPD)>0 )   channel[i]++;
   }
 }
}

void outputChannels(void)
{
 int norm = 0;
 
 for( int i=0 ; i<CHANNELS ; i++)
   if( channel[i]>norm ) norm = channel[i];
   
 Serial.print('|');
 for( int i=0 ; i<CHANNELS ; i++)
 {
   int pos;
   
   if( norm!=0 ) pos = (channel[i]*10)/norm;
   else          pos = 0;
   
   if( pos==0 && channel[i]>0 ) pos++;
   
   if( pos>9 ) pos = 9;
 
   Serial.print(grey[pos]);
   channel[i] = 0;
 }
 
 Serial.print("| ");
 Serial.println(norm);
}

void printChannels(void)
{
 Serial.println(">      1 2  3 4  5  6 7 8  9 10 11 12 13  14                     <");
}

void setup()
{
 Serial.begin(57600);
 
 Serial.println("Starting 2.4GHz Scanner ...");
 Serial.println();

 Serial.println("Channel Layout");
 printChannels();
 
 // Setup SPI
 SPI.begin();
 SPI.setDataMode(SPI_MODE0);
 SPI.setClockDivider(SPI_CLOCK_DIV2);
 SPI.setBitOrder(MSBFIRST);
 
 // Activate Chip Enable
 pinMode(CE,OUTPUT);
 disable();
 
 powerUp();
 
 setRegister(_NRF24_EN_AA,0x0);

 setRegister(_NRF24_RF_SETUP,0x0F);
 
 line = 0;
}

void loop()
{
 scanChannels();
 
 outputChannels();
 
 if( line++>12 )
 {
   printChannels();
   line = 0;
 }
}

 


اتصالات و راه‌اندازی پروژه با افزودن نمایشگر Oled


در اولین مرحله برای راه‌اندازی پروژه بعد از نصب کتابخانه های مورد نیاز، اقدام به برقراری اتصالات بین برد nRF24، آردوینو و نمایشگر Oled خواهیم کرد. اتصالات را مطابق جدول و شماتیک زیر برقرار کنید.

اتصالات OLED به برد آردوینو - دیجی اسپارک

 

جدول اتصالات ماژول nRF24 به برد آردوینو - دیجی اسپارک

 

  • شماتیک پروژه اسکنر شبکه های ۲٫۴ GHz با nRF24L01 و نمایش در OLED

شماتیک اتصالات ماژول NRF24L01 به آردوینو نمایشگر OLED - دیجی اسپارک

 

در این مرحله اقدام به آپلود کد در برد آردوینو نانو خواهیم کرد، اما ابتدا بخش هایی از کد را مورد بررسی قرار خواهیم داد. در این کد کتابخانه های زیر استفاده شد، نسبت به آموزش قبل که تنها از یک کتابخانه استفاده شده بود تعداد آن ها افزایش داشت.

#include <SPI.h>

#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>

 

این خط از کد بخش مهمی از پروژه را در بر میگیرد که تعریف کننده نمدار Gray است که در سریال دیتا دریافتی را به نشان می‌دهد.

char grey[] = " .:-=+*aRW";

 

در این چند خط به ترتیب چند Void تعریف شده که در اولین مورد رجیستر های مورد نیاز را راه‌اندازی کرده‌ایم.

void setRegister(byte r, byte v)
{
 PORTB &=~_BV(2);
 SPI.transfer((r&0x1F)|0x20);
 SPI.transfer(v);
 PORTB |= _BV(2);
}

 

در این قسمت مقادیری که در سمت راست Oled نمایش داده می‌شوند را تنظیم می‌کنیم.

  display.setCursor(90, 10);
  display.setTextSize(2);
  display.setTextColor(WHITE);
  display.print(norm);
  display.setCursor(90, 8);
  display.setTextSize(1);
  display.setTextColor(WHITE);
  display.print("");

 

در ادامه با استفاده از map مقادیر بدست آمده به اشکال مورد نظر معادل سازی می‌کنیم.

  drawHeight = map(norm, 0, 200, 0, 32 );

کد کامل پروژه اسکنر شبکه های ۲٫۴ GHz با nRF24L01 و نمایش در OLED

#include <SPI.h>

#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#define OLED_RESET 4

#define CE  9

#define CHANNELS  64
int channel[CHANNELS];

int  line;
char grey[] = " .:-=+*aRW";

#define _NRF24_CONFIG      0x00
#define _NRF24_EN_AA       0x01
#define _NRF24_RF_CH       0x05
#define _NRF24_RF_SETUP    0x06
#define _NRF24_RPD         0x09


Adafruit_SSD1306 display = Adafruit_SSD1306(128, 32, &Wire);

byte count;
byte sensorArray[128];
byte drawHeight;

char filled = 'F'; 
char drawDirection = 'R'; 
char slope = 'W'; 


byte getRegister(byte r)
{
 byte c;
 
 PORTB &=~_BV(2);
 c = SPI.transfer(r&0x1F);
 c = SPI.transfer(0);  
 PORTB |= _BV(2);

 return(c);
}

void setRegister(byte r, byte v)
{
 PORTB &=~_BV(2);
 SPI.transfer((r&0x1F)|0x20);
 SPI.transfer(v);
 PORTB |= _BV(2);
}
 
void powerUp(void)
{
 setRegister(_NRF24_CONFIG,getRegister(_NRF24_CONFIG)|0x02);
 delayMicroseconds(130);
}

void powerDown(void)
{
 setRegister(_NRF24_CONFIG,getRegister(_NRF24_CONFIG)&~0x02);
}

void enable(void)
{
   PORTB |= _BV(1);
}

void disable(void)
{
   PORTB &=~_BV(1);
}

void setRX(void)
{
 setRegister(_NRF24_CONFIG,getRegister(_NRF24_CONFIG)|0x01);
 enable();

 delayMicroseconds(100);
}

void scanChannels(void)
{
 disable();
 for( int j=0 ; j<200  ; j++)
 {
   for( int i=0 ; i<CHANNELS ; i++)
   {
     setRegister(_NRF24_RF_CH,(128*i)/CHANNELS);
     
     setRX();
     
     delayMicroseconds(40);
     
     disable();
     
     if( getRegister(_NRF24_RPD)>0 )   channel[i]++;
   }
 }
}

void outputChannels(void)
{
 int norm = 0;
 
 for( int i=0 ; i<CHANNELS ; i++)
   if( channel[i]>norm ) norm = channel[i];
   
 Serial.print('|');
 for( int i=0 ; i<CHANNELS ; i++)
 {
   int pos;
   
   if( norm!=0 ) pos = (channel[i]*10)/norm;
   else          pos = 0;
   
   if( pos==0 && channel[i]>0 ) pos++;
   
   if( pos>9 ) pos = 9;
 
   Serial.print(grey[pos]);
   channel[i] = 0;
 }
 
 Serial.print("| ");
 Serial.println(norm);


  display.setCursor(90, 10);
  display.setTextSize(2);
  display.setTextColor(WHITE);
  display.print(norm);
  display.setCursor(90, 8);
  display.setTextSize(1);
  display.setTextColor(WHITE);
  display.print("");


  display.drawLine(0, 0, 0, 32, WHITE);
  display.drawLine(80, 0, 80, 32, WHITE);

  for (count = 0; count < 40; count += 10)
  {
    display.drawLine(80, count, 75, count, WHITE);
    display.drawLine(0, count, 5, count, WHITE);
  }

  for (count = 10; count < 80; count += 10)
  {
    display.drawPixel(count, 0 , WHITE);
    display.drawPixel(count, 31 , WHITE);
  }

  
  drawHeight = map(norm, 0, 200, 0, 32 );
  sensorArray[0] = drawHeight;

  for (count = 1; count <= 80; count++ )
  {
    if (filled == 'D' || filled == 'd')
    {
      if (drawDirection == 'L' || drawDirection == 'l')
      {
        display.drawPixel(count, 32 - sensorArray[count - 1], WHITE);
      }
      else //else, draw dots from right to left
      {
        display.drawPixel(80 - count, 32 - sensorArray[count - 1], WHITE);
      }
    }


    

    else
    {
      if (drawDirection == 'L' || drawDirection == 'l')
      {
        if (slope == 'W' || slope == 'w')
        {
          display.drawLine(count, 32, count, 32 - sensorArray[count - 1], WHITE);
        }
        else
        {
          display.drawLine(count, 1, count, 32 - sensorArray[count - 1], WHITE);

        }
      }



      else
      {
        if (slope == 'W' || slope == 'w')
        {
          display.drawLine(80 - count, 32, 80 - count, 32 - sensorArray[count - 1], WHITE);
        }
        else
        {
          display.drawLine(80 - count, 1, 80 - count, 32 - sensorArray[count - 1], WHITE);
        }
      }
    }
  }

 // drawAxises();
  display.display(); 
  display.clearDisplay(); 

  for (count = 80; count >= 2; count--) 
  {
    sensorArray[count - 1] = sensorArray[count - 2];
  }
}

void printChannels(void)
{
 Serial.println(">      1 2  3 4  5  6 7 8  9 10 11 12 13  14                     <");
}

void setup()
{
 Serial.begin(57600);

 display.begin(SSD1306_SWITCHCAPVCC, 0x3C);  

 for (count = 0; count <= 128; count++) 
  {
    sensorArray[count] = 0;
  }
 
 Serial.println("Starting 2.4GHz Scanner ...");
 Serial.println();

 
 Serial.println("Channel Layout");
 printChannels();
 
 SPI.begin();
 SPI.setDataMode(SPI_MODE0);
 SPI.setClockDivider(SPI_CLOCK_DIV2);
 SPI.setBitOrder(MSBFIRST);
 
 pinMode(CE,OUTPUT);
 disable();
 
 powerUp();
 
 setRegister(_NRF24_EN_AA,0x0);
 

 setRegister(_NRF24_RF_SETUP,0x0F);
 
}

void loop()
{
  
 scanChannels();
 
 outputChannels();
 
 if( line++>12 )
 {
   printChannels();
   line = 0;
 }
}

 

 


جمع بندی


در این پروژه با استفاده از برد nRF24 و همچین یک آردوینو nano یک اسکنر در رنج شبکه های ۲٫۴GHz ساختیم که در پروژه های مختلفی مورد استفاده قرار میگیرد، در بخش دوم از پروژه به تحلیل مقادیر و همچنین نمایش آن ها بصورت گرافیکی و نمودار در نمایشگر Oled پرداختیم. از این پروژه میتوانید برای اسکن ترافیک شبکه موجود تا فاصله زیادی استفاده کنید و همچنین با تحلیل نمودار gray میتوانیم تشخیص که این اطلاعات از چه منبعی و برای چه دستگاهی هستند.

ماژول OLED اسکنر شبکه های 2.4GHz - دیجی اسپارک

 

چنانچه در مراحل راه اندازی و انجام این پروژه با مشکل مواجه شدید، بدون هیچ نگرانی در انتهای همین پست، به صورت ثبت نظر سوالتان را مطرح کنید. من در سریع‌ترین زمان ممکن پاسخ رفع مشکل شما را خواهم داد. همچنین اگر ایرادی در کدها و یا مراحل اجرایی وجود دارند می‌توانید از همین طریق اطلاع رسانی کنید.

 

در پایان نظرات و پیشنهادات خود را با ما درمیان بگذارید و با اشتراک گذاری این آموزش در شبکه های اجتماعی , از وبسایت دیجی اسپارک حمایت کنید.

 

درباره نویسنده

CiferTech

تبادل نظر و رفع عیب با ثبت دیدگاه

۱۴ دیدگاه

    • سلام وقتتون بخیر ببخشید خواستم بدونم میشه ال سی دی تاچ استفاده کرد یا ال سی دی با ابعاد بزرگتر از این که شما فرمودین؟!؟!اگر بخواهیم نمایشگر بزرگتر استفاده کنیم فرقی میکنه؟!؟!؟!؟!ممنونم

  • سلام یک سوال چطوری با یک نمایشگر کوچک میشه با استفاده از این برد میشه فهمید الان سیگنال مال چه دستگاهی هست وردشو زد

    • خروجی هایی که با به شکل ASCII در خروجی سریال مانبتور دریافت می‌کنید، در صورت تحلیل شدن می‌توانند برای این مورد هم استفاده شوند.

        • برنامه خاصی فکر نمیکنم وجود داشته باشه برای این مورد، اما در کل اگر درباره نمودار Gray تحقیق کنید، درک بهتری از خروجی پیدا خواهید کرد.

  • باسلام
    میشه در مورد ردیابی مکان سیگنال با تحلیل کد اسکی بیشتر توضیح دهید یا اگر مرجعی هست معرفی نمایید
    ممنون میشم

    • سلام، متاسفانه مرجع خاصی برای این مورد نمیشناسم. اما با یک سرچ ساده مقالات در این مورد پیدا می‌کنید.

  • سلام خسته نباشید
    استاد ما اگه بخوایم اون عدد کنار نمایش گر رو بدست بیاریم از کدوم قسمت کد باید بخونیمش مثلا اونجا که کنار طیف نوشته ۸۶ من اون رو می‌خوام کدوم قسمت کد اون رو میده

    • با سلام
      دقیقا متوجه سوالتان نشدم ولی برای نمایش هر عددی در نمایشگر بایستی دستور آنرا بنویسید. سپس مشخص کنید که عدد مورد نظر از کجا خوانده شده و روی نمایشگر نمایش داده شود.