ความรู้แน่น ฟรีสำหรับชุมชน ArduinoAll ที่นี่เท่านั้น

ฟรีและดีที่สุด คอร์สอบรม Arduino + NodeMCU
ทำเพื่อแบ่งปัน ห้ามนำไปจำหน่าย หรือเก็บเงินค่าเรียน
  !!!


  


AllNewStep รับประกันคุณภาพทุกชิ้น วันจันทร์-ศุกร์แจ้งชำระสินค้าก่อน 14.00 จัดส่งทันทีวันนี้ค่ะ

กรุงเทพ /ภาคกลาง ได้พรุ่งนี้


*** สินค้าทุกชิ้น ถ้าสามารถทำรายการสั่งซื้อได้ แสดงว่ามีครบทุกรายการค่ะ *** 

พิมพ์ค้นหาบทความ หัวข้อกระทู้ และสินค้าในเว็บ AllNewStep ได้ที่นี่
QUOTE 

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

sa

น้องซื้อ เซ็นเซอร์ รุ่นนี้ 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 
ความคิดเห็นที่ #11
เจ้าของร้าน

ขอบคุณที่ช่วยเพิ่มเติมครับ

QUOTE 
ความคิดเห็นที่ #12
sawoey

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

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

{

 

}

}

Senser ในลักษณะนี้ อาจจะนับผิดได้นะครับ (นับเบิ้นขึ้นมา) อาจจะต้องหน่วงเวลาอ่านหลายครั้ง

หรืออาจจะต้องใช้ Interrurp() จับขอบสัญญาณขา ขึ้น-ลง จะแน่นอนกว่า เอาเป็นว่าคุณทดสอบส่วนของ Senser ลองเดินผ่านหลายครั้งนับได้ ok ไหม แล้วลองหยุดตรงตำแหน่ง Senser โดยยังไม่ต้องผ่าน โปรฯ เขานับไหม เอาตรงให้ OK ก่อน ส่วนจะนำค่าที่นับได้ไปใส่รวมกันอย่างไร เป็นอีกเรื่อง ซึ่งถูกบังคับด้วย Four digital tube module LED display ที่น้องมีอยู่ เดี่ยวผมช่วยดูอีกที ยังดูไม่ละเอียด อีกอย่าง ผมดู Code ต้อง มโน output เองมันเลยไม่แน่ใจ ต้องดูจากอุปกรณ์จริง มันถึงจะเร็วกว่าที่ มโน เองครับ

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

เยี่ยมครับ : )

QUOTE 
ความคิดเห็นที่ #14
sa

ขอบคุณพี่ๆ ทุกความคิดเห็นนะค่ะ ...ช่วยน้องได้เยอะเลยค่ะ

 

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

ยินดีครับ : )

QUOTE 
ความคิดเห็นที่ #16
sawoey

 

 

/*

 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;

const int inputPin = 2;//รับค่าจาก Sener

 

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

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

// space --> ' '

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

 

int  disp[8];

int val;

//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);

  pinMode(inputPin,INPUT);

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

}  

 

int n;

unsigned long start=millis();

byte b = 0;

void loop()

{

  showDisplay();

  if(b==0){

    b++;

    wait(10);     // หน่วงเวลาแสดงข้อความต้อนรับ

  }

  else{

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

    {

 

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

 

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

 

         {

 

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

 

               n++;

               //ค่าที่นับได้ 10001

               if(n>10000)

 

                {

                     n=0;

                 }

      

 

        }

      // หน่วงเวลา

      wait(10);

    }

 

 

  }

}

 

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;

}

ลอง Run ดูครับไม่รู้ว่าจะแสดงผลถูกไหม คือผมหาที่ใส่ผลจากการนับ +1 ทุกครั้งที่มีการส่ง HIGH มาที่ขา 2

ให้ต่อ R 10K ที่ขา 2 ลงกราวด์ด้วยครับ

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

แบบนี้น้องสบายเลยนะครับ คุณ sawoey Laughing

QUOTE 
ความคิดเห็นที่ #18
sawoey

ก็ยังไม่รู้ว่าจะ ok ไหมครับต้องรอให้น้องเขาทดสอบดูก่อนครับเท่าที่ผมดูแล้วมันน่าจะเป็นตามนั้น โดย มโนเอา จิตในจิต กายในกาย ธรรมในธรรม ว่างั้น เนื่องจากผมไม่มีอุปกรณืจริงทดสอบ ช่วยได้เท่าที่เรามีความรู้เท่านั้น ว่าไป code Pro นะครับ สมัยก่อนผมเคยเขียน Pro ด้าน Database ใช้กับหน่วยงานครับ เรียกว่าอย่างหวง Code ไม่ยอมให้ใครง่ายๆ เก็บไว้คนเดียว (มันเขียนยากนิ) 3 ปีต่อมาแจกให้ใครก็ไม่เอาแล้วครับ สัจจธรรม ครับ เกิดขึ้น ตั้งอยู่ ดับไป นอกเรื่องแล้วคลายเครียดเพื่อสุขภาพ  สาธุ...

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

เยี่ยมเลยครับ LaughingLaughingLaughing

แสดงความคิดเห็นที่ 11-19 จากทั้งหมด 19 ความคิดเห็น
ขาย ARDUINO
คุณภาพ อันดับ 1

ได้รับรางวัลร้านยอดเยี่ยม
ตั้งแต่ปี 2558
ขาย Arduino
วีดีโอสอน Arduino

สอน esp8266

สอน Arduino IoT
สอน Arduino แบบเร็ว

สอน NodeMCU

อุปกรณ์ Arduino

MEMBER ZONE

พูดคุย-สอบถาม