มาลองยำ Arduino: เล่าสู่กันฟัง และปัญหาที่เจอ

สวัสดีครับ หลังจากที่หายไปนาน

ช่วงนี้กำลังทดลองยำ เอ้ย!  ทดลองใช้ Arduino กับเซ็นเซอร์ Transceiver และ WiFi Module ESP8266 ครับ ตอนนี้ที่ได้เป็นระบบ Control panel  แสดงผลเซ็นเซอร์ขึ้นจอ OLED และอัพโหลดข้อมูลขึ้นเว็บไซต์ทุก 5 วินาที (ซึ่งดูจะถี่ไปหน่อย แต่ก็เอาไว้ทดสอบดูน่ะครับว่าจะอัพโหลดกันไหวมั้ย?)

ใครสนใจลองเอาไปดู เข้าไปโหลดไฟล์ ino และ libraries ที่ใช้ (บางตัวผมโมเพิ่มให้ใช้ดีขึ้น [สำหรับผมเองน่ะนะ – -] ด้วย) ที่

https://github.com/itpcc/Arduino-Experiment
และ https://github.com/itpcc/arduino_oled_weather_station/
ครับ

ระหว่างทำก็เจอปัญหาระหว่างทำที่พอจะเล่าให้ฟัง มีดังนี้ครับ (ใครสงสัยหรืออยากให้อธิบายส่วนใดแบบละเอียดบอกได้นะครับ เดี๋ยวจะเขียนเพิ่ม)

ปัญหาไฟไม่พอ (5V)

อาจจะเป็นเพราะผมพารานอยด์ไปเองก็ได้ แต่อุปกรณ์ต่อพ่วงมันเยอะเหลือเกิน (ที่ Mega มี nRF, ESP8266, RTC, GY-651 และ OLED แถมที่ Nano (เอาไว้เป็นเครื่องลูกไว้ส่งข้อมูลเข้า Mega ที่เป็นเครื่องหลัก) ก็มี DHT11 กับ nRF ไว้ส่งข้อมูล) ก็เลยต้องหาแหล่งจ่ายไฟภายนอกเพิ่ม สุดท้ายไปลงที่ Power Bank ที่มันมีพอร์ต USB 2.1A แล้วต่อ Micro USB เอาเฉพาะไฟบวกไฟลบไปใช้ก็ได้ล่ะครับ จ่ายได้ทั้งหมดนั่นเลย

การแสดงผล Bitmap บน OLED

ภาพตัวอย่างไว้ทดลองแสดงผล bitmap แบบตัววิ่ง (เขียนว่า มจธ. เปิดเทอม 4 มกราคม 2559 อิอิกำ)

ภาพตัวอย่างไว้ทดลองแสดงผล bitmap แบบตัววิ่ง

รูปภาพที่ขนาดไม่เกิน 128*64 px (หรือเกินกว่านั้นก็ได้ แต่ต้องหั่นตอนแสดงผล) แบบขาวดำสามารถแสดงผลได้บน OLED (ตรงนี้ผมเอาไว้ใช้ทำเมนูภาษาไทยบนจอ เพราะเคยลองพยายามทำ Menu จาก text ภาษาไทยเลยมันลำบากเกินไป อีกอย่างไม่ได้แสดงผล dynamic  อะไรอยู่แล้ว ถ้านึกไม่ออกให้นึกถึงเมนูเว็บที่ข้อความเป็นรูปภาพน่ะครับ แบบนั้นเลย) แต่ต้องยำนิดนึง โดยบันทึกรูปภาพแบบ 1-bit BMP Windows  แล้วเอาไปแปลงด้วย lcd assistant ให้เป็น char array ตามขนาดรูป (สาเหตุที่เป็น char เพราะใน Arduino char มีขนาด 8bit พอดีกับฟังก์ชันแสดงผลที่มี Library ให้)

ตัวอย่างรูปที่แปลงด้วย LCD Assistance

ตัวอย่างรูปที่แปลงด้วย LCD Assistance

ปัญหาที่เจอคือบางทีรูปมันใหญ่ (อย่างรูปทดสอบด้านบน) บางครั้ง include ตรงๆ memory มันไม่พอ เลยต้องแก้โดยการใส่ keyword PROGMEM ไว้ (PROGMEM เป็น keyword ที่กำหนดว่าให้เอาข้อมูลตัวแปรไปไว้ในส่วน sketch memory ที่เป็นค่าคงที ซึ่งมีที่มาก แต่ต้องอ่านด้วยฟังก์ชันพิเศษครับ ข้อมูลหาอ่านได้ที่ https://www.arduino.cc/en/Reference/PROGMEM ครับ) แล้วตอนแสดงผลค่อยไล่อ่านทีละชุด เก็บไว้ใน char array เล็กๆ ชุดเดียว เหมือนหมูทอดล่ะครับ กินทั้งชิ้นใหญ่คงยากไป สู้หั่นเป็นชิ้นเล็กแล้วกินชิ้นเล็กเท่าที่กินได้จะดีกว่าครับ

ตัวอย่างการแสดงผลที่ได้จากการแบ่งแสดงผลภาพใน PROGMEM

ตัวอย่างการแสดงผลที่ได้จากการประยุกต์การแบ่งแสดงผลภาพใน PROGMEM

ส่วนรูปล่างเป็นอีกตัวอย่างครับ (อยู่ใน receiver_display) ใช้รูปตัวอักษรใหญ่ 0-9 ยาวมาแสดงผลเฉพาะชิ้นตัวเลข

ชุดตัวเลขแสดงผลที่ใช้แสดงผลในจอ

ชุดตัวเลขแสดงผลที่ใช้แสดงผลในจอ

ครบทุกเซ็นเซอร์ล่ะ โยก DHT11 ไปตัวเล็กแล้ววิทยุเข้ามาแทน ต่อไปก็เตรียม go online!

Posted by ราชศักดิ์ รักษ์กำเนิด on Friday, February 5, 2016

ปัญหาเรียกหาข้อมูล nRF ไม่ได้

อันนี้ดีบักยากพอตัวนะครับ แต่ที่พอจะแนะได้คือ

  1. ใส่ C เบอร์เล็กๆ (ผมใช้ 0.5 uF) คร่อมระหว่าขั้วบวกกับขั้วลบดู ช่วยเรื่องไฟรบกวนได้พอสมควร
  2. ลองเปลี่ยน channel ดูครับ คลื่นย่าน 2.4 GHz มีหลายอุปกรณ์ รวมถึง WiFi แย่งใช้ ช่องพื้นฐานมาตรฐานอาจจะมีอุปกรณ์อื่นใช้ จะตีกันได้
  3. ลองหาพวกโมดูลแปลงพอร์ตมาใช้ครับ ให้มันใช้กับไฟ 5V ได้ (ตัว nRF มันออกแบบมาให้ใช้กับ 3.3V)
  4. ลองอัพโหลด example ทั้งสองฝั่งแล้วลองรันดูครับ
  5. (สำหรับแบบเสาใหญ่ที่มี PA) ใช้แหล่งจ่ายไฟภายนอกด้วย

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

 

ใครมีข้อสงสัยอะไรสอบถามได้ครับ บางทีอาจจะลืมนึกถึงไป อาจจะพอตอบได้บ้าง