Theory - Zer0Gnap/Smartfarm-With-IoT GitHub Wiki

ทฤษฏีที่เกี่ยวข้อง

Software

  • Wed Application

Libary

1.microgear libary

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

Microgear.create ( key, secret, [alias] )

เป็นการสร้าง microgear
  • key - เป็น key สำหรับ gear ที่จะรัน ใช้ในการอ้างอิงตัวตนของ gear
  • secret - เป็น secret ของ key ซึ่งจะใช้ประกอบในกระบวนการยืนยันตัวตน
  • alias - เป็นการตั้งชื่อเรียก จะใส่ในalias หรือ setAlias()ภายหลังก็ได้

1556451432466

microgear.connect(APPID);

การเชื่อมต่อ NETPIE ด้วย microgear
  • APPID คือ Application เป้าหมายที่microgearจะเชื่อมต่อ

microgear.publish (topic, message)

เป็นการส่งข้อความแบบไม่เจาะจงผู้รับ ซึ่งจะมีแต่ microgear ที่ subscribe topoic นี้เท่านั้น ที่จะได้รับข้อความ
  • topic string - ชื่อของ topic ที่ต้องการจะส่งข้อความไปถึง
  • message string|number|object - ข้อความ

microgear.subscribe (topic)

ใช้subscribe เพื่อรับ message ของ topic ที่สนใจ
  • topic -topic ที่สนใจ

microgear.on (event, callback)

การทำงาน microgear จะเป็น Event แล้วจึงไปเรียก function ที่กำหนดไว้
  • event -ชื่อ Event
  • callback -เรียก function

2.PDO [PHP Data Objects]

เป็น extension ที่สร้างขึ้นเพื่อใช้ในการติดต่อ Database ซึ่งสามารถจัดการ MySQL,SQLite หรือ PostgreSQL ได้ด้วยโค้ดแบบเดียวกัน [uniform method of access]

try {$dh = new PDO("mysql:host=$host;dbname=$dbname", $user, $pass); }

catch(PDOException $e) {echo $e->getMessage();}

3.canvas (javascript)

<canvas> -เป็นการวาดออบเจคต์ (ข้อความ รูป กล่องข้อความ) และสามารถตกแต่งออบเจคต์แต่ละตัวได้ใผ่าน CSS (ใส่สีพื้น วาดเส้นขอบ ทำมุมโค้ง)

4.Javascript chart.js

1556642044050

5.materialdesignicons

<link rel="stylesheet" href="vendors/iconfonts/mdi/css/materialdesignicons.min.css">

Hardware

1.Library Wire.h

ในการใช้งานการเชื่อมต่อแบบ 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

i2c.png


2.Library SPI.h

เป็นไลบารี่ที่มีการอ้างอิงถึงรีจิสเตอร์และการเชื่อมต่อสายที่ไม่ได้ระบุขาโดยตรง ซึ่ง SPI เป็นบัสสื่อสารอีกตัวหนึ่ง มีความสามารถในการเชื่อมต่ออุปกรณ์หลาย ๆ ตัวเข้าด้วยกันโดยใช้สายเส้นเดียวกัน การทำงานจะใช้สายสัญญาณ 2 เส้นในการรับ-ส่งข้อมูล และมีขาควบคุมการรับ-ส่งข้อมูล การใช้งานจะแบ่งเป็นตัวแม่ (Master) ซึ่งเป็นไมโครคอนโทรลเลอร์ และตัวลูก (Slave) คืออุปกรณ์ที่นำมาต่อเพื่อสื่อสารด้วย การสื่อสารผ่านบัส SPI มีสายสัญญาณทั้งหมด 4 เส้น คือ

  • MOSI = สายที่ใช้ส่งสัญญาณจากตัวแม่ไปยังตัวลูก
  • MISO = สายที่ช้รับสัญญาณจากตัวลูก
  • SCK = เป็นสายควบคุมจังหวะการรับ–ส่งข้อมูล
  • CS = เป็นสายใช้ควบคุมอุปกรณ์ที่ต้องการจะคุยด้วย

350px-SPI-three-slaves-svg.png


3.Library OneWire.h

เป็นไลบารี่ที่บรรจุ Source Code คำสั่งสำหรับใช้ติดต่อสื่อสารกับอุปกรณ์จำพวก 1-Wire ไว้ ซึ่ง 1-Wire เป็นการสื่อสารแบบบัสเดี่ยว จุดเด่นคือใช้สายสัญญาณเพียงเส้นเดียวแต่สามารถสื่อสารแบบ 2ทิศทางได้ 1-wire.png


4.Library DallasTemperature.h

ไลบารี่ที่บรรจุคำสั่งสำหรับใช้ติดต่อกับ เซนเซอร์ 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();

Temperature-Sensor-Dallas-Pinout-Diagram-2.jpg


5.Library Adafruit_Sensor.h

ไลบารี่นี้ เอาไว้ใช้กับชิบจำพวกเซนเซอร์ ซึ่งรวบรวมข้อมูลเซนเซอร์หลายๆตัวไว้แล้ว ทำให้ไม่ต้องสร้างไดฟ์เวอร์ใหม่ และลดการเกิดความผิดพลาดและไม่เสียเวลา ด้วยการลดข้อมูลทั้งหมดให้อยู่ใน 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

6.Library Adafruit_BME280.h

เป็นไลบารี่ของ 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();

13676-01.jpg


7.Library Adafruit_SSD1306.h และ Library Adafruit_GFX.h

เป็นไลบารี่สำหรับจอ 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();

128x64-tiny-oled-led-display.jpg


8.Library Microgear.h

ไลบารี่นี้ เป็นไลบารี่ของ 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);
}

9.Library TridentTD_LineNotify.h

TridentTD_LineNotify เป็นไลบรารี่สำหรับส่งเตือนเข้า Line Notify โดยสามารถใช้ได้กับ ESP8266 และ ESP32 สามารถส่งได้ทั้ง ข้อความ สติ๊กเกอร์ และ รูปภาพด้วย URL ได้ ความสามารถในการส่ง หากส่งไม่สำเร็จจะพยายามส่งให้ใหม่อัตโนมัติ 3 ครั้ง

#include <TridentTD_LineNotify.h> //อ้างอิง Library

LINE.setToken(.....) //กำหนด Token

LINE.notify(.....) //คำสั่งส่งข้อความ

10.Library Ultrasonic.h

เป็นไลบารี่ที่บรรจุ 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

71bn1j4-Kz-VL-SX425.jpg


11.Library time.h

ไลบารี่นี้เป็นไลบารี่เวลา จะใช้ไลบารี่นี้เพื่อดึงเวลาจาก 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();


12.Library EEPROM.h

ไลบารี่นี้มีอยู่แล้วใน 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(... , ...))

13.Library BH1750.h

ไลบารี่นี้ เป็นไลบารี่ที่เก็บคำสั่งในการใช้งานของ 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

BH17050.jpg

⚠️ **GitHub.com Fallback** ⚠️