دات ماتریس 8×8 شامل 64 ال ای دی با 16 پایه متناظر با 8 ستون از آندها و 8 ردیف از کاتدها است.
برچسب روی یک وجه نمایشگر ماتریس 8×8 نقطهای معمولا نشاندهنده وجهی است که پایههای 1 تا 8 ( از چپ به راست) را در برمیگیرد و پایههای 9 تا 16 (از راست به چپ) روی وجه دیگر قرار میگیرند.
ساختار دات ماتریس 8×8
همانطور که در شکل بالا نشان داده شده است، هر ماتریس 8×8 نقطهای دارای یک چینش خاص برای پایههای سطری و ستونی خود است. برای مثال، پایه 1 از دات ماتریس بکاربرده شده در این مقاله، LEDهای ردیف 5 را کنترل میکند. جهت نحوه چینش پایهها با استفاده از یک مولتیمتر تنظیمشده در حالت دیودی تعیین میشود. پایه انتهای سمت چپ را بهعنوان پایه 1 علامتگذاری کنید (فقط دو احتمال وجود دارد). COM مولتیمتر (مشکی) را به پایه 1 و آند مولتیمتر (قرمز) را به پایه 16 متصل کنید. اگر LED ردیف 5 ستون 8 روشن شود، در نتیجه ماتریس 8×8 نقطهای یک کاتد مشترک دارد؛ در غیر اینصورت، آند مولتیمتر را به پایه 1 و کاتد را به پایه 16 متصل کنید. اگر LED ردیف 5 ستون 8 روشن شود، در نتیجه دات ماتریس 8×8 شما یک آند مشترک دارد.
نمایش حروف الفبا روی دات ماتریس 8×8
حرف K نشان دهنده نمایش یک حرف الفبایی با ماتریس 8×8 نقطهای است (شکل 3). یک عدد باینری 8 بیتی وضعیتهای LED را در یک ردیف نمایش میدهد، و یک 1 نشاندهنده روشن بودن یک LED است. ردیف ششم حرف K بصورت B11011100 نمایش داده میشود، که معادل مقدار دسیمال 220 است. برای یک ماتریس 8×8 نقطهای کاتد مشترک یک LED هنگامی روشن است که ستون (آند) HIGH و سطر (کاتد) LOW باشد.
برای نمایش یک طرح بر روی ماتریس 8×8 نقطهای وضعیت هر LED در یک سطر تغییر داده میشود، یک تاخیر کوتاه بین تغییر حالت هر LED وجود دارد و سپس سطر بعدی تغییر داده میشود، به این عمل اسکن سطر گفته میشود. برای مثال، تاخیر کوتاه 200 میکروثانیه سریعتر از آن است که چشم بتواند تشخیص دهد و بنظر میرسد تمام LEDها بطور همزمان روشن هستند. 200 میکروثانیه تاخیر معادل فرکانس نمایش 5kHz است و چشم انسان میتواند سوسو زدن نور تا حداکثر Hz400 را تشخیص دهد. برای حرف K، LED سطر 6 و ستون 3 خاموش میباشد، بنابراین نمایش باینری سطر 6 B11011100 و مقدار باینری ستون سوم صفر است. سطرها و ستونها از گوشه بالا سمت چپ (R1,C1) شمارهگذاری میشوند، و سطرها با پایههای ماتریس 8×8 نقطهای موازی هستند.
برای نمایش کاراکتر، نمایش باینری طرح LED با مقدار دسیمال متناظر جایگزین میشود. برای مثال، در سط سوم حرف A، LEDها در ستون اول و پنجم روشن هستند و نمایش باینری الگوی LED، B10001 میباشد که مقدار دسیمال 17 دارد (جدول 5 را در انتهای فصل مشاهده کنید). دستور bitRead(binary number, c) بیت cth عدد باینری را میخواند، و خوانس را با کم ارزشترین بیت (سمت راستترین بیت) که صفر است، شروع میکند. اگر بیت 1 باشد، برای روشن کردن LED، پایههای آردوینو که ستون (آند) و سطر (کاتد) متناظر از نمایشگر ماتریس نقطهای 8 × 8 را کنترل میکنند به ترتیب HIGH و LOW تنظیم میشوند. توجه داشته باشید اگر نمایشگر ماتریس 8×8 نقطهای آند مشترک باشد، یک LED وقتی روشن میشود که کاتد و آند مربوط بهLED به ترتیب HIGH و LOW تنظیم میشوند. برای نمایش هر حرف یک وقفه زمانی لازم است، که با دستور while (millis() < start+1000) بدست میآید و start معادل زمان شروع اولین نمایش کاراکتر است.
در شکل 4، برای کمک به درک شماتیک، اتصالات پایههای آردوینو که سطرهای ماتریس نقطهای 8 × 8 را کنترل میکنند زرد رنگ و اتصالات پایههای کنترلکننده ستونها آبی یا نارنجی هستند. از آنجایی که سطرها اسکن میشوند، مقاومتهای 220 اهم به هر پایه ستون (آند) نمایشگر ماتریس نقطهای 8 × 8 متصل میشوند. پایههای A0، A1، A2، و A3 آردوینو به ترتیب پایههای 14، 15، 16 و 17 متصل هستند. سطرهای ماتریس نقطهای 8 × 8 (R) و ستونها (C) در شکل 2 نشان داده شدهاند.
جدول 1- اتصالات دات ماتریس 8 × 8 به آردوینو
پایه ماتریس نقطهای 8 × 8
|
1
|
2
|
3
|
4
|
5
|
6
|
7
|
8
|
9
|
10
|
11
|
12
|
13
|
14
|
15
|
16
|
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
ماتریس نقطهای 8 × 8
|
R5
|
R7
|
C2
|
C3
|
R8
|
C5
|
R6
|
R3
|
R1
|
C4
|
C6
|
R4
|
C1
|
R2
|
C7
|
C8
|
پایه آردوینو
|
13
|
12
|
9
|
8
|
11
|
7
|
10
|
17
|
16
|
6
|
5
|
15
|
4
|
14
|
3
|
2
|
کد نمایش حروف B، A و C در دات ماتریس 8×8
// Arduino display pins
int pin[] = {19,13,12,9,8,11,7,10,17,16,6,5,15,4,14,3,2};
// dot matrix display columns
int col[] = {pin[13],pin[3],pin[4],pin[10],pin[6],pin[11],pin[15],pin[16]};
// dot matrix display rows
int row[] = {pin[9],pin[14],pin[8],pin[12],pin[1],pin[7],pin[2],pin[5]};
byte val[3][8] = {4,10,17,17,31,17,17,0, // decimal representation of letter A
15,17,17,15,17,17,15,0, // decimal representation of letter B
14,17,1,1,1,17,14,0}; // decimal representation of letter C
unsigned long start;
bool pixel;
void setup()
{
for (int i=1; i<18; i++) pinMode(pin[i], OUTPUT); // display pins as output
for (int i=0;i<8;i++) digitalWrite(col[i], LOW); // set anodes LOW, turn off
for (int i=0;i<8;i++) digitalWrite(row[i], HIGH); // set cathodes HIGH,
} // turn off
void loop()
{
for (int n=0; n<3; n++) // display the letters A, B, C
{
start = millis(); // milliseconds elapsed
while (millis() < start+1000) // display time for each letter
for (int r=0; r<8; r++)
{
digitalWrite(row[r], LOW); // set cathodes to LOW for each row
for (int c=0; c<8; c++)
{
pixel = bitRead(val[n][r], c); // read cth bit in rth row of nth letter
if(pixel == 1) digitalWrite(col[c], HIGH); // set anode HIGH, LED on
delayMicroseconds(200); // delay between LEDs in a row
digitalWrite(col[c], LOW); // reset anode to LOW, LED off
}
digitalWrite(row[r], HIGH); // reset cathode to HIGH
}
}
}
در کدهای زیر ، برای نمایش سه حرف: A، B، و C، طرحهای LED با ماتریس val[3][8] تعریف میشوند، که دارای 3 سطر، یک سطر برای هر حرف، و 8 ستون، یک ستون برای هر سطر از نمایشگر ماتریس 8×8 نقطهای میباشد. در این کدها pin[] 16 پایه آردوینو متصلشده به نمایشگر ماتریس 8×8 نقطهای را تعریف میکند. در زبان برنامهنویسی C، شمارهگذاری عناصر ماتریس از صفر شروع میشود، چنانکه pin[1] به دومین عضو ماتریس pin[] اشاره میکند. عبارت ماتریس، یک آرایه دو بُعدی شامل یک عبارت بردار تک بُعدی است. برای مطابقت دستورات و دیتاشیت ماتریس 8×8 نقطهای، اولین عضو ماتریس pin[] معادل 19 یا پایه A5 آردوینو تعریف میشود بنابراین pin[1] نشاندهنده پایه 1 ماتریس 8×8 نقطهای است و این ارتباط بین مابقی پایههای ماتریس 8×8 نقطهای و اعضای ماتریس pin[] صادق است. برای مثال، در شکل4-7، پایه 13 آردوینو به پایه 1 ماتریس 8×8 نقطهای یعنی سطر 5 نمایشگر ماتریس 8×8 نقطهای متصل است. بنابراین، pin[1]معادل پایه 13 آردوینو است و عضو پنجم ماتریس row[] برابر pin[1] است.
استفاده از یک شیفت رجیستر
اگر از شیفت رجیسترها استفاده نشود، به تمام 16 پایه آردوینو برای نمایش الگوها بر روی نمایشگر ماتریس 8×8 نقطهای نیاز داریم (شکل 4 را مشاهده کنید). دقیقا مانند نمایشگر سون سگمنت 4 رقمی ، یک شیفت رجیستر میتواند ستونهای نمایشگر ماتریس 8×8 نقطهای را کنترل کرده و شیفت رجیستر دوم سطرهای آن را کنترل میکند.
اتصالهای بین یک پایه آردوینو و یک پایه نمایشگر ماتریس 8×8 نقطهای که در کد بالا با ماتریس col[] بیان میشدند، هم اکنون با اتصالات شیفت رجیستر بیان میشوند (شکل 5 و جدول 2 را مشاهده کنید). فقط ماتریسهای pin[] و row[] در کدهای پایین مورد نیاز هستند.
کد نمایش حروف A، B، C با شیفت رجیستر
// Arduino display pins
int pin[] = {19,13,12,9,8,11,7,10,17,16,6,5,15,4,14,3,2};
// dot matrix display rows
int row[] = {pin[9],pin[14],pin[8],pin[12],pin[1],pin[7],pin[2],pin[5]};
byte val[3][8] = {4,10,17,17,31,17,17,0, // decimal representation of letter A
15,17,17,15,17,17,15,0, // decimal representation of letter B
14,17,1,1,1,17,14,0}; // decimal representation of letter C
int dataPin = 2; // shift register DATA pin
int latchPin = 3; // shift register LATCH pin
int clockPin = 4; // shift register CLOCK pin
unsigned long start;
void setup()
{
pinMode (dataPin, OUTPUT); // define shift register DATA pin as output
pinMode (latchPin, OUTPUT); // define shift register LATCH pin as output
pinMode (clockPin, OUTPUT); // define shift register CLOCK pin as output
for (int i=1; i<17; i++) pinMode(pin[i], OUTPUT); // display pins as
// output
for (int i=0; i<8; i++) digitalWrite(row[i], HIGH); // set cathodes
} // HIGH, turn off
void loop()
{
for (int n=0; n<3; n++) // display the letters A, B, C
{
start = millis(); // milliseconds elapsed
while (millis()
جدول 2- اتصالات دات ماتریس 8×8 و شیفت رجیستر
پایه
|
نماد
|
توضیح
|
متصل به
|
---|---|---|---|
1
|
QB
|
خروجی شیفت رجیستر برای ستون 2
|
پایه 3 ماتریس 8×8 نقطهای
|
2
|
QC
|
خروجی شیفت رجیستر برای ستون 3
|
پایه 4 ماتریس 8×8 نقطهای
|
3
|
QD
|
خروجی شیفت رجیستر برای ستون 4
|
پایه 10 ماتریس 8×8 نقطهای
|
4
|
QE
|
خروجی شیفت رجیستر برای ستون 5
|
پایه 6 ماتریس 8×8 نقطهای
|
5
|
QF
|
خروجی شیفت رجیستر برای ستون 6
|
پایه 11 ماتریس 8×8 نقطهای
|
6
|
QG
|
خروجی شیفت رجیستر برای ستون 7
|
پایه 15 ماتریس 8×8 نقطهای
|
7
|
QH
|
خروجی شیفت رجیستر برای ستون 8
|
پایه 16 ماتریس 8×8 نقطهای
|
8
|
GND
|
زمین
|
آردوینو GND
|
9
|
’QH
|
خروجی با بیش از یک رجیستر
|
|
10
|
SRCLR
|
در صورت LOW بودن رجیستر را پاک میکند
|
پایه 5 ولت آردوینو
|
11
|
SRCLK
|
کلاک ذخیره رجیستر
|
پایه 4 آردوینو CLOCK
|
12
|
RCLK
|
پایه 3 آردوینو LATCH
|
|
13
|
OE
|
خروجی هنگامی که این پایه زمین باشد فعال میشود
|
GND آردوینو
|
14
|
SER
|
ورودی سریال برای پایه بعدی
|
پایه 2 آردوینو DATA
|
15
|
QA
|
خروجی شیفت رجیستر برای ستون 1
|
پایه 13 ماتریس 8×8 نقطهای
|
16
|
VCC
|
منبع تغذیه 5 ولت
|
5 ولت آردوینو
|
استفاده از دو شیفت رجیستر
دومین شیفت رجیستر 74HC595 سطرهای نمایشگر ماتریس 8×8 نقطهای را کنترل کرده و تعداد پایههای آردوینو مورد نیاز را به 3 کاهش میدهد (شکل 6). تغییرات در اتصالات اولین شیفت رجیستر پس از اتصال شیفت رجیستر دوم در جدول 3 بیان شدهاند.
جدول 3- تغییر در اتصالات شیفت رجیستر اول با اتصال شیفت رجیستر دوم
پایه
|
نماد
|
توضیح
|
اتصال به
|
---|---|---|---|
9
|
’QH
|
خروجی با بیش از یک رجیستر
|
(2) 74HC595 پایه 14
|
11
|
SRCLK
|
کلاک ذخیره رجیستر
|
پایه کلاک آردوینو، 74HC595(2) پایه 11
|
12
|
RCLK
|
کلاک شیفت رجیستر
|
پایه LATCH آردوینو، 74HC595(2) پایه 12
|
74HC595(1) و 74HC595(2) به ترتیب به اولین و دومین شیفت رجیستر اشاره میکنند. شیفت رجیستر دوم به نمایشگر ماتریس 8×8 نقطهای و شیفت رجیستر اول متصلشده و بجز پایه GND و 5V به پایه دیگری از آردوینو متصل نمیشود (جدول 4 را مشاهده کنید).
جدول 4- اتصالات ماتریس 8×8 نقطهای و شیفت رجیستر
پایه
|
نماد
|
توضیح
|
متصل به
|
---|---|---|---|
1
|
QB
|
خروجی شیفت رجیستر برای ستون 2
|
پایه 14 ماتریس 8×8 نقطهای
|
2
|
QC
|
خروجی شیفت رجیستر برای ستون 3
|
پایه 8 ماتریس 8×8 نقطهای
|
3
|
QD
|
خروجی شیفت رجیستر برای ستون 4
|
پایه 12 ماتریس 8×8 نقطهای
|
4
|
QE
|
خروجی شیفت رجیستر برای ستون 5
|
پایه 1 ماتریس 8×8 نقطهای
|
5
|
QF
|
خروجی شیفت رجیستر برای ستون 6
|
پایه 7 ماتریس 8×8 نقطهای
|
6
|
QG
|
خروجی شیفت رجیستر برای ستون 7
|
پایه 2 ماتریس 8×8 نقطهای
|
7
|
QH
|
خروجی شیفت رجیستر برای ستون 8
|
پایه 5 ماتریس 8×8 نقطهای
|
8
|
GND
|
زمین
|
آردوینو GND
|
9
|
’QH
|
خروجی با بیش از یک رجیستر
|
|
10
|
SRCLR
|
در صورت LOW بودن رجیستر را پاک میکند
|
پایه 5 ولت آردوینو
|
11
|
SRCLK
|
کلاک ذخیره رجیستر
|
پایه 11 74HC595(1)
|
12
|
RCLK
|
کلاک شیفت رجیستر
|
پایه 12 74HC595(1)
|
13
|
OE
|
خروجی هنگامی که این پایه زمین باشد فعال میشود
|
GND آردوینو
|
14
|
SER
|
ورودی سریال برای پایه بعدی
|
پایه 9 74HC595(1)
|
15
|
QA
|
خروجی شیفت رجیستر برای ستون 1
|
پایه 9 ماتریس 8×8 نقطهای
|
16
|
VCC
|
منبع تغذیه 5 ولت
|
5 ولت آردوینو
|
با اتصال شیفت رجیستر دوم به []Pin و []row نیاز نداریم:
int pin[] = {19,13,12,9,8,11,7,10,17,16,6,5,15,4,14,3,2}
int row[] = {pin[9],pin[14],pin[8],pin[12],pin[1],pin[7],pin[2],pin[5]}
for (int i=1; i<17; i++) pinMode(pin[i], OUTPUT)
for (int i=0; i<8; i++) digitalWrite(row[i], HIGH)
digitalWrite(row[r], LOW)
delayMicroseconds(200)
digitalWrite(row[r], HIGH)
دستور shiftOut(dataPin, clockPin, MSBFIRST, ~(1<<r)) قبل از دستور shiftOut(dataPin, clockPin, MSBFIRST,val[n][r]) اضافه میشود.
دستور ()shiftOut در سری دوم کد همین مقاله، اطلاعات سطری را در اولین رجیستر بارگذاری میکند، دستور ()shiftOut اضافهشده اطلاعات سطری را به شیفت رجیستر دوم انتقال میدهد و سپس اطلاعات ستونی در شیفت رجیستر اول بارگذاری میشوند.
دستور shiftOut(dataPin, clockPin, MSBFIRST, ~(1<<r)) سطرهای نمایشگر ماتریس 8×8 نقطهای را کنترل میکند. هنگامیکه شیفت رجیستر نمایش باینری برای سطر r را بارگذاری میکند، این سطر با LOW کردن کاتد متناظر روشن میشود. برای مثال، برای روشن کردن سطر پنجم، عدد باینری B11101111 در شیفت رجیستر قرار داده میشود. با اینحال، هنگام کدگذاری آسانتر است که مقدار باینری B00010000 که معکوس B11101111 است را بارگذاری کنید، و سپس بیتها را با علامت ~ از یک به صفر و از صفر به یک تغییر دهید. علامت >> یک بیت با مقدار یک را با عبارت 1<<r)) به مکان r منتقل میکند.
بطورخلاصه، دستور shiftOut(dataPin, clockPin, MSBFIRST, ~(1<<r)) وارون 2r را به صورت باینری تولید و این مقدار را با شروع از پرارزشترین بیت در رجیستر بارگذاری میکند. با استفاده از دو رجیستر و تغییر دستور shiftOut(dataPin, clockPin, MSBFIRST, ~(1<<r)) میتوان کاراکتر را انتقال داد. یک انعکاس، بالا به پایین، با تغییر MSBFIRST به LSBFIRST بدست میآید.
کاراکترها را میتوان با اضافه کردن حلقه for (int t=0; t<8; t++) قبل از start = millis() در لیست 2-7 جدید و تغییر shiftOut(dataPin, clockPin, MSBFIRST, ~(1<<r)) به shiftOut(dataPin, clockPin, LSBFIRST, ~(1<<r)) انعکاس بالا به پایین یا shiftOut(dataPin, clockPin, MSBFIRST, ~(1<<r+t)) گام رو به پایین یا shiftOut(dataPin, clockPin, MSBFIRST, ~(1<<r-t)) گام رو به بالا با دستور if(r-t+1>0) قبل از دستور digitalWrite(latchPin,LOW) نمایش داد.
در صورت استفاده از یک یا دو شیفت رجیستر، تغییر MSBFIRST به LSBFIRST در دستور shiftOut(dataPin, clockPin, MSBFIRST,val[n][r]); کاراکتر را از چپ به راست بازتاب میکند.
متن متحرک در دات ماتریس هشت در هشت
در این سه سری کد ارائه شده، یک سطر فعال میشود و سپس LEDهای ستونی در این سطر روشن یا خاموش میشوند که این عمل اسکن سطری نامیده میشود. یک مقاومت 220 اهمی سری با هر ستون نمایشگر ماتریس 8×8 نقطهای جریان را برای کنترل روشنایی LED محدود میکند بطوریکه با اسکن سطری هر بار فقط یک LED در یک ستون روشن میشود. برای نمایش یک پیام متحرک با نمایشگر ماتریس 8×8 نقطهای، کاراکترها در عوض بالا یا پایین شدن باید از راست به چپ منتقل شوند. بنابراین، ستونها، بهجای سطرها، فعال شده و LEDهای یک ستون روشن یا خاموش میشوند که این عمل اسکن ستونی نامیده میشود. در این حالت مقاومتهای 220 اهمی با هر سطر نمایشگر ماتریس 8×8 نقطهای سری میشوند (شکل 7را مشاهده کنید). در صورت جابجایی کاراکترها با اسکن ستونی، در دستور shiftOut(dataPin, clockPin, MSBFIRST, (1<<7+c-t)) علامت ~ وجود ندارد، همانطورکه در پاراگراف قبلی بیان شد، یک ستون با HIGH کردن آند فعال میشود، در مقابل برای اسکن سطری کاتد بصورت LOW تنظیم میشود.
کد زیر یک پیام را بر روی نمایشگر ماتریس 8×8 نقطهای با حرکت کاراکترها از راست به چپ نمایش میدهد و پیام با دستور Serial.available()>0 که در مقالات قبلی بیان شد به بافر مانیتور سریال وارد میشود. دستور () Serial.readبافر را هر بار با یک کاراکتر کاهش میدهد.
نمایشهای دسیمال کاراکترهای حروف بزرگ و کوچک برای کمک به تفسیر دستورات اصلی، بجای دستورات اصلی در یک فایل داده بارگذاری میشوند.
برای ایجاد یک فایل داده در IDE آردوینو، مثلث زیر دکمه مانیتور سریال را در سمت راست IDE انتخاب کنید. از منوی باز شده New Tab را انتخاب کرده، عنوان (title) را وارد کنید: letters.h. در این صورت New Tab با عنوان letters.h برای دربرگرفتن ماتریسهای letters[]، شامل کاراکترهای حرفی عددی، و val[63][8]، شامل نمایشهای دسیمال کاراکترها، ویرایش میشود (جدول 5 را مشاهده کنید). ماتریس val[63][8] برای نمایشهای دسیمال کاراکتر یک ماتریس سطری است که با دستور ()bitRead تبدیل به یک ماتریس ستونی شده و بصورت ماتریس []cols ذخیره میشود.
هنگامیکه یک فایل اضافی در لیست دستورات قرار میگیرد، دستور ” filename.h”#include برای استفاده از یک کتابخانه در دستورات، بجای <> از ” ” استفاده میکند، مانند دستور include# letters.h .
کد نمایش متن متحرک روی نمایشگر ماتریس 8×8 نقطهای
#include "letters.h" // include letter data
int dataPin = 2; // shift register DATA pin
int latchPin = 3; // shift register LATCH pin
int clockPin = 4; // shift register CLOCK pin
byte cols[8];
char data;
int n;
unsigned long start;
void setup()
{
Serial.begin(9600); // define Serial output baud rate
pinMode (dataPin, OUTPUT); // define shift register DATA pin as output
pinMode (latchPin, OUTPUT); // define shift register LATCH pin as output
pinMode (clockPin, OUTPUT); // define shift register CLOCK pin as output
}
void loop()
{
while (Serial.available()>0) // message read from Serial Monitor
{
data=Serial.read(); // message read one letter at a time
Serial.print(data);
// decimal representation of letter
for (int lett=0; lett<63 ;lett++) if(data == letters[lett]) n=lett;
for (int i=0; i<8;i++) // convert row to column orientation
{
cols[i]=0; // change to column orientation
for (int j=0; j<8; j++) cols[i]= cols[i] + (bitRead(val[n][j],i)<0)
{
digitalWrite(latchPin,LOW); // change display pattern
shiftOut(dataPin, clockPin, MSBFIRST,~cols[c]); // shift by one
// column
shiftOut(dataPin, clockPin, MSBFIRST, (1<<7+c-t));
digitalWrite(latchPin,HIGH);
}
}
}
}
}
1 دیدگاه در “راه اندازی دات ماتریس 8 در 8 در آردوینو”
با سلام و خداقوت
خیلی ممنون از زحماتتون
من وقتی برنامه نمایش متن متحرک روی نمایشگر ماتریس ۸×۸ نقطهای رو میخوام verify کنم روی سطر اول ارور میده و بعدش با توجه به توضیحاتتون که گفتید newtab رو بزنیم و بقیه کارا بازم این ارور رفع نمیشه. در ضمن جدول شماره 5 هم وجود نداره. میشه راهنمایی بفرمایین؟