วันจันทร์ที่ 19 กุมภาพันธ์ พ.ศ. 2561

วิธีประกาศ pinMode() ใน Arduino UNO ให้มีขนาดพื้นที่ประหยัดขึ้น จากปกติ

การใช้ คำสั่ง กำหนด ขา pin แบบ digital pin ใน Arduino
ปกติจะใช้คำสั่ง  pinMode( ...)  เป็นมาตรฐานปกติ

อย่างไรก็ดาม เราสามารถใช้เทคนิค Port Manipulation ในการกำหนดได้
ซึ่งทำให้มีความประหยัด กว่า pinMode() ปกติ พอสมควร
โดยสามารถใช้ได้ตั้งแต่ ขา 0 - 13 และ A0-A7 (A6,A7 ใน Arduino Mini)

วิธีทำ
------
ให้เพิ่มคำสั่ง ที่ 1  เข้าไป (ตามรูป)
และหากจะเรียกใช้งาน ก็ใช้ตามรูปแบบที่ 2 (ในรูป)

---------------------------------------------
เครดิต : ไอเดีย จาก Paisan Mi 
ผู้เขียนเพียงเอามา code คำสั่ง ที่เรียบง่ายขึ้น
https://www.facebook.com/groups/arduino.thai/?multi_permalinks=1749811495061620&comment_id=1750012741708162&notif_id=1519025435116480&notif_t=feedback_reaction_generic&ref=notif




วันอังคารที่ 19 ธันวาคม พ.ศ. 2560

[ถาม-ตอบ คำถามที่มักถามบ่อยๆ] กดปุ่ม ต่ำกว่า 5 วินาที ติด เกินกว่า 5 วินาทีดับ โคดแบบกระชับๆ

คำถาม

ขออนุญาตสอบถามนะครับ 
"ผมต้องการเขียนโคด กดสวิตซ์ค้างไว้5วินาทีขึ้นไปแล้วปล่อยหลอดLEDจะไม่ติด 
แต่ถ้ากดสวิตช์ค้างไว้ไม่ถึง5วินาทีแล้วปล่อยก่อนหลอดLEDจะติด" ฯลฯ...

https://web.facebook.com/photo.php?fbid=1507160482712496&set=gm.1686822391360531&type=3&ifg=1


่ตอบคำถาม
โคดที่กระชับ แบบ clean code สะอาดๆ



วันพุธที่ 4 ตุลาคม พ.ศ. 2560

WatchDog ใน ESP8266


ใน ESP8266 มี WatchDog ป้องกัน การทำงานวนค้างอยู่ 2 แบบ
คือ Hardware Watchdog และ Software Watchdog

แต่ละแบบแตกต่างกันอย่างไรไปดูกัน



เวลาเกิด Hardware Watchdog
จะขึ้นข้อความมาเป็น rst cause: 4  ดังรูป

วันเสาร์ที่ 16 กันยายน พ.ศ. 2560

บันทึก ค่า string ใน EEPROM และการอ่านค่าขึ้นมาใน Arduino


EEPROM เป็นอะไรที่สะดวกดีในการบันทึกข้อมูล
ลงใน rom ของ อุปกรณ์อิเลคโทรนิค
สำหรับใน Arduino ตามปกติแล้วจะบันทึกและอ่านได้ทีละ byte
ในการบันทึกและอ่านค่า แบบ string พวกข้อความกลับไม่ได้มีตระเตรียมไว้
หากเขียนปกติต้องค่อยๆ เรียงทีละ byte ซึ่งยุ่งยากมากๆ

เลยต้องพึ่งวิธีพิเศษขึ้น
วิธีทำที่สั้นสุดจะเป็นดังนี้


วันศุกร์ที่ 15 กันยายน พ.ศ. 2560

Arduino 2 ตัว ยิง String หากัน ทาง I2C


มีคนมาตั้งกระทู้ใน กลุ่ม Arduino Thailand
ว่า I2C ยิง String แต่อีกฝั่งดันรับเป็น char ตัวแรก เท่านั้นทำไงดี

เนื่องด้วย I2C ยิงหากัน
หากจะส่งรับหากัน
หลักการไม่ยาก

คือ ฝั่งส่ง ก็ใช้ Wire.println();
และ ฝั่งรับ ก็ใช้ Wire.readStringUntil('\n');
เพียงเท่านี้ ก็ทำให้ การสื่อสาร แบบ I2C ระหว่าง Arduino 2 ตัว รับค่ากันได้ราบรื่น

ตัวอย่าง code ที่เขียนสด ไม่ได้ทดสอบผล
แต่ผู้ตั้งกระทู้ท่านนั้น ได้เอาไปใช้ ก็บอกว่าได้ผลตามต้องการ

ตัวอย่าง code เป็นดังนี้


วันอังคารที่ 29 สิงหาคม พ.ศ. 2560

มาทำให้บอร์ด Arduino ทั้งหลาย สามารถใช้ฟังกชั่น printf() ได้ดีกว่า

หลายอาทิตย์ก่อน มีคนมาตั้งคำถามในกลุ่ม
อยากจะแสดงเวลาบน LCD แบบมีเลข 0 นำด้วยถ้าเลขต่ำว่า 10
ซึ่งตามปกติการแสดงบน lcd จะเขียนด้้วย print() อย่างนี้

//--------------------------------------------------
   int hour = 12; 

   int minute = 5; 
   int sec = 9;

   if( hour <10 ) lcd.print("0");
   lcd.print(hour);
   lcd.print(":");
   if( minute <10 ) lcd.print("0");
   lcd.print(minute);
   lcd.print(":");
   if( sec <10 ) lcd.print("0");
  lcd.print(sec);
//--------------------------------------------------

แต่บน ESP8266 เราสามารถเขียนโดยใช้
ฟังกชั่น print ที่กำหนด format ได้
หรือ ที่เรียกว่า ฟังกชั่น printf()
ซึ่งจะเหลือบรรทัดเดียวดังนี้

//--------------------------------------------------
lcd.printf("%02d:%02d:%02d", hour, minute, sec);
//-------------------------------------------------


ปรากฏว่า บน Arduino กลับไม่รองรับ
การใช้ printf() ซะงั้น !?!!!!
วันนี้พอมีเวลาเลยมาทำให้ฝั่งบน Arduino
สามารถ ใช้ ฟังกชั่น printf() ได้ด้วยเลยดีกว่า
ซึ่งจะทำให้ โคดมีความเรียบร้อยขึ้นมาก


-------------------------------------------------------------
วิธีทำ
=====
1) ให้ไป download 2 files
คือ ไฟล์ Print.h และ Print.cpp นี้มา
ผู้เขียนอัพโหลดไว้ที่
https://github.com/TridentTD/Arduino_Printf


2) จากนั้นให้เข้าไปที่ โฟลเดอร์
C:\Users\..ชื่อuser..\AppData\Local\Arduino15\packages\arduino\hardware\avr\1.6.18\cores\arduino
แล้วเอาไปแทนที่ในโฟลเดอร์นั้น
เพียงเท่านี้ Arduino ของคุณ
ก็จะสามารถใช้ printf()
ได้ทั้ง บน lcd หรือแม้กระทั่ง บน Serial monitor ได้
ทำให้โคดมีความเรียบง่ายและสั้นขึ้น ในลัดนิ้วมือเดียว



-------------------------------------------------------------

วันอาทิตย์ที่ 13 สิงหาคม พ.ศ. 2560

เทคนิคเล็กๆ กับการ แสดงสถานะการเชื่อมต่อ WiFi ด้วย LED ใน ESP8266

ปกติการเชื่อมต่อสัญญาณไวไฟ ของ ESP8266
มักจะใช้ Serial Monitor เป็น จุดแสดงว่า ESP8266 ได้เชื่อมต่อ WiFi สำเร็จแล้วหรือยัง
แต่ End-User ที่ไม่ได้มีการใช้ Serial Monitor จะไม่สามารถรู้ว่าขณะนี้ การเชื่อมต่อไวไฟ เป็นอย่างไร

มีวิธีทำให้ End-User ก็สามารถทราบว่าไวไฟได้เชื่อมต่อแล้วหรือยังด้วย
เทคนิคง่ายๆ ดังนี้


ให้เพิ่ม

extern "C" {
#include "user_interface.h"
}

เข้าไปส่วนต้นของ code
จากนั้นก่อนที่ จะสั่งให้ WiFi เริ่มต้นทำงาน ด้วย WiFi.begin(ssid, password);
ก็ให้เพิ่มบรรทัดนี้เข้าไป

wifi_status_led_install(2,  PERIPHS_IO_MUX_GPIO2_U, FUNC_GPIO2);

ส่วนอื่นๆ การเชื่อมต่อไวไฟ ให้เขียนตาม code ปกติ
เพียงเท่านี้ หาก ESP8266 ไวไฟ ยังไม่เชื่อมต่อ ไฟจะกระพริบที่ LED  GPIO2
แต่หากไวไฟ เชื่อมต่อสำเร็จ ไฟจะสว่างหยุดการกระพริบ
ก็จะช่วยให้ End-User ก็สามารถทราบว่าไวไฟได้เชื่อมต่อสำเร็จแล้วได้
หมายเหตุ
สำหรับ ESP-01 ให้เปลี่ยนเป็นค่าดังนี้แทน

wifi_status_led_install(0, PERIPHS_IO_MUX_GPIO0_U, FUNC_GPIO0);