Theory - Zer0Gnap/Smartfarm-With-IoT GitHub Wiki
microgear เป็น client library ของ NETPIE ที่เปลี่ยน web browser ให้เป็น microgear เพื่อสื่อสารกับmicrogear ใน platform อื่นๆ เช่น arduino, raspberry pi หรือ computer สามารถนำmicrogear libaryไปพัฒนาIOT console หรือ mobile application โดยการเขียนภาษา HTML/JavaScript เพื่อการพัฒนา IOT application โดย microgear รองรับweb browserดังต่อไปนี้ Chrome,Firefox,Opera,Safari,Internet Explorer,Edge
-
key
- เป็น key สำหรับ gear ที่จะรัน ใช้ในการอ้างอิงตัวตนของ gear -
secret
- เป็น secret ของ key ซึ่งจะใช้ประกอบในกระบวนการยืนยันตัวตน -
alias
- เป็นการตั้งชื่อเรียก จะใส่ในalias
หรือsetAlias()
ภายหลังก็ได้
-
APPID
คือ Application เป้าหมายที่microgearจะเชื่อมต่อ
เป็นการส่งข้อความแบบไม่เจาะจงผู้รับ ซึ่งจะมีแต่ microgear ที่ subscribe topoic นี้เท่านั้น ที่จะได้รับข้อความ
-
topic
string - ชื่อของ topic ที่ต้องการจะส่งข้อความไปถึง -
message
string|number|object - ข้อความ
-
topic
-topic ที่สนใจ
-
event
-ชื่อ Event -
callback
-เรียก function
เป็น extension ที่สร้างขึ้นเพื่อใช้ในการติดต่อ Database ซึ่งสามารถจัดการ MySQL,SQLite หรือ PostgreSQL ได้ด้วยโค้ดแบบเดียวกัน [uniform method of access]
<canvas>
-เป็นการวาดออบเจคต์ (ข้อความ รูป กล่องข้อความ) และสามารถตกแต่งออบเจคต์แต่ละตัวได้ใผ่าน CSS (ใส่สีพื้น วาดเส้นขอบ ทำมุมโค้ง)
<link rel="stylesheet" href="vendors/iconfonts/mdi/css/materialdesignicons.min.css">
ในการใช้งานการเชื่อมต่อแบบ I2C จะใช้งานผ่านไลบารี่ Wire.h เสมอ โดยเริ่มต้นจะต้องเรียกใช้ Wire.begin() เพื่อกำหนดขาของ SCL, SDA ซึ่งมีรูปแบบการใช้ดังนี้
#include <Wire.h> //อ้างอิง Library
void Wire.begin(int sda = -1, int scl = -1,long frequency = 100000);
- int sda = หมายเลข GPIO ที่ต้องการจะใช้เป็นขา SDA (ค่าเริ่มต้น = -1)
- int scl = หมายเลข GPIO ที่ต้องการจะใช้เป็นขา SCL (ค่าเริ่มต้น = -1)
- long frequency = ความเร็วในการส่งข้อมูล (ค่าเริ่มต้น = 100kHz)
หากไม่มีการกำหนดค่าในพารามิเตอร์ sda และ scl โปรแกรมจะใช้ขาตาม Pinout ซึ่ง ESP32 จะใช้ขา GPIO22 เป็นขา SCL และขา GPIO21 เป็นขา SDA
เป็นไลบารี่ที่มีการอ้างอิงถึงรีจิสเตอร์และการเชื่อมต่อสายที่ไม่ได้ระบุขาโดยตรง ซึ่ง SPI เป็นบัสสื่อสารอีกตัวหนึ่ง มีความสามารถในการเชื่อมต่ออุปกรณ์หลาย ๆ ตัวเข้าด้วยกันโดยใช้สายเส้นเดียวกัน การทำงานจะใช้สายสัญญาณ 2 เส้นในการรับ-ส่งข้อมูล และมีขาควบคุมการรับ-ส่งข้อมูล การใช้งานจะแบ่งเป็นตัวแม่ (Master) ซึ่งเป็นไมโครคอนโทรลเลอร์ และตัวลูก (Slave) คืออุปกรณ์ที่นำมาต่อเพื่อสื่อสารด้วย การสื่อสารผ่านบัส SPI มีสายสัญญาณทั้งหมด 4 เส้น คือ
- MOSI = สายที่ใช้ส่งสัญญาณจากตัวแม่ไปยังตัวลูก
- MISO = สายที่ช้รับสัญญาณจากตัวลูก
- SCK = เป็นสายควบคุมจังหวะการรับ–ส่งข้อมูล
- CS = เป็นสายใช้ควบคุมอุปกรณ์ที่ต้องการจะคุยด้วย
เป็นไลบารี่ที่บรรจุ Source Code คำสั่งสำหรับใช้ติดต่อสื่อสารกับอุปกรณ์จำพวก 1-Wire ไว้ ซึ่ง 1-Wire เป็นการสื่อสารแบบบัสเดี่ยว จุดเด่นคือใช้สายสัญญาณเพียงเส้นเดียวแต่สามารถสื่อสารแบบ 2ทิศทางได้
ไลบารี่ที่บรรจุคำสั่งสำหรับใช้ติดต่อกับ เซนเซอร์ Dallas เพื่อวัดอุณหูมิ การต่อสัญญาร เป็นแบบ 1-Wire สื่อสารสายเดี่ยว
การอ้างอิง Library DallasTemperature.h จำเป็นต้องอ้างอิง Library OneWire.h ด้วย เนื่องจาก Dallas ต่อสายสัญญาณแบบ 1-Wire
#include <OneWire.h>
#include <DallasTemperature.h>
ทำการตั้งค่า Pin ที่จะใช้เป็น Pin สื่อสาร 1-Wire
OneWire oneWire(ONE_WIRE_BUS);
สร้างตัวแปร Dallas เพื่อกำหนดพารามิเตอร์ โดยพารามิเตอร์ต้องเป็น Pin 1-Wire
DallasTemperature sensors(&oneWire);
ทำการ begin() Dallas
sensors.begin();
ทำการวัดอุณหภูมิ หน่วยเป็นองศาเซลเซียส ได้ดังนี้
sensors.requestTemperatures();
ไลบารี่นี้ เอาไว้ใช้กับชิบจำพวกเซนเซอร์ ซึ่งรวบรวมข้อมูลเซนเซอร์หลายๆตัวไว้แล้ว ทำให้ไม่ต้องสร้างไดฟ์เวอร์ใหม่ และลดการเกิดความผิดพลาดและไม่เสียเวลา ด้วยการลดข้อมูลทั้งหมดให้อยู่ใน Library และหน่วย SI ที่ได้มาตรฐานสำหรับแต่ละตระกูล Library นี้ จะทำให้การสลับรุ่นเซนเซอร์ที่มีผลกระทบกับระบบได้ ช่วยลดความเสี่ยงและปัญหาของความพร้อมใช้งานของเซนเซอร์และการเข้ารหัสซ้ำ โดยเซนเซอร์ที่ใช้ร่วมกับ Adafruit_Sensor.h ได้แก่
Sensor วัดการเร่งความเร็ว
- ADXL345
- LSM303DLHC
- MMA8451
Sensor วัดการหมุนวน
- L3GD20
Sensor แสง
- TSL2561
Sensor วัดแม่เหล็ก
- LSM303DLHC
- HMC5883
Sensor ความดันอากาศ
- BMP085
- BMP183
Sensor วัดความชื้นและอุณหภูมิ
- DHT
Sensor วัดความชื้น,อุณหภูมิและความดันบรรยากาศ
- BME280
Sensor Orientation
- BNO055
เป็นไลบารี่ของ BME280 (อุณหภูมิ ความชื้น และความดันอาการ) สามารถต่อสายสัญญาณได้ทั้งรูปแบบ Wire และ SPI
ในการอ้างอิง Library จะต้องอ้างอิงถึง Wire ถ้าต่อสายสัญญาณแบบ I2C และอ้างอิงถึง SPI.h ถ้าต่อสายสัญญาณแบบ SPI
#include <Wire.h>
#include <SPI.h>
#include <Adafruit_Sensor.h>
#include <Adafruit_BME280.h>
สร้างตัวแปร bme เพื่อกำหนดพารามิเตอร์ โดยแบ่งได้เป็น 3 อย่างดังนี้
Adafruit_BME280 bme; // I2C
Adafruit_BME280 bme(BME_CS); // hardware SPI
Adafruit_BME280 bme(BME_CS, BME_MOSI, BME_MISO, BME_SCK); // software SPI
เริ่มต้น ทำการ begin() ก่อน
if (!bme.begin()) {
Serial.println("Could not find a valid BME280 sensor, check wiring!");
while (1);
}
ทำการวัดอุณหภูมิ หน่วยเป็นองศาเซลเซียส
bme.readTemperature();
ทำการวัดความดันอากาศ หน่วยเป็น Pascals
bme.readPressure();
ทำการวัดระดับความสูง หน่วยเป็นเมตร
bme.readAltitude(SEALEVELPRESSURE_HPA);
ทำการวัดความชื้นอากาศ หน่วยเป็นเปอร์เซน
bme.readHumidity();
เป็นไลบารี่สำหรับจอ OLED ที่ใช้ไดฟ์เวอร์ SSD1306 จอแสดงผล OLED สามารถต่อสายสัญญาณได้ทั้งแบบ I2C และ SPI ไลบารี่นี้ ควรใช้คู่กับไลบารี่ Wire.h
ในการอ้างอิง Library จะต้องอ้างอิงถึง Wire ถ้าต่อสายสัญญาณแบบ I2C และอ้างอิงถึง SPI.h ถ้าต่อสายสัญญาณแบบ SPI
#include <SPI>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
สร้างตัวแปร display เพื่อกำหนดพารามิเตอร์
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
- SCREEN_WIDTH = ความกว้างของจอ OLED
- SCREEN_HEIGHT = ความสูงของจอ OLED
- &Wire = กำหนดว่าเป็นการต่อสัญญาณแบบ Wire
- OLED_RESET = Pin Reset
ในเริ่มต้น ต้องทำการ begin() ก่อน
if(!display.begin(SSD1306_SWITCHCAPVCC, 0x3D)) { // Address 0x3D for 128x64
Serial.println(F("SSD1306 allocation failed"));
for(;;); // ถ้ายังเชื่อมต่อไม่ได้ ให้ทำการวน loop
}
- SSD1306_SWITCHAPVCC = เป็นค่าคงที่ที่ระบุประเภทของแหล่งพลังงานไปยังไลบรารี
- Ox3D = Address ของ OLED 128x64
เมื่อต้องการเคลียร์หน้าจอให้ว่าง สามารภใช้คำสั่งดังนี้
display.clearDisplay();
ถ้าต้องการเปลี่ยนขนานของตัวอักษร สามารถใช้คำสั่งดังนี้
display.setTextSize(1);
ถ้าต้องการเปลี่ยนสีตัวอักษร สามารถใช้คำสั่งดังนี้
display.setTextColor(WHITE);
การเริ่มต้นตัวอักษรสามารถใช้คำสั่งดังนี้ โดยมีพารามิเตอร์ Top ,Left ตามลำดับ
display.setCursor(0, 0); // 0, 0 คือเริ่มจากบนสุด และซ้ายสุด
การวาดตัวอักษรสามารถเขียนได้ดังนี้
display.println("Text"); //ขึ้นบรรทัดใหม่
display.print("Text"); //ไม่ขึ้นบรรทัดใหม่
เมื่อต้องการเขียนหน้าจอ ให้ทำการ display() ไว้ขั้นตอนสุดท้าย
display.display();
ไลบารี่นี้ เป็นไลบารี่ของ NETPIE ที่เป็น Platfrom IOT โดยคำสั่งที่ใช้มีดังนี้ เริ่มต้นให้สร้าง microgear
microgear.init(KEY, SECRET, ALIAS);
- KEY = เป็นคีย์ที่ได้มาจากการเว็บ netpie.io
- SECRET = เป็นคีย์ลับ ใช้ประกอบการยืนยันตัวตน
- ALIAS = เป็นชื่อเล่นให้ microgear เพื่อให้อ้างถึง
การเชื่อมต่อ NETPIE จะต้องให้ microgear ทำการเชื่อมต่อ โดยใช้คำสั่ง
microgear.connect(APPID);
- APPID = กลุ่มของ Application ที่ microgear ทำการเชื่อมต่อ
microgear สามารถตั้งชื่อเล่นหรือนามแฝงของตัวเองได้ ซึ่งสามารถให้ microgear ตัวอื่นสามารถสื่อสานได้ผ่านทางฟังก์ชั้น chat() และชื่อดังกล่าวจะปรากฏหน้าจัดการ key บน NETPIE อัตโนมัติ
microgear.setAlias(ALIAS);
- ALIAS = เป็นชื่อเล่นให้ microgear เพื่อให้อ้างถึง
microgear สามารถตรวจเช็คสถานะในการเชื่อมต่อ NETPIE ได้ โดยจะ return ค่า เป็น true หรือ false
microgear.connected();
เพื่อคงสภาพการเชื่อมต่อ NETPIE ไว้ จำเป็นจะต้องใช้ฟังก์ชัน loop() ในการคงสภาพ และควรเอาไว้ใน arduino loop()
void loop(){
if(microgear.connectes()){
microgear.loop();
}
}
microgear สามารถส่งข้อความไปยัง microgear ตัวอื่นได้
microgear.chat(GEARNAME, message);
- GEARNAME = ชื่อเล่นหรือนามแฝง microgear ที่จะส่งข้อความให้
- message = ข้อความทที่ต้องการจะส่ง
ในกรณีอยากส่งข้อความแบบไม่เจาะจงผู้รับ สามารถใช้ pulish ในการส่งไปหา topic ได้ microgear ที่ subscribe topic นี้ไว้ จะได้รับข้อความ
microgear.publish (topic, message, [retained]);
- topic = ชื่อของ topic ที่ต้องการจะส่งข้อความไปถึง
- message = ข้อความที่จะส่ง
- [retained] = ต้องการให้ retian ข้อความหรือไม่ ต้องการใส่ true ถ้าไม่ต้องการใส่ false (พารามิเตอร์นี้ ถ้าไม่ใส่จะเป็นค่าเริ่มต้น = false)
ถ้า microgear สนใจ topic ใดโดยเฉพาะ สามารถให้ฟังก์ชัน subscribe() ในการรับ message ของ topic นั้นที่เข้ามา
microgear.subscribe(topic);
- topic = ชื่อของ topic ที่สนใจ
microgear จะมีการทำงานแบบ Event คือเป็นการตอบสนองต่อ Event ต่างๆ ด้วยการเขียน function มารองรับดังนี้
void microgear.on (event, callback)
- event = ชื่อของ Event
- callback = callback ฟังก์ชัน
Event : connect เมื่ออุปกรณ์เชื่อมต่อกับ NETPIE สำเร็จ
microgear.on(CONNECTED, onConnected); //ประกาศฟังก์ชัน
void onConnected(char *attribute, uint8_t* msg, unsigned int msglen) {
Serial.println("Connected to NETPIE...");
microgear.setAlias(ALIAS);
}
Event : absent เมื่อมีอุปกรณ์อื่นตัดขาดการเชื่อมต่อ NETPIE
microgear.on(ABSENT,onLostgear);
void onLostgear(char *attribute, uint8_t* msg, unsigned int msglen) {
Serial.print("Lost member --> ");
for (int i=0; i<msglen; i++)
Serial.print((char)msg[i]);
Serial.println();
}
Event : present เมื่อมีอุปกรณ์อื่นทำการเชื่อมต่อ NETPIE
microgear.on(PRESENT,onFoundgear);
void onFoundgear(char *attribute, uint8_t* msg, unsigned int msglen) {
Serial.print("Found new member --> ");
for (int i=0; i<msglen; i++)
Serial.print((char)msg[i]);
Serial.println();
}
Event : message เมื่อมี message เขามาหรือ topic ที่ทำการ subscribe มี massage เข้ามา
microgear.on(MESSAGE,onMsghandler);
void onMsghandler(char *topic, uint8_t* msg, unsigned int msglen) {
Serial.print("Incoming message --> ");
msg[msglen] = '\0';
Serial.println((char *)msg);
}
TridentTD_LineNotify เป็นไลบรารี่สำหรับส่งเตือนเข้า Line Notify โดยสามารถใช้ได้กับ ESP8266 และ ESP32 สามารถส่งได้ทั้ง ข้อความ สติ๊กเกอร์ และ รูปภาพด้วย URL ได้ ความสามารถในการส่ง หากส่งไม่สำเร็จจะพยายามส่งให้ใหม่อัตโนมัติ 3 ครั้ง
#include <TridentTD_LineNotify.h> //อ้างอิง Library
LINE.setToken(.....) //กำหนด Token
LINE.notify(.....) //คำสั่งส่งข้อความ
เป็นไลบารี่ที่บรรจุ Source Code คำสั่งสำหรับควบคุม Ultrasonic HC-SR04 โดยมีคำสั่งที่ใช้ดังนี้
#include <Ultrasonic.h> //อ้างอิง Library
Ultrasonic ultrasonic(12,13); //กำหนดตัวแปร และกำหนดค่าพารามิเตอร์ Trig และ Echo ตามลำดับ
ultrasonic.read() //ฟังก์ชันในการอ่านค่า หน่วยเป็น CM
ultrasonic.read(CM) //ฟังก์ชันในการอ่านค่า หน่วยเป็น CM
ultrasonic.read(INC) //ฟังก์ชันในการอ่านค่า หน่วยเป็น inches
ไลบารี่นี้เป็นไลบารี่เวลา จะใช้ไลบารี่นี้เพื่อดึงเวลาจาก sever
#include <time.h> //อ้างอิง Library
กำหนด Timezone และ server ของเวลา
configTime(timezone, dst, ntp_server1, ntp_server2, ntp_server3);
- timezone = โซนเวลาของประเทศที่ต้องการ
- dst = Daylight Savings Time
- ntp_server1, ntp_server2, ntp_server3 = server เวลา
โดยเมื่อต้องการเวลา สามารถเขียนโค้ดได้ดังนี้
String Time() {
time_t now = time(nullptr);
struct tm* newtime = localtime(&now);
String tmpNow = "";
tmpNow += " ";
tmpNow += String(newtime->tm_hour);
tmpNow += ":";
tmpNow += String(newtime->tm_min);
tmpNow += ":";
tmpNow += String(newtime->tm_sec);
return tmpNow;
}
โดยวิธีการเรียกใช้คือ Time();
และเมื่อต้องการวัน เดือน ปี ปัจจุบัน สามารถเขียนโค้ดได้ดังนี้
String Date() {
time_t now = time(nullptr);
struct tm* newtime = localtime(&now);
String tmpNow = "";
tmpNow += String(newtime->tm_mday);
tmpNow += "-";
tmpNow += String(newtime->tm_mon + 1);
tmpNow += "-";
tmpNow += String(newtime->tm_year + 1900);
return tmpNow;
}
โดยวิธีเรียกใช้คือ Date();
ไลบารี่นี้มีอยู่แล้วใน Arduino IDE อยู่แล้ว ไม่ต้องติดตั้งเพิ่ม EEPROM เป็นหน่วยความจำขนาดเล็กที่จะเก็บไว้ถึงแม้จะปิดบอร์ดก็ตาม ไลบารี่นี้จะช่วยในการอ่านและเขียน EEPROM โดยคำสั่งที่ใช้มีดังนี้
#include <EEPROM.h> //อ้างอิง Library
EEPROM.begin(EEROM.length()) //เริ่มต้น EEPROM โดยใส่ค่าพารามิเตอร์เป็นขนาดของ EEPROM
EEPROM.read(...) //อ่านค่าใน EEPROM โดยใส่พารามิเตอร์เป็น Address ที่อยู่ของข้อมูล
EEPROM.write(... , ...) //เขียนค่า EEPROM โดยใส่พารามิเตอร์เป็น Address , ข้อมูล ตามลำดับ
EEPROM.commit() //เป็นการบันทึกค่าลงใน EEPROM (ต้องใช้คำสั่งนี้ทุกครั้งที่มีกร EEPROM.write(... , ...))
ไลบารี่นี้ เป็นไลบารี่ที่เก็บคำสั่งในการใช้งานของ BH1750 เอาไว้ โดยมีคำสั่งที่ใช้ดังนี้
#include <BH1750.h> //อ้างอิง Library
BH1750 lightmeter; //กำหนดตัวแปร
lightmeter.begin() //ทำการ Set up BH1750
lightmeter.readLightLevel() //อ่านค่าแสงโดยค่าที่ได้เป็นค่า lux
ในการใช้ไลบารี่นี้ จำเป็นจะต้องใช้ไลบารี่ Wire.h ด้วย เพราะเป็นการเชื่อมต่อแบบ I2C โดยมีคำสั่งที่ใช้ดังนี้
#include <Wire.h> //อ้างอิงถึง Library
Wire.begin() //กำหนดขา SDA SCL ถ้าไม่กำหนดค่าอะไรเลย SDA,SCL จะใช้ขาของ Pinout