[Raspberry pi] เฉลยโจทย์ การแข่งขันทักษะระดับภาคข้อ 2-6

1. การส่งอีเมล์และ ค้นหาข้อมูลในเวปไซต์ต่าง ๆ

ข้อนี้ไม่จำเป็นต้องเฉลย

 

2. สร้างระบบ   Data  Logger  ในโรงเรือน

image

แสดงค่าความเปลี่ยนแปลงความชื้นและอุณหภูมิทุกๆ 10 วินาที โดยทำตามขั้นตอนดังนี้ ทำการต่อโมดูล DHT11 เข้ากับบอร์ด Raspberry Pi จากนั้นเขียนโปรแกรมเพื่ออ่านค่าความชื้นและอุณหภูมิเก็บไว้ในไฟล์ชื่อ Logger.txt โดยรูปแบบการเก็บข้อมูลใน 1 บรรทัดประกอบด้วย วันที่ – เวลา – ค่าความชื้น – ค่าอุณหภูมิ รูปแบบของไฟล์ Text เมื่อเปิดขึ้นมามีรูปแบบดังนี้image
          (2.1) สามารถสร้างไฟล์มีค่า ปี/เดือน/วัน/ชั่วโมง/นาทีและวินาที ถูกต้อง (2 คะแนน)
          (2.2) สามารถตัดการแสดงผลหน่วยไมโครวินาที ออกจากชุดเวลาได้      (2 คะแนน)
          (2.3) สามารถแสดงค่า Humidity ได้ถูกต้อง ( 2 คะแนน)
          (2.4) สามารถแสดงเครื่องหมาย “%” (เปอร์เซ็นต์) ได้ (2 คะแนน)
          (2.5) สามารถแสดงค่า Temparature ได้ถูกต้อง (2 คะแนน)

จากโจทย์เขียนเป็นโปรแกรมได้ดังนี้

 

ข้อ (2.1) จะตอบโจทย์ด้วย คำสั่ง date=datetime.datetime.now()
ข้อ (2.2) จะตอบโจทย์ได้ด้วยคำสั่ง date.strftime(“%Y-%M-%d : %H:%M:%S”) เพื่อกำหนดรูปแบบการแสดง วันเดือนปี และเวลา
ข้อ (2.3) และ (2.5) จะตอบโจทย์ด้วยการอ่านค่า humidity, temperature = Adafruit_DHT.read_retry(Sensor,GPIO)
ข้อ (2.4) เครื่องหมาย % แสดงด้วยคำสั่ง %%

3. รหัสแอสกี้และเลขฐานสอง

image

image

เขียนโปรแกรมรับค่าจากคีย์บอร์ดที่หน้าต่าง Terminal นำค่าที่ได้แสดงผลเป็นค่าเลขฐานสองตามรหัสแอสกี้ที่เกิดขึ้น โดยมีรูปแบบตามรูปที่ 5 ลอจิก “1” LED ติด ลอจิก “0” LED ดับ

(3.1) สามารถแสดงค่าเลขฐานสองที่หน้าต่าง Terminal ได้ถูกต้อง ( 4 คะแนน)
(3.2) สามารถให้ LED ติดดับตามค่าข้อมูลเลขฐานสองได้ถูกต้อง ( 6 คะแนน)

จากโจทย์เขียนเป็นโปรแกรมได้ดังนี้

หัวใจของโปรแกรมนี้คือการระบุตำแหน่งของ LED ให้อยู่ในรูปแบบของ list หรือ array เพื่อระบุตำแหน่งบิตได้สะดวก

my_pin=[6,12,13,19,16,26,20,21]

อีกคำสั่งคือ ORD สำหรับการเปลี่ยนค่ารหัสแอสกี้ที่อ่านได้จากการกดคีย์บอร์ดให้อยู่ในรูป integer

bin2str=bin(ord(ascii)+256)

หมายเหตุ 256 ที่บวกเพิ่มเพื่อให้เวลาแสดงเลขฐาน 2 แล้วเลข 0 ด้านหน้าไม่ถูกตัดหายไป

 

4. สวิตช์รหัสกระตุ้นด้วยแสง

image

 

สั่งการเปิดปิดรีเลย์ด้วยการสั่งงานด้วยแสง โดยสภาวะปกติ BH1750 จะได้รับแสงปกติของห้อง
     (4.1) ใช้กระดาษบังแสงให้ BH1750 แล้วเอาออกรอ 3 วินาที RELAY1 ทำงาน ทำอีกครั้ง RELAY1 หยุดทำงานสลับกันไปเรื่อย ๆ (Toogle) (4 คะแนน)
     (4.2) ใช้กระดาษบังแสงให้ BH1750 แล้วเอาออก 2 ครั้ง รอ 3 วินาที RELAY2 ทำงาน ทำอีกครั้ง RELAY2 หยุดทำงานสลับกันไปเรื่อย ๆ (Toogle) (4 คะแนน)
     (4.3) ใช้กระดาษบังแสงให้ BH1750 แล้วเอาออก 3 ครั้ง รอ 3 วินาที RELAY3 ทำงาน ทำอีกครั้ง RELAY3 หยุดทำงาน สลับกันไปเรื่อย ๆ (Toogle) (4 คะแนน)
     (4.4) ใช้กระดาษบังแสงให้ BH1750 แล้วเอาออก 4 ครั้ง รอ 3 วินาที RELAY4 ทำงาน ทำอีกครั้ง RELAY4 หยุดทำงาน สลับกันไปเรื่อย ๆ (Toogle) (4 คะแนน)
     (4.5) ใช้กระดาษบังแสงให้ BH1750 แล้วเอาออก 5 ครั้ง รอ 3 วินาที RELAY ทุกตัวทำงาน ทำอีกครั้ง RELAY ทุกตัวหยุดทำงาน สลับกันไปเรื่อย ๆ (Toogle) (4 คะแนน)

จากโจทย์เขียนเป็นโปรแกรมได้ดังนี้

การทำงานของโปรแกรม

โปรแกรมนี้ใช้ while ในการตรวจสอบ
while (lum<100)  ตรวจสอบว่าบังแสง  ถ้าใช่ เพิ่มค่าการนับ count
while (lum<100)  รอจนกระทั่งเอากระดาษบังแสงออก

ตัวแปร timer จะคอยตรวจสอบว่า ไม่มีการบังแสงนานเกินกว่าเวลาที่กำหนด (2-3 วินาที) ถ้าเกินก็ไปสั่งตรวจสอบ ค่า count เพื่อสั่ง RELAY เปิดหรือปิด

5. ระบบถ่ายภาพด้วยสวิตช์ 2 รูปแบบ

 

image

ใช้สวิตช์ 2 ตัวเพื่อถ่ายภาพ โดยการต่อสวิตช์ตามรูปเท่านั้น (ห้ามต่อตัวต้านทาน)
(5.1) ถ้ากดสวิตช์ SW1 ให้ถ่ายภาพและเก็บไฟล์ภาพไว้ที่โฟลเดอร์ home/pi/Desktop/SW1 โดยมีรูปแบบชื่อไฟล์เป็น
Imagexx.jpg โดยค่า xx คือค่าตัวเลขที่ต้องเพิ่มขึ้นทีละ 1 ค่าไปเรื่อยๆ เช่น Image01.jpg Image02.jpg Image03.jpg ( 5 คะแนน)
(5.2) ถ้ากดสวิตช์ SW2 ให้ถ่ายภาพและเก็บไฟล์ภาพไว้ที่โฟลเดอร์ home/pi/Desktop/SW2 โดยมีรูปแบบชื่อไฟล์เป็นวัน/เดือน/ปีและเวลา (5 คะแนน)

จากโจทย์เขียนเป็นโปรแกรมได้ดังนี้

การทำงานของโปรแกรม

หลัก ๆ ของโปรแกรมนี้คือให้ใช้การพูลอัพ และพูลดาวน์ภายในตัว Raspberry Pi ด้วยคำสั่ง

GPIO.setup(sw_1,GPIO.IN,pull_up_down=GPIO.PUD_DOWN)
GPIO.setup(sw_2,GPIO.IN,pull_up_down=GPIO.PUD_UP)

เพื่อให้การทำงานเกิดการตรวจสอบได้อย่างรวดเร็ว อาจจะใช้การสร้าง Event เพื่อตรวจสอบการกดสวิตช์

GPIO.add_event_detect(sw_1,GPIO.RISING)
GPIO.add_event_detect(sw_2,GPIO.FALLING)

การตรวจสอบการกดสวิตช์ก็สามารถทำผ่านคำสั่ง

if GPIO.event_detected(sw_1):

if GPIO.event_detected(sw_2):

นอกนั้นที่เหลือ ก็เป็นการสั่งงานถ่ายรูปปกติ  โดยผลลัพธ์ที่เกิดขึ้น จะเก็บในโฟลเดอร์ที่ต่างกัน

6. โอห์มมิเตอร์ เครื่องวัดค่าความต้านทาน

image

 

ต่อวงจรแปลงสัญญาณอะนาลอกเป็นดิจิตอลเข้ากับบอร์ด Raspberry Pi โดยที่เอาต์พุต CH1 ของ MCP2308 ต่อกับวงจรแบ่งแรงดัน โดยกำหนดค่า R1 คงที่ไว้ที่ 1 กิโลโอห์ม ส่วนค่า R? คือจุดที่ใช้ตรวจวัด โดยจะมีการสุ่มตัวต้านทานที่ใช้ในการวัดจำนวน 5 ค่า มีค่าอยู่ระหว่าง 100 โอห์ม ถึง 10 กิโลโอห์ม ค่าที่อ่านได้จะต้องมีค่าความผิดพลาดไม่เกิน 10%
     6.1) ค่าความต้านทานเท่ากับ        อ่านค่าได้        (2 คะแนน)
     6.2) ค่าความต้านทานเท่ากับ        อ่านค่าได้       (2 คะแนน)
     6.3) ค่าความต้านทานเท่ากับ        อ่านค่าได้        (2 คะแนน)
     6.4) ค่าความต้านทานเท่ากับ        อ่านค่าได้        (2 คะแนน)
     6.5) ค่าความต้านทานเท่ากับ        อ่านค่าได้        (2 คะแนน)

 

จากโจทย์เขียนเป็นโปรแกรมได้ดังนี้

การทำงานของโปรแกรม

จากกฎของวงจรแบ่งแรงดัน

image

R1 = (R2 * (Vin – Vo))/Vo

ค่าของ Vo จะมาจากการอ่านค่าอะนาลอกจาก MCP3208 ซึ่งเป็นแบบ12 บิต แรงดันไฟเลี้ยง 3.3V

voltage = value*3.3/4096

การวัดค่าความต้านในย่าน 1-10 กิโลโอห์มก็ทำได้ไม่ยาก

Facebook Comments