เปลี่ยนโทรศัพท์ Android มาเป็นเครื่องที่ใช้ iPhone จะย้ายเบอร์มาเครื่องใหม่ได้อย่างไร

ก่อนอื่นอ่านบทความนี้ก่อน https://kaebmoo.wordpress.com/2014/11/24/move-iphone-contacts-to-android/ เพราะบทความอันนี้จะเขียนสั้นสั้น หลักของวิธีการคือทำกลับกัน นั่นก็คือทำการเอาข้อมูล Contacts ออกมาจาก Google (export) แล้วก็นำมาเข้าใน Contacts ของ iCloud (import) โดยไปที่ Contacts อยู่เมนูด้านขวาบนของจอภาพ (อย่าลืม login เข้า gmail ก่อน)

contacts

จะขึ้นหน้านี้ เลื่อนลงไปข้างล่างที่ More แล้วเลือกไปที่ Export

export

เลือกการ export เป็นแบบ vCard

exportcontacts

จากนั้นก็ไป login เข้า iCloud แล้วเลือก Contacts จากนั้นหน้าจอด้านล่างซ้ายเลือกไปที่ import

importvCard

เอวังก็มีด้วยประการฉะนี้ เบอร์โทร ฯลฯ ทั้งหมดทั้งปวงที่เคยอยู่ในโทรศัพท์ Samsung, Huawei, Mi, Vivo สารพัดเครื่อง Android ก็จะมาบังเกิดอยู่บนเครื่อง iPhone

ถ้าท่านมีสองเครื่องทั้ง Android และ iPhone ใช้งานพร้อมกัน อยากให้เบอร์โทรสองเครื่องมันเหมือนกัน เพิ่มบนเครื่อง Android แล้วอยากให้มันเพิ่มบน iPhone ให้เอง ว้าวววว ความอยากมากจังนะเธอ คุณต้องมี Application เช่น IFTTT แล้วติดตั้งลงไปในโทรศัพท์ เช่น บนเครื่อง iPhone แล้วก็หา Applet พวก Automatically add new iOS Contacts to your Google services หรือในทางกลับกันก็จาก Google ไป iOS Contacts อันนี้บอกวิธีแล้วแต่ไม่สอนไปค้นหาขั้นตอนเอาเอง วันนี้ขี้เกียจ 😀

แต่ถ้าคุณเห็นว่าบทความเหล่านี้พอมีประโยชน์ อยากจะช่วยค่าเบียร์ผม เชิญครับเชิญ จ่ายเงินตรงนี้ https://paypal.me/ogonan ส่งมาส่งมา ยินดีต้อนงับ เป็นอย่างยิ่ง

Advertisements

LoRa WAN

LoRa
คำว่า LoRa ย่อมาจาก Long Range เมื่อเพิ่มคำว่า Wide Area Network เข้าไปก็จะเป็น Long Range Wide Area Network หรือ LoRaWAN

LoRaWAN เป็นมาตรฐานการสื่อสารสารแบบไร้สายแบบหนึ่ง (มาตรฐานการสื่อสารไร้สายมีหลายแบบ เช่น WiFI, Bluetooth, FM Radio, GSM, 3G, LTE, NB-IoT …) โดยการสื่อสารแบบ LoRaWAN สามารถที่จะทำให้อุปกรณ์ในระบบของ Internet of Things สามารถที่จะสื่อสารกันได้ด้วยระยะทางไกลและใช้พลังงานไฟฟ้าน้อย (สามารถใช้แบตเตอรี่ได้)

  • คุณสมบัติพื้นฐานของ LoRaWAN
  • ใช้ได้ระยะทางไกล (> 5 km, > 10 km, > 80 km)
  • ประหยัดพลังงาน (แบตเตอรี่ อาจใช้ได้มากถึง 1 ปีหรือมากกว่า!!!)
  • ราคาไม่สูง (อุปกรณ์สื่อสาร หลักร้อยบาท)
  • อัตราการส่งข้อมูลต่ำ (< 50 kbps)
  • ใช้ย่านความถี่ ที่ไม่ต้องขออนุญาต
  • ส่งและรับข้อมูลได้ (Bidirectional)

จากคุณสมบัติจะเห็นได้ว่า LoRa มีข้อดีหลายข้อยกเว้นเรื่องอัตราการรับส่งข้อมูลที่มีความเร็วต่ำ (ขนาดข้อมูลเล็ก) ซึ่งก็เป็นข้อจำกัดในการออกแบบที่ต้องแลกกันกับเรื่องของ ระยะทาง, ความเร็ว, การใช้พลังงาน ซึ่งปัจจัยเหล่านี้มักจะสวนทางกัน เช่น ถ้าต้องการความเร็วสูงมากก็จะได้ระยะทางการส่งที่ไม่ไกล หรือถ้าต้องการรับส่งในระยะทางไกลด้วยความเร็วสูงมากก็จะต้องใช้พลังงานมาก แต่เนื่องจากอุปกรณ์ IoT ส่วนใหญ่นั้น มีการส่งข้อมูลที่น้อยในระยะเวลาสั้น ความต้องการความเร็วในการส่งข้อมูลปริมาณมากนั้นจึงไม่จำเป็นซึ่งก็จะทำให้ได้ข้อดีของการใช้พลังงานน้อย และเนื่องจาก LoRa นั้นสามารถใช้ความถี่ในย่านที่ไม่ต้องขออนุญาตจึงทำให้เราสามารถที่จะวางอุปกรณ์สื่อสาร LoRaWAN Gateway ได้เองเพื่อสร้างเครือข่ายใช้งานของตัวเองขึ้นมาในราคาหลักพันหรือหมื่นบาทเท่านั้น สำหรับกฎเกณฑ์ที่คณะกรรมการกิจการกระจายเสียง กิจการโทรทัศน์ และกิจการโทรคมนาคมแห่งชาติ ประกาศสำหรับความถี่ย่าน 920-925 MHz ที่จะสามารถใช้กับ LoRa ในประเทศไทยนั้น ในกรณีกำลังส่งของอุปกรณ์น้อยกว่า 50 mW ไม่ต้องมีใบอนุญาตให้ทำ มี ใช้ นำเข้า และนำออก แต่ต้องมีใบอนุญาตให้ค้า กรณีกำลังส่งน้อยกว่า 500 mW ไม่ต้องมีใบอนุญาต มี ใช้ และนำออก แต่ต้องมีใบอนุญาตให้ทำ นำเข้า และค้า ในกรณีที่ส่งด้วยกำลังสูงมากกว่า 500 mW (< 4W) ต้องขอรับใบอนุญาตจาก กสทช. ทุกกรณี

ด้วยคุณสมบัติของการส่งข้อมูลและการประหยัดพลังงาน ก็ทำให้มีการประยุกต์ใช้เทคโนโลยีนี้ในอุปกรณ์ต่าง ๆ ที่เรียกว่า Internet of Things, Internet of Everythings, หรือ M2M (Machine to Machine) ซึ่งมักจะเป็นอุปกรณ์ขนาดเล็ก ที่ทำงานด้วยแบตเตอรี่และมีการรับส่งข้อมูลไม่มากในระยะเวลาสั้น

ตัวอย่างการนำไปใช้งาน

ระบบวัด (Metering)

  • ส่งข้อมูลวันละ 1 ถึง 5 ครั้งต่อวัน เกี่ยวกับปริมาณการใช้ เช่น มิเตอร์น้ำ, มิเตอร์ไฟฟ้า

ระบบจอดรถ

  • ส่งข้อมูลเมื่อมีรถเข้าจอดหรือออกจากที่จอด
  • ไม่ต้องมีการเดินสายสัญญาณ เหมือนระบบเดิม

ถังขยะ

  • ส่งข้อมูลเมื่อขยะเต็มถัง
  • ประหยัดเวลาในการเลือกเก็บเฉพาะถังที่เต็ม

ระบบไฟส่องสว่าง

  • ควบคุมไฟถนนตามสภาวะแวดล้อมและแจ้งสถานะ

ระบบตรวจวัดสภาพแวดล้อม

  • เสียง, อุณหภูมิ, ฝุ่นละอง, ความชื้น

ระบบบริหารสินทรัพย์

  • ตรวจสอบสถานะและตำแหน่ง

ระบบเกี่ยวกับสุขภาพทางร่างกาย

  • การตรวจจับการล้ม, การขอความช่วยเหลือฉุกเฉิน, ข้อมูลทางการแพทย์

ระบบตรวจสอบ

  • สินค้า, รถยนต์, สัตว์

 

lora_architecture.jpg

สถาปัตยกรรมของระบบ

สำหรับการส่งข้อมูล เมื่อดูจากแผนภาพ ยกตัวอย่างเช่น ตัวตรวจจับ (sensor) มีการส่งข้อมูลไปยัง Application จะเป็นการส่งจากทางซ้ายไปทางขวาของภาพ เมื่อตัวตรวจจับ (sensor) ได้รับข้อมูลก็จะทำการเข้ารหัสและส่งผ่าน LoRa radio เมื่อ Gateway ได้รับข้อมูล ก็จะส่งต่อไปยังเครือข่ายอื่นเช่น 3G หรือ Ethernet หรือ WiFi เพื่อส่งไปยัง Network Server จากนั้น Network Server ก็จะส่งต่อข้อมูล (routes the message) ไปยัง Application ปลายทางตามที่กำหนด

สำหรับการส่งข้อมูลกลับ เช่น การสั่งเปิดไฟส่องสว่างก็จะกลับทิศทางกันคือเริ่มจากขวาไปซ้าย แต่บางครั้งเนื่องจากการออกแบบอุปกรณ์บางประเภทให้ใช้พลังงานน้อย อุปกรณ์เหล่านั้นก็อาจจะไม่สามารถที่จะรอรับคำสั่งได้ตลอดเวลา ทั้งนี้ก็ขึ้นอยู่กับประเภทของอุปกรณ์ (device classes) ที่จะเลือกหรือออกแบบขึ้นมาใช้งาน

Devices (End Nodes)
อุปกรณ์ LoRaWAN สามารถเป็นอะไรก็ได้ ที่รับหรือส่งข้อมูลได้ นิยามที่จำเพาะเจาะจงในเรื่องนี้อาจไม่มีแต่โดยทั่วไปเรามักยกตัวอย่างของ อุปกรณ์ตรวจวัด ตรวจจับ เช่น
อุปกรณ์วัดอุณหภูมิ, ระบุตำแหน่ง (GPS), Electric Plug ที่สามารถสั่งเปิดปิดได้, อุปกรณ์วัดพลังงานไฟฟ้า

kiwi-tec_LAS-201_04

ตัวอย่างเครื่องตรวจวัดฝุ่นละอองในอากาศ PM2.5 และอุณหภูมิ ความชื้นของ kiwi-tec

Device classes
A: สามารถรับข้อมูลได้เฉพาะเมื่ออุปกรณ์กำลังส่งข้อมูลเท่านั้น
B: เหมือนกับ A แต่ สามารถรอรับข้อมูลในช่วงระยะเวลาที่กำหนด
C: สามารถรับส่งข้อมูลได้ตลอดเวลา

สำหรับคำศัพท์ต่อไปนี้

  • Device addressing
  • LoRa radio

จะเกี่ยวข้องกับเรื่องทางเทคนิค แต่สามารถศึกษาเพิ่มเติมได้ถ้าสนใจที่ https://lora-alliance.org/about-lorawan ในเบื้องต้นสำหรับ LoRa radio นั้นจะมีการใช้ความถี่ดังนี้ ในยุโรป 868MHz และ 433 MHz อเมริกา 915 MHz ประเทศไทยใช้ 920-925 MHz

Gateway
Gateway หรือที่เรียกว่า MODEM หรือ access point เป็นอุปกรณ์ที่รับข้อมูลจากอุปกรณ์ปลายทาง (devices) ผ่านทางคลื่นวิทยุ ในรัศมีที่คลื่นวิทยุนั้นครอบคลุม

Network Server

หลังจากที่อุปกรณ์ได้ส่งข้อมูลและถูกรับโดย LoRa gateway ข้อมูลนั้นก็จะถูกส่งต่อไปยัง Network Server ซึ่งก็จะทำหน้าที่ดังต่อไปนี้

  • รวบรวมข้อมูลที่มาจากทุก LoRaWAN gateways ในเครือข่าย
  • ส่งต่อข้อมูลดังกล่าวไปยัง application ที่กำหนดไว้
  • ควบคุมอุปกรณ์ gateways
  • เลือก gateway ที่เหมาะสมในการส่งข้อมูลไปยังอุปกรณ์ ในกรณีที่มีหลาย gateway ในพื้นที่ ที่อุปกรณ์นั้นปรากฏอยู่
  • พักข้อมูลไว้จนกว่าอุปกรณ์แบบ A หรือ B พร้อมที่จะรับข้อมูลแล้วจึงส่งให้
  • ขจัดข้อมูลที่ซ้ำซ้อน เช่น กรณีที่ gateway หลายตัวรับข้อมูลมาจากอุปกรณ์เดียวกัน

Application
คือการใช้งานของผู้ใช้ซึ่งจะเป็นส่วนของการประมวลผลข้อมูลที่ได้รับมาหรือการสั่งการอย่างใดอย่างหนึ่ง

Security
สำหรับเรื่องนี้สามารถหาอ่านเพิ่มเติมได้ถ้าสนใจ https://lora-alliance.org/about-lorawan

เปรียบเทียบระหว่าง LoRa และ NB-IoT
เป็นเทคโนโลยีไร้สาย ที่ใช้พลังงานต่ำทั้งคู่ โดย LoRa ถูกพัฒนาขึ้นมาก่อน ในขณะที่ Narrow Band IoT ถูกพัฒนามาจากกลุ่มผู้จัดทำมาตรฐานของระบบโทรศัพท์เคลื่อนที่ โดย NB-IoT ไม่จำเป็นต้องมี Gateway แบบ LoRa โดย NB-IoT สามารถใช้สถานีฐานของโทรศัพท์ได้เลยในความถี่เดียวกับความถี่โทรศัพท์

ตารางเปรียบเทียบระหว่าง Sigfox, LoRa, และ NB-IoT

sigfox_lora_nb-iot

Table from : https://www.sciencedirect.com/science/article/pii/S2405959517302953

ตัวอย่างการใช้งาน NB-IoT และ LoRa ในประเทศ

  • AIS http://business.ais.co.th/iot/index.html มีกรณีศึกษาในความร่วมมือในการทดสอบการใช้งาน NB-IoT กับธุรกิจอสังหาริมทรัพย์และพลังงาน
  • True http://trueiot.truecorp.co.th/ มีเนื้อหาสำหรับ ผู้พัฒนา ผู้ใช้งานทั่วไป ผู้ใช้งานกับธุรกิจ แต่ยังเป็นสินค้าและผลิตภัณฑ์ทั่วไป (ยังไม่ถึงกับ IoT หรือเทคโนโลยีที่ใช้ NB-IoT)
  • DTAC ยังไม่มีข้อมูลความเคลื่อนไหวเกี่ยวกับเรื่องนี้
  • CAT LoRa IoT https://loraiot.cattelecom.com มีข้อมูลว่าจะเปิดให้บริการ เบื้องต้น 18 จังหวัดและขายชุดทดสอบสำหรับนักพัฒนา

 

ESP8266 OTA

อ้างอิงจาก https://www.bakke.online/index.php/2017/06/02/self-updating-ota-firmware-for-esp8266/
และ http://esp8266.github.io/Arduino/versions/2.1.0-rc2/doc/ota_updates/ota_updates.html

การเขียนโปรแกรมสั่งงานอุปกรณ์ IoT (Internet of Things) นั้นส่วนใหญ่จะทำการเขียนบนเครื่องมือพัฒนาที่เรียกว่า IDE (Integrated development environment) เช่น Arduino IDE จากนั้นก็จะทำการ upload ตัวโปรแกรม (binary compiled) ไปยังบอร์ดผ่านทาง serial port (USB) หรือสายอนุกรมที่ต่อระหว่างคอมพิวเตอร์กับบอร์ด เมื่อมีการแก้ไขโปรแกรมและทำการ compile ใหม่ก็จะทำแบบเดียวกันนี้อีกครั้ง เมื่อนำไปใช้งานแล้วถ้าหากจะต้องมีการแก้ไขก็จะต้องนำอุปกรณ์ IoT นั้นมาเชื่อมต่อกับเครื่องคอมพิวเตอร์ที่เขียนโปรแกรม เพื่อทำการ upload โปรแกรมที่แก้ไขแล้วลงไปที่อุปกรณ์ใหม่อีกครั้งผ่านสายอนุกรม จะเห็นได้ว่าในบางกรณีนั้นการทำแบบนี้เป็นไปได้ยากมาก เช่น ถ้าอุปกรณ์นั้นไม่ได้อยู่ในบ้านหรือในที่ทำงาน แต่อยู่ในสถานที่ห่างไกลออกไป เช่น อยู่กับลูกค้า อยู่ต่างจังหวัด อยู่ต่างประเทศ การทำ upload ผ่านทางสายอนุกรมนั้นแทบจะเป็นไปไม่ได้เลย การส่งอุปกรณ์กลับก็สร้างความยุ่งยากเช่นเดียวกัน จึงได้มีแนวคิดของการ upload โปรแกรมผ่านทางเครือข่ายเช่น WiFi หรือผ่านทางอินเทอร์เน็ต เพื่อที่อุปกรณ์ที่ใช้งานอยู่นั้นสามารถ download โปรแกรมอันใหม่ผ่านทางเครือข่ายไปปรับปรุงตัวเองได้ หรือสามารถให้ผู้ใช้ปลายทางสามารถที่จะ download โปรแกรมตัวใหม่ทำการ upload ด้วยตัวเองผ่าน wifi เพื่อ upload เข้าไปที่บอร์ด ซึ่งเมื่อบอร์ด upload โปรแกรมใหม่เสร็จก็จะทำการ reboot ตัวเองใหม่เพื่อทำงานตามโปรแกรมที่ได้รับการปรับปรุง

การ upload firmware ผ่านทาง WiFi

บอร์ด (esp8266) ทำการจำลองตัวเองเป็น web server พร้อมกับต่อ WiFi ที่กำหนดเพื่อให้ผู้ใช้ upload file (binary compiled) จากนั้นเราใช้คอมพิวเตอร์เชื่อมต่อ WiFi เดียวกันกับที่บอร์ดเชื่อมต่อแล้วใช้ browser เปิดเข้าไปที่ url ตามที่เรากำหนดใน code เช่น http://ogoswitch-7228204.local/firmware เพื่อทำการ upload binary file ที่เรา compiled แล้วไปยังบอร์ด

ตัวอย่าง code ได้แก่


#include "DNSServer.h"
#include "WiFiManager.h"  

#include "ESP8266HTTPUpdateServer"
#include "ESP8266WebServer.h"
#include "ESP8266mDNS"

const char* host = "ogosense-webupdate";
const char* update_path = "/firmware";
const char* update_username = "admin";
const char* update_password = "ogosense";
ESP8266WebServer httpServer(80);
ESP8266HTTPUpdateServer httpUpdater;

setup() 
{
   WiFiManager wifiManager;
   Serial.begin(115200);
   Serial.println();
   wifiManager.setTimeout(300);
   String APName = "OgoSense-"+String(ESP.getChipId());         
   if(!wifiManager.autoConnect(APName.c_str()) ) {
        Serial.println("failed to connect and hit timeout");
        delay(3000);
        // reset and try again, or maybe put it to deep sleep
        ESP.reset();
        delay(5000);
     }
 
   // if you get here you have connected to the WiFi
   Serial.println("connected...yeey :)");

   // web update OTA
   String host_update_name;
   host_update_name = "ogoswitch-"+String(ESP.getChipId());
   MDNS.begin(host_update_name.c_str());
   httpUpdater.setup(&httpServer, update_path, update_username, update_password);
   httpServer.begin();
   MDNS.addService("http", "tcp", 80);
   Serial.printf("HTTPUpdateServer ready! Open http://%s.local%s in your browser and login with username '%s' and password '%s'\n", host_update_name.c_str(), update_path, update_username, update_password);
}

loop()
{
   httpServer.handleClient();
}

การปรับปรุงโปรแกรมผ่านอินเทอร์เน็ตโดยอัตโนมัติเมื่อมีการปรับปรุง

การให้บอร์ด (IoT) ทำการตรวจสอบและทำการ update ผ่าน web server ที่เรากำหนดไว้ โดยเราจะนำไฟล์ที่ compiled แล้วไปเก็บไว้บน web server และสร้างไฟล์เพื่อระบุหมายเลขรุ่นใส่ไว้ โดยโปรแกรมบนบอร์ดจะทำการเปรียบเทียบเลขดังกล่าว ถ้าเลขในไฟล์บน web server มีค่ามากกว่าบนบอร์ด โปรแกรมบนบอร์ดก็จะทำการ download binary file อันใหม่ตามที่เราระบุชื่อ มาทำการ update บนบอร์ด เมื่อการปรับปรุงเสร็จตัวบอร์ดจะทำการ reboot เพื่อที่จะทำงานบนโปรแกรมอันใหม่ ดังนั้นโปรแกรมอันใหม่ที่เขียนปรับปรุงจะต้องมีการระบุหมายเลขในตัวแปร FW_VERSION ให้ตรงกับตัวเลขในไฟล์ที่ระบุหมายเลขรุ่นล่าสุด เมื่อเราต้องการปรับปรุงโปรแกรมก็เพิ่มค่าตัวเลขดังกล่าวขึ้นไปเช่น ถ้าของเดิมเป็น 1 ก็เปลี่ยนเป็น 2 โดยจะต้องเปลี่ยนทั้งในตัวโปรแกรม (source code) และค่าในไฟล์หมายเลขรุ่น

ตัวอย่าง


#include "DNSServer.h"
#include "ESP8266WebServer.h"
#include "WiFiManager.h"    

#include "Timer.h"

#include "WiFiClient.h"
#include "ESP8266mDNS.h"
#include "ESP8266HTTPUpdateServer.h"
#include "ESP8266HTTPClient.h"
#include "ESP8266httpUpdate.h"

const char* host = "ogosense-webupdate";
const char* update_path = "/firmware";
const char* update_username = "admin";
const char* update_password = "ogosense";
const int FW_VERSION = 1;
const char* firmwareUrlBase = "http://www.ogonan.com/ogoupdate/";
String firmware_name = "ogoswitch_temperature_humidity_nodisplay.ino.ino.d1_mini";
ESP8266WebServer httpServer(80);
ESP8266HTTPUpdateServer httpUpdater;
Timer checkFirmware;

void setup()
{
   WiFiManager wifiManager;

   Serial.begin(115200);
   Serial.println();
   wifiManager.setTimeout(300);
   String APName = "OgoSense-"+String(ESP.getChipId());
   if(!wifiManager.autoConnect(APName.c_str()) ) {
     Serial.println("failed to connect and hit timeout");
     delay(3000);
     //reset and try again, or maybe put it to deep sleep
     ESP.reset();
     delay(5000);
   }

  //if you get here you have connected to the WiFi
  Serial.println("connected...yeey :)");

  // web update OTA
  String host_update_name;
  host_update_name = "ogoswitch-"+String(ESP.getChipId());
  MDNS.begin(host_update_name.c_str());
  httpUpdater.setup(&httpServer, update_path, update_username, update_password);
  httpServer.begin();
  MDNS.addService("http", "tcp", 80);
  Serial.printf("HTTPUpdateServer ready! Open http://%s.local%s in your browser and login with username '%s' and password '%s'\n", host_update_name.c_str(), update_path, update_username, update_password);

  checkFirmware.every(86400000L, upintheair);
  upintheair();
}

void loop()
{
  checkFirmware.update();
}

void upintheair()
{
  String fwURL = String( firmwareUrlBase );
  fwURL.concat( firmware_name );
  String fwVersionURL = fwURL;
  fwVersionURL.concat( ".version" );

  Serial.println( "Checking for firmware updates." );
  // Serial.print( "MAC address: " );
  // Serial.println( mac );
  Serial.print( "Firmware version URL: " );
  Serial.println( fwVersionURL );

  HTTPClient httpClient;
  httpClient.begin( fwVersionURL );
  int httpCode = httpClient.GET();
  if( httpCode == 200 ) {
    String newFWVersion = httpClient.getString();

    Serial.print( "Current firmware version: " );
    Serial.println( FW_VERSION );
    Serial.print( "Available firmware version: " );
    Serial.println( newFWVersion );

    int newVersion = newFWVersion.toInt();

    if( newVersion > FW_VERSION ) {
      Serial.println( "Preparing to update" );

      String fwImageURL = fwURL;
      fwImageURL.concat( ".bin" );
      t_httpUpdate_return ret = ESPhttpUpdate.update( fwImageURL );

      switch(ret) {
        case HTTP_UPDATE_FAILED:
          Serial.printf("HTTP_UPDATE_FAILD Error (%d): %s", ESPhttpUpdate.getLastError(), ESPhttpUpdate.getLastErrorString().c_str());
          break;

        case HTTP_UPDATE_NO_UPDATES:
          Serial.println("HTTP_UPDATE_NO_UPDATES");
          break;
      }
    }
    else {
      Serial.println( "Already on latest version" );
    }
  }
  else {
    Serial.print( "Firmware version check failed, got HTTP response code " );
    Serial.println( httpCode );
  }
  httpClient.end();
}

ในตัวอย่างจะมีการตรวจสอบ firmware ใหม่เมื่อเริ่มทำงาน และจะมีการตรวจสอบทุก 24 ชั่วโมง โดยใช้ Timer เรียกใช้ function upintheair()

   checkFirmware.every(86400000L, upintheair);

ogoswitch_temperature_humidity_nodisplay.ino.d1_mini.version

1

การนำโปรแกรมที่ compile แล้วไปไว้บน web server เราสามารถทำได้โดยการ compile โปรแกรมในเมนู Sketch เลือก Export Compiled Binary หรือกด Compile the sketch ด้วยปุ่ม Ctrl+R (windows) หรือ command+r (mac) และ export binary ด้วยปุ่ม Ctrl+Alt+S (windows) หรือ command+option+s (mac) จากนั้นนำ binary file upload ขึ้นไปยัง web server ในตำแหน่งที่กำหนด ตามตัวแปร firmwareUrlBase โดยอย่าลืมสร้างไฟล์เก็บเลขรุ่นแล้ว upload ขึ้นไปด้วยเช่น ogoswitch_temperature_humidity_nodisplay.ino.d1_mini.version โดยในไฟล์ให้ระบุหมายเลขรุ่นตามที่กำหนด เมื่อมีการปรับปรุงก็ให้เพิ่มเลขนี้ขึ้นไปให้มากกว่าเดิม

มีวิธีง่ายง่ายอีกหนึ่งวิธีคือ

   ESPhttpUpdate.update("192.168.0.2", 80, "/arduino.bin");

คำสั่งเดียว โดย 192.168.0.2 ก็เป็น ip address ของ web server, 80 คือหมายเลข port, /arduino.bin ก็เป็น directory และชื่อไฟล์ของโปรแกรมที่ต้องการ update เวลาที่ต้องการ update ก็ทำเป็น function แล้วเรียกใช้งาน อาจจะทำผ่านการกดปุ่มแล้วเรียก function ดังกล่าวก็ได้ สำหรับการใช้งานที่ซับซ้อนและละเอียดมากกว่านี้ก็สามารถดูได้จาก link ที่ให้ไว้ข้างบนสุด

ด้วยวิธีการแบบนี้ต่อให้อุปกรณ์ IoT เราไปอยู่ถึงญี่ปุ่น เราก็ยังสามารถปรับปรุงโปรแกรมเพิ่มความสามารถใหม่ หรือ upload โปรแกรมใหม่ ที่แก้ไข bug แล้วซึ่งอาจเกิดในโปรแกรมรุ่นแรกที่มี bug เพียบบบบบบ 😉 ไปยังอุปกรณ์ดังกล่าวได้โดยไม่ต้องเหาะเอาคอมพิวเตอร์ไปจิ้มที่เครื่อง หรือในกรณีที่คนใช้งานทั่วไปที่ไม่สามารถทำเองได้ วิธีการเหล่านี้ก็สามารถช่วยแก้ไขปัญหาดังกล่าวได้อย่างดี

หมายเหตุ กรุณาเพิ่มเติม code เกี่ยวกับเรื่องความปลอดภัยด้วย เพราะตัวอย่างนี้ไม่รวมเรื่องการตรวจสอบยืนยันเรื่องความปลอดภัย ถ้าไม่ทำท่านอาจถูก hacker ทำการ hack DNS หรือ redirect http request ไปยัง host ของ hacker แล้ว upload โปรแกรมของ hacker แทน เจอแบบนั้นตัวใครตัวมันนะครับท่าน 😛

ความตาย ความแน่นอน ความไม่แน่นอน

ความตายน่ากลัวไหม

ผมก็กลัว คนส่วนใหญ่ก็น่าจะกลัว เพียงแต่ผมรู้สึกว่าตอนนี้ตัวเองรู้สึกกลัวน้อยลง เราทุกคนโตขึ้นมาก็จะทราบดีว่าเราจะต้องตายและความตายเป็นเรื่องแน่นอนยิ่งกว่าแน่นอน

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

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

//

แรงบันดาลใจจากการเสียชีวิตของคุณยาย ความเจ็บป่วยของเจ้านายที่ทำงาน การเห็นคนส่วนใหญ่ที่กลัวหรือเกรงเรื่องความตายโดยไม่กล้าจะพูดถึง รวมถึงเป็นเรื่องที่อยากเขียนมานานแล้ว — 2018 01 23 17:28

 

smart farm control

งานนี้ เป็นการประยุกต์ใช้

  • message passing (MQTT หรือ netpie.io) ในการรับส่งข้อมูลหรือคำสั่ง เช่น ข้อมูลความชื้น คำสั่งปิด หรือ เปิด โดยติดตั้งใช้งานบน Raspberry pi
  • smart switch or wifi switch ประกอบด้วย controller board (IoT board) เช่น ESP-8266, Relay เพื่อใช้เป็นสวิทช์ปิดเปิดอุปกรณ์ไฟฟ้า โดยการรับคำสั่งจาก MQTT Server
  • smart sensor or wifi sensor (temperature and relative humidity) เป็นการใช้ IoT Board กับ Electronic Sensor เช่น SHT30 ในการวัดค่าความชื้น อุณหภูมิ แล้วส่งข้อมูลไปยัง MQTT Server
  • web application (java script, angularjs, nodejs) เป็นส่วนติดต่อกับผู้ใช้งานและทำหน้าที่ในการรับค่าที่ส่งจาก smart sensor ผ่าน MQTT แล้วนำมาตัดสินใจในการทำงานตามเงื่อนไขที่ผู้ใช้ตั้งไว้ เช่น เมื่อค่าความชื้นต่ำกว่าที่กำหนด ให้สั่ง Smart Switch ทำงานเป็นต้น
  • wifi access point เป็นส่วนของระบบสื่อสัญญาณระหว่างอุปกรณ์ได้แก่ MQTT Server, smart switch, smart sensor

 

เมื่อนำมาทำงานประกอบร่วมกัน ก็จะได้ชุดควบคุมเพื่อใช้ควบคุมการรดน้ำ (พ่นหมอก) ในโรงเรือนเพาะปลูก โดยทำตามเงื่อนไขของ ความชื้น หรือ อุณหภูมิ หรือทั้งสองอย่าง

รายละเอียดของ source code

ส่วนของ User Interface (ui) และ smart sensor

ส่วนของ smart switch

ogofarm_ui

การทำงาน สามารถเลือกเงื่อนไข (Condition) ได้สามแบบคือ เลือกตรวจจับค่าความชื้น (RH) หรือ อุณหภูมิ (Temp) หรือ ทั้งความชื้นและอุณหภูมิ (RH&Temp) โดยความชื้นมีหน่วยเป็นร้อยละ (%) อุณหภูมิมีหน่วยเป็นองศาเซลเซียส (Degree Celsius) และเงื่อนไขการสั่งงาน smart switch เพื่อปิดหรือเปิด (ON/OFF)

การ ON/OFF นั้นจะสัมพันธ์โดยตรงกับค่า min ไม่ว่าจะเป็น min RH หรือ min Temp นั่นคือ เมื่อค่าที่วัดได้ต่ำกว่าค่า min smart switch จะทำงานตามที่ระบุใน ON/OFF เช่น ถ้าตำแหน่ง ON/OFF อยู่ ON โปรแกรมก็จะเป็นการสั่งให้ smart switch ทำงานเปิดไฟฟ้า relay contact จะอยู่ที่ตำแหน่ง NO (Normal Open) หรือเชื่อมระหว่าง Common กับ NO แต่ถ้าตำแหน่ง ON/OFF อยู่ที่ OFF เมื่อค่าที่วัดมาต่ำกว่าค่า min ก็จะเป็นการสั่งให้ smart switch ปิดการทำงาน relay contact จะอยู่ที่ตำแหน่ง NC (Normal Close)


if smart sensor data < min RH or min Temp

do action in ON/OFF

else if smart sensor data > max or min Temp

do toggle action in ON/OFF

ส่วนค่า max ของ RH หรือ Temperature นั่นจะทำงานตรงข้ามกับการเลือก ON/OFF นั่นคือเมื่อเลือกที่ ON เมื่อค่าที่วัดมาได้มากกว่าค่า max RH หรือ Temp. ก็จะเป็นการสั่งให้ smart switch ปิดการทำงานของอุปกรณ์ไฟฟ้า (เช่น ปั๊มน้ำ)

ในกรณีที่เลือกเงื่อนไข (condition) แบบ RH&Temp จะเป็นการทำงานด้วยสองเงื่อนไขของค่าที่วัดคือ ทั้งค่าความชื้นและอุณหภูมิ โดยค่า min จะทำงานสัมพันธ์กับ ON/OFF ด้านซ้าย ส่วนค่า max จะทำงานสัมพันธ์กับ ON/OFF ด้านขวา


if smart sensor data < min RH && min Temp

do action in Left ON/OFF

else if smart sensor data > max RH && max Temp

do action in Right ON/OFF

นอกจากนี้ ยังมีการตั้งค่าเวลา sensor timer (countdown) เพื่อตรวจสอบการส่งข้อมูลของ smart sensor ในกรณีที่มีข้อมูลส่งเข้ามา timer จะเริ่มนับใหม่ กรณีที่ไม่มีข้อมูลจาก smart sensor ส่งเข้ามาโปรแกรมจะทำการส่งคำสั่ง OFF ไปยัง smart switch เพื่อป้องกันการทำงานค้าง กรณีที่ไม่ได้รับข้อมูลจาก smart sensor

ในกรณีของการส่งข้อมูลไปเปิด smart switch จะมีการส่งค่าเวลาเพื่อให้ smart switch สามารถทำงานตามเวลาที่กำหนดแล้วปิดเอง (โดยไม่จำเป็นต้องดูเงื่อนไขของค่าที่ได้รับจาก smart sensor) เช่น เมื่อ ความชื้นต่ำกว่าที่ตั้งและกำหนดให้เปิด smart switch / smart switch จะถูกตั้งเวลาทำงาน 5 นาที (TIMEFACTOR) จากนั้นจะหยุดทำงาน แต่ถ้าในระหว่าง 5 นาทีนั้น เงื่อนไขของความชื้นมากกว่าที่กำหนด โปรแกรมสามารถส่งคำสั่งหยุดไปที่ smart switch ได้ทันที แต่ถ้าเงื่อนไขที่ได้รับจาก smart sensor ยังอยู่ในเงื่อนไข ON หลังจากที่ค่าเวลา ontimer ครบห้านาทีแล้ว โปรแกรมก็จะถูกบังคับให้ส่งการปิดไปยัง smart switch เพื่อป้องกันการทำงานเกินเวลาซึ่งอาจทำให้อุปกรณ์ เช่น ปั๊มน้ำเสียหายได้ และหลังจากส่งคำสั่งปิดไปที่ smart switch แล้ว โปรแกรมจะยังคงมีการตั้งค่าเวลาหน่วง delay (60 วินาที) เพื่อป้องกันการเปิดซ้ำในทันที ทั้งนี้ค่าการหน่วงเวลาเหล่านี้สามารถตั้งปรับเปลี่ยนได้ตามความเหมาะสม

ogofarm_diagram

ใน source code (version 1) เบื้องต้นนี้สามารถ ใช้งานกับ smart sensor 4 ชุด และ smart switch 4 ชุด โดยเงื่อนไขการทำงานผูกระหว่าง smart switch 1 ตัว สามารถทำงานจับคู่ได้กับ sensor หลายตัวได้ (1 to m) แต่ smart sensor จะจับคู่กับ smart switch ได้แค่ตัวใดตัวหนึ่ง (1 to 1)

smart sensor 1 ชุด จะทำงานทั้งวัดอุณหภูมิ วัดความชื้น สำหรับการสั่งงาน smart switch 1 ตัวเท่านั้นโปรแกรมยังไม่สามารถแยกการสั่ง smart switch ต่างกันได้ ด้วยเงื่อนไขของอุณหภูมิหรือความชื้น จาก smart sensor ตัวเดียวได้

ใน version 1.0

  • ยังไม่มีการเก็บข้อมูล เพื่อการดูย้อนหลังหรือนำไป plot graph (ว่าจะทำอยู่ รอก่อนนะ)
  • ยังไม่ได้ให้เชื่อมต่อออกอินเทอร์เน็ต เพราะใน farm ไม่มี internet  แต่ถ้าจะใช้ 3G 4G ก็ไม่มีปัญหาปรับแก้ไขเพิ่มเติมได้ เช่น นำค่าที่ได้ส่งออกไปเก็บไว้ที่ cloud เป็นต้น

Version 1.0 2017-11-21

Things Control

ThingsControl – control anything as you want.

ผมเริ่มหัดเขียน php, c เพื่อคุยกับ netpie เมื่อประมาณต้นเดือนมิถุนายน และหัดเขียน app inventor เมื่อราวราว 30 พฤษภาคม 2560

จนวันนี้ ใช้เวลาประมาณ 1 เดือนเต็มเต็ม งานที่ทำอยู่ก็สำเร็จในเบื้องต้น รวมเวลาสั่งของ (hardware) มาลองด้วย

แรงบันดาลใจก็มาจาก sonoff หรือ smart switch ที่บริษัท จีนทำขายไปทั่วโลกในราคาไม่แพง นอกเหนือจากนั้นอีกแรงขับหนึ่งก็คือ ความหวงวิชาของหน่วยงานรัฐ หรือแม้แต่คนในวงการเดียวกันเอง ถึงตอนนี้ ผมก็ยังคิดว่า ทำไมจะต้องมาเสียเวลาไป 1 เดือนเพื่อทำในสิ่งที่ คนอื่นก็ทำกันอยู่แล้ว และต้องมาทำซ้ำซ้ำกัน จริงอยู่นะ ว่า พอมาทำจริงจริงมันก็ไม่ได้ง่ายนัก ถ้าจะทำเพื่อให้ใช้งานได้จริง ไม่ใช่ทำแค่ ปิด เปิด หลอดไฟได้ แบบที่ ก็ทำกันมาหลายปี เวลาหัดทำ หัดใช้งาน ใหม่ใหม่ มันก็มีความยากอยู่พอสมควร แต่ถ้าจะคิดในมุม เรื่องพื้นฐานแบบนี้ ถ้าเผยแพร่ได้ มันจะช่วยให้วงการมันพัฒนาไปได้อีกมาก เพราะสาระของเรื่องนี้ มันไม่ได้อยู่ตรงนี้แล้ว มันต้องต่อยอดออกไปอีก ไม่ว่าจะเป็นเรื่อง big data หรือ machine learning ลำพังแค่จะทำตัวสร้างข้อมูลยังจะหวงกัน ก็ไม่ต้องไปถึงไหนกัน

ครับ ถ้าท่านหลงมาเจอ ก็ลองไปดูที่นี่ เผื่อจะสนใจ https://github.com/kaebmoo/thingscontrol

มันคืออุปกรณ์เปิด ปิด อุปกรณ์ไฟฟ้า ที่สั่งงานผ่าน smart phone (android) สั่งผ่าน internet โดยสามารถตั้งเวลาควบคุมการ เปิด ปิด หรือระยะเวลาที่ให้ทำงาน ได้

 

อ่าน/เขียน ข้อมูลไปยัง netpie ด้วย app inventor

screen_read_write_netpie_appinventor

 

blocks(1)

ใช้ผ่าน web component ที่อยู่ในหมวด connectivity ซึ่งใช้เรียก REST API ของ netpie โดยกำหนด uri คือ https://api.netpie.io/topic/ชื่อแอพที่สร้างในnetpie/ชื่อtopic?retain&authen=key:secret

เช่น https://api.netpie.io/topic/sControl/sensor/light?retain&auth=key:secret

ตรง key และ secret ใส่ key และ secret ที่ได้จากการสร้างแอพพลิเคชั่นจาก netpie

application_netpie

ลองส่งข้อมูลขึ้นด้วยการใส่ค่าใน textbox แล้วกดปุ่ม [post to netpie] โปรแกรมจะเรียก web method PUT Text เพื่อส่งค่า

ลองอ่านค่าจาก netpie ด้วยการกดปุ่ม [get value from netpie] โปรแกรมจะเรียก web method GET

ค่าที่ได้จาก netpie จะหน้าตาประมาณนี้

[{“topic”:”/sControl/sensor/light”,”payload”:”YES”,”lastUpdated”:1498810051,”retain”:true}]

จากนั้นจะมีการตรวจค่าใน Event GotText ก็ทำการตรวจสอบว่าสามารถอ่านค่าได้หรือไม่ (responseCode = 200) แล้วก็ทำการอ่านค่าโดยแปลงจาก json มาใส่ใน List (item) เพื่อใช้ค้นหา key ที่เราสนใจ ซึ่งในที่นี้จะอยู่ใน key ชื่อ payload

 

ตรง if else ที่ตรวจสอบค่าว่าเป็น PUT, หรือ GET เพื่อไม่ให้เกิด error เนื่องจากเวลา PUT netpie จะส่งค่า JSON กลับมาไม่เหมือนกับตอน GET จะได้แสดงผลถูก

ในตัวอย่างนี้มีการใช้ clock ทุก 5 วินาที (อย่าลืมตั้งค่า TimerInterval = 5000) เพื่ออ่านค่า ดังนั้นก็ไม่จำเป็นต้องกดปุ่ม [get value from netpie] ก็ได้ เพราะโปรแกรมจะอ่านค่าจาก netpie มาทุกทุก 5 วินาที เพื่อมาแสดงผล

ส่วนถ้าจะยัด microgear ลงไปใน component ของ app inventor นี่ อันนี้ขอผ่าน ฝีมือยังไม่ถึง รอเซียนทั้งหลายเขาทำมาละกัน 😛

download code

more information

ปล. app inventor มีออกชุดพัฒนาสำหรับ iot แล้วนะ ลองดูที่นี่ http://iot.appinventor.mit.edu