Chương 6 Kết luận
6.2. Hướng phát triển của đề tài
Với kết quả đã đạt được, nhóm nghiên cứu nhận thấy hệ thống cần thêm một số cải tiến về ứng dụng quả lý giám sát và cảnh bảo qua tin nhắn SMS, khi có thơng số ơ nhiểm vượt để bà con nuôi tôm kịp thời xử lý. Hệ thống cần thêm một số cải tiến trong thiết kế cơ khí để tăng độ cứng độ bề, và có thể sản xuất và gia công bán ra thị trường với giá cả rẻ bằng ½ giá trị ngoại nhập.
Trên cơ sở kết quả đã đạt được, đề tài có thể phát triển rộng ra trong lĩnh vực ni trồng thủy sản và nơng nghiệp cơng nghệ caọ Tồn bộ hệ thống trang trại được điều khiển và giám sát tự động hóa hồn tồn. Với mơ hình là một hệ thống điều khiển khép kín bao gồm các khâu từ giám sát online, xử lý tuần hồn mơi trường nước cho đến khâu cho ăn tự động thích nghi với từng giai đoạn tăng trưởng của tôm. Dữ liệu của toàn hệ thống được lưu trữ trên Cloud, hỗ trợ cho việc quản lý, điều khiển và truy xuất nguồn gốc thức ăn, tơm giống, qui trình ni cho đến các gia đoạn tăng trưởng của tôm. Đây là cơ sở để phát triển hiện đại hóa ngành ni trồng thủy sản, ứng dụng cơng nghệ cao I4.0 cho sản phẩm tôm Việt Nam để hướng tới đáp ứng các chỉ tiêu xuất khẩu ra thị trường thế giớị
58 -
TÀI LIỆU THAM KHẢO
[1]. Tổng cục Thủy sản - Bộ Nông Nghiệp Và Phát Triển Nông Thôn, “Dự án quan trắc môi trường phục vụ nuôi trồng thủy sản từ 2015 đến 2020”.
[2]. Bộ Nông nghiệp và Phát triển nông thôn - Viện Nghiên Cứu Nuôi Trồng Thủy Sản 1, “Đề án kiểm sốt ơ nhiễm mơi trường ni trồng thủy sản (Tôm, Cá Tra) Đến Năm 2020”, Bắc Ninh, 2013.
[3]. Nguyễn Đình Trung, “Quản lý chất lượng nước trong nuôi trồng thủy sản”, NXB Nông Nghiệp, 2004
[4]. Chanratchakool P., et al. “Health management in shrimp ponds”. (1995).
[5]. Whetstone, Jack M., et al. “Opportunities and constraints in marine shrimp farming”. SRAC, USDA, USA (2002).
[6]. Trương Quốc Phú, “Một số nguyên lý và kỹ thuật ứng dụng trong nuôi trồng thủy sản”, NXB Nông Nghiệp, 2012
[7]. Phạm Thị Tuyết Ngân, và Trương Quốc Phú. “Biến động các yếu tố môi trường trong ao nuôi tôm sú (Penaeus monodon) thâm canh tại Sóc Trăng”. Tạp chí Khoa học Đại học Cần Thơ 15a (2010): 179-188.
[8]. Claude Ẹ Boyd, (Trương Quốc Phú & Vũ Ngọc Út biên dịch), “Quản lý chất lượng nước trong ao nuôi thủy sản”, NXB ĐH Cần Thơ.
[9]. Https://emin.vn/thiet-bi-do-moi-truong-chat-long-thuc-pham-may-do-do-man- 225/pc.html [10]. Https://emin.vn/thiet-bi-do-moi-truong-chat-long-thuc-pham-may-do-do-duc- 195/pc.html [11]. Https://emin.vn/thiet-bi-do-moi-truong-chat-long-thuc-pham-may-do-do-ph- 197/pc.html [12]. Https://emin.vn/thiet-bi-do-moi-truong-chat-long-thuc-pham-may-do-oxy-hoa-tan- do-205/pc.html [13]. Https://cenintec.com/e-aqua [14]. Https://ad.teslateq.vn/
[15]. Satya Nandlal and Timothy Pickering, “Freshwater prawn Macrobrachium rosenbergii farming in Pacific Island countries”, Vol. 1, the University of the South Pacific, 2015.
[16]. Michael B. New, “Farming freshwater prawns, a manual for the culture of the giant river prawn (Macrobrachium rosenbergii)”, FAO Fisheries Technical Paper.
[17]. Mauricio Emerenciano et.al. “Biofloc Technology (BFT): A review for Aquaculture Application and Animal Food Industry”, Intech open sciencẹ
[18]. Https://www.atlas-scientific.com/product_pages/probes/industrial_ph_probẹhtml [19]. Https://www.atlas-scientific.com/product_pages/probes/do_probẹhtml
59 [20]. Https://www.atlas-scientific.com/product_pages/probes/ec_k0-1.html
[21]. Https://wikịdfrobot.com/Turbidity_sensor_SKU__SEN0189 [22]. Https://iotmaker.vn/cam-bien-nhiet-do-probe-ds18b20.html
60
PHỤ LỤC Ạ Phần mềm giám sát và quản trị cơ sở dữ liệu trung tâm của trang trại nuôi tôm
ứng dụng IoT
Ạ1. Chương trình trên Arduino UNO điều khiển cho cơ cấu chấp hành
/* This BTS1 program is designed by Bui Thu Cao, Industrial University of Ho Chi Minh city, 10/06/2019 */
/* Controlling program for BTS1- Actuators*/ #include <SoftwareSerial.h> #include <Servọh> #include <Wirẹh> #include <avr/sleep.h> #define interruptPin 2 SoftwareSerial BTSSerial(4,7); Servo myServo; #define INA 12 #define INB 13 #define ENA 5 String gprs_data = ""; String instSerial, instBTS, res; String const good = "OK"; String const wrong ="Error";
boolean input_serialBTS_complete, input_serial_complete, wakeupflag, RCservofirst, SaFlag;
unsigned long start, times; int angle;
void setup() {
// put your setup code here, to run once: BTSSerial.begin(9600);
Serial.begin(9600); // use for SIM com pinMode(interruptPin, INPUT_PULLUP); Wirẹbegin(); // Join i2c bus delay(1000);
61 Wirẹwrite(0x0F); // Send register ađress (alarm1 seconds)
Wirẹwrite(0); // Write 0 to alarm1 seconds
WirẹendTransmission(); // Stop transmission and release the I2C bus delay(500);
pinMode(10, OUTPUT);
digitalWrite(10, LOW); // Power on for BTS2 pinMode(11, OUTPUT); digitalWrite(11, LOW); pinMode(9, OUTPUT); digitalWrite(9, LOW); pinMode(8, OUTPUT); digitalWrite(8, LOW); delay(2000); instSerial = ""; instBTS = ""; input_serialBTS_complete = false; input_serial_complete = false; wakeupflag = true; SaFlag = false; angle = 0; RCservofirst = true; start = millis();
attachInterrupt(digitalPinToInterrupt(interruptPin), wakeUp, FALLING); delay(500); } void wakeUp(){ sleep_disable(); wakeupflag = true; } void loop() { if (wakeupflag) { // Clear alarm flag
WirẹbeginTransmission(0x68); // Start I2C protocol with DS3231 ađress Wirẹwrite(0x0F); // Send register ađress (alarm1 seconds)
62 Wirẹwrite(0); // Write 0 to alarm1 seconds
WirẹendTransmission(); // Stop transmission and release the I2C bus wakeupflag = false;
// Enable time for loop start = millis();
delay(5000);
digitalWrite(10, HIGH); // Power on for BTS2 delay(2000);
digitalWrite(11, HIGH); // Power RC Servo on delay(2000); myServọattach(3); //======= Setup actuation============ delay(20000); BTSSerial.print("AT R\r\n"); }
// Read instruction from BTS2 if (BTSSerial.available()){ char ch = BTSSerial.read(); instBTS += String(ch); if (ch=='\n') {
input_serialBTS_complete = true;
//BTSSerial.print(instBTS); Use for testing from BTS2 //Serial.print(instBTS); //Use for testing from BTS2 } } if (Serial.available()){ char ch = Serial.read(); instSerial += String(ch); if (ch=='\n') { input_serial_complete = true; //Serial.print(instSerial); } }
63 if (input_serial_complete){ //use for testing BTS1
// Processing instruction from Serial.port char cid = instSerial.charAt(3);
switch (cid) {
case 'B':
digitalWrite(11, HIGH); // Power RC Servo on myServọattach(3); controlRCservo(instSerial); myServọdetach(); break; case 'C': // Control DC motor
digitalWrite(10, HIGH); // Power on for BTS2 delay(4000);
BTSSerial.print("AT A,1,11\r\n"); //Power on for Salinity sensor readBTS(1000); //Clear recieved buffer
delay(1000);
DC_rolling(instSerial);
delay(1000);
digitalWrite(10, LOW); // Power on for BTS2 delay(1000);
break; case 'P':
digitalWrite(11, HIGH); // Power RC Servo on myServọattach(3);
delay(2000);
controlRCservo("AT B,120,03\r\n"); //Rotate to point test (2) //ok delay(1000);
myServọdetach(); delay(5000);
64 delay(4000);
BTSSerial.print("AT A,1,11\r\n"); //Power on for Salinity sensor readBTS(1000);
delay(3000);
DC_rolling("AT C,0,5000\r\n"); // Rolling down to test point (3) //ok delay(4000);
BTSSerial.print("AT R\r\n"); // Send read BTS2 (4) readBTS(25000); gprs_data = res; Serial.print(res); delay(2000); DC_rolling("AT C,1,8000\r\n"); //(5) //+1000 delay(1000);
digitalWrite(10, LOW); // Power on for BTS2
myServọattach(3); delay(2000);
controlRCservo("AT B,000,03\r\n"); //Go to point test (6) //ok myServọdetach();
delay(5000);
digitalWrite(10, HIGH); // Power on for BTS2 delay(2000);
BTSSerial.print("AT A,1,11\r\n"); //Power on for Salinity sensor readBTS(1000);
DC_rolling("AT C,0,3500\r\n"); // Rolling down to water can (7) delay(2000);
digitalWrite(10, LOW); // Power on for BTS2 delay(7000);
65 DC_rolling("AT C,1,7000\r\n"); // Rolling down to water can (8) //ok
delay(3000);
myServọattach(3); delay(2000);
controlRCservo("AT B,090,03\r\n"); //Go to point test (9) myServọdetach();
delay(5000);
digitalWrite(10, LOW); // Power on for BTS2 delay(1000);
break;
default:
res = "Wrong command"; break; } instSerial = ""; input_serial_complete = false; Serial.print(res); } if (input_serialBTS_complete){
// Processing instruction from BTSSerial.port char cid = instBTS.charAt(3);
switch (cid) { case 'R':
digitalWrite(8, HIGH); // Power SIM on delay(15000); gprs_data = instBTS.substring(5)+"\r\n"; SetupIP(); SetupHTTPS(); LoadD(gprs_data); HTTPS_post(2000); delay(15000);
66 digitalWrite(10, LOW); // Power off for BTS2
default:
res = "Wrong command"; break;
}
instBTS = "";
input_serialBTS_complete = false;
//BTSSerial.println(res); //Use for testing from BTS2 }
times = millis()-start;
if (times>=3600000) { // 1 hour measurement a time start = millis(); wakeupflag = true; } /* if (times>=50000) { //BTSSerial.print("AT D,R\r\n");
BTSSerial.println("Go to sleep mode!"); delay(1000); gotoSleep(); } */ } void gotoSleep() { sleep_enable(); set_sleep_mode(SLEEP_MODE_PWR_DOWN); delay(1000); sleep_mode(); }
67 {
unsigned long startTimes = millis(); // Start timer
// Send command to SIM
int L = cmd.length(); for (int i=0; i<=L; i++) { Serial.print(cmd.charAt(i)); }
// Receivec respond from SIM res = "";
while((millis()- startTimes)< timeout) { // Read until timeout if(Serial.available()) { // If there is data available
char ch = Serial.read(); // Read serial port and save the data in a local buffer res += String(ch); } } } void SetupIP(){
//Reference AT Commands for IP Application
sendC("AT+SAPBR=3,1,\"CONTYPE\",\"GPRS\"\r\n", 500); //_BTS2Serial.println(res);
sendC("AT+SAPBR=3,1,\"APN\",\"m-wap\"\r\n", 1000); //_BTS2Serial.println(res);
// Open bearer, AT+SAPBR=1,1,\r\n"; //_BTS2Serial.println("AT+SAPBR=1,1.."); sendC("AT+SAPBR=1,1\r\n", 2000); //_BTS2Serial.println(res);
68 }
/*
String IPconnectionAdress(){
//Query bearer, AT+SAPBR=2,1\r\n";
String res = sendCmdAndWaitForResp("AT+SAPBR=2,1\r\n",2000); return res;
} */
// Function to set our Azure account parameters void SetupHTTPS(){ String sendstring; // Enable HTTP initation sendC("AT+HTTPINIT\r\n", 500); //_BTS2Serial.print(res+"1");
// Set bearer profile identifier
sendC("AT+HTTPPARA=\"CID\",1\r\n", 2000); //_BTS2Serial.print(res+"3");
delay(2000); // Set the URL
sendC("AT+HTTPPARA=\"URL\",\"https://IoThubCaọazure-
devices.net/devices/BTS1/messages/events?api-version=2018-06-30\"\r\n", 1000); //_BTS2Serial.print(res+"4");
// Set the Shared Access Signature
sendC("AT+HTTPPARA=\"USERDATA\",\"authorization: SharedAccessSignature sr=xxxxxxx, 2000);
//_BTS2Serial.print(res+"5");
// Set Content-Type field in the HTTP header
sendC("AT+HTTPPARA=\"CONTENT\",\"application/json\"\r\n", 500); //_BTS2Serial.print(res+"6");
}
69 String sendstring;
// Set Data length
sendstring = "AT+HTTPDATA="; sendstring += gprs_datạlength(); sendstring += ",2000\r\n"; sendC(sendstring, 1000);
// Load the JSON String data to HTTPDATA sendC(gprs_data, 5000);
//_BTS2Serial.println(res); }
void HTTPS_post(int timeout){
sendC("AT+HTTPACTION=1\r\n", timeout); //_BTS2Serial.println(res);
}
void controlRCservo(String inst) { String cmd, timedelay;
int i, rotation;
if (inst.substring(3,4)=="B") {
if (inst.length()==13) { //check lenght of the command cmd = inst.substring(5,8); rotation = cmd.toInt(); if ((rotation>=0)&&(rotation<=180)) { if (angle<=rotation) { for (i=angle;i<=rotation;i++){ myServọwrite(i); delay(100); } } else { for (i=angle;i>=rotation;i--){ myServọwrite(i); delay(100); } }
70 delay(4000);
angle = rotation; res = good; } else res = wrong; } else res = wrong; } else res = wrong; }
void DC_rolling(String inst) { char cid, cmd, ch;
String timedelay, instsa, sa; int timess, delta, L;
//String inst = "AT C,1,xxxx\r\n"; if (inst.length()==13) { cid = inst.charAt(3); cmd = inst.charAt(5); timedelay = inst.substring(7,11); timess = timedelaỵtoInt(); delta = 20; delay(1000); digitalWrite(9, HIGH);
pinMode(INA, OUTPUT); // set INA out; pinMode(INB, OUTPUT); // set INB out; pinMode(ENA, OUTPUT); // set ENA out; switch (cmd) { case '0': digitalWrite(INA, HIGH); digitalWrite(INB, LOW); digitalWrite(ENA, HIGH); while (timess>0) { L = res.length(); sa = res.substring(5,L-2); Serial.println(res); timess -= delta; if (sạtoInt()>2) {
71 digitalWrite(ENA, LOW); break; } }; delay(2000); break; case '1': digitalWrite(INA, LOW); digitalWrite(INB, HIGH); digitalWrite(ENA, HIGH); delay(timess); digitalWrite(ENA, LOW); break; } digitalWrite(ENA, LOW);
pinMode(INA, INPUT_PULLUP); // set off output;
pinMode(INB, INPUT_PULLUP); // set off output; pinMode(ENA, INPUT_PULLUP); // set off output; digitalWrite(9, LOW);
} }
void readBTS(int timedelay){ unsigned long startTime, timesi; char ch; res = ""; startTime = millis(); timesi = 0; do { if (BTSSerial.available()) { ch = BTSSerial.read();
72 res += ch; //if (ch =='\n') break; } timesi = millis()-startTime; } while (timesi<timedelay); //if (timesi>=timedelay) res = "E"; }