
การตั้งโปรแกรมให้ระบบไฟจราจร : การพัฒนาโค้ด

อัปเกรดสำหรับเนื้อหาเพิ่มเติม
True or false? When the programs start, the bus has priority.
สัญญาณไฟจราจรโดยทั่วไป จะสลับกันไปมาระหว่างไฟแดง ไฟเหลือง และไฟเขียวในเวลาปกติ ไม่ว่าจะมียานพาหนะแล่นมาหรือว่าไม่มี แต่นี่เป็นสัญญาณไฟจราจรอัจฉริยะ มันสามารถตอบสนองต่อสัญญาณ จากรถเมล์ที่อยากเห็นไฟเขียว แต่สัญญาณไฟจราจรต้องการการปรับปรุง มันจะเป็นไฟแดงจนกระทั่งรถเมล์ ขอให้เป็นไฟเขียว และไม่เคยมีไฟเหลืองเลย ตอนนี้เราจะทำการปรับปรุงเรื่องนี้ มาเริ่มด้วยรหัสเทียมที่เราเขียนไว้ ในวิดีโออีกชุดกัน หากกดปุ่ม A รถเมล์จะส่งสัญญาณ ไปยังกลุ่มหนึ่งของวิทยุ ข้อความที่เป็นเลขหนึ่งที่ว่านั้นหมายถึง ฉันต้องการไฟเขียว นี่เป็นรหัสเทียมของสัญญาณไฟจราจร ในโปรแกรมนั้นเราเริ่มมันด้วยการ ตั้งค่ากลุ่มของวิทยุให้เป็นหนึ่ง ตัวแปรแรก (Prio) จะคอยควบคุมว่ารถเมล์ มีความสำคัญหรือไม่ เริ่มจากที่รถเมล์ ไม่มีสิ่งนั้น ดังนั้น ตัวแปรแรก (Prio) เท่ากับเป็นเท็จ แต่ถ้าสิ่งที่รับได้ก็คือข้อความ ที่เป็นเลขหนึ่ง ตัวแปรแรก (Prio) จะเป็นจริงและรถเมล์ ก็จะได้ไฟเขียวอย่างที่ต้องการ ตอนนี้ให้ดูที่รหัสที่จัดการสี ซึ่งมันเปลี่ยนไปในไฟสัญญาณจราจร การวนซ้ำจะทำงานตลอดเวลา ตราบใดที่เงื่อนไขยังเป็นจริงอยู่ แต่ถ้าตัวแปรแรก (Prio) เป็นเท็จขึ้นมา มันจะกลายเป็นไฟแดง แต่ถ้าเป็นข้อความอื่นๆ ไฟแดงก็จะหายไป แล้วกลายเป็นไฟเขียวขึ้นมาแทน หลังจากนั้น 3 วินาที ไฟเขียวก็จะดับลง ตัวแปรแรก (Prio) เป็นเท็จ เรากลับไปที่จุดเริ่มต้นของ การวนซ้ำอีกครั้ง แล้วไฟแดงก็จะปรากฎขึ้น การปรับปรุงที่เราต้องการทำในตอนนี้ คือต้องบอกว่าเมื่อไหร่ไฟจะเป็นสีเหลือง ระหว่างไฟแดงและไฟเขียว เราต้องการให้เป็นไฟเหลือง และเหมือนกันกับระหว่าง ไฟเขียวและไฟแดงนั่นแหละ เราจึงเพิ่มสิ่งนี้เข้าไป ปิดไฟแดง และเปิดไฟเหลือง และ ปิดไฟเขียว เปิดไฟเหลือง มาทดสอบรหัสกัน โอ้ นี่มันเร็วเกินไป เราต้องบอกได้ว่านานแค่ไหนก่อนที่ มันจะเปลี่ยนเป็นไฟแดงและไฟเหลือง และนานแค่ไหนที่จะเป็นไฟเหลือง ก่อนที่จะกลายเป็นไฟเขียว ดังนั้นเราจึงเพิ่ม หยุดชั่วคราวเป็นเวลา 3 วินาที หลังจากที่ไฟแดงเปิดอยู่ที่นี่ และหยุด 1 วินาที หลังเป็นไฟเหลือง และใน 2 กรณีนี้ เราจะเขียนลงไปว่าปิดไฟเหลือง เปิดไฟเขียว และยังเขียนได้ว่า ปิดไฟเหลืองก่อนที่ตัวแปรแรก (Prio) จะเป็นเท็จ ตอนนี้เราได้ทำการปรับปรุงมันแล้ว ไฟเหลืองจะปรากฎขึ้นเมื่อเราต้องการ แต่สัญญาณไฟจราจรยังคงเป็นสีเขียวเท่านั้น เมื่อคนขับรถเมล์กดปุ่ม นั่นเป็นเพราะเราเขียนรหัส ที่ควบคุมไฟเขียว ให้เป็นคำสั่งอื่นๆ ไว้ ซึ่งหมายความว่ามันจะเกิดขึ้นเมื่อ ตัวแปรเป็นเท็จเท่านั้น เป็นการดีกว่าที่จะบอกว่า มันเกิดขึ้นในเชิงบวกเสมอ ดังนั้นเราจึงลบคำสั่งอื่นๆ ทิ้งไป และไฟเหลืองและไฟเขียวก็จะปรากฎ ขึ้นทุกครั้งเมื่อเราต้องการ นั่นคือมีการวนซ้ำทำงานอยู่ตลอด มาทดสอบการปรับปรุงครั้งที่สองนี้กัน รถเมล์มาแล้ว คนขับรถเมล์กดปุ่ม ตัวแปรแรก (Prio) จึงเป็นจริงทันที แต่ไม่มีอะไรเปลี่ยนแปลง ทำไมมันไม่เปลี่ยนล่ะ ยังไงมันก็เป็นไฟแดงแล้ว จึงเปลี่ยนเป็นไฟเหลือง เกิดอะไรขึ้น โอ้ พวกเราอยู่ที่นี่ในรหัสเทียม เมื่อปุ่มถูกกด และมันก็ไม่ได้ทดสอบว่าตัวแปรแรก (Prio) เป็นจริง จนกระทั่งวนกลับไปที่จุดเริ่มต้น ดังนั้นรถเมล์ยังคงต้องรอไฟแดง การหยุดในรหัสทำให้เรามี ปัญหาที่คาดไม่ถึง เราจำเป็นต้องเอารหัสมาเพื่อทดสอบว่า ตัวแปรแรก(Prio) เป็นจริงได้บ่อยครั้งขึ้น เมื่อเราตั้งโปรแกรมให้หยุด รหัสก็จะหยุดนิ่ง มันไม่ตอบสนองเรา มันจะตรวจสอบว่าตัวแปรแรก (Prio) เป็นจริงในที่ตรงนี้เท่านั้น คือตรงคำสั่ง "ถ้า" (If) เพื่อให้สัญญาณไฟจราจรฟังเรามากขึ้น เราจำเป็นต้องมีคำสั่ง"ถ้า"(If) เพิ่มเติม มาลองทำให้มันช้าขึ้น 1 วินาที โดยแบ่งช่วงการหยุดแบบนี้ ตอนนี้รหัสสามารถข้ามไปยังไฟเขียว ได้จากหลายที่ แต่เราต้องการตรวจสอบให้แน่ใจว่า ในแต่ละครั้งจะมีไฟติดแค่เพียงสีเดียว หากตัวแปรแรก (Prio) ตรงนี้เป็นจริง และเราจะข้ามแถวนี้ไป ไฟแดงจึงยังคงอยู่ เราต้องการให้ไฟเขียวติดตอนรถเมล์มา ดังนั้นเราต้องบอกรหัสให้ปิดไฟแดง และไฟเหลืองตรงนี้ งั้นมาทดสอบกันอีกครั้ง คราวนี้รถเมล์มาช้า ปุ่ม A ถูกกด และสัญญาณไฟจราจร ก็เปลี่ยนเป็นสีเขียวอย่างรวดเร็ว ตอนนี้แม้แต่สัญญาณไฟจราจร ยังฉลาดขึ้นเลย บางทีคุณอาจพัฒนาอะไร ให้ดีขึ้นกว่าเดิมก็ได้นะ