ผู้เขียน หัวข้อ: งานครั้งที่ 16 เขียนโปรแกรมแสดงผลค่า 7 Segment 4 digit (install Lib)  (อ่าน 11631 ครั้ง)

admin

  • Administrator
  • Hero Member
  • *****
  • กระทู้: 706
    • ดูรายละเอียด
    • อีเมล์
เขียนโปรแกรมแสดงผลค่า 7 Segment 4 digit
ฟังก์ชั่นที่ใช้งาน
-delay() http://arduino.cc/en/Reference/Delay
-millis()http://arduino.cc/en/Reference/Millis

ไลบารี่เพิ่มเติม
Multiplex7Seg.h https://github.com/kkazakov/Multiplex7Seg

การเพิ่มไลบารี่ลงในโปรแกรม Arduino IDE จากไฟล์ Zip
1. ดาวน์โหลดไฟล์ Zip ดังรูป


2. ทำการเพิ่มไลบรารี่ลงในโปรแกรม Arduino IDE โดยการเพิ่มจากไฟล์ zip แล้วทำการหาไฟล์ zip ที่ได้จากการดาวน์โหลดในข้อ 1


การใช้งานไลบรารี่
จะต้องประกาศตัวแปลระบุขาต่อกับ 7 segment ก่อนใช้งาน (ประกาศแบบ global นอกฟังก์ชั่น setup,loop)
byte digitPins[] = {9, 10, 11, 12};         // LSB to MSB
byte segmentPins[] = {2, 3, 4, 5, 6, 7, 8}; // Segment a to g

-Multiplex7Seg::set(1, 4, digitPins, segmentPins);  //1=enable,4=4 digit
-Multiplex7Seg::loadValue(value);

โจทย์โปรแกรม
-แสดงผลตัวเลขเวลาเริ่มตั้งแต่บอร์ดได้รับการป้อนแรงดันแหล่งจ่ายหรือหลังจากการรีเซตแสดงผลเป็นเลขวินาที
-แก้ไขไลบารี่ให้แสดงเลข 6,9 ให้สมบูรณ์
-โปรแกรมรายละเอียดพิเศษรายกลุ่ม (แจ้งให้ทราบเมื่อถึงชั่วโมงเรียน)

วงจรที่ใช้ในการทดลองสำหรับผู้ที่ใช้บอร์ด Arduino


วงจรที่ใช้ในการทดลองสำหรับผู้ที่ใช้ไอซี ATmega328 (ที่มี Boot Loader Arduino)


บริเวณใช้งานบอร์ดทดลอง


ตัวอย่างโปรแกรมแสดงผล 7 Segment แบบใช้ไลบารี่
โค๊ด: [Select]
#include <Multiplex7Seg.h>
byte digitPins[] = {9, 10, 11, 12};            // LSB to MSB
byte segmentPins[] = {2, 3, 4, 5, 6, 7, 8}; // Segment a to g

void setup() {
  Multiplex7Seg::set(1, 4, digitPins, segmentPins);   // Initialize
}
void loop() {
  int x=9876;
  Multiplex7Seg::loadValue(x);
  delay(1000);
  Multiplex7Seg::loadValue(1234);
  delay(1000);
}

ตัวอย่างโปรแกรมแสดงผล 7 Segment แบบไม่ใช้ไลบารี่
โค๊ด: [Select]

//---------------Bit of display (Transistor driver)---------
char digit1 = 10; //Display digit 1 (1000)
char digit2 = 11; //Display digit 2 (100)
char digit3 = 12; //Display digit 3 (10)
char digit4 = 13; //Display digit 4 (1)
//--------------Bit of segment-----------------------------
char segA = 2; //Display segment A to D2
char segB = 3; //Display segment B to D3
char segC = 4; //Display segment C to D4
char segD = 5; //Display segment D to D5
char segE = 6; //Display segment E to D6
char segF = 7; //Display segment F to D7
char segG = 8; //Display segment G to D8
char segDP = 9; //Display segment DP to D9

void setup() {               
  pinMode(segA, OUTPUT);
  pinMode(segB, OUTPUT);
  pinMode(segC, OUTPUT);
  pinMode(segD, OUTPUT);
  pinMode(segE, OUTPUT);
  pinMode(segF, OUTPUT);
  pinMode(segG, OUTPUT);
  pinMode(segDP, OUTPUT);
 
  pinMode(digit1, OUTPUT);
  pinMode(digit2, OUTPUT);
  pinMode(digit3, OUTPUT);
  pinMode(digit4, OUTPUT);
}
void loop()
{
   displayNumber(1234);
}

void displayNumber(int toDisplay) {
#define DISPLAY_BRIGHTNESS  1500
#define DIGIT_ON  HIGH
#define DIGIT_OFF  LOW
 for(int digit = 4 ; digit > 0 ; digit--)
 {
    //----------Turn off all digits---------------
    digitalWrite(digit1, DIGIT_OFF);
    digitalWrite(digit2, DIGIT_OFF);
    digitalWrite(digit3, DIGIT_OFF);
    digitalWrite(digit4, DIGIT_OFF);
    //----------Turn on the right segments for this digit
    lightNumber(toDisplay % 10);    // send number low digit to display
    toDisplay /= 10;                // shift next number
    //---------------Add point at digit 2-------------------
    if (digit==2)
    {digitalWrite(segDP, HIGH);
    }
    else
    {digitalWrite(segDP, LOW);
    }
    //---------------On display------------------
    switch(digit) {
    case 1:
      digitalWrite(digit1, DIGIT_ON);
      break;
    case 2:
      digitalWrite(digit2, DIGIT_ON);
      break;
    case 3:
      digitalWrite(digit3, DIGIT_ON);
      break;
    case 4:
      digitalWrite(digit4, DIGIT_ON);
      break;
    }
    delayMicroseconds(DISPLAY_BRIGHTNESS); // Brightness 7-Segment Controlled
  }
}

void lightNumber(int numberToDisplay) {
#define SEGMENT_ON  HIGH
#define SEGMENT_OFF LOW
  switch (numberToDisplay){
  case 0:
    digitalWrite(segA, SEGMENT_ON);
    digitalWrite(segB, SEGMENT_ON);
    digitalWrite(segC, SEGMENT_ON);
    digitalWrite(segD, SEGMENT_ON);
    digitalWrite(segE, SEGMENT_ON);
    digitalWrite(segF, SEGMENT_ON);
    digitalWrite(segG, SEGMENT_OFF);
    break;
  case 1:
    digitalWrite(segA, SEGMENT_OFF);
    digitalWrite(segB, SEGMENT_ON);
    digitalWrite(segC, SEGMENT_ON);
    digitalWrite(segD, SEGMENT_OFF);
    digitalWrite(segE, SEGMENT_OFF);
    digitalWrite(segF, SEGMENT_OFF);
    digitalWrite(segG, SEGMENT_OFF);
    break;
  case 2:
    digitalWrite(segA, SEGMENT_ON);
    digitalWrite(segB, SEGMENT_ON);
    digitalWrite(segC, SEGMENT_OFF);
    digitalWrite(segD, SEGMENT_ON);
    digitalWrite(segE, SEGMENT_ON);
    digitalWrite(segF, SEGMENT_OFF);
    digitalWrite(segG, SEGMENT_ON);
    break;
  case 3:
    digitalWrite(segA, SEGMENT_ON);
    digitalWrite(segB, SEGMENT_ON);
    digitalWrite(segC, SEGMENT_ON);
    digitalWrite(segD, SEGMENT_ON);
    digitalWrite(segE, SEGMENT_OFF);
    digitalWrite(segF, SEGMENT_OFF);
    digitalWrite(segG, SEGMENT_ON);
    break;
  case 4:
    digitalWrite(segA, SEGMENT_OFF);
    digitalWrite(segB, SEGMENT_ON);
    digitalWrite(segC, SEGMENT_ON);
    digitalWrite(segD, SEGMENT_OFF);
    digitalWrite(segE, SEGMENT_OFF);
    digitalWrite(segF, SEGMENT_ON);
    digitalWrite(segG, SEGMENT_ON);
    break;
  case 5:
    digitalWrite(segA, SEGMENT_ON);
    digitalWrite(segB, SEGMENT_OFF);
    digitalWrite(segC, SEGMENT_ON);
    digitalWrite(segD, SEGMENT_ON);
    digitalWrite(segE, SEGMENT_OFF);
    digitalWrite(segF, SEGMENT_ON);
    digitalWrite(segG, SEGMENT_ON);
    break;
  case 6:
    digitalWrite(segA, SEGMENT_ON);
    digitalWrite(segB, SEGMENT_OFF);
    digitalWrite(segC, SEGMENT_ON);
    digitalWrite(segD, SEGMENT_ON);
    digitalWrite(segE, SEGMENT_ON);
    digitalWrite(segF, SEGMENT_ON);
    digitalWrite(segG, SEGMENT_ON);
    break;
  case 7:
    digitalWrite(segA, SEGMENT_ON);
    digitalWrite(segB, SEGMENT_ON);
    digitalWrite(segC, SEGMENT_ON);
    digitalWrite(segD, SEGMENT_OFF);
    digitalWrite(segE, SEGMENT_OFF);
    digitalWrite(segF, SEGMENT_OFF);
    digitalWrite(segG, SEGMENT_OFF);
    break;
  case 8:
    digitalWrite(segA, SEGMENT_ON);
    digitalWrite(segB, SEGMENT_ON);
    digitalWrite(segC, SEGMENT_ON);
    digitalWrite(segD, SEGMENT_ON);
    digitalWrite(segE, SEGMENT_ON);
    digitalWrite(segF, SEGMENT_ON);
    digitalWrite(segG, SEGMENT_ON);
    break;
  case 9:
    digitalWrite(segA, SEGMENT_ON);
    digitalWrite(segB, SEGMENT_ON);
    digitalWrite(segC, SEGMENT_ON);
    digitalWrite(segD, SEGMENT_ON);
    digitalWrite(segE, SEGMENT_OFF);
    digitalWrite(segF, SEGMENT_ON);
    digitalWrite(segG, SEGMENT_ON);
    break;
  case 10:
    digitalWrite(segA, SEGMENT_OFF);
    digitalWrite(segB, SEGMENT_OFF);
    digitalWrite(segC, SEGMENT_OFF);
    digitalWrite(segD, SEGMENT_OFF);
    digitalWrite(segE, SEGMENT_OFF);
    digitalWrite(segF, SEGMENT_OFF);
    digitalWrite(segG, SEGMENT_OFF);
    break;
  }
}

ไลบรารี่แสดงจุดทศนิยมได้
เนื่องจากไลบรารี่ข้างต้นไม่สามารถแสดงจุดทศนิยมได้ ครูจึงปรับปรุงให้สามารถแสดงจุดทศนิยมได้ (ดูตามตัวอย่างที่แนบมาพร้อมกับไลบรารี่) สามารถดาวน์โหลดได้ที่ https://www.mediafire.com/?j850i6ec9pl3gds
« แก้ไขครั้งสุดท้าย: มิถุนายน 27, 2017, 04:30:14 PM โดย admin »