سلام به همگی . در اموزش های قبلی یاد گرفتیم که سون سگمنت چیه و چجوری راه اندازی کنیم . امروز میخواییم یاد بگیریم با اشغال پین کمتر این کارو کنیم.

من Mr.robot هستم و برخلاف اسمم علاقه ای به برنامه نویسی ندارم ولی چون مکمل سخت افزاره رو اوردم بهش .
بعد از این معرفی کوچیک بریم سراغ اموزش :
با توجه قیمت های سرسام آور میکروکنترلر ها ، برای پروژه ها باید میکرو ارزون بخرین و از طرفی با کمبود پین هاش کنار بیایید
سون سگمنت بر خلاف اسمش 10 تا پین داره 😐
برای این کار ما از ایسی شیفت ریجستر استفاده میکنیم ( حالا اخم نکنید توضیح میدم چیه). آیسی شیف ریجستر در واقع ریجستر هایی هستن که توانایی انتقال و ذخیره دیتا رو دارن. داخل این ایسی تعدادی flip flop نهفته شدن که برای پروزه ما خیلی کاربردی هست .
آیسی که ما استفاده میکنیم 74HC595 هست . یک آیسی 8 بیتی که میتونیم با استفاده از سه پین Latch / Clock / Data کنترلش کنیم . در شکل پایین ترتیب پایه ها رو مشاهده میکنید.

و میرسیم به بخش مورد علاقه خودم شماتیک و سیم بندی پروژه ، حتما باید مقاومت 220 اهم بزارید ( خودم 220 نداشتم 150 اهم گذاشتم 🙂 ) ;
int latchPin = 11; // connect to the ST_CP of 74HC595 (pin 3,latch pin)
int clockPin = 9; // connect to the SH_CP of 74HC595 (pin 4, clock pin)
int dataPin = 12; // connect to the DS of 74HC595 (pin 2)
byte sevenSegDigits[10] = { B01111011 , // = 0
B00001001 , // = 1
B10110011 , // = 2
B10011011 , // = 3
B11001001 , // = 4
B11011010 , // = 5
B11111000 , // = 6
B00001011 , // = 7
B11111011 , // = 8
B11001011 // = 9
};
byte sevenSegDP = B00000100; // = DP
byte sevenSegAlpha[] = { B11101011 , // = A
B11111000 , // = b
B01110010 , // = C
B10111001 , // = d
B11110010 , // = E
B11100010 , // = F
B11011011 , // = g
B11101000 , // = h
B01100000 // = I
};
/* ***********************************************************
* Global Variables *
* ********************************************************* */
bool bAddDecimalPoint = true; // display state of show decimal point
/* ***********************************************************
* Void setup *
* ********************************************************* */
void setup() {
// Set latchPin, clockPin, dataPin as output
pinMode(latchPin, OUTPUT);
pinMode(clockPin, OUTPUT);
pinMode(dataPin, OUTPUT);
}
/* ***********************************************************
* Functions *
* ********************************************************* */
// display a alpha, binary value, or number on the digital segment display
void sevenSegWrite(byte digit, bool bDP = false, char switchValue='D') {
/* digit = array pointer or binary value, as a byte
* bDP = true-include decimal point, as boolean
* switchValue = 'A' alpha
* 'B' binary
* 'D' digits <default>, as char */
// set the latchPin to low potential, before sending data
digitalWrite(latchPin, LOW);
// the data (bit pattern)
if (switchValue=='A'){
// alpha
shiftOut(dataPin, clockPin, MSBFIRST, sevenSegAlpha[digit]+(sevenSegDP*bDP));
} else if (switchValue=='B'){
// binary
shiftOut(dataPin, clockPin, MSBFIRST, digit+(sevenSegDP*bDP));
} else {
// digits
shiftOut(dataPin, clockPin, MSBFIRST, sevenSegDigits[digit]+(sevenSegDP*bDP));
}
// set the latchPin to high potential, after sending data
digitalWrite(latchPin, HIGH);
}
void sevenSegBlank(){
// set the latchPin to low potential, before sending data
digitalWrite(latchPin, LOW);
shiftOut(dataPin, clockPin, MSBFIRST, B00000000);
// set the latchPin to high potential, after sending data
digitalWrite(latchPin, HIGH);
}
/* ***********************************************************
* Void Loop *
* ********************************************************* */
void loop() {
//Switch add decimal point states
bAddDecimalPoint = !bAddDecimalPoint;
// count from 9 to 0
// Change byte to int - byte doesn't have a negative number
for (int digit = 9; digit >= 0; --digit) {
sevenSegWrite(digit, bAddDecimalPoint);
delay(1000);
}
// suspend 1 second
sevenSegBlank();
delay(1000);
// count from 0 to 9
for (int digit = 0; digit <= 9; digit++) {
sevenSegWrite(digit, bAddDecimalPoint);
delay(1000);
}
// suspend 1 second
sevenSegBlank();
delay(1000);
// alpha characters
for (int digit = 0; digit <= 8; digit++){
sevenSegWrite(digit, bAddDecimalPoint, 'A');
delay(1000);
}
// suspend 1 second
sevenSegBlank();
delay(1000);
// display individual segments - Binary
sevenSegWrite(1,false,'B'); // B00000001
delay(1000);
sevenSegWrite(2,false,'B'); // B00000010
delay(1000);
sevenSegWrite(4,false,'B'); // B00000100
delay(1000);
sevenSegWrite(8,false,'B'); // B00001000
delay(1000);
sevenSegWrite(16,false,'B'); // B00010000
delay(1000);
sevenSegWrite(32,false,'B'); // B00100000
delay(1000);
sevenSegWrite(64,false,'B'); // B01000000
delay(1000);
sevenSegWrite(128,false,'B'); // B10000000
delay(1000);
// SECRET MESSAGE
sevenSegWrite(0xE8,false,'B'); // B11101000
delay(500);
sevenSegWrite(0xF2,false,'B'); // B11110010
delay(500);
sevenSegWrite(0x70,false,'B'); // B01110000
delay(500);
sevenSegBlank(); // small blank flick
delay(100);
sevenSegWrite(0x70,false,'B'); // B01110000
delay(500);
sevenSegWrite(0xB8,false,'B'); // B10111000
delay(500);
sevenSegBlank();
delay(500);
sevenSegWrite(0xD9,false,'B'); // B11011001
delay(500);
sevenSegWrite(0xB8,false,'B'); // B10111000
delay(500);
sevenSegWrite(0x38,false,'B'); // B00111000
delay(500);
sevenSegWrite(0xF0,false,'B'); // B11110000
delay(500);
sevenSegWrite(0x38,false,'B'); // B00111000
delay(500);
sevenSegWrite(0xF8,false,'B'); // B11111000
delay(500);
sevenSegWrite(0xF2,true,'B'); // B11110010
delay(500);
// suspend 1 second
sevenSegBlank();
delay(1000);
}
الان ترس و وحشت برتون داشته که یا خدا قراره اینهمه برنامه بنویسیم برای سون سگمنت و شیفت ریجستر ولی نگران نباشید این کد برای شناخت شما از تمامی عدد ها و حروفی که میشه با سون سگمنت ساخت .
byte sevenSegDigits[10] = { B01111011 , // = 0
B00001001 , // = 1
B10110011 , // = 2
B10011011 , // = 3
B11001001 , // = 4
B11011010 , // = 5
B11111000 , // = 6
B00001011 , // = 7
B11111011 , // = 8
B11001011 // = 9
};
در این قسمت تعریف میکنیم که برای نمایش هر عدد باید کدوم بخش ها روشن بشه جاهای که ۱ هست روشن میشه جاهایی که صفر خاموش این اعداد با توجه به شماتیک تغییر میکنه بس حتما مثل شکل وصل کنید
در بخش بعدی هم برای حروف این کارو کردیم
pinMode(latchPin, OUTPUT);
pinMode(clockPin, OUTPUT);
pinMode(dataPin, OUTPUT);
اینجا هم clock latch data رو به عنوان خروجی تعریف میکنیم
void sevenSegWrite(byte digit, bool bDP = false, char switchValue='D') {
/* digit = array pointer or binary value, as a byte
* bDP = true-include decimal point, as boolean
* switchValue = 'A' alpha
* 'B' binary
* 'D' digits <default>, as char */
// set the latchPin to low potential, before sending data
digitalWrite(latchPin, LOW);
// the data (bit pattern)
if (switchValue=='A'){
// alpha
shiftOut(dataPin, clockPin, MSBFIRST, sevenSegAlpha[digit]+(sevenSegDP*bDP));
} else if (switchValue=='B'){
// binary
shiftOut(dataPin, clockPin, MSBFIRST, digit+(sevenSegDP*bDP));
} else {
// digits
shiftOut(dataPin, clockPin, MSBFIRST, sevenSegDigits[digit]+(sevenSegDP*bDP));
}
// set the latchPin to high potential, after sending data
digitalWrite(latchPin, HIGH);
}
void sevenSegBlank(){
// set the latchPin to low potential, before sending data
digitalWrite(latchPin, LOW);
shiftOut(dataPin, clockPin, MSBFIRST, B00000000);
// set the latchPin to high potential, after sending data
digitalWrite(latchPin, HIGH);
}
توضیح این قسمت بمونه برا یه جلسه دیگه چون خیلی مفصله
for (int digit = 9; digit >= 0; --digit) {
sevenSegWrite(digit, bAddDecimalPoint);
delay(1000);
}
اینجا بهش میگیم از ۹ تا ۰ بشماره روی سون سگمنت
قسمت بعدی هم عکس اینه از ۰ میشماره تا ۹
sevenSegWrite(1,false,'B'); // B00000001
delay(1000);
sevenSegWrite(2,false,'B'); // B00000010
delay(1000);
sevenSegWrite(4,false,'B'); // B00000100
delay(1000);
sevenSegWrite(8,false,'B'); // B00001000
delay(1000);
sevenSegWrite(16,false,'B'); // B00010000
delay(1000);
sevenSegWrite(32,false,'B'); // B00100000
delay(1000);
sevenSegWrite(64,false,'B'); // B01000000
delay(1000);
sevenSegWrite(128,false,'B'); // B10000000
delay(1000);
در این بخش هم با استفاده از اعداد باینری هر یک از هفت تا چراغ روی سون سگمنت روشن میکنیم
باز هم میگم بیشتر اینا برای آشنایی شما با انواع تابع با شیفت ریجستر هست و شما میتونید در پروژه خیلی خلاصه تر بنویسید
خب خب خب اولین اموزشمون تموم شد امیدوارم حوصلتون سر نرفته باشه
در مورد پروفایل هم بگم همون الیوت در Mr robot هستش فقط نسخه گربه ایش
اوقات خوش فعلا:))))