Uncategorized

สอนใช้งาน ESP8266 Soil NPK Sensor เซ็นเซอร์วัดธาตุสารอาหารในดิน RS485 วัดค่า ไนโตรเจนในดิน ฟอสฟอรัส และโพแทสเซียม PR-3000-TR-NPK-N01

อุปกรณ์ที่ต้องใช้ใน บทความ สอนใช้งาน ESP8266 Soil NPK Sensor เซ็นเซอร์วัดธาตุสารอาหารในดิน RS485 วัดค่า ไนโตรเจนในดิน ฟอสฟอรัส และโพแทสเซียม PR-3000-TR-NPK-N01

วิธีการต่ออุปกรณ์ สอนใช้งาน ESP8266 Soil NPK Sensor เซ็นเซอร์วัดธาตุอาหารในดิน วัดค่าไนโตรเจน ฟอสฟอรัส โพแทสเซียม

1.เชื่อมต่ออุปกรณ์ตามด้านล่าง

ESP8266 -> RS485 module
            • Vin(5VDC) -> VCC
            • GND -> GND
            • D5 -> RO
            • D6 -> DI
            • D3 -> DE
            • D4 -> RE

RS485 module -> Soil NPK Sensor
            • VCC -> สายสีน้ำตาล
            • GND -> สายสีดำ
            • B -> B-
            • A -> A+

ESP8266 -> จอแสดงผล OLED 128×64 ขนาด 0.96”
            • Vin(5VDC) -> VCC
            • GND -> GND
            • D2 -> SDA
            • D1 -> SCL

*** Vin คือ แรงดันไฟฟ้าที่เชื่อมต่อมาจากภายนอกทำให้อุปกรณ์ที่เชื่อมต่อกับช่อง Vin นี้จะได้รับแรงดันไฟฟ้าขนาดเท่ากับแหล่งจ่ายไฟที่นำมาเชื่อมต่อ ซึ่งต่างจากช่อง 3v3 ที่ปล่อยแรงดันไฟฟ้าสูงสุดที่ 3.3VDC เท่านั้น สำหรับบอร์ด ESP8266 ไม่ควรใช้งานช่อง Vin เกิน 5 VDC เพราะอาจทำให้บอร์ด ESP8266 เกิดความเสียหายได้ ***

2. เมื่อเชื่อมต่ออุปกรณ์เรียบร้อยแล้ว ให้ทำการดาวน์โหลด Library ทั้ง 2 จากลิ้งค์ข้างล่าง

ดาวน์โหลด Library 


วิธีลง Library ให้ดูตัวอย่างในบทความนี้

3. ทำการแยกไฟล์ทั้ง 2 ไฟล์ออกมา สำหรับการแยกไฟล์นั้นจำเป็นที่จะต้องมีโปรแกรม WinRAR หรือ WinZip ติดตั้งอยู่ในเครื่องเสียก่อน


4. เมื่อทำการแยกไฟล์ออกมาแล้วให้ทำการ Copy โฟลเดอร์ไปไว้ในโฟลเดอร์ libraries ของโปรแกรม Arduino IDE
ตัวอย่าง Location : This PC > Document > Arduino > libralies












5. เปิดโปรแกรม Arduino IDE ขึ้นมา


6. จากนั้น Copy โค๊ดตัวอย่างด้านล่างไปวางไว้ในโปรแกรม Arduino IDE

#include <SoftwareSerial.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
 
#define SCREEN_WIDTH 128    // OLED display width, in pixels
#define SCREEN_HEIGHT 64    // OLED display height, in pixels
#define OLED_RESET -1       // Reset pin # (or -1 if sharing Arduino reset pin)
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
 
#define RE 2
#define DE 0
 
//const byte code[]= {0x01, 0x03, 0x00, 0x1e, 0x00, 0x03, 0x65, 0xCD};
const byte nitro[] = {0x01,0x03, 0x00, 0x1e, 0x00, 0x01, 0xe4, 0x0c};
const byte phos[] = {0x01,0x03, 0x00, 0x1f, 0x00, 0x01, 0xb5, 0xcc};
const byte pota[] = {0x01,0x03, 0x00, 0x20, 0x00, 0x01, 0x85, 0xc0};
 
byte values[11];
SoftwareSerial mod(14,12);
 
void setup() {
  Serial.begin(9600);
  mod.begin(4800);
  pinMode(RE, OUTPUT);
  pinMode(DE, OUTPUT);
  
  display.begin(SSD1306_SWITCHCAPVCC, 0x3C); //initialize with the I2C addr 0x3C (128x64)
  delay(500);
  display.clearDisplay();
  display.setCursor(25, 15);
  display.setTextSize(1);
  display.setTextColor(WHITE);
  display.println(" NPK Sensor");
  display.setCursor(25, 35);
  display.setTextSize(1);
  display.print("Initializing");
  display.display();
  delay(3000);
}
 
void loop() {
  byte val1,val2,val3;
  val1 = nitrogen();
  delay(250);
  val2 = phosphorous();
  delay(250);
  val3 = potassium();
  delay(250);
  
  
  Serial.print("Nitrogen: ");
  Serial.print(val1);
  Serial.println(" mg/kg");
  Serial.print("Phosphorous: ");
  Serial.print(val2);
  Serial.println(" mg/kg");
  Serial.print("Potassium: ");
  Serial.print(val3);
  Serial.println(" mg/kg");
  delay(2000);
 
  display.clearDisplay();
  
 
  display.setTextSize(2);
  display.setCursor(0, 5);
  display.print("N: ");
  display.print(val1);
  display.setTextSize(1);
  display.print(" mg/kg");
 
  display.setTextSize(2);
  display.setCursor(0, 25);
  display.print("P: ");
  display.print(val2);
  display.setTextSize(1);
  display.print(" mg/kg");
 
  display.setTextSize(2);
  display.setCursor(0, 45);
  display.print("K: ");
  display.print(val3);
  display.setTextSize(1);
  display.print(" mg/kg");
 
  display.display();
}
 
byte nitrogen(){
  digitalWrite(DE,HIGH);
  digitalWrite(RE,HIGH);
  delay(10);
  if(mod.write(nitro,sizeof(nitro))==8){
    digitalWrite(DE,LOW);
    digitalWrite(RE,LOW);
    for(byte i=0;i<7;i++){
    //Serial.print(mod.read(),HEX);
    values[i] = mod.read();
    //Serial.print(values[i],HEX);
    }
    //Serial.println();
  }
  return values[4];
}
 
byte phosphorous(){
  digitalWrite(DE,HIGH);
  digitalWrite(RE,HIGH);
  delay(10);
  if(mod.write(phos,sizeof(phos))==8){
    digitalWrite(DE,LOW);
    digitalWrite(RE,LOW);
    for(byte i=0;i<7;i++){
    //Serial.print(mod.read(),HEX);
    values[i] = mod.read();
    //Serial.print(values[i],HEX);
    }
    //Serial.println();
  }
  return values[4];
}
 
byte potassium(){
  digitalWrite(DE,HIGH);
  digitalWrite(RE,HIGH);
  delay(10);
  if(mod.write(pota,sizeof(pota))==8){
    digitalWrite(DE,LOW);
    digitalWrite(RE,LOW);
    for(byte i=0;i<7;i++){
    //Serial.print(mod.read(),HEX);
    values[i] = mod.read();
    //Serial.print(values[i],HEX);
    }
    Serial.println();
  }
  return values[4];
}

15. เมื่อทำการเปลี่ยนค่าการอ่านข้อมูลแล้ว จะเห็นได้ว่าที่หน้าจอ Serial Monitor จะแสดงข้อมูลค่าตัวเลข NPK (ไนโตรเจน ฟอสฟอรัส โพแทสเซียม) ที่เซ็นเซอร์วัดได้ขึ้นมา ซึ่งตัวเลขที่แสดงในหน้าจอ Serial Monitor นี้จะตรงกับค่าตัวในหน้าจอแสดงผล






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






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





Link:https://www.cybertice.com/article/459