Announcement

Collapse
No announcement yet.

ช่วยแนะนำการแก้โปรแกรมภาษาซีหน่อยครับ แงๆ

Collapse
X
 
  • Filter
  • Time
  • Show
Clear All
new posts

  • ช่วยแนะนำการแก้โปรแกรมภาษาซีหน่อยครับ แงๆ

    เป็นวงจรที่ต่อกับเซนเซอร์นะครับ ตัดเอามาเฉพาะส่วนที่เป็นเงื่อนไขการทำงาน ทีนี้ผมมีปัญหาคือผมต้องแก้โปรแกรม และผมอ่อนกากมากๆ หน้านี้กว่าผมจะเขียนออกมาได้เป็นอาทิตๆ และมันต้องส่งพุ่งนี้ครับ

    โปรแกรมเดิมๆของมันจะอธิบายตามคำสั่งนะครับ โดยรีเรย์ที่จะไปควบคุมอุปกรณ์มีสี่ตัว

    if((SW1 == 1)&& (SW2 == 1)) //เมื่อเซนเซอร์1 และ 2 จับวัตถุได้พร้อมกัน
    {
    relay3 = 0; // รีเรย์ตัวที่สามทำงาน ไฟสัญญานติด
    delay(500); // Siren ON หน่วงเวลา 3 วินาที

    relay1 = 0; // รีเรย์ตัวแรกทำงาน Motor Left หมุนลง
    relay2 = 1;
    relay3 = 0;//ไฟยังติดอยู่
    relay4 = 1;

    while(limit1); // Limit Switch Left มอเตอร์หมุนผ้าใบไปชนลิมิตสวิตตัวล่าง

    relay1 = 1; // Motor OFF
    relay2 = 1;
    relay3 = 1; // Siren OFF
    relay4 = 1;
    delay(9000); // หน่วงเวลา 53 วินาที <<<<<<<<<<< แก้ตรงนี้ครับ

    relay3 = 0;
    delay(300); // Siren ON 2 วีนาที
    relay1 = 1;
    relay2 = 0; // Motor Right มอเตอร์หมุนขึ้น
    relay4 = 1;
    while(limit2); // Limit Switch Right ลิมิตสวิตตัวบนถูกชน

    relay1 = 1; // Motor OFF หยุดการทำงานทั้งหมด
    relay2 = 1; // Motor OFF
    relay3 = 1; // Siren OFF
    relay4 = 1;
    delay(10);
    }

  • #2
    สิ่งที่ผมะจแก้ก็คือการเพิ่มเงื่อนไข โดยยกเลิกการหน่วงเวลา 53 วินาที แต่เปลี่ยนเป็นเงื่อนไข if((SW1 == 0)&& (SW2 == 0)) คือเงื่อนไขที่ว่าเมื่อเซนเซอร์ออฟพร้อมกันสองตัวนาน 15 วินาที มอเตอร์ก็จะหมุนกลับทิศทางไปเข้าขั้นตอนอันเดิม งงกะคำสั่งอ่ะครับ จำไม่ได้จริง

    Comment


    • #3
      if((SW1 == 1)&& (SW2 == 1)) //เมื่อเซนเซอร์1 และ 2 จับวัตถุได้พร้อมกัน
      {
      relay3 = 0; // รีเรย์ตัวที่สามทำงาน ไฟสัญญานติด
      delay(500); // Siren ON หน่วงเวลา 3 วินาที

      relay1 = 0; // รีเรย์ตัวแรกทำงาน Motor Left หมุนลง
      relay2 = 1;
      relay3 = 0;//ไฟยังติดอยู่
      relay4 = 1;

      while(limit1); // Limit Switch Left มอเตอร์หมุนผ้าใบไปชนลิมิตสวิตตัวล่าง

      relay1 = 1; // Motor OFF
      relay2 = 1;
      relay3 = 1; // Siren OFF
      relay4 = 1;

      if((SW1 == 0)&& (SW2 == 0)) ........... //<<<<<< ตรงนี้อ่ะครับ ต้องการให้เงื่อนไขเป็นวัตถุผ่านเซนเซอร์ทั้งสองไปแล้ว โดยเป้นเงื่อนไขเซนเซอร์จับวัตถุไม่ได้พร้อมกันนานเกิน 15 วินาที เงื่อนไขจึงสมบูรณ์ ไม่รู้จะใส่คำสั่งอะไรอ่ะครับ ให้มันนับเวลาว่าเซนเซอร์จับวัตถุไม่ได้นานเกิน 15 วิ

      {

      relay3 = 0;
      delay(300); // Siren ON 2 วีนาที
      relay1 = 1;
      relay2 = 0; // Motor Right มอเตอร์หมุนขึ้น
      relay4 = 1;
      while(limit2); // Limit Switch Right ลิมิตสวิตตัวบนถูกชน

      relay1 = 1; // Motor OFF หยุดการทำงานทั้งหมด
      relay2 = 1; // Motor OFF
      relay3 = 1; // Siren OFF
      relay4 = 1;
      delay(10);
      }
      }

      Comment


      • #4
        ช่วยหน่อยนะครับ ส่งพรุ่งนี้แล้ว ทำไม่ทันจริงๆ ต้องไปคำนวนส่วนอื่นๆ

        Comment


        • #5
          ดันครับ

          Comment


          • #6
            อธิบายการใช้งานเลยดีกว่า

            รางรถไฟมีทางข้าม ผมทำเครื่องกั้นทางเดินข้ามรถไฟ โดยเป็นแบบอัตโนมัติ คือเมื่อมีรถไฟมา เครื่องกั้นจะเปิดลง พอรถไฟไป เครื่องกั้นจะเปิดขึ้น

            ทีนี้จังหวะที่รถไฟมาแล้ว เครื่องกั้นปิดแล้ว ตอนแรกพวกผมทำการหน่วงเวลาเอาเองว่าเวลา 53 วินาที น่าจะเป็นเวลาที่รถไฟได้ผ่านไปแล้ว เครื่องกั้นจึงเปิดขึ้น

            ทีนี้ต้องการแก้ไขคือนอกจากจะให้เซนเซอร์ทั้งสองทั้งสองตัวรับรู้ว่ารถไฟมาได้แล้ว อยากให้มันทำหน้าที่รับรุ้อีกว่ารถไฟไปแล้ว แล้วไปส่งสัญญานให้เครื่องกั้นเปิด

            อย่างที่ทุกท่านทราบว่ารถไฟแต่ละขบวนยาวไม่เท่ากัน

            เหตุผลที่ใช้เซนเซอร์ 2 ตัวต่อรางเพราะว่าต้องการความแน่ชัดว่าสิ่งที่ผ่านเซนเซอร์เป็นรถไฟจริงๆ โดยเงื่อนไขคือวัตถุต้องผ่านเซนเซอร์ทั้งสอง ซึ่งเซนเซอร์ทั้งสองตั้งอยู่ริมรางรถไฟโดน******งกันสองเมตร

            การรับรู้ว่ารถไฟมาไม่ยาก แต่การรับรู้ว่ารถไฟไปแล้ว ผมมาคิดๆดู

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

            เงื่อนไขที่จะทำให้แน่ใจก็คือหากรถไฟวิ่งผ่านไปจริงๆแล้ว เซนเซอร์ต้องจับวัตถุไม่ได้ หรือ OFF เกิน 15 วินาที

            คือคำสั่งนี้อ่ะครับ

            if((SW1 == 0)&& (SW2 == 0)) แต่ต้องเพิ่มเงื่อนไขเข้าไปอีกว่าเซนเซอร์ OFF นานเกิน 15 วินาที

            Comment


            • #7
              งงว่าคำสั่งที่จะกำหนดว่าหลังจากรถไปผ่านเซนเซอร์ไปแล้ว เมื่อเซนเซอร์จับวัตถุไม่ได้นานเกิน 15 วินาที

              คือเงือนไข (SW1 == 0)&& (SW2 == 0) ต้องเกิดนานเกิน 15 วินาที จึงจะไปสั่งให้ตัวไม้กั้นหมุนขึ้น

              งงว่าถ้าสมมติใช้ While ((SW1 == 0)&& (SW2 == 0)) แล้วจะเพิ่มคำสั่งอะไรเพื่อให้มันรอจนกว่าจะ 15 นาทีถึงไปขั้นตอนต่อไปครับ

              พี่ช่วยเขียนโค๊ดให้หน่อยนะครับ งงมาก อะไรๆก็รุมเร้าผมไปหมด จะบ้าตายแล้ว

              Comment


              • #8
                ดัน

                Comment


                • #9
                  ดันให้ครับ

                  Comment


                  • #10
                    ไม่รู้อ่า ช่วยดันนะ

                    Comment


                    • #11
                      ใช้ Timing ครับ สร้างฟังก์ชั่นขึ้นมาแล้วนับจาก Timing ใน IC เลย

                      Comment


                      • #12
                        นำเงื่อนไขไปใส่ไว้ใน Timeing Code เลย แล้วให้รีเทิร์นค่ามาก็น่าจะโอเคแล้วครับ

                        Comment


                        • #13
                          int safe,timer;

                          ...
                          relay4 = 1;

                          safe = 0; timer = 0;
                          while (!safe) {
                          if (SW1 == 0) && (SW2 == 0)) { //เซนเซอร์จับวัตถุไม่ได้พร้อมกัน
                          delay(50); //0.3วินาที
                          timer++;
                          if (timer >= 50) safe = 1; //นานเกิน 15 วิ
                          }
                          else {
                          timer = 0; //เริ่มจับเวลาใหม่ ถ้ายังมีเซนเซอร์ใดจับวัตถุได้
                          }
                          }

                          relay3 = 0;
                          ...

                          Comment

                          Working...
                          X