มีเรื่องให้ช่วยหน่อยคับผม T_T

Started by pomcoe, February 12, 2013, 11:47:21 AM

Previous topic - Next topic

pomcoe

บอกตรงๆๆนะ
  ถ้าผมทำได้ ผมคงไม่เข้ามาขอความช่วยเหลือหลอก
ผมไม่ค่อยถนัดโปรแกรมจิงๆ

อิอิ

crywolf

ก็ยังงงๆอยู่ดี
งั้นผมจะเขียนให้ตามที่เข้าใจนะ

#include <16F88.h>         // Standard Header file for the PIC16F877A
#device ADC = 10
#fuses HS,NOWDT,NOPROTECT,NOLVP   

#use delay(clock=10000000)   
#define vbe 0.0048875855327468230694037145650049 // Vref/1023 ;Vref = 5 volt

unsigned int delay1,delay2,delay3,wait1,wait2,wait3;
float infa1,vinfa1,infa2,vinfa2,infa3,vinfa3;

void main(void)
{
setup_adc_ports(all_analog);
setup_adc(adc_clock_internal);
 
while(TRUE)
{
set_adc_channel(0);
delay_us(10);
infa1 = read_adc();
vinfa1 = vbe * (float)infa1;
   
if((vinfa1>=1.2)&&(vinfa1<=2 ))
{
wait1 = 1000;
}

set_adc_channel(1);
delay_us(10);
infa2 = read_adc();
vinfa2 = vbe * (float)infa2;
   
if((vinfa2>=1.2)&&(vinfa2<=2 ))
{
wait2 = 1000;
}

set_adc_channel(2);
delay_us(10);
infa3 = read_adc();
vinfa3 = vbe * (float)infa3;
   
if((vinfa3>=1.2)&&(vinfa3<=2 ))
{
wait3 = 1000;
}

if( wait1 > 0 )
{
if( --wait1 == 0 )
{
output_high(PIN_B0);
delay1 = 4000;
}
}
if( wait2 > 0 )
{
if( --wait2 == 0 )
{
output_high(PIN_B1);
delay2= 4000;
}
}
if( wait3 > 0 )
{
if( --wait3 == 0 )
{
output_high(PIN_B2);
delay3 = 4000;
}
}

if( delay1 > 0 )
if( --delay1 == 0 ) output_low(PIN_B0);
if( delay2 > 0 )
if( --delay2 == 0 ) output_low(PIN_B1);
if( delay3 > 0 )
if( --delay3 == 0 ) output_low(PIN_B2);

delay_ms(1);
}
}

pomcoe

Quote from: crywolf on March 06, 2013, 06:26:29 PM
ก็ยังงงๆอยู่ดี
งั้นผมจะเขียนให้ตามที่เข้าใจนะ

#include <16F88.h>         // Standard Header file for the PIC16F877A
#device ADC = 10
#fuses HS,NOWDT,NOPROTECT,NOLVP   

#use delay(clock=10000000)   
#define vbe 0.0048875855327468230694037145650049 // Vref/1023 ;Vref = 5 volt

unsigned int delay1,delay2,delay3,wait1,wait2,wait3;
float infa1,vinfa1,infa2,vinfa2,infa3,vinfa3;

void main(void)
{
setup_adc_ports(all_analog);
setup_adc(adc_clock_internal);
 
while(TRUE)
{
set_adc_channel(0);
delay_us(10);
infa1 = read_adc();
vinfa1 = vbe * (float)infa1;
   
if((vinfa1>=1.2)&&(vinfa1<=2 ))
{
wait1 = 1000;
}

set_adc_channel(1);
delay_us(10);
infa2 = read_adc();
vinfa2 = vbe * (float)infa2;
   
if((vinfa2>=1.2)&&(vinfa2<=2 ))
{
wait2 = 1000;
}

set_adc_channel(2);
delay_us(10);
infa3 = read_adc();
vinfa3 = vbe * (float)infa3;
   
if((vinfa3>=1.2)&&(vinfa3<=2 ))
{
wait3 = 1000;
}

if( wait1 > 0 )
{
if( --wait1 == 0 )
{
output_high(PIN_B0);
delay1 = 4000;
}
}
if( wait2 > 0 )
{
if( --wait2 == 0 )
{
output_high(PIN_B1);
delay2= 4000;
}
}
if( wait3 > 0 )
{
if( --wait3 == 0 )
{
output_high(PIN_B2);
delay3 = 4000;
}
}

if( delay1 > 0 )
if( --delay1 == 0 ) output_low(PIN_B0);
if( delay2 > 0 )
if( --delay2 == 0 ) output_low(PIN_B1);
if( delay3 > 0 )
if( --delay3 == 0 ) output_low(PIN_B2);

delay_ms(1);
}
}


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


JENG

ผมว่าส่วน sensor ออกแบบใหม่ดีกว่าครับอาจจะต่อกับ comparator ภายนอกแล้วปรับเอาหรือตามที่ทำอยู่ก็ได้ไม่ว่ากัน  ;D

ส่วนการทำงานที่ถูกต้องเป็นดังนี้
1.หน่วงเวลาก่อนทำงาน 5 วินาทีขึ้นไป (รูดซิบแล้วฉี่เร็วกว่า5วิให้มันรู้ไป ;D ) กันในกรณีคนเดินผ่านแล้วทำงาน
2.ถ้าเกิน5วิให้ state เป็นรอการเปิดน้ำ (ถ้าไม่เกินก็ reset counter)
3.เมื่อstate รอเปิดน้ำแล้วให้ sensor คืนสถานะเดิมก่อน(ฉี่เสร็จแล้วเดินออก) ค่อยสั่งเปิดน้ำ 5วิแล้วหยุด

ถ้าจะทำแบบ chip เดียวคุมสามช่องเลยถ้าไม่มีความรู้ความชำนาญเรื่อง coding แบบ state machine
หรือมองภาพการทำงานแบบ state ไม่ออก ผมว่าเลี่ยงไปใช้ chip แยกกันทำงานดีกว่า

โชคดีครับ  ;D
สามารถติดตาม electoday ได้ที่

Facebook
www.facebook.com/groups/coopmicro

Google+
https://plus.google.com/communities/103482067769375459277

☺☺☺ความรู้ และความฉลาด ไม่ใช่สิ่งเดียวกัน จะมีประโยชน์อะไร ถ้าฉลาดแต่อยู่ในกะลา☺☺☺

skytec

ผมว่าเรายังสับสน เราต้องการแบบนี้ใช่ไหม

1.  Sensor 1 ตรวจได้ว่า มีคนอยู่
2.  ตราบเท่าที่ SENSOR ยังจับได้ให้ เครื่องยังไม่นับหรือ Triger ทำงาน
3.  เมื่อเครื่อง SENSOR จับไม่ได้ ก็เริ่ม Trig ให้ counter หน่วง ไป 4 SEC
4.  หลังจากนั้น  RELAY จะทำงานให้ Valve น้ำ จ่ายน้ำเพื่อล้างโถ เป็นเวลา 5 sec
5. Valve จะตัด เมื่อ ครบเวลา 5 sec
6. หากระหว่างที่ Valve น้ำเปิดอยู่  Sensor จะไม่ทำงาน เพื่อให้การจ่ายน้ำล้างโถให้เกลี้ยง

___|----------~~~~ ---------|_________________________|----------|________________________________      SENSOR 1

__________ ~~~~~______|-----5 sec-----|_____________________|-------5 Sec---|___________________      Triger

___________~~~~~~ ________________|----5 sec---|________________________|----5 SeC------|______     Relay Status



Hardware : 


                     infrared reciever    >|---------> A/D -----
                        

                     infrared Transmitter <|-------- DO--------


                     RELAY  <------------------------DO---------

                     LED STATUS 1 <---------------DO---------

                    LED STATUS 2 <----------------DO---------

                    POWER SUPPLY 220/5 V ISOLATE
"จินตนาการสำคัญกว่าความรู้ ความรู้มีข้อจำกัด จิตนาการไร้ขอบเขต " --อัลเบิร์ต ไอสไตน์

pomcoe

Quote from: skytec on March 09, 2013, 12:29:37 AM
ผมว่าเรายังสับสน เราต้องการแบบนี้ใช่ไหม

1.  Sensor 1 ตรวจได้ว่า มีคนอยู่
2.  ตราบเท่าที่ SENSOR ยังจับได้ให้ เครื่องยังไม่นับหรือ Triger ทำงาน
3.  เมื่อเครื่อง SENSOR จับไม่ได้ ก็เริ่ม Trig ให้ counter หน่วง ไป 4 SEC
4.  หลังจากนั้น  RELAY จะทำงานให้ Valve น้ำ จ่ายน้ำเพื่อล้างโถ เป็นเวลา 5 sec
5. Valve จะตัด เมื่อ ครบเวลา 5 sec
6. หากระหว่างที่ Valve น้ำเปิดอยู่  Sensor จะไม่ทำงาน เพื่อให้การจ่ายน้ำล้างโถให้เกลี้ยง

___|----------~~~~ ---------|_________________________|----------|________________________________      SENSOR 1

__________ ~~~~~______|-----5 sec-----|_____________________|-------5 Sec---|___________________      Triger

___________~~~~~~ ________________|----5 sec---|________________________|----5 SeC------|______     Relay Status



Hardware : 


                     infrared reciever    >|---------> A/D -----
                        

                     infrared Transmitter <|-------- DO--------


                     RELAY  <------------------------DO---------

                     LED STATUS 1 <---------------DO---------

                    LED STATUS 2 <----------------DO---------

                    POWER SUPPLY 220/5 V ISOLATE

ประมาณนั้นคับ
ขอบคุณมากนะคับที่ช่วย

skytec

"จินตนาการสำคัญกว่าความรู้ ความรู้มีข้อจำกัด จิตนาการไร้ขอบเขต " --อัลเบิร์ต ไอสไตน์