น้องซื้อ เซ็นเซอร์ รุ่นนี้ 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
{
}
}
สามารถนำมาแก้ไขเพื่อรวมเป็นโปรแกรมเดียวกันได้อย่างไรบ้าง พี่ๆช่วยหน่อยนะค่ะ จำเป็นต้องใช้งานจริงๆ
ต้องทำความเข้าใจทีละส่วนก่อนแล้วเอามารวมกันนะครับ แยกส่วนกัน
วงจรนับก็โปรแกรมส่วนหนึ่งดูตัวอย่างการใช้งานเซนเซอร์แสง รับค่ามาเป็นดิจิตอลแล้วเพิ่มค่าในตัวแปรโคดไม่กี่บรรทัด
แสดงผลก็อีกส่วนแสดงผลก็มีโคดแล้ว แล้วเอามารวมกัน โปรแกรมไม่ยาก
อยากให้ได้ทดลองเขียนจะได้ความรู้ครับ
น้องทำความเข้าใจและลองนำมาเขียนอยู่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;
}
ต้องแก้อะไรเพิ่มเติมค่ะ
โคดนี้สำหรับแสดงผลออกจอ 7 segment มีวิธีใช้งานที่หน้าบทความครับ
ต้องเพิ่มส่วนนับคนเดินผ่านครับ
ตามที่แนะนำครับ อุปกรณ์มีครบแล้ว เหลือเขียนโปรแกรม ต้องขออภัยที่ผมไม่ได้รับเขียนโปรแกรมให้ อยากให้พยายามอีกนิดนะครับ
สโคปงานนี้ไม่ได้ยากเลย
การอ่านค่าเซนเซอร์อินฟาเรดสำหรับนับคนก็ไม่ได้ยาก ใช้คำสั่ง digitalRead() บรรทัดเดียวก็ได้ค่า 0 หรือ 1
แล้ว การนับก็ไม่ยาก เช็คเงื่อนไขหลัก ๆ เช่น ถ้าเซนเซอร์เปลี่ยนสถานะจาก 0 เป็น 1 และ 1 เป็น 0
ก็ให้นับเพิ่ม 1 คนเดืินผ่าน เช่น count = count+1;
การแสดงผลก์เอาค่าตัวแปรไปแสดงออก 7 segment
เขียนรวม ๆ แล้วไม่กี่บรรทัด ยากสุดก็ตรงแสดงผลออก 7 segment ก็มีโคดและคำอธิบายแล้วครับ ทำความเข้าใจตรงนี้ก่อนนะครับ ผมดูแล้วโคดที่เขียนยังมีความเข้าใจในการใช้งานตรงนี้ยังไม่เพียงพอ
ผมเห็นโคดแล้วยังไม่เข้าในการใช้งานของ 7 segment ถ้าเข้าใจแล้ว ส่วนที่เหลือก็ไม่ยากครับ
ตรง ฟังชั่น showText('0','0','0','1'); เปลี่ยนเป็น 0001 ดูซิครับ 7 Segment แสดงค่าเป็น 0001 หรือไม่ ถ้าใช่ ก็คือ คือส่วนที่จะต้องนำค่าที่อ่านได้จากการนับเข้าใส่ตรงนี้ แล้วแปลงตัวเลขที่นับได้ให้อยู่ในรูปของ String() ตามรูปแบบของ showText()
Input ใส่ตัวเลขอยู่ตรงนี้ครับ
showText((n/1000)%10,(n/100)%10+10,(n/10)%10,n%10); //แก้ค่าที่จะให้แสดงผลตรงนี้
n++;
if(n>10000) {
n=0;
}