lnwshop logo
  • ตอบกระทู้
  • ตั้งกระทู้ใหม่
QUOTE 

ขอความกรุณา ดูโค้ดวงจรนับให้หน่อยค่ะ

sa
sa
IP: 49.230.209.x
1 ปีที่ผ่านมา

น้องซื้อ เซ็นเซอร์ รุ่นนี้ Infrared Proximity Sensor เป็นเซนเซอร์วัดระยะ   และโมดูลแสดงค่าตัวเลข 4 หลัก Four digital tube module LED display ต้องการให้เซ็นเซอร์ทำงานเมื่อมีคนเดินผ่่านโดยโปรแกรมทำการนับและแสดงผลที่ 7-segment  น้องใช้บอร์ด Arduino UNO R3 ค่ะ   ต้องแก้โปรแกรมเพิ่มเติมอย่างไรบ้างค่ะ จากโปรแกรมที่ให้มาค่ะ

ส่วนของโมดูล 7-segment

/*
 written by Jason Berger ,arduinoall, พ.ไพศาล
 reedited by Phaisarn Te. @060614
 
 8-Digit 7-Segment display driver.
 2x 74HC595 wired to 2x 4-digit 7-segment displays
 bits 0-7 select a digit
 bits 8-14 A-G
 
 */
char disp_c[8] ;

//กำหนด ขา pin
const int SCLK_pin=4;
const int RCLK_pin=5;
const int DIO_pin =6;


// 0-9   --> ใช้ค่า 0-9
// 0.-9. --> ใช้ค่า 10-19
// space --> ' '
// A-Z, a-z --> 'A' 'B' ... 'a' 'b'

int  disp[8];

//time values for delay workaround
unsigned long prev =0;
unsigned long waitMS=0;

void setup()
{

  pinMode(RCLK_pin,OUTPUT);
  pinMode(DIO_pin,OUTPUT);
  pinMode(SCLK_pin,OUTPUT);
  showText('O','P','E','N'); // แสดงข้อความต้อนรับ
}  

int n;
unsigned long start=millis();
byte b = 0;
void loop()
{
  showDisplay();
  if(b==0){
    b++;
    wait(3000);     // หน่วงเวลาแสดงข้อความต้อนรับ
  }
  else{
    if ( millis() > (prev + waitMS))
    {
      //code to loop in here


      //ระหว่าง loop แก้ไขแสดงค่าอื่นๆได้

      // แสดงผลแบบตัวอักษร ตัวอย่างแสดงคำว่า Ardu
     // showText('A','r','d','u'); //  แก้ค่าที่จะให้แสดงผลตรงนี้


      // แสดงผลแบบตัวเลข ตัวอย่างแสดงค่า 95.42
      // showText(9,15,4,2); //15 --> แสดงเลข 5.


       // แสดงผลตัวอย่าง การ run เลข
      showText((n/1000)%10,(n/100)%10+10,(n/10)%10,n%10);  //แก้ค่าที่จะให้แสดงผลตรงนี้
      n++;
      if(n>10000) {
        n=0;
      }
      
      // หน่วงเวลา
      wait(1000);
    }
  }
}

void showText(char a, char b , char c,char d){
  disp_c[0] = d;
  disp_c[1] = c;
  disp_c[2] = b;
  disp_c[3] = a;
}
void showDisplay()
{
  setDisp();
  for(int i=0; i<8; i++)
  {
    setDigit(i,disp[i]);
  }
}

void setDigit(int dig, int character)
{
  int digits[]= {
    128,64,32,16,8,4,2,1        };

  //character set (0-9)0-9
  //            (10-19)0.-9.
  //            (20-45)A-Z
  //            (46-71)a-z
  //            (72)- (73) space
  int characters[]= {
    3,159,37,13,153,73,65,31,1,9,
    2,158,36,12,152,72,64,30,0,8,
    17,1,99,3,97,113,67,145,243,135,145,227,85,19,3,49,25,115,73,31,129,129,169,145,137,37,
    5,193,229,133,33,113,9,209,247,143,81,227,85,213,197,49,25,245,73,225,199,199,169,145,137,37,
    253,255        };

  digitalWrite(RCLK_pin, LOW);
  shiftOut(DIO_pin, SCLK_pin, LSBFIRST, characters[character]);
  shiftOut(DIO_pin, SCLK_pin, LSBFIRST, digits[dig]);
  digitalWrite(RCLK_pin, HIGH);
}

void setDisp()
{
  for (int i=0; i<8;i++)
  {
    int val = disp_c[i];
    if((val >= 32)&&(val <= 47)){ // ! ถึง / ไม่ให้แสดง
      switch (val){
      case 45 :
        val = 72;
        break;  // เครื่องหมาย -
      default :
        val = 73;
        break;  // ค่าอื่นระหว่างนี้ ไม่ให้แสดง
      }
    }
    else if((val >= 48)&&(val <= 57)) //0-9
    {
      val -= 48;
    }
    else if((val >= 65)&&(val <= 90)) //A-Z
    {
      val -= 45;
    }
    else if((val >= 97)&&(val <= 122)) //a-z
    {
      val -= 51;
    }

    disp[i] = val;

  }
}   
void wait( unsigned long milsec)
{
  prev = millis();
  waitMS = milsec;
}

 

โปรแกรมส่วนเซ็นเซอร์ค่ะ

int inputPin = 2; //infrared proximity switch connected to digital pin 2

int val = 0; //this variable will read the value from the sensor

void setup() 

{

pinMode(inputPin, INPUT); //declare infrared sensor as input

}

void loop()

{

val = digitalRead(inputPin); // read input value

if (val == HIGH)  //check if the input is HIGH

{

 

}

else

{

 

}

}

สามารถนำมาแก้ไขเพื่อรวมเป็นโปรแกรมเดียวกันได้อย่างไรบ้าง  พี่ๆช่วยหน่อยนะค่ะ จำเป็นต้องใช้งานจริงๆ

QUOTE 
ความคิดเห็นที่ #1
เจ้าของร้าน
เจ้าของร้าน
1 ปีที่ผ่านมา

ต้องทำความเข้าใจทีละส่วนก่อนแล้วเอามารวมกันนะครับ แยกส่วนกัน

วงจรนับก็โปรแกรมส่วนหนึ่งดูตัวอย่างการใช้งานเซนเซอร์แสง รับค่ามาเป็นดิจิตอลแล้วเพิ่มค่าในตัวแปรโคดไม่กี่บรรทัด 

แสดงผลก็อีกส่วนแสดงผลก็มีโคดแล้ว แล้วเอามารวมกัน โปรแกรมไม่ยาก

อยากให้ได้ทดลองเขียนจะได้ความรู้ครับ

QUOTE 
ความคิดเห็นที่ #2
sa
sa
IP: 49.230.209.x
1 ปีที่ผ่านมา

น้องทำความเข้าใจและลองนำมาเขียนอยู่2-3วันแล้วค่ะ...แต่ยังติดปัญหาอยู่...พี่ช่วยหน่อยได้ไหมค่ะ..พอดีต้องรีบใช้ค่ะ...

โค้ดที่น้องปรับแก้ค่ะ

char disp_c[8] ;

 

//กำหนด ขา pin

const int SCLK_pin=4;

const int RCLK_pin=5;

const int DIO_pin =6;

// 0-9   --> ใช้ค่า 0-9

// 0.-9. --> ใช้ค่า 10-19

// space --> ' '

// A-Z, a-z --> 'A' 'B' ... 'a' 'b'

int  disp[8];

int inputPin = 2; //infrared proximity switch connected to digital pin 2

int val = 0; //this variable will read the value from the sensor

//time values for delay workaround

unsigned long prev =0;

unsigned long waitMS=0;

 

void setup()

{

  pinMode(inputPin, INPUT); //declare infrared sensor as input

  pinMode(RCLK_pin,OUTPUT);

  pinMode(DIO_pin,OUTPUT);

  pinMode(SCLK_pin,OUTPUT);

}  

 

int n;

unsigned long start=millis();

byte b = 0;

void loop()

{

val = digitalRead(inputPin); // read input value

if (val == HIGH)  //check if the input is HIGH

 

{

 

showDisplay();

  if(b==0){

    b++;

   /* wait(1000);     // หน่วงเวลาการวิ่งของตัวเลข

 

  }  if ( millis() > (prev + waitMS));

   // {

      //code to loop in here

 

 

      //ระหว่าง loop แก้ไขแสดงค่าอื่นๆได้

 

      // แสดงผลแบบตัวอักษร ตัวอย่างแสดงคำว่า Ardu

     // showText('A','r','d','u'); //  แก้ค่าที่จะให้แสดงผลตรงนี้

 

 

      // แสดงผลแบบตัวเลข ตัวอย่างแสดงค่า 95.42

      // showText(9,15,4,2); //15 --> แสดงเลข 5.

 

 

       // แสดงผลตัวอย่าง การ run เลข*/

      showText((n/1000)%10,(n/100)%10,(n/10)%10,n%10);  //แก้ค่าที่จะให้แสดงผลตรงนี้

      n++;

      if(n>10000) {

        n=0;

      }

      wait(1000);

    }

  } // หน่วงเวลา

      

    

  else{

    showText('0','0','0','0');

    

  }

 

}

void showText(char a, char b , char c,char d){

  disp_c[0] = d;

  disp_c[1] = c;

  disp_c[2] = b;

  disp_c[3] = a;

}

void showDisplay()

{

  setDisp();

  for(int i=0; i<8; i++)

  {

    setDigit(i,disp[i]);

  }

}

 

void setDigit(int dig, int character)

{

  int digits[]= {

    128,64,32,16,8,4,2,1        };

 

  //character set (0-9)0-9

  //            (10-19)0.-9.

  //            (20-45)A-Z

  //            (46-71)a-z

  //            (72)- (73) space

  int characters[]= {

    3,159,37,13,153,73,65,31,1,9,

    2,158,36,12,152,72,64,30,0,8,

    17,1,99,3,97,113,67,145,243,135,145,227,85,19,3,49,25,115,73,31,129,129,169,145,137,37,

    5,193,229,133,33,113,9,209,247,143,81,227,85,213,197,49,25,245,73,225,199,199,169,145,137,37,

    253,255        };

 

  digitalWrite(RCLK_pin, LOW);

  shiftOut(DIO_pin, SCLK_pin, LSBFIRST, characters[character]);

  shiftOut(DIO_pin, SCLK_pin, LSBFIRST, digits[dig]);

  digitalWrite(RCLK_pin, HIGH);

}

 

void setDisp()

{

  for (int i=0; i<8;i++)

  {

    int val = disp_c[i];

    if((val >= 32)&&(val <= 47)){ // ! ถึง / ไม่ให้แสดง

      switch (val){

      case 45 :

        val = 72;

        break;  // เครื่องหมาย -

      default :

        val = 73;

        break;  // ค่าอื่นระหว่างนี้ ไม่ให้แสดง

      }

    }

    else if((val >= 48)&&(val <= 57)) //0-9

    {

      val -= 48;

    }

    else if((val >= 65)&&(val <= 90)) //A-Z

    {

      val -= 45;

    }

    else if((val >= 97)&&(val <= 122)) //a-z

    {

      val -= 51;

    }

 

    disp[i] = val;

 

  }

}   

void wait( unsigned long milsec)

{

  prev = millis();

  waitMS = milsec;

}

ต้องแก้อะไรเพิ่มเติมค่ะ

QUOTE 
ความคิดเห็นที่ #3
เจ้าของร้าน
เจ้าของร้าน
1 ปีที่ผ่านมา

โคดนี้สำหรับแสดงผลออกจอ 7 segment มีวิธีใช้งานที่หน้าบทความครับ

ต้องเพิ่มส่วนนับคนเดินผ่านครับ

QUOTE 
ความคิดเห็นที่ #4
sa
sa
IP: 203.158.176.x
1 ปีที่ผ่านมา

อ่านแล้วค่ะ  และลองแก้แล้วค่ะ แแต่ก็ยังไม่ได้ค่ะ....ช่วยดูให้หน่อยสิค่ะ

QUOTE 
ความคิดเห็นที่ #5
sa
sa
IP: 49.229.113.x
1 ปีที่ผ่านมา

ตกลงแก้โค้ดเพิ่มเติมยังไงบ้างค่ะ  ขอความกรุณาด้วยค่ะ จะใช้งานแล้วค่ะ 

QUOTE 
ความคิดเห็นที่ #6
เจ้าของร้าน
เจ้าของร้าน
1 ปีที่ผ่านมา

ตามที่แนะนำครับ อุปกรณ์มีครบแล้ว เหลือเขียนโปรแกรม ต้องขออภัยที่ผมไม่ได้รับเขียนโปรแกรมให้ อยากให้พยายามอีกนิดนะครับ 

สโคปงานนี้ไม่ได้ยากเลย 

การอ่านค่าเซนเซอร์อินฟาเรดสำหรับนับคนก็ไม่ได้ยาก ใช้คำสั่ง digitalRead() บรรทัดเดียวก็ได้ค่า 0 หรือ 1

แล้ว การนับก็ไม่ยาก เช็คเงื่อนไขหลัก ๆ เช่น ถ้าเซนเซอร์เปลี่ยนสถานะจาก 0 เป็น 1 และ 1 เป็น 0

ก็ให้นับเพิ่ม 1 คนเดืินผ่าน เช่น count = count+1;

การแสดงผลก์เอาค่าตัวแปรไปแสดงออก 7 segment

 

เขียนรวม ๆ แล้วไม่กี่บรรทัด ยากสุดก็ตรงแสดงผลออก 7 segment ก็มีโคดและคำอธิบายแล้วครับ ทำความเข้าใจตรงนี้ก่อนนะครับ ผมดูแล้วโคดที่เขียนยังมีความเข้าใจในการใช้งานตรงนี้ยังไม่เพียงพอ

QUOTE 
ความคิดเห็นที่ #7
sa
sa
IP: 203.158.176.x
1 ปีที่ผ่านมา

ขอบคุณนะค่ะ....แล้วจะลองดูค่ะ...

QUOTE 
ความคิดเห็นที่ #8
เจ้าของร้าน
เจ้าของร้าน
1 ปีที่ผ่านมา

ผมเห็นโคดแล้วยังไม่เข้าในการใช้งานของ 7 segment ถ้าเข้าใจแล้ว ส่วนที่เหลือก็ไม่ยากครับ

QUOTE 
ความคิดเห็นที่ #9
sawoey
sawoey (Guest)
IP: 61.7.189.x
1 ปีที่ผ่านมา

 ตรง ฟังชั่น showText('0','0','0','1'); เปลี่ยนเป็น 0001 ดูซิครับ 7 Segment แสดงค่าเป็น 0001 หรือไม่ ถ้าใช่ ก็คือ คือส่วนที่จะต้องนำค่าที่อ่านได้จากการนับเข้าใส่ตรงนี้ แล้วแปลงตัวเลขที่นับได้ให้อยู่ในรูปของ String() ตามรูปแบบของ showText()

QUOTE 
ความคิดเห็นที่ #10
sawoey
sawoey (Guest)
IP: 61.7.189.x
1 ปีที่ผ่านมา

Input ใส่ตัวเลขอยู่ตรงนี้ครับ       

showText((n/1000)%10,(n/100)%10+10,(n/10)%10,n%10);  //แก้ค่าที่จะให้แสดงผลตรงนี้

      n++;
      if(n>10000) {
        n=0;
      }

 

1
2
ถัดไป ›
แสดงความคิดเห็นที่ 1-10 จากทั้งหมด 19 ความคิดเห็น
ข้อความ
ชื่อผู้โพส
ข้อมูลสำหรับการติดต่อกลับ (ไม่เปิดเผย เห็นเฉพาะเจ้าของร้าน)
อีเมล
เบอร์มือถือ
  • ตอบกระทู้

หมวดหมู่สินค้า

สมาชิก Arduino All

เข้าสู่ระบบด้วย
เข้าสู่ระบบ
สมัครสมาชิก

ยังไม่มีบัญชีเทพ สร้างบัญชีใหม่ ไม่เกิน 5 นาที
สมัครสมาชิก (ฟรี)

Arduino All ขายดี

รหัสสินค้า A015
275.00 บาท
  • สั่งซื้อ
รหัสสินค้า A233
5.00 บาท
  • สั่งซื้อ
รหัสสินค้า A115
10.00 บาท
  • สั่งซื้อ
รหัสสินค้า A238
4.00 บาท
  • สั่งซื้อ
รหัสสินค้า A237
4.00 บาท
  • สั่งซื้อ
รหัสสินค้า A014
90.00 บาท
  • สั่งซื้อ
รหัสสินค้า A097
4.00 บาท
  • สั่งซื้อ
รหัสสินค้า A474
7.00 บาท
  • สั่งซื้อ
รหัสสินค้า A225
5.00 บาท
  • สั่งซื้อ
Go to Top