Đề tài Nghiên cứu thiết kế hệ thông tưới tự động trong nhà trồng thông minh

Do đâymớilàlầnđầutiênnhữngthànhviêntrongnhómlàmmộtđềtàinghiêncứu, cộngvớikiếnthứccònnhiềuhạnchế, đềtàibọnemvẫncònmộtsốhạnchếnhư : + Chưađođạcđượcnhiềuthôngsố Do hanchếvềmặtthiếtbị,chiphícũngnhưkiếnthứclậptrình.nhómchỉthựchiệnđocácgiátrịvớicáccảmbiếnđơngiản. ¬+ Quymôápdụngcònhạnchế. + Chưađẩyđượcdữdiệu qua mạng

docx82 trang | Chia sẻ: tienthan23 | Lượt xem: 5673 | Lượt tải: 3download
Bạn đang xem trước 20 trang tài liệu Đề tài Nghiên cứu thiết kế hệ thông tưới tự động trong nhà trồng thông minh, để xem tài liệu hoàn chỉnh bạn click vào nút DOWNLOAD ở trên
ợc cân chỉnh. Cảm biến LM35 có 3 chân: + Chân nguồn VCC + Chân đầu ra Vout (chân tương tự + Chân nối đất GND Hình 2.6 Cảm biến LM35. Đặc điểm chính của cảm biến LM35 : - Điện áp đầu vào từ 4V đến 30V - Độ phân giải điện áp đầu ra là 10mV/˚C - Độ chính xác cao ở 25 ˚C là 0.5˚ - Trở kháng đầu ra thấp 0.1 cho 1mA tải Dải nhiệt độ đo được của LM35 là từ -55˚C đến 150˚C với các mức điện áp ra khác nhau. Xét một số mức điện áp sau : - Nhiệt độ 55˚C điện áp đẩu ra -550mV - Nhiệt độ 25˚C điện áp đầu ra 250mV - Nhiệt độ 150˚C điện áp đầu ra 1500mV. Tùy theo cách mắc của LM35 để ta đo các giải nhiệt độ phù hợp. Đối với hệ thống này thì đo từ 0˚C đến 150˚C. 2.6. Giới thiệu về cảm biến đo cường độ ánh sang Photo cell (CdS photoresistor) Hình 2.7 cảm biến đo cường độ ánh sang Photo cell (CdS photoresistor) Tổng quan Tế bào CdS là bộ cảm biến ánh sáng nhỏ. Như mặt nguệch ngoạc được tiếp xúc với ánh sáng nhiều thì điện trở đi xuống. Khi ánh sáng của nó,về 5-10KΩ, khi tối nó đi lên đến 200KΩ. Để sử dụng, kết nối một bên của tế bào ảnh (một trong hai, đối xứng của nó) để điện (ví dụ 5V) và phía bên kia để pin đầu vào analog vi điều khiển của bạn. Sau đó kết nối một 10K kéo xuống điện trở từ đó pin analog mặt đất. Các điện áp trên pin sẽ được 2.5V hoặc cao hơn khi ánh sáng của nó ra và gần mặt đất khi tối của nó. Kích thước:Length: 4.46mm / 0.18in Chiều rộng: 5mm / 0.20in Chiều cao: 2.09mm / 0.08in 2.7 giới thiệu về IC mạch cầu H L293D Hình2.8 hình ảnh IC l293D L293D là IC cầu H điều khiển động cơ. điều khiển 2 L293D gồm 4 kênh điều khiển có thể động cơ DC hoặc 1 động cơ bước 4 pha (5 dây). Để điều khiển động cơ DC, bạn sẽ sử dụng 2 kênh của L293D cho 1 động cơ. L293D đã được tích hợp sẵn đi ốt bảo vệ vi điều khiển chống lại dòng cảm ứng khi động cơ khởi động hoặc tắt. Vì vậy, bạn chỉ cần gắn motor vào L293D và các chân của vi điều khiển tương ứng, là có thể làm cho động cơ chạy ngay. Dòng L293D có 2 loại: L293B/E và L293D, dòng L293B có khả năng chịu tải cao hơn (1A so với 600mA của L293D) nhưng không có đi ốt bảo vệ vi điều khiển. Với mỗi motor, bạn cần 3 chân từ vi điều khiển kết nối với L293D, trong đó có 1 chân điều khiển tốc độ đông cơ dùng xung PWM, 2 chân còn lại là logic 0 hoặc 1 dùng điều chỉnh chiều quay của motor. Tín hiệu điều khiển được xử lý độc lập với nhau với từng đầu ra. Ví dụ: bạn có thể điều khiển 2 động cơ DC chạy với tốc độ khác nhau, hướng khác nhau, 1 động cơ dừng còn 1 động cơ chạy... Mỗi kênh 600mA và dòng đỉnh là 1A. Để sử dụng các động cơ công suất của L293D chịu được tải cao hơn, bạn chỉ việc gắn song song 2 hoặc nhiều L293 lại với nhau. Với 2 IC L293, bạn sẽ có tải chịu được là 1.2A và tải đỉnh là 2A. Ngoài ra, L293D có chức năng tự động ngắt khi bị nóng quá mức nhằm bảo vệ IC. Lưu ý: tuyệt đối không bao giờ làm chập mạch các ngõ ra motor của L293D, nếu không bạn sẽ làm cháy một bên cầu H ngay lập tức. 2.8. Giới thiệu chung về phần mềm mô phỏng Proteus Phần mềm Proteus là phần mềm cho phép mô phỏng hoạt động của mạch điện tử bao gồm phần thiết kế mạch và viết chương trình điều khiển cho các họ vi điều khiển như MCS-51, PIC, AVR, Proteus là phần mềm mô phỏng mạch điện tử của Lancenter Electronics, mô phỏng cho hầu hết các linh kiên điện tử thông dụng, đặn biệt hỗ trợ cho các MCU như PIC, 8051, AVR, Motorola. Phần mềm bao gồm 2 chương trình: ISIS cho phép mô phỏng mạch và ARES dùngđể vẽ mạch in. Proteus là công cụ mô phỏng cho các loại vi điều khiển khá tốt, nó hỗ trợcác dòng vi điều khiển PIC, 8051, PIC, dsPIC, AVR, HC11,các giao tiếp I2C, SPI,CAN, USB, Ethenetngoài ra còn mô phỏng các mạch số, mạch tương tự một cách hiệu quả. Hình 2.9. Giao diện khởi động phần mềm Proteus. 2.9. Thư viện Arduino trong Proteus Thư viện Arduino là một bổ sung rất hay cho phần mềm mô phỏng Proteus nó giúp cho việc mô phỏng Arduino được thuận tiện và dễ dàng hơn thay vì chỉ mô phỏng được chip ATmega328(nhân của Arduino), thư viện này được phát triển bởi các kĩ sư Cesar Osaka, Daniel Cezar, Roberto Bauer và được đăng tải trên blog tiếng Bồ Đào Nha: Thư viện bao gồm các linh kiện sau: - Arduino Uno (Phiên bản chip ATmega328 chân DIP) - Arduino Uno (Phiên bản chip ATmega328 chân SMD - Arduino Mega - Arduino Lilypad - Arduino Nano - Cảm biến siêu âm Ultrasonic V2 Hình 2.10. Các linh kiện trong thư viện Arduino cho Proteus. 2.10. Giới thiệu về Arduino IDE và ngôn ngữ lập trình cho Arduino Thiết kế bo mạch nhỏ gọn, trang bị nhiều tính năng thông dụng mang lại nhiều lợithế cho Arduino, tuy nhiên sức mạnh thực sự của Arduino nằm ở phần mềm. Môi trường lập trình đơn giản dễ sử dụng, ngôn ngữ lập trình Wiring dễ hiểu và dựa trên nền tảng C/C++ rất quen thuộc với người làm kỹ thuật. Và quan trọng hơn là số lượng thư viện code được viết sẵn và chia sẻ bởi cộng đồng nguồn mở là cực kỳ lớn. Hình 2.11 Giao diện phần mềm Arduino IDE. Arduino là phần mềm dùng để lập trình cho arduino. Môi trường lập trình cho arduino làIDE có thể chạy trên ba nền tảng phổ biến nhất hiện nay là Windows, Macintosh OSX và Lunix. Do có tính chất nguồn mở nên môi trường lập trình này hoàn toàn miễn phí và có thể mở rộng hơn bởi người dùng có kinh nghiệm. Ngôn ngữ lập trình có thể được mở rộng thông qua các thư viện C++.Và ngôn ngữ lập trình này dựa trên nền tảng của ngôn ngữ C của AVR nên người dùng hoàn toàn có thể nhúng thêm code viết bằng AVR vào chương trình nếu muốn. Hiện tại, Arduino IDE có thể download từ trang chủ 2.11 Giới thiệu về phần mềm Visual Studio 2010. - Visual Studio 2010 là công cụ xây dựng , lập trình mã nguồn để quản trị thông tin hệ thống phát triển phần mềm của doanh nghiệp , xây dựng các ứng dụng cho máy để bàn và các ứng dụng web. - Visual Studio 2010 Ultimate được xem như là một trong những công cụ thiết kế tốt nhất hiện nay với việc phát triển phần mềm, triển khai các giải pháp doanh nghiệp. Hình 2.12: Giao diện phần mềm Visual Studio 2010. - Visual Studio 2010 Ultimate được tăng cường thêm những giải pháp giảm thiểu nguy cơ trong quá trìh phát triển thiết kế. - Visual Studio 2010 Ultimate tạo ra những giải pháp về phần mềm , phát triển một số cung cụ tuyệt vời của ứng dụng lập trình. - Có thể nói Visual Studio 2010 Ultimate là phần mềm không thể thiếu dành cho các kỹ thuật viên phần mềm và một số công ty phát triển phần mềm. Những chức năng chính của Visual Studio 2010 Ultimate. - Phát triển mã nguồn, phần mềm. - Thực hiện giải pháp phần mềm. - Ứng dụng lập trình... Giới thiệu về Windown Form C#. a. Giới thiệu. - Tạo ra các ứng dụng trên máy tính có cài đặt .NET Framework 2.0. - Sử dụng không gian System . Windown.Form. - Thiết kế giao diện trực quan. b. Thiết kế giao diện quản lý thông số nhà trồng. * Giao diện thiết kế. Hinh 2.13: Giao diện thiết kế trên C#. Chương 3: THIẾT KẾ, LẬP TRÌNH,LẮP ĐẶT MẠCH VÀ VẼ ĐỒ THỊ THỂ HIỆN GIÁ TRỊ 3.1. Thiết kế mạch trên Proteus Nhóm nhiệt rồi tín hiệu từ này lại được truyền Arduino ra LCD.Ngoài ra,ngoài giá trị nhiệtđộ,cường độánh sang, giá trịđộẩmđượcđọc từ một biến trở10K mang giáđã đồng ý với phương án thiết kế mạch đo nhiệt độ, ánh sáng hiển thị lên LCD bao gồm các chức năng hiển thị độ C và cường độánh sáng.Ở phương pháp này, tín hiệu được truyền từ cảm biến LM35,cảm biến ánh sáng photocell vào Arduino và được tính toán ra trị tượng trưng có thể điều chỉnhđược cho phù hợp với môi trường. Tiếp đến là phần kết nối với IC L293D để điều khiển 2 động cơ DC một chiều 12V .IC L293D được kết nối trực tiếp vớiArduino mega sử với mỗi động cơphải sử dụng 3 chân điều khiển.Và mỗi động cơ có thểđiều chỉnhđược tốc độ qua các biến trở 100K được kết nối trực tiếp vào các cổnganalog của Arduino mega.Ngoài ra các động cơ có thểđảo chiều bằng cách nhấn dữ phím bấm cũngđược kết nối trực tiếp vào bo mạch chủ Cuối cùng làđặt ngưỡng cảnh báo giám sát nhiệt độ cho phù hợp với nhu cầu người dung, bằng các LED..LED màuđỏ thể hiện nhiệt độđang cao.LED màu xanh thể hiện nhiệt độ vừađủ..LED màu trắng thể hiện nhiệtđộđang thấp.Các LED cũngđược kết nối trực tiếp với Arduino mega Hình 3.1 Sơđồ nguyên lý của mạch Bảng 3.1 Sơ đồ chân kết nối của các linh kiện Tên linh kiện Chân linh kiện Chân kết nối với Arduino IC L293D EN1 EN2 Vin1 Vin2 Vin3 Vin4 50 28 48 46 30 32 LED đỏ 1 22 LED xanh 1 24 LED trắng 1 26 LCD 16.2 RS E D4 D5 D6 D7 8 9 4 5 6 7 LM35 1 A1 Photocell 2 A0 Biến trở điều khiểnđộng cơ 1 2 A8 Biến trở điều khiển động cơ 2 2 A9 Phím bấmđảo chiều động cơ 1 1 34 Phím bấmđảo chiều động cơ 2 1 44 3.2 Lập trình đo nhiệt độ,ánh sang,độ ẩm hiển thị lên LCD 16.2 3.2.1 Lập trình đo nhiệt độ,ánh sáng Như chương trước đã giới thiệu, cảm biến LM35 đo nhiệt độ và thể hiện nhiệt độ đó dưới dạng điện áp (cứ 10mV là 1 độ, tối đa điện áp cung cấp là 5000mV – 10bit), nhiệt độ chính do vậy để cho ra được giá trị xác, trước hết, ta sử dụng hàm analogRead() để đọc giá trị điện áp từ cảm biến LM35 dưới dạng nhiệt độ. Giá trị điện áp này sẽ được tính toán để ra giá trị nhiệt độ theo công thức: tempC=(val/(1024*10))*5000 = val* 0.48828125 (trong đó: val là giá trị đọc vào từ cảm biến, tempC là giá trị nhiệt độ thang Celsius) Chuyển đổi sang nhiệt độ thang Farenheit (oF) ta dùng công thức: tempF=(tempC*9)/5+32 = tempC*1.8+32 Cònđối với cảm biến ánh sáng photocell việc đọc giá trịđo là thực sự rất đơn giản. Chỉđơn giản làđọc trực tiếp từ cổnganalog A0, để đo cường độ ánh sáng. Giá trị này sẽ rơi vào khoảng từ 0-700 .Tùy vào các thí nghiệm thực tế mà người dung quan sátđược để khuyến cáođược giá trị cần thiết cho phù hợp với nhu cầu sử dụng của mình Giá trị của độẩm sẽđược lấy một cách tượng trưng từ một chiếtáp 50K được nối trực tiếp vào chânanalog của Arduino mega Sau đây là code đầy đủ của phần đo nhiệt độ, ánhsáng và độẩm analogRead(photocellPin); delay(10); int photocellReading = analogRead(photocellPin); analogRead(doamPin); delay(10); int doamReading = analogRead(doamPin); analogRead(tempPin); delay(10); int tempReading = analogRead(tempPin); float voltage = tempReading * aref_voltage / 1024; float temperatureC = tempReading * 0.48828125; float temperatureF = (temperatureC * 9 / 5) + 32; 3.2.2 Lập trình hiển thị giá trị lên LCD 16.2 Sau khi các giá trị của các cảm biến được đọc thì shieuld LCD sẽ có nhiệm vụđọc các giá trị lên màn hình.Do màn hình LCD 16.2 chỉ hiển thịđược 2 dòng nên ởđây bọn em ưu tiên hiển thị giá trị cường độ sang ở dòng thứ nhất,giá trị nhiệt độở dòng thứ 2 với kiểuđộ C,lấy chính xác giá trịđọcđược sau dấu phẩy 2 ký tự. Các chân BS E D4 D5 D6 D7 của LCD sẽ lần lượtđược kết nối trực tiếp vào các chân digital sau 8 9 4 5 67 để giúp cho nó có thể hiển thị.Tất cả quá trìnhđọc và ghi dữ liệu sẽđược tạo trễ là 500ms Code kết nối chân và hiển thị giá trị lên LCD LiquidCrystal lcd(8 ,9 , 4, 5, 6, 7); lcd.print("Light "); lcd.setCursor(6, 0); lcd.print(photocellReading); lcd.setCursor(0, 1); // ---------------- lcd.print("Temp \337C"); lcd.setCursor(6, 1); lcd.print(temperatureC); delay(500); 3.3 Lập trình điều khiển động cơ và đặt ngưỡng cảnh báo giới hạn 3.3.1 Lập trình điều khiển động cơ KHAI BÁO KHAI XUẤT CỔNG RA VÒNG LẶP CHÍNH CÀI ĐẶT PIN 2 PIN 1 Hình 3.2 Lưu đồ thuậttoán điều chỉnh động cơ Các chân của IC L293D được Pin vào Arduino mega cho phù hợp và chính xác Trong vòng lặp,giá trị điều khiển tốc độ động cơ được thực hiện bằng cách chia việc đọc tương tự từ các chếtáp xoay với 4 Phải chia cho 4 vì giá trị analog nhận được ở khoãng giữa 0 và 1023 màđầu ra analog cần được từ 0 đến 255. Nếu nút được nhấn, động cơ đảo chiều quay, nếu không nó sẽ chạy theo hướng ngược lại.Việcđảo chiều động cơ nàyđược thực hiện bằng chân pin switch. Vì vậy, nếu các nút không được nhấn, đây sẽ quay theo chiều thuận, nếu không nó sẽ quay theo chiều nghich Tốc độ của động cơ và chức năng đảo chiều sẽ được chuyển tới một chức năng gọi là 'setMotor' rằng sẽ thiết lập các chân thích hợp trên chip điều khiển để điều khiển động cơ. void setMotor(int speed, boolean reverse) { analogWrite(enablePin, speed); digitalWrite(in1Pin, ! reverse); digitalWrite(in2Pin, reverse); } void setMotor2(int speed2,boolean reverse) { analogWrite(enablePin2, speed2); digitalWrite(in3Pin,! reverse); digitalWrite(in4Pin, reverse); } Đâu tiên, tốc độ được dùng một thiết lập bằng cách sử dụnganalogWrite cho phép pinđược chọn làm việc. Việc cho phép pin của L293D có thểđiều chỉnh hoặc tắt bất kể các chân in1, in2, in3 và in4 của L293Dkhi được thiết lập để. Để điều khiển hướng của động cơ, các chân in1 và in2,in3 và in4 phải được thiết lập các giá trị trái ngược nhau Ví dụ. Nếu in1 ở mức cao và in2 ở mức th ấp, động cơ sẽ quay theo m ột chiều , nếu trên in1 ở mức thấp và in2 ở mức cao thì sau đó động cơ sẽ quay theo hướng ngược lại. Các '!' lệnh có nghĩa là 'không'. Vì vậy, các lệnh digitalWrite đầu tiên cho in1 đặt nó giá vào bất cứ điều gì ngược lại với các trị của 'đảo ngược', do đó, nếu ngược lại là HIGH nó đặt nó để LOW và ngược lại. DigitalWrite tiếp theo. Điều này có nghĩa rằng nó sẽ luôn luôn là đối lập với các mức giá trị ở in1. 3.3.2 Lập trình đặt ngưỡng cảnh báo và điều chỉnh động cơ theo hướng cảnh báo Ở đây nhóm thiết kế và sử dụng 3 đèn led mầu + Nếu ở nhiệt độ thấp thì led mầu trắng sáng và đồng thời cho một động cơ quay + Nếu ở nhiệt độ thấp thì led mầu trắng và xanh sáng và đồng thời cho hai động cơ quay + Nếu ở nhiệt độ thấp thì cả 3 đèn led sáng và đồng thời cho ba động cơ quay =>động cơ quay sẽ tượng trưng cho tưới việc Giá trị nhiệt độđượcđọcở thang đo độ .C sẽđược lấy và đặt ngưỡng cảnh báo và giám sát cho hệthống . if (temperatureC < 21) lightLED(whitePin); if (temperatureC >= 21 && temperatureC <= 24) lightLED(greenPin); if (temperatureC > 24) lightLED(redPin); void lightLED(byte whatLED){ digitalWrite(whitePin, LOW); //white led is off digitalWrite(redPin, LOW); //red led is off digitalWrite(greenPin, LOW); //green led is off Ởđây nhiệt độ sẽđược phân chia thành các mức khác nhau theo nhu cầu của người sữ dụng để bật các led tương ứng với các đặc trưng phù hợp 3.4 Lập trình sử dụng modul Arduino datalogger và truyền ra cổng Serial 3.4.1 Lập trình sử dụng đồng hồ đếm thời gian thực DS1307 trên shieul datalogger Các RTC (read time clock) sẽ được sử dụng là DS1307 . Đây là IC có chi phí thấp và nó cóthểsử dụng trong một khoảng thời gian dài nhờ một quả Pin nhỏ Hình 3.3 IC DS1307 Khi có Pin, DS1307 sẽ đánh dấu cho một thời gian dài, ngay cả khi các Arduino mất nguồn, hoặc được lập trình lại. KHÂU TRỄ ĐĂNG NHẬP THỜI GIAN LẤY THỜI GIAN Hình 3.4 Lưu đồ thuật toán cho DS1307 Vòng lặp chính Trong vòng lặpnày ,có các phần chính như sau Thiết lập thời gian chờ cho đến khung làm việc của mình và các lượt tiếp theo Yêu cầu thời gian và ngày tháng hiện From RTC Đăng nhập thời gian và ngày tháng vào thẻ SD Đọc cảm biến ánh sang,nhiệt độ vàđộẩm Đăng những bài đọc vào thẻ SD Dữ liệu đồng bộ hóa vào thẻ theo thời gian định sẵn Điều quan trọng đầu tiên là khâu Delay () gọi hàm, đây là bước Arduino mega chờ để thực hiện mệnh lệnh. Sau đó, nhóm lần lập trình cho sang đèn LED màu xanh, điều này cho chúng ta biết rằng chúng tađang có quá trình đọc / ghi dữ liệu Tiếp theo chúng ta gọi millis () để có được những "thời gian kể từ Arduino bật 'và đăng đó vào thẻ.. Sau đó,rất quan trọng là sữ dụng câu lệnh RTC.now () gọi để có được một bản chụp của thời gian. Một khi chúng ta có điều đó, ta sẽ viết một dấu thời gian (seconods kể từ năm 2000) cũng như các ngày trong YY / MM / DD HH: SS: MM định dạng thời gian mà có thể dễ dàng được công nhận bởi một bảng tính.  3.4.2 Lập trình xuất dữ liệu ra thẻ SD Thẻ SD dung để ghi lại tất cả dữ liệu mà các cảm biếnđo được bao gồm cả thời gian được cập nhập từ RTC của IC DS1307.dữ liệu sẽđược lưu vào một file định dạng là một file exel. Serial.print("Initializing SD card..."); pinMode(53, OUTPUT); if (!SD.begin(chipSelect)) { Serial.println("Card failed, or not present"); return; } Serial.println("card initialized."); char filename[] = "LOGGER00.CSV"; for (uint8_t i = 0; i < 100; i++) { filename[6] = i/10 + '0'; filename[7] = i%10 + '0'; if (! SD.exists(filename)) { logfile = SD.open(filename, FILE_WRITE); break; // leave the loop! } } if (! logfile) { error("couldnt create file"); } Serial.print("Logging to: "); Serial.println(filename); Bây giờ mã bắt đầu giao tiếp với thẻ SD, nó sẽ cố gắng để khởi tạo các thẻ và tìm thấy một phân vùng FAT16 / FAT32. Tiếp theo nó sẽ được thiết lập để tạo ra một logfile. Vấn đề phức tạp nhất nó nằmởđây.nhóm đã cố gắng để dữ liệuđược ghi ra vào một bảngExel tương tự nhưLOGGERnn . csv, ký tựnn là một con số.Cách thức bắt đầu để tạo ra LOGGER00.CSV và cách tăng thời gian mỗi khi các tập tin đã tồn tại, cho đến khi chúng tôi nhận được để LOGGER99.csv , nhómđã lập trình để cho sẽ có một tập tin mới mỗi khi khởi động Arduino Để tạo ra một tập tin, nhómsử dụng một số Unix cờ lệnh mà bạn có thể nhìn thấy trong logfile.open () . FILE_WRITE nghĩa để tạo ra các tập tin và ghi dữ liệu vào nó. Nếu chúng ta quản lý để tạo ra một tập tin thành công và ghi vào thẻ SD, nhóm in ra tên vào cổng Serial để quan sát trực tiếp bằng cổng nối tiếp với máy tính Hình 3.5 Bảng số liệu đọc từ file Exel của thẻ SD 3.4.3 Giao diện cổng kết nối Serial Hình 3.6 .Dao diện kết nối cổng Serial 3.5 Lập trình nhận dữ liệu từ cổng COM ảo, file dữ liệu và vẽ đồ thị cho các tham số nhiệt độ,ánh sáng và độẩm Hình 3.7. Giao diện thiết kế. Các bước thiết kế giao diện giám sát: - Thiết kế giao diện. - Lập trình. - Mô phỏng . 3.5.1. Thiết kế giao diện. >>>Từ thanh công cụ Toolbox kéo thả các hình được giao diện như trên. Hình 3.8.Giao diện thiết kế phần mềm. >>> Thiết lập thuộc tính cho các đối tượng. STT Đối tượng Name Text Nội dung 1 Nút nhấn Kết nối btketnoi Kết Nối Kết nối cổng Com 2 Nút nhấn Ngắt btngat Ngắt Ngắt kết nối cổng Com 3 Nút nhấn Xóa btxoa Xóa Xóa dữ liệu text 4 Nút nhấn Thoát btthoat Thoát Thoát khỏi giao diện 5 Nút nhấn Start btmode Start Vẽ đồ thị nhiệt độ,ánh sáng, độ ẩm 6 Nút nhấn Compact button8 Compact Dịch đồ thị về gốc 7 Nút nhấn File btfile File Chỉ ra đường dẫn đến file dữ liệu 8 Nút nhấn Send btsend Send Gửi dữ liệu xuống vi xử lý 9 Nút nhấn COM btcom COM Cho phép chế độ Com hoạt động 10 Nút nhấn TEXT FILE btfile FILE Cho phép chế độ file hoạt động 11 Text COM1 cbcom No Hiển thị COM kết nối 12 Text Baudrate cbrate No Hiển thị tốc độ baud 13 Text Data bits cbbits No Hiển thị số bit dữ liệu 14 Text Parity cbparity No Hiển thị bit kiểm tra chẵn lẻ 15 Text Stop bit cbbit No Hiển thị bit dừng 16 Text Nhiệt độ kenh1 No Hiển thị thông số nhiệt độ 17 Text Ánh sáng kenh2 No Hiển thị thông số ánh sáng 18 Text Độ ẩm kenh3 No Hiển thị thông số độ ẩm 19 Text kết quả lbkq No Hiển thị dữ liệu lấy từ data 20 Đồ thị zedGraphControl1 No Đồ thị hiển thị thông số 3.5.2.Lập trình cho các đối tượng. >>> Nút nhấn Start. >>> Nút nhấn Thoát. >>>Nút nhấn Kết nối. >>>Nút nhấn Ngắt. >>>Nút nhấn Xóa. >>> Nút nhấn Compact. >>> Nút nhấn File. >>>Nút nhấn Send. >>> Lập trình các thông số cổng Com: - Cổng COM. - Tốc độ baud. -Bit dừ liệu. -Bit kiểm tra chẵn lẻ. -Bit stop. >>> Lập trình hiển thị thông số . - Nhiệt độ. -Ánh sáng. - Độ ẩm. - Dữ liệu lấy từ file gửi thi lên” lbkq “. >>>Lập trình hiển thị giao diện “Loadform” khi khởi động mô phỏng. -Hiển thị đồ thị. -Hiển thị mặc định thông số cổng Com. >>> Lập trình cho hàm cho bài toán. - Hàm draw vẽ đồ thị. - Hàm hiển thị file. - Hàm đọc file. - Hàm tách dữ liệu. 3.5.3. Mô phỏng. Hình 3.9 Kết quả mô phỏng. Có 2 chế độ mô phỏng dữ liệu: lấy dừ liệu từ file và đọc trực tiếp từ cổng com để vẽ.Tuy nhiên , ở đây tôi xin giới thiệu chế độ vẽ đọc từ file. -Đường màu đỏ đường biểu thị dao động nhiệt độ. -Đường màu xanh biểu thị dao động độ ẩm. -Đường màu tím là biểu thị thông số ánh sáng. 3.6 Lắp đặt mach đo nhiệt độ,ánh sang ,độ ẩm và thử nghiệm trên các board 3.6.1 Lắp đặt cảm biến đo ánh sang ,nhiệt độ và độ ẩm trên Arduino datalogger Hình 3.10. Sơ đồ kết nối các cảm biến Các cảm biến LM35,photocellvà trở 10K được gá trên datalogger sao cho các chân được kết nối với các cổng của Arduino mega như hình vẽ,ngoài ra còn phải nối thêm các điểm L1 L2 của datalogger vào các chân digital lần lượt là 3 và 2.nhóm đã dung các chân căm để hàn vào các lỗ trên mặt Arduino datalogger để giúp cho việc tháo lắp linh kiện được dễ dàng hơn.Xong tất cả các công việc nhưtrên nhóm có được hình ảnh cụ thể sau khi khoàn thành như sau Hình 3.11 Mạch Arduino datalogger sau khi hoàn thành 3.6.2 Lắp đặt mạch điều khiển động cơ IC L293D đã được nhóm chọn và sử dụng cho đề tài này Có 2 động cơ DC 12V được nối trực tiêp vào chân IC(chúng ta có thể xem chi tiết sơ đồ kết nối chân cụ thể giữa Arduino mega với IC l293D và động cơ) 2 phím phấm dung để đảo chiều động cơ.có thể nhấm dữ phím để đảo chiều.Ngoài ra,có 2 biến trở 10K dùng để tăng giảm tốc độ nhờ vào việc lập trình để băm xung PWM.xung PWM sẽ làm thay đổi giá trị điện áp ngõ ra và đồng thời làm thay đổi tốc độ của động cơ 3.6.3 Lắp đặt LED giám sát và cảnh báo Nhóm đã dùng các LED đơn sắc loại thường.Có 3 màu màu đỏ ,màu xanh và màu trắng tượng trưng cho các ngưỡng cảnh báo nhiệt độ Các led đỏ xanh trắng lần lượt được kết nối với các điện trở 1K và nối trực tiếp vào các chân 22 24 và 26 bằng các dây cắm. Hình 3.12 Led cảnh báo ngưỡng 3.6.4 Tổng thể mạch đang hoạt động khi đã cấp nguồn và nạp Code Hình 3.13 Hình ảnh toàn mạch hoạt động sau khi đã nạp code và cấp nguồn 3.7 Chi phí thực hiện đề tài Bảng 3.2 Bảng chi phí thực hiện đề tài STT Tên linh kiện Số lượng Giá thành (vnd) 1 Arduino mega 2560 1 350.000 vnđ 2 Shieul LCD button 1 110.000 vnđ 3 Arduino datalogger 1 150.000 vnđ 4 Biến trở 10k 2 5000 vnđ 5 Biến trở 50k 1 2,500 vnđ 6 IC l293D 1 25.000 vnd 7 Động cơ DC 12v 2 10.000 vnđ 8 LED 3 2000 vnđ 9 Dây cắm 1 bó 5000 vnđ 10 LM 35 1 15.000 vnđ 11 Photocell 1 5000 vnđ 12 Phím bấm 3 2000 vnđ 13 Giá cắm linh kiện 2 10.000 vnđ Tổng chi phí 691.500 vnđ Code lập trình bằng IDE cho mạch Arduino mega 2560 #include #include #include "RTClib.h" #include #include // Một logger dữ liệu đơn giản cho các chân analog Arduino // Bao nhiêu mili giây giữa lấy dữ liệu và đăng nhập nó. 1000 ms là một lần thứ hai #define LOG_INTERVAL 1000 // Bao nhiêu mili giây trước khi ghi dữ liệu đăng nhập vĩnh viễn vào đĩa // Đặt nó vào LOG_INTERVAL để viết từng thời gian (an toàn nhất) // Cuối cùng 10 lần đọc khi bị mất điện nhưng nó sử dụng ít điện năng hơn và nhanh hơn rất nhiều! #define SYNC_INTERVAL 1000 uint32_t syncTime = 0; // thời gian đồng bộ cuối cùng () #define ECHO_TO_SERIAL 1 /// dữ liệu echo đến cổng nối tiếp #define WAIT_TO_START 0 // Đợi cho đầu vào nối tiếp trong // Các chân kỹ thuật số kết nối với đèn LED #define redLEDpin 2 #define greenLEDpin 3 // Các chân analog kết nối với các cảm biến #define photocellPin 0 // analog 0 #define tempPin 1 // analog 1 #define doamPin 8 #define BANDGAPREF 14 #define aref_voltage 5 // chúng ta buộc 3.3V để Aref và đo nó multimeter! #define bandgap_voltage 1.1 // này không phải là siêu nhưng nó không đảm bảo -too- off LiquidCrystal lcd(8 ,9 , 4, 5, 6, 7); //khai bao chan ket noi l293d int enablePin = 50; int in1Pin = 48; int in2Pin = 46; int switchPin = 44; int potPin = 2; int enablePin2 = 28; int in3Pin = 30; int in4Pin = 32; int switchPin2 = 34; int potPin2 = 9; byte redPin=22, greenPin=24, whitePin=26; RTC_DS1307 RTC; // xác định các đối tượng Real Time Clock // Cho lá chắn ghi dữ liệu, chúng tôi sử dụng pin kỹ thuật số 10 cho SD cs dòngconst int chipSelect = 4; File logfile; void error(char *str) { Serial.print("error: "); Serial.println(str); // LED màu đỏ chỉ ra lỗi digitalWrite(redLEDpin, HIGH); while(1); } void setup(void) { pinMode (greenPin, OUTPUT); //LED màu xanh là phù hợp pinMode (redPin, OUTPUT); //LED màu đỏ tượng trưng nóng pinMode (whitePin, OUTPUT); //LED màu trắng tượng trưng pinMode(in1Pin, OUTPUT); pinMode(in2Pin, OUTPUT); pinMode(in3Pin, OUTPUT); pinMode(in4Pin, OUTPUT); pinMode(enablePin, OUTPUT); pinMode(enablePin2, OUTPUT); pinMode(switchPin, INPUT_PULLUP); pinMode(switchPin2, INPUT_PULLUP); Serial.begin(9600); Serial.println(); lcd.begin(16, 2); // Đèn LED sử dụng gỡ lỗi pinMode(redLEDpin, OUTPUT); pinMode(greenLEDpin, OUTPUT); #if WAIT_TO_START Serial.println("Type any character to start"); while (!Serial.available()); #endif //WAIT_TO_START // Khởi tạo các thẻ SD Serial.print("dang xu ly the SD..."); // Chắc chắn rằng các chip mặc định chọn pin được thiết lập để // Đầu ra, ngay cả khi bạn không sử dụng nó: pinMode(53, OUTPUT); // Xem thẻ có mặt chưa và có thể được khởi tạo: if (!SD.begin(10,11,12,13)) { error("loi,hay kiem tra lai"); } Serial.println("card initialized."); // Tạo ra một tập tin mới char filename[] = "LOGGER00.CSV"; for (uint8_t i = 0; i < 100; i++) { filename[6] = i/10 + '0'; filename[7] = i%10 + '0'; if (! SD.exists(filename)) { // Chỉ mở một tập tin mới nếu nó không tồn tại logfile = SD.open(filename, FILE_WRITE); break; // rời khỏi vòng lặp! } } if (! logfile) { error("couldnt create file"); } Serial.print("Logging to: "); Serial.println(filename); // Kết nối với RTC Wire.begin(); if (!RTC.begin()) { logfile.println("RTC failed"); #if ECHO_TO_SERIAL Serial.println("RTC failed"); #endif //ECHO_TO_SERIAL } logfile.println("datetime,light,temp,doam,vcc"); #if ECHO_TO_SERIAL Serial.println("datetime,light,temp,doam,vcc"); #endif //ECHO_TO_SERIAL // Nếu bạn muốn thiết lập các Aref để một cái gì đó khác hơn 5v analogReference(EXTERNAL); pinMode(in1Pin, OUTPUT); pinMode(in2Pin, OUTPUT); pinMode(enablePin, OUTPUT); pinMode(switchPin, INPUT_PULLUP); } void loop(void) { int speed = analogRead(potPin) / 4; int speed2 = analogRead(potPin2)/4; boolean reverse = digitalRead(switchPin); boolean reverse2 = digitalRead(switchPin2); setMotor(speed, reverse); setMotor2(speed2, reverse2); DateTime now; // Chậm trễ cho số lượng thời gian mà chúng ta muốn giữa bài đọc delay((LOG_INTERVAL -1) - (millis() % LOG_INTERVAL)); digitalWrite(greenLEDpin, HIGH); // log milliseconds since starting uint32_t m = millis(); logfile.print(m); // mili giây kể từ khi bắt đầu logfile.print(", "); #if ECHO_TO_SERIAL Serial.print(m); Serial.print(", "); #endif // fetch the time now = RTC.now(); // log time logfile.print(now.unixtime()); logfile.print(", "); logfile.print('"'); logfile.print(now.year(), DEC); logfile.print("/"); logfile.print(now.month(), DEC); logfile.print("/"); logfile.print(now.day(), DEC); logfile.print(" "); logfile.print(now.hour(), DEC); logfile.print(":"); logfile.print(now.minute(), DEC); logfile.print(":"); logfile.print(now.second(), DEC); logfile.print('"'); #if ECHO_TO_SERIAL Serial.print(now.unixtime()); // Serial.print(", "); Serial.print('"'); Serial.print(now.year(), DEC); Serial.print("/"); Serial.print(now.month(), DEC); Serial.print("/"); Serial.print(now.day(), DEC); Serial.print(" "); Serial.print(now.hour(), DEC); Serial.print(":"); Serial.print(now.minute(), DEC); Serial.print(":"); Serial.print(now.second(), DEC); Serial.print('"'); #endif //ECHO_TO_SERIAL analogRead(photocellPin); delay(10); int photocellReading = analogRead(photocellPin); lcd.print("Light "); lcd.setCursor(6, 0); lcd.print(photocellReading); analogRead(doamPin); delay(10); int doamReading = analogRead(doamPin); analogRead(tempPin); delay(10); int tempReading = analogRead(tempPin); // Chuyển đổi đó để đọc điện áp, cho 3.3v Arduino sử dụng 3.3, cho 5.0, sử dụng 5,0 float voltage = tempReading * aref_voltage / 1024; float temperatureC = tempReading * 0.48828125; float temperatureF = (temperatureC * 9 / 5) + 32; if (temperatureC < 21) lightLED(whitePin); if (temperatureC >= 21 && temperatureC <= 24) lightLED(greenPin); if (temperatureC > 24) lightLED(redPin); lcd.setCursor(0, 1); // ---------------- lcd.print("Temp \337C"); lcd.setCursor(6, 1); lcd.print(temperatureC); delay(500); logfile.print(", "); logfile.print(photocellReading); logfile.print(", "); logfile.print(temperatureC); #if ECHO_TO_SERIAL Serial.print(", "); Serial.print(photocellReading); Serial.print(", "); Serial.print(temperatureC); Serial.print(", "); Serial.print(doamReading); #endif //ECHO_TO_SERIAL // Đăng nhập ước tính điện áp 'VCC' bằng cách đo các ref 1.1V nội bộ analogRead(BANDGAPREF); delay(10); int refReading = analogRead(BANDGAPREF); float supplyvoltage = (bandgap_voltage * 1024) / refReading; logfile.print(", "); logfile.print(supplyvoltage); #if ECHO_TO_SERIAL Serial.print(", "); Serial.print(supplyvoltage); #endif // ECHO_TO_SERIAL logfile.println(); #if ECHO_TO_SERIAL Serial.println(); #endif // ECHO_TO_SERIAL digitalWrite(greenLEDpin, LOW); digitalWrite(redLEDpin, HIGH); logfile.flush(); digitalWrite(redLEDpin, LOW); } void setMotor(int speed, boolean reverse) { analogWrite(enablePin, speed); digitalWrite(in1Pin, ! reverse); digitalWrite(in2Pin, reverse); } void setMotor2(int speed2,boolean reverse) { analogWrite(enablePin2, speed2); digitalWrite(in3Pin,! reverse); digitalWrite(in4Pin, reverse); } void lightLED(byte whatLED){ // first turn off all the LEDs digitalWrite(whitePin, LOW); //blue led is off digitalWrite(redPin, LOW); //red led is off digitalWrite(greenPin, LOW); //green led is off // now turn on the requested LED digitalWrite(whatLED, HIGH); } Chương4: KẾT LUẬN VÀ HƯỚNG PHÁT TRIỂN ĐỀ TÀI 4.1 Hướng phát triển của đề tài 4.1.1. Đo được nhiều thông số của nhà trồng hơn. - Đo được thông số độ ẩm của nhà trồng - Đo được các thông số về dinh dưỡng của đất: K,N,S,P..... - Đo các thông số hướng gió, nồng độ CO2, O2,SO2... để quản lý chất lượng môi trường nhà trồng. - Đo và phát hiện các thông số về sâu bệnh : loại sâu bệnh, mật độ, mức độ ảnh hưởng của sâu bệnh . 4.1.2.Ứng dụng mạng internet vào quản lý. -Đưa các thông số kỹ thuật của nhà trồng lên web. - Quản lý các thông số từ web để có thể biết được tình trạng nhà trồng. -Quản lý và giám sát nhà trồng từ xa mà không cần đến hiện trường nhờ hệ thống camera kết nối với internet. 4.1.3.Phát triển giao diện giám sát mô phỏng trên phần mềm C#. - Phát triển vẽ các thông số nhà trồng trực tiếp qua cổng COM. - Thêm phần điều khiển động cơ bơm, hệ thống thông gió trực tiếp giao diện C#. - Có thể up load file dữ liệu nhận trục tiếp từ cổng COM lên giao diện. -Xây dựng thêm giao diện Map để có thể giám sát được vị trí , hình ảnh nhà trồng. 4.1.4.Đưa đề tài phát triển rộng rãi vào thực tế. - Trước hết áp dụng trong các mô hình trồng rau, cây cảnh tại các hộ gia đình. - Có thể phát triển trong những khu sản xuất rau trên diện rộng. 4.2.Kết luận Như vậy, với đề tài đồán :nghiên cứa thiết kế hệ tưới tự động cho nhà trồng thông minh :Thiết kế đo nhiệt độ thang Celsius (oC),đo cường độ ánh sángvà độ ẩm, có đèn led cảnh báo nhiệt độ giới hạn ngưỡng trên và dưới. đồng thời hiển thị giá trị nhiệt độ ánh sáng lên LCD.Ngoài ra còn điều khiển 2 động cơ phù hợp cho việc tưới nước hay thông gió cho nhà trồng,đọc dữ liệu từ file để vẽ lên đồ thị giúp người dùng có thể theo dõi được một cách cụ thể hơn. Trong quá trình thực hiện, lập trình cho mạch đo nhiệt độ, nhóm gặp phải nhiều khó khăn khác nhau như: do phải nghiên cứu nhiều tài liệu nước ngoài, datasheets, dẫn đến nhiều chỗ dịch sai, dịch nhầm dẫn đến áp dụng các hàm, câu lệnh bị sai ý nghĩa, cấu trúc, trong quá trình viết code gặp phải nhiều lỗi phát sinh mà không tìm ngay ra nguyên nhân cần đầu tư thời gian để giải quyết, nhiều linh kiện rất khó để tìm được thư viện chuẩn để lập trình Quá trình lắp mạch cũng gặp phải những khó khăn nhất định tuy nhiên nhóm đã cố gắng giải quyết được vấn đề phát sinh để hoàn thành được đề tài. Nhóm đã hoàn thành thiết kế, lập trình và lắp đặt mạch. Do đây mới là lần đầu tiên những thành viên trong nhóm làm một đề tài đồ án, cộng với kiến thức còn nhiều hạn chế, chúng em tự thấy đề tài của mình thực hiện được vẫn còn rất nhiều sai sót, khiếm khuyết. Chúng em rất mong được sự ủng hộ và giúp đỡ của thầy giáo để đề tài chúng em thực hiện được hoàn thiện hơn và có thêm nhiều cải tiến đáng kể và ứng dụng tốt hơn vào thực tiễn. Hà Nội,ngày 12 tháng 4 năm 2015 TÀI LIỆU THAM KHẢO [1] Massimo Banzi, Getting Started with Arduino, O’Reilly Media, Inc, 2009. [2] Michael Margollis and Nicholas Weldin, Arduino Cookbook, O’Reilly Media, Inc, 2011. [3] [4] [5] [6] PHỤ LỤC 1:.Code cho visual studio vẽ đồ thị từ cổng COM ảo using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; using System.Globalization; //them thu vien using System.IO; using System.IO.Ports; using System.Xml; using System.Net; //thu vien ve do thi using ZedGraph; //upload //ban do so using GMap.NET; using GMap.NET.WindowsForms; using GMap.NET.WindowsForms.Markers; using GMap.NET.MapProviders; using AltosTools.WindowsForms.Maps; using GMap.NET.WindowsForms.ToolTips; using System.Data; using System.Data.OleDb; namespace Rs_232_tt { publicpartialclassform : Form { csdl mm = newcsdl(); //do thi privatestring inputname1 = "nhiet do kenh1"; privatestring inputname2 = "nhiet do kenh2"; privatestring inputname3 = "nhiet do kenh3"; privatestring apiurl = ""; privatestring writedata_ = "e840660a12040b48a90d96acc4aa85ea"; string duongdan=" "; int dem = 0; string[] b; int up = 0;//ko up len host int sosanh = 1; //che do file double k1, k2, k3; double com1, com2, com3; double time; int tickStart = 0;//Khai bao 1 bien dung timer //............ SerialPort p = newSerialPort();//khai bao p kieu serialport string inputdata = String.Empty;//inpudata du lieu lay tu cong com delegatevoidSetTexCallback(string text);//khai bao delegate public form() { InitializeComponent(); //Cai dat thong so cong Com string[] cong = SerialPort.GetPortNames(); //them toan bo cong com duoc tim thay vao cbcom cbcom.Items.AddRange(cong); p.ReadTimeout = 1000; p.DataReceived += newSerialDataReceivedEventHandler(datareceive); //Cai dat cac giai tri baurd rate string[] baudrate = { "1200", "2400", "4800", "9600", "19200", "38400", "57600", "115200" }; cbrate.Items.AddRange(baudrate); //cai dat thong so data bit string[] databit = { "6", "7", "8" }; cbbits.Items.AddRange(databit); //cai dat parity string[] parity = { "None", "Odd", "Even" }; cbparity.Items.AddRange(parity); //cai dat stopbit cbbit string[] stopbit = { "1", "1.5", "2" }; cbbit.Items.AddRange(stopbit); } privatevoid cbcom_TextChanged(object sender, EventArgs e) { //cong com if (p.IsOpen) { //neu port dang mo thi dong lai p.Close(); } p.PortName = cbcom.SelectedItem.ToString(); } privatevoid cbrate_TextChanged(object sender, EventArgs e) { if (p.IsOpen) { //neu port dang mo thi dong lai p.Close(); } } privatevoid cbbits_TextChanged(object sender, EventArgs e) { if (p.IsOpen) { //neu port dang mo thi dong lai p.Close(); } p.DataBits = Convert.ToInt32(cbbits.Text); } privatevoid cbparity_TextChanged(object sender, EventArgs e) { if (p.IsOpen) { //neu port dang mo thi dong lai p.Close(); } switch (cbparity.SelectedItem.ToString()) { case"Odd": p.Parity = Parity.Odd; break; case"Even": p.Parity = Parity.Even; break; case"None": p.Parity = Parity.None; break; } } privatevoid cbbit_TextChanged(object sender, EventArgs e) { if (p.IsOpen) { //neu port dang mo thi dong lai p.Close(); } switch (cbbit.SelectedItem.ToString()) { case"1": p.StopBits = StopBits.One; break; case"1.5": p.StopBits = StopBits.OnePointFive; break; case"2": p.StopBits = StopBits.Two; break; } } //xay dung ham datareceive privatevoid datareceive(object obj, SerialDataReceivedEventArgs e) { inputdata = p.ReadLine();//doc du lieu tu cong com hien thi duoi dang dang chuoi //string buffer1 = Convert.ToString(p.ReadLine());//can nghien cuu if (inputdata != String.Empty) { hienthi(inputdata);//Di xay dung ham hien thi } } //xay dung ham hien thi privatevoid hienthi(string text) { if (this.lbkq.InvokeRequired) { SetTexCallback d = newSetTexCallback(hienthi);//kieu settexcallback duoc thiet lap o tren kieu delegate this.Invoke(d, newobject[] { text }); } else { this.lbkq.Text += "\r\n"; this.lbkq.Text +=text;//text o tren cho object[] {text} lbkq.SelectionStart = lbkq.TextLength;//scroll cuon xuong lbkq.ScrollToCaret();//scroll cuon xuong } } // privatevoid Form1_Load(object sender, EventArgs e) { hien(); lbkq.BackColor = Color.FromArgb(240,240,240); cbcom.SelectedIndex = 0;//Com 1 cbrate.SelectedIndex = 4;//9600 cbbits.SelectedIndex = 2;//8 bit cbparity.SelectedIndex = 0;//none cbbit.SelectedIndex = 0;//stop bit=1 chedofile.Enabled = false; no.Enabled = false; //hien thi status status.Text = "Hay chon 1 cong Com De Ket Noi"; /////////do thi 1 GraphPane mypane = zedGraphControl1.GraphPane;//zedGraphControl1 ten cua do thi // GraphPane mypane4 = zedGraphControl4.GraphPane; mypane.Title.Text = "Thông số nhà trồng "; //mypane4.Title.Text = "Nhiet Do Trung Binh"; mypane.XAxis.Title.Text = "Thoi Gian cot X (s))"; // mypane4.XAxis.Title.Text = "Thoi Gian Cot X"; mypane.YAxis.Title.Text = "Don vi dao dong"; //dinh nghia so diem ve tren mot do thi RollingPointPairList list1 = newRollingPointPairList(1200); //RollingPointPairList list2 = new RollingPointPairList(1200); PointPairList list3 = newPointPairList(); PointPairList list4 = newPointPairList();//kenh1 PointPairList list2 = newPointPairList(); //dinh nghia curve de ve LineItem curve1 = mypane.AddCurve("Duong 1", list1, Color.Red, SymbolType.Star);//duong1 dang hinh tron LineItem myCurve2 = mypane.AddCurve("Curve2", list2, Color.Blue, SymbolType.None); LineItem curve3 = mypane.AddCurve("Duong 3", list3, Color.Violet, SymbolType.Diamond);//duong1 dang hinh tron curve1.Symbol.Fill = newFill(Color.Blue); BoxObj box = newBoxObj( 0.0, 1.5, 1.0, 0.5, Color.Empty,Color.FromArgb( 150, Color.LightGreen ) ); box.Location.CoordinateFrame = CoordType.XChartFractionYScale; box.Fill = newFill(Color.White, Color.FromArgb(200, Color.LightGreen), 45.0F); box.ZOrder = ZOrder.F_BehindGrid; box.IsClippedToChartRect = true; mypane.GraphObjList.Add(box); BoxObj box1 = newBoxObj(0.0, 3, 1.0, 1.5, Color.Empty, Color.FromArgb(150,Color.LightBlue)); box1.Location.CoordinateFrame = CoordType.XChartFractionYScale; box1.Fill = newFill(Color.White, Color.FromArgb(200, Color.LightBlue), 45.0F); box1.ZOrder = ZOrder.F_BehindGrid; box1.IsClippedToChartRect = true; mypane.GraphObjList.Add(box1); BoxObj box2 = newBoxObj(0.0, 1.0, 1.0, 1.0, Color.Empty, Color.FromArgb(150, Color.LightGoldenrodYellow)); box2.Location.CoordinateFrame = CoordType.XChartFractionYScale; box2.Fill = newFill(Color.White, Color.FromArgb(200, Color.LightGoldenrodYellow), 45.0F); box2.ZOrder = ZOrder.F_BehindGrid; box2.IsClippedToChartRect = true; mypane.GraphObjList.Add(box2); mypane.Legend.IsVisible = false; mypane.Fill = newFill(Color.WhiteSmoke, Color.Lavender, 0F); mypane.Chart.Fill = newFill(Color.FromArgb(255, 255, 245), Color.FromArgb(255, 255, 190), 90F); //mau nen do thi mypane.Title.FontSpec.FontColor = Color.Green; mypane.XAxis.Title.FontSpec.FontColor = Color.Green; mypane.YAxis.Title.FontSpec.FontColor = Color.Green; mypane.Title.FontSpec.Size = 20; mypane.XAxis.MajorGrid.IsVisible = true; mypane.YAxis.MajorGrid.IsVisible = true; mypane.XAxis.MinorGrid.IsVisible = true; mypane.YAxis.MinorGrid.IsVisible = true; mypane.XAxis.MajorGrid.Color = Color.Blue; mypane.YAxis.MajorGrid.Color = Color.Blue; mypane.Chart.Fill = newFill(Color.White, Color.FromArgb(240,240,240)); mypane.Fill= newFill(Color.FromArgb(240, 240, 240)); //dinh khoang cach timer if (up == 0) { timer1.Interval = 500;//50ms } if (up == 1) { timer1.Interval = 1;//50ms } //dinh hien thi truc theo thoi gian //mypane.XAxis.Scale.MinAuto = true; mypane.YAxis.Scale.Max = 50; mypane.YAxis.Scale.Min = 0; // mypane.YAxis.Scale.MaxAuto = true; mypane.XAxis.Scale.MinorStepAuto = true; ;//muc chia nho nhat la 1 mypane.YAxis.Scale.MajorStepAuto = true; ;//muc chia lon nhat la 5 //goi ham xac dinh co truc zedGraphControl1.AxisChange(); //zedGraphControl4.AxisChange(); //khoi dong timer ve vi tri dau tickStart = Environment.TickCount; } //...Xay dung ham ve draw publicvoid draw(double setpoint1, double setpoint2 , double setpoint3) { if (zedGraphControl1.GraphPane.CurveList.Count <= 0) return; //dua cac duong ve diem xuat phat LineItem curve1 = zedGraphControl1.GraphPane.CurveList[0] asLineItem; LineItem curve2 = zedGraphControl1.GraphPane.CurveList[1] asLineItem; LineItem curve3 = zedGraphControl1.GraphPane.CurveList[2] asLineItem; if (curve1 == null) return; if (curve2 == null) return; if (curve3 == null) return; //list chua cac diem IPointListEdit list1 = curve1.Points asIPointListEdit; IPointListEdit list2 = curve2.Points asIPointListEdit; IPointListEdit list3 = curve3.Points asIPointListEdit; //RollingPointPairList list11 = new RollingPointPairList(1200); if (list1 == null) return; if (list2 == null) return; if (list3 == null) return; //time tinh bang ms----s/1000 time = (Environment.TickCount - tickStart) / 1000.0; list1.Add(time, setpoint1); list2.Add(time, setpoint2); list3.Add(time, setpoint3); //doan chuong trinh thuc hien ve do thi Scale xscale = zedGraphControl1.GraphPane.XAxis.Scale; if (time > xscale.Max - xscale.MajorStep) { if (button8.Text == "Compact") { xscale.Max = time + xscale.MajorStep; xscale.Min = xscale.Max - 30; } else { //che do scroll xscale.Max = time + xscale.MajorStep; xscale.Min = 0; } } zedGraphControl1.AxisChange(); zedGraphControl1.Invalidate(); } //draw4 publicvoid draw4(double setpoint4, double setpoint5, double setpoint6, double setpoint7) { //time tinh bang ms----s/1000 time = (Environment.TickCount - tickStart) / 1000.0; } privatevoid cbketnoi_Click(object sender, EventArgs e) { if (cbrate.Text == "115200") { p.BaudRate = 115200; } if (cbrate.Text == "9600") { p.BaudRate = 9600; } if (cbrate.Text == "19200") { p.BaudRate = 19200; } // try { p.Open(); btngat.Enabled = true; btketnoi.Enabled = false; status.Text = "Dang ket noi voi cong" + cbcom.SelectedItem.ToString(); } catch (Exception ex) { MessageBox.Show("Khong Ket Noi Duoc", "Thu Lai", MessageBoxButtons.OK, MessageBoxIcon.Error); } } privatevoid cbthoat_Click(object sender, EventArgs e) { DialogResult kq = MessageBox.Show("Ban Thuc Su Muon Thoat", "Thoat Chuong Trinh", MessageBoxButtons.YesNo, MessageBoxIcon.Question); if (kq == DialogResult.Yes) { MessageBox.Show("Cam on ban da su dung chuong trinh", "Thoat Chuong Trinh"); this.Close(); } } privatevoid btngat_Click(object sender, EventArgs e) { p.Close(); btngat.Enabled = false; btketnoi.Enabled = true; status.Text = "Da Ngat Ket Noi"; } privatevoid btxoa_Click(object sender, EventArgs e) { lbkq.Text = ""; txtsend.Text = ""; } privatevoid textBox9_TextChanged(object sender, EventArgs e) { } //.......... int check = 0;//khi nhan start thi check=0; //test upload privatevoid uplenhost(string a1,string a2,string a3,string a4, double value1,double value2,double value3,double value4) { time = 10; string url =apiurl + "?apikey=" + writedata_ + "&json={" + a1 + ":" + value1 + "," + a2 + ":" + value2 + "," + a3 + ":" + value3 + "," + a4 + ":" + value4 + "}"; var request = (HttpWebRequest)WebRequest.Create(url);; request.Accept = "*/*"; request.Method = "GET"; request.ContentType = "text/plain"; request.ContentLength = 0; HttpWebResponse reponse = (HttpWebResponse)request.GetResponse(); reponse.Close(); } //end test upload privatevoidhien() { mm.ketnoi(); mm.datagrid("SELECT * FROM history"); } privatevoid btmode1_Click(object sender, EventArgs e) { if (btmode.Text == "Start") { timer1.Enabled = true; btmode.Text = "Stop"; //khoi dong timer ve ban dau if (check == 0) { tickStart = Environment.TickCount; check = 1; } } else { timer1.Stop(); timer1.Enabled = false; btmode.Text = "Start"; } } privatevoid button8_Click(object sender, EventArgs e) { if (button8.Text == "Compact") button8.Text = "Scroll"; else button8.Text = "Compact"; } privatevoid cbrate_SelectedIndexChanged(object sender, EventArgs e) { } privatevoid btsend_Click(object sender, EventArgs e) { if (p.IsOpen) { if (txtsend.Text == "") { MessageBox.Show("Ban chua nhap du lieu", "Thong Bao"); } else p.Write(txtsend.Text); } else MessageBox.Show("Com chua mo", "Thong bao", MessageBoxButtons.OK, MessageBoxIcon.Error); } privatevoid file_Click(object sender, EventArgs e) { OpenFileDialog op1 = newOpenFileDialog(); op1.ShowDialog(); duongdan = op1.FileName; txtfile.Text = duongdan; } privatevoid timer1_Tick(object sender, EventArgs e) { readfile(); } // void readfile() { //chuoi 001$C2,003500,,,,,291006*Ins$0.00513,-0.00607,-1.00915,0.00687,-0.01123,0.00634,0.00436,0.02538,-0.09119,0.49476,0.26919,-1.61244; if (sosanh == 0)//che do com { if (inputdata.Length >1) { string[] docongcom = inputdata.Split(newchar[] { '$', 'C', ',', '*', 'I', 'n', 's',' ' }); com1 = double.Parse(docongcom[0]); com2 = double.Parse(docongcom[1]); com3 = double.Parse(docongcom[2]); kenh1.Text = docongcom[0]; kenh2.Text = docongcom[1]; kenh3.Text = docongcom[2]; if (up == 0) { //draw(com1); //draw(com2); } //luon luon ve do thi 4 if (up == 1) { //uplenhost(inputname1, inputname2, inputname3, com1, com2, com3, (com1 + com2 + com3) / 3); } draw4(com1, com2, com3, (com1 + com2 + com3) / 3); } } if(sosanh==1)//che do file { b = File.ReadAllLines(duongdan); if(dem==dem++) { if (b[dem].Length > 3) { string[] a = b[dem].Split(newchar[] { ','}); if (b.Length < 4) return; kenh1.Text = a[0]; kenh2.Text = a[1]; kenh3.Text = a[2]; lbkq.Text += b[dem]; lbkq.Text += "\r\n"; lbkq.SelectionStart = lbkq.TextLength;//scroll cuon xuong lbkq.ScrollToCaret();//scroll cuon xuong k1 = double.Parse(kenh1.Text); k2 = double.Parse(kenh2.Text); k3 = double.Parse(kenh3.Text); kenh1.Text = k1.ToString(); kenh2.Text = k2.ToString(); kenh3.Text = k3.ToString(); if (up == 0) { draw(k1,k2,k3); } } if (dem == b.Length - 1) { timer1.Enabled = false; time = 0; dem = 0; } }//end if so sanh } privatevoid chedocom_Click(object sender, EventArgs e) { sosanh = 0; chedocom.Enabled = false; chedofile.Enabled=true; status.Text = "Che do doc cong COm.Hay chon gia tri thong so phu hop de ket noi."; } privatevoid chedofile_Click(object sender, EventArgs e) { sosanh = 1; chedofile.Enabled = false; chedocom.Enabled = true; status.Text = "Che do doc File.Hay Chon File"; } privatevoid yes_Click(object sender, EventArgs e) { up = 1; yes.Enabled = false; no.Enabled = true; } privatevoid no_Click(object sender, EventArgs e) { up = 0; no.Enabled = false; yes.Enabled = true; } privatevoid textBox1_TextChanged(object sender, EventArgs e) { } privatevoid groupBox1_Enter(object sender, EventArgs e) { } privatevoid textBox2_TextChanged(object sender, EventArgs e) { } privatevoid textBox1_TextChanged_1(object sender, EventArgs e) { } privatevoid ht1_CellContentClick(object sender, DataGridViewCellEventArgs e) { } privatevoid zedGraphControl1_Load(object sender, EventArgs e) { } privatevoid lbkq_TextChanged(object sender, EventArgs e) { } } } Chương 1: KHÁI QUÁT Kháiquátvềnhàtrồngthông minh Tạimộtsốđịaphươngđãsửdụngnhàtrồngđểcanhtácmộtsốloạicây, hoa, raucógiátrịkinhtếcao, tuynhiênhiện nay vẫnchưacóđơnvịnàotiếnhànhnghiêncứuthiếtkếnhàtrồngđápứngđiềukiệnkinhtế, môitrườngcủanước ta. Thựctếtrongcuộcsốngbậnrộnhiện nay, nhiềubạnvẫncóthúvuilàtrồngnhữngcâycảnh, vườnrautrongkhônggiantrốngcủanhàmìnhnhưsânthượng, ban công. Tuynhiên, trongnhữnglúcbạnbậnđicôngtácnhiềungàythìnhữngcâycảnhvàvườnhoa ở nhàsẽkhôngaitướinước.Nhậnthấysựcầnthiếtphảiphảixâydựngnhàtrồngnhằmđẩymạnhsựnghiệppháttriểnnôngnghiệp, nôngthônnhómnghiêncứuchúngemđãthựchiệnđềtàitướinướctựđộngđượcđiềukhiểnbởimạchđiệntử Arduino Hình 1:Hệthốngtướinướctựđộngchocâytrồng 9 1.2 Thựctiễnápdụngcủa Arduino vàođềtài. Nhóm xin đưa ra mộtvídụvềứngdụngcủa Arduino vềgiámsátnhàvườn:Họsẽcungcấpchomộtliênlạchiệnđạiđểlàmvườnvàkếtnốimộtsốthông tin vềkhuvườncủahọvớiInternet.Sửdụngmộtcảmbiếnđộẩmvànhiệtđộđấtkếtnốivớimột Arduino vàmột chip WiFiđểtựđộnggửisốđotừkhuvườncủabạnđểđámmây.Mộtdịchvụgọi Carriots đểxửlýcácdữliệuvàhiểnthịnóđộcđáotrênmộttrang web. Sauđó, một email hoặc tin nhắn SMS cảnhbáocóthểđượcgửichobạntựđộngnếuđộẩmgiảmxuốngdướimộtngưỡngnhấtđịnh. Hìnhảnhdướiđâyđạidiệnchohệthốngkhilắpráphoànchỉnhvàvớibộcảmbiếnchônxuốngđấtbêncạnhmộtbomạchhoànchỉnh từvídụthựctiễnnàycungvoisựgiúpđỡcủagiáoviênhướngdẫn,nhómđãlựachọnvàpháttriểnđềtàitheohướngsữdụngkit Arduino đểthựchiệnđềtàicủamình. Giớihạnbàitoán Do đâymớilàlầnđầutiênnhữngthànhviêntrongnhómlàmmộtđềtàinghiêncứu, cộngvớikiếnthứccònnhiềuhạnchế, đềtàibọnemvẫncònmộtsốhạnchếnhư : + Chưađođạcđượcnhiềuthôngsố Do hanchếvềmặtthiếtbị,chiphícũngnhưkiếnthứclậptrình.nhómchỉthựchiệnđocácgiátrịvớicáccảmbiếnđơngiản. + Quymôápdụngcònhạnchế. + Chưađẩyđượcdữdiệu qua mạng

Các file đính kèm theo tài liệu này:

  • docxbaocaonckh2015_1884.docx