2.4 การประยุกต์ใช้ FreeBoards ของ Netpie

1.โครงงานระบบสมาร์ทฟาร์ม

สถานการณ์ : - หากความชุ่มฉ่ำของน้ำในดินมีค่าน้อยกว่า 45 เปอร์เซนต์ ปั๊มน้ำจะฉีดน้ำออกมาให้กับระบบ

- หากคามชุ่มฉ่ำของน้ำในดินมีค่าตั้งแต่ 45 เปอร์เซนต์ขึ้นไป หรือความชื้นสัมพัทธ์มีค่ามากกว่า 79 ขึ้นไปปั๊มน้ำจะหยุดฉีดน้ำ

- แสดงผลผ่านจอ LCD และ Dashboard ใน FreeBoard

Arduino IDE Code

Arduino IDE Code

#include "DHT.h"

#include <AuthClient.h>

#include <MicroGear.h>

#include <MQTTClient.h>

#include <SHA1.h>

#include <Arduino.h>

#include <ESP8266WiFi.h>

#include <ESP8266WebServer.h>

#include <ESP8266mDNS.h>

#include <EEPROM.h>

#include <Wire.h>

#include <LiquidCrystal_I2C.h>

#include <BH1750FVI.h>

#include <MicroGear.h>

// Set the LCD address to 0x27 for a 16 chars and 2 line display

// NodeMCU Dev Kit => D1 = SCL, D2 = SDA

//LiquidCrystal_I2C lcd(0x27, 20, 4);

LiquidCrystal_I2C lcd(0x3F, 20, 4);

BH1750FVI LightSensor(BH1750FVI::k_DevModeContLowRes);

/////////////////// ตั้งค่า Logic การเปิดปิดไฟ////////////////

int L = 0;

int H = 1;

const char* ssid = "BJHome"; // กรอกชื่อ wifi

const char* password = "1234etet90"; // กรอกรหัส wifi

#define APPID "BJHome" //ใส่ APPID ที่สร้างไว้ใน NETPIE

#define KEY "21WwwgfsdfsafdnRmqa" //ใส่ KEY ที่สร้างไว้สำหรับ SmartSensor

#define SECRET "uQEmK6asfapKnubNWf3nJvBV" //ใส่ SECRET ของ KEY ที่สร้างไว้

#define ALIAS "stem" //ตั้งชื่อให้กับอุปกรณ์นี้

#define LEDPinA D3 //=ต่อรีเลย์ช่อง A หรือ LED

#define LEDPinB D4 //=ต่อรีเลย์ช่อง B หรือ LED

#define LEDPinC D5 //=ต่อรีเลย์ช่อง C หรือ LED

#define LEDPinD D6 //=ต่อรีเลย์ช่อง D หรือ LED

#define LEDPinE D0 //=ต่อรีเลย์ช่อง E หรือ LED

#define LEDPinF D8 //=ต่อรีเลย์ช่อง F หรือ LED

#define DHTPIN D7 //ระบุขาที่ต่อกับเซนเซอร์ DHT

#define DHTTYPE DHT22 //ระบุชนิด DHT11 หรือ DHT12 หรือ DHT22

#define RefreshTime 100 //ค่าความถี่ของการส่งข้อมูล

WiFiClient client;

AuthClient *authclient;

DHT dht(DHTPIN, DHTTYPE);

int timer = 0;

char str[32];

MicroGear microgear(client);

void onConnected(char *attribute, uint8_t* msg, unsigned int msglen)

{

Serial.println("Connected to NETPIE..."); //หากการเชื่อมต่อสำเร็จ ให้แสดงข้อความนี้ทาง Serial Monitor

microgear.setAlias(ALIAS);

}

void setup()

{

dht.begin();

lcd.begin();

LightSensor.begin();

Serial.begin(115200);

lcd.print(" KLS SMART FARM" );

lcd.setCursor(1, 1);

lcd.print(" Conecting" );

//////////////////////////////////////////////////////////

pinMode(LEDPinA, OUTPUT);

pinMode(LEDPinB, OUTPUT);

pinMode(LEDPinC, OUTPUT);

pinMode(LEDPinD, OUTPUT);

pinMode(LEDPinE, OUTPUT);

pinMode(LEDPinF, OUTPUT);

digitalWrite(LEDPinA, L);

digitalWrite(LEDPinB, L);

digitalWrite(LEDPinC, L);

digitalWrite(LEDPinD, L);

digitalWrite(LEDPinE, L);

digitalWrite(LEDPinF, L);

microgear.on(MESSAGE, onMsghandler);

microgear.on(CONNECTED, onConnected);

/////////////////////////////////////////////////////////

if (WiFi.begin(ssid, password))

{

while (WiFi.status() != WL_CONNECTED)

{

delay(500);

Serial.print(".");

}

}

Serial.println("WiFi connected");

Serial.println("IP address: ");

Serial.println(WiFi.localIP());

microgear.init(KEY, SECRET, ALIAS);

microgear.connect(APPID);

}

void loop()

{

if (microgear.connected())

{

microgear.loop();

dthana() ;

Serial.println("connect...");

}

else

{

Serial.println("connection lost, reconnect...");

microgear.connect(APPID);

}

delay(500);

}

//////////////////////////////////////////////////////////////////////

void dthana() /////////////// ฟังก์ชันอ่านค่า DHT และ ANALOG 0

{ uint16_t lux = LightSensor.GetLightIntensity();

timer = 0;

int tempread = dht.readTemperature(); //เก็บค่าอุณหภูมิที่อ่านได้ไว้เป็นแบบ float ไว้ในตัวแปร "tempread"

int humidread = dht.readHumidity(); //เก็บค่าความชื้นที่อ่านได้ไว้เป็นแบบ float ไว้ในตัวแปร "humidread"

int soilread = analogRead(0);

char temp[10]; //

char humid[10]; // สร้างตัวแปรไว้ใช้ส่งข้อมูลทาง microgear.chat (ต้องใช้รูปแบบ char)

char light[10]; //

char soil[10]; //

int lightread = lux ;// analogRead(LDRPIN); //เก็บค่าที่อ่านจาก LDR ไว้ในตัวแปรแบบ int ที่ชื่อ LDRread

// LDRread = map(LDRread, 0, 1024, 0, 100);

Serial.print(" Light Read = "); //แล้วแสดงข้อมูลค่า LDR ที่อ่านได้

Serial.print(lightread); //ด้วยการแสดงค่าตัวแปร LDRread ทาง Serial Monitor

Serial.print(" TEMP Read = ");

Serial.print(tempread);

Serial.print(" HUMID Read = ");

Serial.print(humidread);

Serial.print(" SOIL Read = ");

Serial.println(analogRead(0));

/////////////////////////////////////////////////////////

lcd.clear();

lcd.print("Light Temp Humidity ");

lcd.setCursor(1, 1);

lcd.print(lightread);

lcd.setCursor(7, 1);

lcd.print(tempread);

lcd.setCursor(13, 1);

lcd.print(humidread);

delay(1000);

/////////////////////////////////////////////////////////

if (isnan(tempread) || isnan(humidread) || tempread > 1000 || humidread > 1000) // ถ้าอ่านค่าไม่ได้ หรืออ่านค่าได้มากกว่า 100 ให้แสดงค่าเป็น 0 แทน

{

tempread = 0;

humidread = 0;

lightread = 0;

soilread = 0;

}

int tempread_decimal = (tempread - (int)tempread) * 100; // เก็บส่วนของตัวเลขที่อยู่หลังจุดทศนิยม ไปเป็นแบบ int

int humidread_decimal = (humidread - (int)humidread) * 100; // เช่น 35.87 จะเก็บ 87 ไว้ในตัวแปร

sprintf(temp, "%d.%d", (int)tempread, tempread_decimal); // ยัดค่าตัวแปร int เข้าไปในตัวแปร char โดยมีรูปแบบ

sprintf(humid, "%d.%d", (int)humidread, humidread_decimal); // %d.%d = ส่วนจำนวนเต็ม.ส่วนทศนิยม (จะ chat ตัวแปรนี้ไป)

sprintf(light, "%d", lightread); // และเก็บค่า LDR ที่ทำให้เป็น 0-10 แล้ว เข้าไปในตัวแปร char เหมือนกัน

sprintf(soil, "%d", soilread);

microgear.chat("SmartSensor/Temperature", temp); // ทำการ chat ตัวแปรต่างๆ ออกไป

microgear.chat("SmartSensor/Humidity", humid); // โดยใช้ชื่อผู้รับเป็น "SmartSensor/Temp,Humid,LightLevel"

microgear.chat("SmartSensor/LightLevel", lightread); // โดยจะไปรับค่านี้ในเกจแสดงผลอีกที

microgear.chat("SmartSensor/Soil", soilread); // โดยจะไปรับค่านี้ในเกจแสดงผลอีกที

onMsghandler;

}

//////////////////////////////////////////////////////////////////

void onMsghandler(char *topic, uint8_t* msg, unsigned int msglen)

{

Serial.print("Incoming message --> ");

Serial.print(topic);

Serial.print(" : ");

char strState[msglen];

for (int i = 0; i < msglen; i++)

{

strState[i] = (char)msg[i];

Serial.print((char)msg[i]);

}

Serial.println();

String stateStr = String(strState).substring(0, msglen);

//=========== ช่วงประมวลผลคำสั่ง =============

if (stateStr == "ON1")

{

digitalWrite(LEDPinA, H);

microgear.chat("testledstatus", "ON1"); //==== คำสั่ง chat เพื่อบอกส่งค่าสถานะไปยังหลอด LED บน NETPIE Freeboard

}

else if (stateStr == "OFF1")

{

digitalWrite(LEDPinA, L);

microgear.chat("testledstatus", "OFF1"); //==== คำสั่ง chat เพื่อบอกส่งค่าสถานะไปยังหลอด LED บน NETPIE Freeboard

}

/////////////////////2222222222222222222////////////////////////////////////////

else if (stateStr == "ON2")

{

digitalWrite(LEDPinB, H);

microgear.chat("testledstatus", "ON2"); //==== คำสั่ง chat เพื่อบอกส่งค่าสถานะไปยังหลอด LED บน NETPIE Freeboard

}

else if (stateStr == "OFF2")

{

digitalWrite(LEDPinB, L);

microgear.chat("testledstatus", "OFF2"); //==== คำสั่ง chat เพื่อบอกส่งค่าสถานะไปยังหลอด LED บน NETPIE Freeboard

}

/////////////////////3333333333333333333////////////////////////////////////////

else if (stateStr == "ON3")

{

digitalWrite(LEDPinC, H);

microgear.chat("testledstatus", "ON3"); //==== คำสั่ง chat เพื่อบอกส่งค่าสถานะไปยังหลอด LED บน NETPIE Freeboard

}

else if (stateStr == "OFF3")

{

digitalWrite(LEDPinC, L);

microgear.chat("testledstatus", "OFF3"); //==== คำสั่ง chat เพื่อบอกส่งค่าสถานะไปยังหลอด LED บน NETPIE Freeboard

}

/////////////////////4444444444444444444////////////////////////////////////////

else if (stateStr == "ON4")

{

digitalWrite(LEDPinD, H);

microgear.chat("testledstatus", "ON4"); //==== คำสั่ง chat เพื่อบอกส่งค่าสถานะไปยังหลอด LED บน NETPIE Freeboard

}

else if (stateStr == "OFF4")

{

digitalWrite(LEDPinD, L);

microgear.chat("testledstatus", "OFF4"); //==== คำสั่ง chat เพื่อบอกส่งค่าสถานะไปยังหลอด LED บน NETPIE Freeboard

}

/////////////////////555555555555555555555////////////////////////////////////////

else if (stateStr == "ON5")

{

digitalWrite(LEDPinE, H);

microgear.chat("testledstatus", "ON5"); //==== คำสั่ง chat เพื่อบอกส่งค่าสถานะไปยังหลอด LED บน NETPIE Freeboard

}

else if (stateStr == "OFF5")

{

digitalWrite(LEDPinE, L);

microgear.chat("testledstatus", "OFF5"); //==== คำสั่ง chat เพื่อบอกส่งค่าสถานะไปยังหลอด LED บน NETPIE Freeboard

}

/////////////////////6666666666666666666666////////////////////////////////////////

else if (stateStr == "ON6")

{

digitalWrite(LEDPinE, H);

microgear.chat("testledstatus", "ON6"); //==== คำสั่ง chat เพื่อบอกส่งค่าสถานะไปยังหลอด LED บน NETPIE Freeboard

}

else if (stateStr == "OFF6")

{

digitalWrite(LEDPinE, L);

microgear.chat("testledstatus", "OFF6"); //==== คำสั่ง chat เพื่อบอกส่งค่าสถานะไปยังหลอด LED บน NETPIE Freeboard

}

////////////////////////////////

//=========== ช่วงประมวลผลคำสั่ง =============

}

Download ตัวอย่าง Dashboard

2. โครงงานวัดระดับน้ำส่งค่าขึ้นอินเตอร์เน็ต

Arduino IDE Code

#include "DHT.h"

#define DHTTYPE DHT11

#include <Wire.h>

#include <LiquidCrystal_I2C.h>

//LiquidCrystal_I2C lcd(0x27, 20, 4);

LiquidCrystal_I2C lcd(0x3F, 20, 4);

///////////////////////////////

#define pump D0 //ปั๊ม

#define soilA D3 //วัดความชื้น A

#define soilB D4 //วัดความชื้น B

#define soilC D5 //วัดความชื้น C

#define DHTPIN1 D6 // ตั้งค่าพอร์ตDHT

#define trig D7 //อัลตราโซนิกส์พอร์ต Trig

#define echo D8 //อัลตราโซนิกส์พอร์ต Ecro

DHT dht1(DHTPIN1, DHTTYPE);

void setup() {

Serial.begin(9600);

Serial.println("DHTxx test!"); // ปริ้นคำว่า DHTxx test!

dht1.begin(); // เรียกการใช้งาน DHT

pinMode(soilA,INPUT);

pinMode(soilB,INPUT);

pinMode(soilC,INPUT);

pinMode(pump,OUTPUT);

lcd.begin();

}

void loop() {

delay(100);

lcd.clear();

long duration, cm;

pinMode(trig, OUTPUT);

digitalWrite(trig, LOW);

delayMicroseconds(2);

digitalWrite(trig, HIGH);

delayMicroseconds(5);

digitalWrite(trig, LOW);

pinMode(echo, INPUT);

duration = pulseIn(echo, HIGH);

cm = microsecondsToCentimeters(duration);

Serial.print(cm);

Serial.print("cm");

delay(100);

/////////////////////////////////////////////////

float t1 = dht1.readTemperature(); // กำหนดค่าตัวแปร t1 อ่านค่า อุณหภูมิ

float h1 = dht1.readHumidity(); // กำหนดค่าตัวแปร h1 อ่านค่า ความชื้น

Serial.print(" Temperature1: "); // ปริ้นคำว่า Temperature1:

Serial.print(t1); // ปริ้นค่า t1 --> อุณหภูมิ

Serial.print(" \t"); // วรรค

Serial.print("Humid: "); // ปริ้นคำว่า Humid:

Serial.print(h1); // ปริ้นค่า h1 --> ความชื้นสัมพัทธ์

Serial.print(" \t"); //วรรค ขึ้นบรรทัดใหม่

/////////////////////////อ่านค่า soil sensor//////////////////////

Serial.print("soilA = "); Serial.print(digitalRead(soilA));

Serial.print("soilB = "); Serial.print(digitalRead(soilB));

Serial.print("soilC = "); Serial.println(digitalRead(soilC));

////////////////////////////////////////////////////////////////

lcd.print("Humid S1 S2 S3" );

lcd.setCursor(0, 1); lcd.print(h1);

lcd.setCursor(6, 1); lcd.print(digitalRead(soilA));

lcd.setCursor(9, 1); lcd.print(digitalRead(soilB));

lcd.setCursor(12, 1); lcd.print(digitalRead(soilC));

int x = 10-cm; // สมการระยะน้ำเต็ม

if(((x>=3)and (digitalRead(soilA)==0)and (digitalRead(soilB)==0)and (digitalRead(soilC)==0))or((h1>79))) {digitalWrite(pump,HIGH);}

else {digitalWrite(pump,LOW);}

////////////////////////////////////////////////

}

long microsecondsToCentimeters(long microseconds)

{

return microseconds / 29 / 2;

}