ในโปรเจกต์นี้ คุณจะได้เรียนรู้วิธีการใช้ shift register และ serial monitor โดยการควบคุมความสว่างของ LEDs และการแปลงจาก decimal ไปเป็น binary ด้วย LEDs
ขั้นตอนที่ 1: สิ่งที่คุณต้องมี





สำหรับบทช่วยสอนนี้ คุณจะต้องมี:
- Arduino Uno
- Breadboard
- LEDs
- 74HC595 Shift Register
- 221 Ohm Resistors
ขั้นตอนที่ 2: วงจร

หากคุณไม่ทราบว่า shift register คืออะไรหรือทำงานอย่างไร ผมแนะนำให้อ่านโพสต์นี้โดย last minute engineers ก่อนดำเนินการโปรเจกต์นี้ต่อ

ตามที่แสดงใน schematic LEDs ทั้งหมดควรเชื่อมต่อแยกกันไปยัง pins Qa-h บน shift register. SER ควรเชื่อมต่อกับ pin 12 บน Arduino, OE ควรเชื่อมต่อกับ pin 9, RCLK ควรเชื่อมต่อกับ pin 10, SRCLK ควรเชื่อมต่อกับ pin 11, SRCLR ควรเชื่อมต่อกับ pin 5v, Vcc ควรเชื่อมต่อกับ pin 5v และ GND ควรกราวด์. Qh' ควรปล่อยว่างไว้
ขั้นตอนที่ 3: โค้ด
วิธีการทำงาน
มาดูโค้ดทีละส่วนกัน
if (Serial.available() > 0) {
int index=0;
delay(100); // let the buffer fill up
int numChar = Serial.available();
`Serial.available()` ตรวจสอบว่ามีการส่งข้อมูลไปยัง Arduino หรือไม่ หากมีการรับข้อมูล เงื่อนไขจะถูกตรงตามนั้น วัตถุประสงค์ของ `delay` คือเพื่อให้ `buffer` เต็ม `numChar` จะเก็บความยาวของข้อมูลที่ส่ง +1 (เนื่องจากมี `NULL character`)
if (numChar>11) {
numChar=11;
}
บรรทัดนี้จำกัดค่าของ `numChar` ไว้ที่ 11 เพื่อป้องกัน `buffer overflow errors`
while (numChar--) {
buffer[index++] = Serial.read();
}
splitString(buffer);
ส่วนนี้เติมตัวแปร `buffer` ของเราให้เต็มและส่งไปยังฟังก์ชันที่ชื่อว่า `splitString`
void splitString(char* data){
Serial.print("Data entered: ");
Serial.println(data);
char* parameter;
parameter = strtok (data, " ,");
while (parameter != NULL) {
setLED(parameter);
parameter = strtok (NULL, " ,");
}
// Clear the text and serial buffers
for (int x=0; x<11; x++) {
buffer[x]='\\0';
}
}
ใน C/C++ เราไม่สามารถส่ง `character arrays` เป็น `argument` ไปยัง `function` ได้ ดังนั้นเราจึงใช้ `pointer` ที่ชื่อว่า `data` (คลิกที่นี่เพื่อดูวิดีโออธิบายว่า `pointer` คืออะไร หรือ อ่านบทความนี้). เราส่ง `data array` ไปยังคำสั่ง `strtok` เป็น `argument` ตัวแรก และ `tokens` (ที่ล้อมรอบด้วยเครื่องหมายคำพูด) เป็น `argument` ตัวที่สอง ด้วยเหตุนี้ `parameter = strtok (data, ", ");` และมันจะแยก `string` ณ จุดนั้น ดังนั้นเราจึงใช้มันเพื่อกำหนดให้ `parameter` เป็นส่วนหนึ่งของ `string` จนถึง `space` หรือ `comma` (สำหรับคำอธิบายเพิ่มเติมว่า `strtok()` ทำงานอย่างไร คลิกที่นี่ หรือ ที่นี่).
บรรทัดถัดไปตรวจสอบว่าตัวแปร `parameter` ว่างเปล่าหรือไม่ หากไม่ว่างเปล่า มันจะส่ง `data parameter` ที่เก็บอยู่ไปยัง `function setLed()` จากนั้นกระบวนการจะถูกทำซ้ำจนกระทั่ง `loop` หยุดทำงาน `for loop` จะล้าง `buffer`
void setLED(char* data) {
if ((data[0] == 'b') || (data[0] == 'B')) {
int Ans = strtol(data+1, NULL, 10);
Ans = constrain(Ans,0,255);
analogWrite(OE, 255-Ans);
Serial.print("Brightness is set to: ");
Serial.println(Ans);
}
else{
int num = strtol(data, NULL, 10);
num = constrain(Ans,0,255);
digitalWrite(latch, LOW);
shiftOut(dataPin, clockPin, LSBFIRST, num);
digitalWrite(latch, HIGH);
Serial.print("number is set to: ");
Serial.println(num);
}
}
คำสั่ง "If" ตรวจสอบว่า `character` ตัวแรกคือ B หรือ b หรือไม่ จากนั้น `function strtol()` จะแปลงตัวเลขหลัง b ให้เป็น `integer` ระหว่าง 0 ถึง 255 คำตอบจะถูกส่งผ่านไปยัง `analogWrite()` `function` นี่เป็นการเปลี่ยนความสว่างด้วย PWM (คลิกที่นี่สำหรับข้อมูลเกี่ยวกับ PWM หรือ ที่นี่สำหรับคำอธิบาย) หาก `data[0]` เป็นตัวเลข `else block` จะทำงาน ตัวเลขจะถูกจำกัดค่าระหว่าง 0 ถึง 255 และถูกส่งไปยัง `shiftOut()` `function` (คลิกที่นี่สำหรับข้อมูลเกี่ยวกับ `shiftOut()`)
ขั้นตอนที่ 4: ยินดีด้วย!!!!
คุณทำโปรเจกต์นี้สำเร็จแล้ว เยี่ยมมาก!
ผมหวังว่าคุณจะชอบ หากคุณมีข้อเสนอแนะเกี่ยวกับโค้ดของผม โปรดแจ้งให้ทราบในความคิดเห็น
ขอบคุณ
รายละเอียดทางเทคนิคเพิ่มเติม
การจำลอง Logic Gate
โปรเจกต์เชิงการศึกษานี้ทำหน้าที่เป็นตัวแทนทางกายภาพว่าคอมพิวเตอร์แปลงตัวเลขฐาน 10 เป็นภาษาเครื่อง binary (ฐาน 2) ได้อย่างไร
- Bit-Manipulation Engine: Arduino จะแสดงเลข Decimal สุ่มบน Serial monitor ผู้ใช้ป้อนคำตอบผ่านปุ่มกด และ Arduino จะใช้ฟังก์ชัน
bitRead()เพื่อส่องสว่างแถวของ LEDs 4 หรือ 8 ดวงที่แสดงถึงbinary bits - Iterative Division Logic: แสดง
algorithmทางคณิตศาสตร์ "Divide by 2" ในfirmwareโดยอัปเดตสถานะของ LEDs จาก LSB (Least Significant Bit) ไปยัง MSB แบบเรียลไทม์
ส่วนต่อประสานภาพ
- High-Contrast Readout: ใช้ LEDs สีน้ำเงินหรือเขียวสว่างเพื่อให้ดูทันสมัย พร้อม "Status LED" เฉพาะที่กะพริบเมื่อผู้เล่นแปลถูกต้อง