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
}
////////////////////////////////
//=========== ช่วงประมวลผลคำสั่ง =============
}
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;
}