น้องซื้อ เซ็นเซอร์ รุ่นนี้ 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
{
}
}
สามารถนำมาแก้ไขเพื่อรวมเป็นโปรแกรมเดียวกันได้อย่างไรบ้าง พี่ๆช่วยหน่อยนะค่ะ จำเป็นต้องใช้งานจริงๆ
โปรแกรมส่วนเซ็นเซอร์ค่ะ
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 เองมันเลยไม่แน่ใจ ต้องดูจากอุปกรณ์จริง มันถึงจะเร็วกว่าที่ มโน เองครับ
/*
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 ลงกราวด์ด้วยครับ
ก็ยังไม่รู้ว่าจะ ok ไหมครับต้องรอให้น้องเขาทดสอบดูก่อนครับเท่าที่ผมดูแล้วมันน่าจะเป็นตามนั้น โดย มโนเอา จิตในจิต กายในกาย ธรรมในธรรม ว่างั้น เนื่องจากผมไม่มีอุปกรณืจริงทดสอบ ช่วยได้เท่าที่เรามีความรู้เท่านั้น ว่าไป code Pro นะครับ สมัยก่อนผมเคยเขียน Pro ด้าน Database ใช้กับหน่วยงานครับ เรียกว่าอย่างหวง Code ไม่ยอมให้ใครง่ายๆ เก็บไว้คนเดียว (มันเขียนยากนิ) 3 ปีต่อมาแจกให้ใครก็ไม่เอาแล้วครับ สัจจธรรม ครับ เกิดขึ้น ตั้งอยู่ ดับไป นอกเรื่องแล้วคลายเครียดเพื่อสุขภาพ สาธุ...
‹ ก่อนหน้า | 1 | 2 |