Khi bạn dùng các thiết bị sử dụng những nguồn điện riêng biệt thì những chân này phải được nối với nhau.. • RESET: việc nhấn nút Reset trên board để reset vi điều khiển tương đương với v
GIỚI THIỆU TỔNG QUÁT
CẤU TRÚC ĐIỀU KHIỂN BẰNG MÁY TÍNH
Hình 1.1 Cấu trúc điều khiển bằng máy tính
1.1 Giới Thiệu Giao Tiếp Chuẩn I2C:
I2C là tên viết tắt của cụm từ tiếng anh “Inter-Integrated Circuit” Nó là một giao thức giao tiếp được phát triển bởi Philips Semiconductors để truyền dữ liệu giữa một bộ xử lý trung tâm với nhiều IC trên cùng một board mạch chỉ sử dụng hai đường truyền tín hiệu Đây là một loại giao thức giao tiếp nối tiếp đồng bộ
MÁY TÍNH NGƯỜI ĐIỀU HÀNH
Chỉ cần có hai đường bus (dây) chung để điều khiển bất kỳ thiết bị / IC nào trên mạng I2C
Không cần thỏa thuận trước về tốc độ truyền dữ liệu như trong giao tiếp UART Vì vậy, tốc độ truyền dữ liệu có thể được điều chỉnh bất cứ khi nào cần thiết
Cơ chế đơn giản để xác thực dữ liệu được truyền
Sử dụng hệ thống địa chỉ 7 bit để xác định một thiết bị / IC cụ thể trên bus I2C
Các mạng I2C dễ dàng mở rộng Các thiết bị mới có thể được kết nối đơn giản với hai đường bus chung I2C
Hình 1.2 Hai đường bus chung I2C
Các thiết bị kết nối với bus I2C được phân loại hoặc là thiết bị Chủ (Master) hoặc là thiết bị Tớ (Slave) Ở bất cứ thời điểm nào thì chỉ có duy nhất một thiết bị Master ở trang thái hoạt động trên bus I2C Nó điều khiển đường tín hiệu đồng hồ SCL và quyết định hoạt động nào sẽ được thực hiện trên đường dữ liệu SDA
Bởi vì I2C sử dụng địa chỉ, nhiều thiết bị Slave có thể được điều khiển từ một thiết bị Master duy nhất Với 7 bit địa chỉ tương ứng 128 (27) địa chỉ duy nhất có sẵn
Kết nối giữa 1 Module Master và 3 Module Slave khác nhau:
Với nguyên lý tương tự như trên chúng ta sẽ có được:
Hình 1.3 Giao diện ngoại vi
GIỚI THIỆU CẤU TRÚC PHẦN CỨNG
ARDUINO UNO R3
Vi điều khiển ATmega328 họ 8bit Điện áp hoạt động 5V DC (chỉ được cấp qua cổng USB)
Tần số hoạt động 16 MHz
Dòng tiêu thụ khoảng 30mA Điện áp vào khuyên dùng 7-12V DC Điện áp vào giới hạn 6-20V DC
Số chân Digital I/O 14 (6 chân hardware PWM)
Số chân Analog 6 (độ phân giải 10bit)
Dòng tối đa trên mỗi chân I/O 30 mA
Dòng ra tối đa (5V) 500 mA
Dòng ra tối đa (3.3V) 50 mA
Bộ nhớ flash 32 KB (ATmega328) với 0.5KB dùng bởi bootloader
Hình 2.1 Thông số kỹ thuật
• GND (Ground): cực âm của nguồn điện cấp cho Arduino UNO Khi bạn dùng các thiết bị sử dụng những nguồn điện riêng biệt thì những chân này phải được nối với nhau
• 5V: cấp điện áp 5V đầu ra Dòng tối đa cho phép ở chân này là 500mA
• 3.3V: cấp điện áp 3.3V đầu ra Dòng tối đa cho phép ở chân này là 50mA
• Vin (Voltage Input): để cấp nguồn ngoài cho Arduino UNO, bạn nối cực dương của nguồn với chân này và cực âm của nguồn với chân GND
• IOREF: điện áp hoạt động của vi điều khiển trên Arduino UNO có thể được đo ở chân này Và dĩ nhiên nó luôn là 5V Mặc dù vậy bạn không được lấy nguồn 5V từ chân này để sử dụng bởi chức năng của nó không phải là cấp nguồn
• RESET: việc nhấn nút Reset trên board để reset vi điều khiển tương đương với việc chân RESET được nối với GND qua 1 điện trở 10KΩ
Vi điều khiển Atmega328 tiêu chuẩn cung cấp cho người dùng:
• 32KB bộ nhớ Flash: những đoạn lệnh bạn lập trình sẽ được lưu trữ trong bộ nhớ Flash của vi điều khiển Thường thì sẽ có khoảng vài KB trong số này sẽ được dùng cho bootloader nhưng đừng lo, bạn hiếm khi nào cần quá 20KB bộ nhớ này đâu
• 2KB cho SRAM (Static Random Access Memory): giá trị các biến bạn khai báo khi lập trình sẽ lưu ở đây Bạn khai báo càng nhiều biến thì càng cần nhiều bộ nhớ RAM Tuy vậy, thực sự thì cũng hiếm khi nào bộ nhớ RAM lại trở thành thứ mà bạn phải bận tâm Khi mất điện, dữ liệu trên SRAM sẽ bị mất
• 1KB cho EEPROM (Electrically Eraseble Programmable Read Only Memory): đây giống như một chiếc ổ cứng mini – nơi bạn có thể đọc và ghi dữ liệu của mình vào đây mà không phải lo bị mất khi cúp điện giống như dữ liệu trên SRAM
Arduino UNO có 14 chân digital dùng để đọc hoặc xuất tín hiệu Chúng chỉ có 2 mức điện áp là 0V và 5V với dòng vào/ra tối đa trên mỗi chân là 40mA Ở mỗi chân đều có các điện trở pull-up từ được cài đặt ngay trong vi điều khiển ATmega328 (mặc định thì các điện trở này không được kết nối)
Arduino UNO có 14 chân digital dùng để đọc hoặc xuất tín hiệu Chúng chỉ có 2 mức điện áp là 0V và 5V với dòng vào/ra tối đa trên mỗi chân là 40mA Ở mỗi chân đều có các điện trở pull-up từ được cài đặt ngay trong vi điều khiển ATmega328 (mặc định thì các điện trở này không được kết nối)
Một số chân digital có các chức năng đặc biệt như sau:
• Chân Serial: 0 (RX) và 1 (TX): dùng để gửi (transmit – TX) và nhận (receive – RX) dữ liệu TTL Serial Arduino Uno có thể giao tiếp với thiết bị khác thông qua 2 chân này Kết nối bluetooth thường thấy nói nôm na chính là kết nối Serial không dây Nếu không cần giao tiếp Serial, bạn không nên sử dụng 2 chân này nếu không cần thiết
• Chân PWM (~): 3, 5, 6, 9, 10, và 11: cho phép bạn xuất ra xung PWM với độ phân giải 8bit (giá trị từ 0 → 28-1 tương ứng với 0V → 5V) bằng hàm analogWrite() Nói một cách đơn giản, bạn có thể điều chỉnh được điện áp ra ở chân này từ mức 0V đến 5V thay vì chỉ cố định ở mức 0V và 5V như những chân khác
• Chân giao tiếp SPI: 10 (SS), 11 (MOSI), 12 (MISO), 13 (SCK) Ngoài các chức năng thông thường, 4 chân này còn dùng để truyền phát dữ liệu bằng giao thức SPI với các thiết bị khác
• LED 13: trên Arduino UNO có 1 đèn led màu cam (kí hiệu chữ L) Khi bấm nút Reset, bạn sẽ thấy đèn này nhấp nháy để báo hiệu Nó được nối với chân số 13 Khi chân này được người dùng sử dụng, LED sẽ sáng
• Arduino UNO có 6 chân analog (A0 → A5) cung cấp độ phân giải tín hiệu 10bit (0 → 210-1) để đọc giá trị điện áp trong khoảng 0V → 5V Với chân AREF trên board, bạn có thể để đưa vào điện áp tham chiếu khi sử dụng các chân analog Tức là nếu bạn cấp điện áp 2.5V vào chân này thì bạn có thể dùng các chân analog để đo điện áp trong khoảng từ 0V → 2.5V với độ phân giải vẫn là 10bit
• Đặc biệt, Arduino UNO có 2 chân A4 (SDA) và A5 (SCL) hỗ trợ giao tiếp I2C/TWI với các thiết bị khác.
LCD 4X16
THÔNG SỐ MÀN HÌNH LCD 1604
• Diện tích hiển thị: 62,3 x 27,6mm
• Màu xanh dương chữ trắng
• Nhiệt độ làm việc: -20 độ đến +70 độ
• Nhiệt độ lưu trữ: -30 độ đến +80 độ
• Chân thứ 2: VDD chân dương 5V
• Chân 3: V0 là đầu điều chỉnh độ tương phản LCD Khi kết nối công suất dương, độ tương phản là yếu nhất Khi sử dụng công suất nối đất, độ tương phản là cao nhất Khi độ tương phản quá cao, sẽ xảy ra hiện tượng tương phản thông qua chiết áp 10K
• Chân 4: RS là lựa chọn thanh ghi Khi mức cao được chọn, thanh ghi dữ liệu được chọn và khi mức thấp được chọn, thanh ghi lệnh được chọn
• Chân 5: R / W là đường tín hiệu đọc / ghi Khi ở mức cao, nó thực hiện thao tác đọc và khi ở mức thấp, nó sẽ thực hiện thao tác ghi Khi RS và RW ở mức thấp cùng nhau, có thể ghi địa chỉ lệnh hoặc hiển thị Khi RS thấp, RW có thể đọc tín hiệu bận và khi RS ở mức cao, RW có thể được ghi vào dữ liệu
• Chân 6: Thiết bị đầu cuối E là thiết bị đầu cuối cho phép Khi thiết bị đầu cuối E thay đổi từ mức cao sang mức thấp, mô đun tinh thể lỏng thực hiện lệnh
• Chân 7 đến 14: D0 đến D7 là các đường dữ liệu hai chiều 8 bit
Module chuyển đổi giao tiếp I2C cho LCD
THÔNG SỐ MẠCH CHUYỂN ĐỔI GIAO TIẾP I2C
• Kích thước: 41.5mm(L)X19mm(W)X15.3MM(H)
• Jump chốt: Cung cấp đèn cho LCD hoặc ngắt
• Biến trở xoay độ tương phản cho
Hình 2.4 Module chuyển đổi giao tiếp I2C
Hình 2.5 Sơ đồ chân kết nối LCD
Cảm biến nhiệt độ độ ẩm DHT11
• Điện áp hoạt động : 5VDC
• Chuẩn giao tiếp: TTL, 1 wire
• Khoảng đo độ ẩm: 20%-80%RH sai số ±
• Khoảng đo nhiệt độ:0-50 °C sai số ± 2°C
• Tần số lấy mẫu tối đa 1Hz (1 giây / lần)
• Kích thước : 28mm x 12mm x10mm Hình 2.6 Cảm biết nhiệt độ & độ ẩm
• Cảm biến độ ẩm, nhiệt độ DHT11 ra chân được tích hợp sẵn điện trở 5,1k giúp người dùng dễ dàng kết nối và sử dụng hơn so với cảm biến DHT11 chưa ra chân, module lấy dữ liệu thông qua giao tiếp 1 wire (giao tiếp 1 dây)
• Bộ tiền xử lý tín hiệu tích hợp trong cảm biến giúp bạn có được dữ liệu chính xác mà không cần phải qua bất kỳ tính toán nào Module được thiết kế hoạt động ở mức điện áp 5VDC.
Cảm biến cường độ ánh sáng quang trở
Hình 2.7 Cảm biến ánh sáng quang trở
Cảm biến cường độ ánh sáng quang trở rất nhạy cảm với cường độ ánh sáng môi trường thường được sử dụng để phát hiện độ sáng môi trường xung quanh và cường độ ánh sáng Khi cường độ ánh sáng môi trường xung quanh bên ngoài vượt quá một ngưỡng quy định, ngõ ra của module D0 là mức logic thấp Ngoài ra còn có ngõ ra Analog ở chân A0 để xử lí mức độ ánh sáng
Cảm biến cường độ ánh sáng phát hiện cường độ ánh sáng, sử dụng bộ cảm biến photoresistor loại nhạy cảm, cho tín hiệu ổn định, rõ ràng và chính xác hơn so với quang trở độ nhạy có thể tùy chỉnh Thiết kế đơn giản nhưng hiệu quả và độ tin cậy cao, độ nhiễu thấp do được thiết kế mạch lọc tín hiệu trước khi so sánh với ngưỡng
Thân thiện với người dùng hơn khi hổ trợ cả 2 dạng tín hiệu ngõ ra dạng số (tín hiệu 0
1) và dạng analog ỨNG DỤNG CẢM BIẾN CƯỜNG ĐỘ ÁNH SÁNG
• Điều khiển thiết bị bật tắt theo ánh sáng
• Điều khiển đèn chiếu sáng tự động
• Hệ thống cảnh báo chống trộm sử dụng kết hợp với module lazer
• Truyền tải dữ liệu bằng thu nhận xung laser
• Kết nối 4 chân với 2 chân cấp nguồn (VCC và GND) và 2 chân tín hiệu ngõ ra (AO và DO)
• Hỗ trợ cả 2 dạng tín hiệu ra Analog và TTL Ngõ ra Analog 0 – 5V tỷ lệ thuận với cường độ ánh sáng, ngõ TTL tích cực mức thấp
• Độ nhạy cao với ánh sáng được tùy chỉnh bằng biến trở
Điện trở
• Nhiệt độ hoạt động: -55oC – 155oC
• Linh kiện xuyên lỗ: 0.5mm
• Loại: Điện trở cố định
• Quy cách đóng gói: 50 cái/gói
Hình 2.8 Điện trở Điện trở cắm 1K 1/4W có giá trị trở kháng cố định được sản xuất theo chuẩn E24 có sai số rất nhỏ chỉ 5%, hiệu suất làm việc ổn định, nhiễu nhiệt nhỏ, đặc tính tần cao Là loại điện trở được sản xuất theo công nghệ Carbon film Điện trở cắm 1/4W có kích thước nhỏ, nhiệt độ hoạt động từ -55oC đến 155oC và dải điện áp rộng thích hợp với nhiều mạch điện tử Bạn có thể ghép các điện trở nối tiếp, song song hoặc kết hợp để có được giá trị điện trở phù hợp với yêu cầu.
LED trắng 5mm
MÔ HÌNH THỰC TẾ
Mô hình phần cứng thiết kế thực tế
Hình 3.1 Hình ảnh mô hình phần cứng thực tế
Mô hình phần mềm thiết kế giao diện thực tế
Hình 3.2 Hình ảnh form 1 được thiết kế trên phần mềm Visual
Hình 3.3 Hình ảnh form 2 được thiết kế trên phần mềm Visual
Hình 3.4 Hình ảnh form3 mô hình thiết kế điều khiển trên phần mềm Visual
PHẦN CODE THỰC HIỆN CHƯƠNG TRÌNH
Phần Code Arduino UNO
// Khai báo đối tượng LCD
#define SLAVE3_ADDR 0x06 int m = 0; float tongt1 = 0; float tongd1 = 0; float tongt2 = 0; float tongd2 = 0; float tongt3 = 0; float tongd3 = 0; float t1 = 100; float t2 = 100; float t3 = 100; float d1 = 100; float d2 = 100; float d3 = 100; void setup()
Serial.begin(9600); lcd.init(); lcd.backlight(); lcd.setCursor(1,0); lcd.print("TRUONG DH NONG LAM"); lcd.setCursor(3,1); lcd.print("KHOA : CK - CN"); lcd.setCursor(1,2); lcd.print("DO LUONG MAY TINH"); lcd.setCursor(0,3); lcd.print("GVHD:TS CAO DUC LOI"); delay(1000); lcd.clear();
String dulieu = ""; while(Serial.available() > 0 )
// xử lý phần số được gửi từ winform if(dulieu.charAt(0) == 'S')
String so1 = dulieu.substring(1, dulieu.indexOf(','));
String so2 = dulieu.substring(dulieu.indexOf(',') + 1); t1 = so1.toInt(); d1 = so2.toInt();
String so1 = dulieu.substring(1, dulieu.indexOf(','));
String so2 = dulieu.substring(dulieu.indexOf(',') + 1); t2 = so1.toInt(); d2 = so2.toInt();
String so1 = dulieu.substring(1, dulieu.indexOf(','));
String so2 = dulieu.substring(dulieu.indexOf(',') + 1); t3 = so1.toInt(); d3 = so2.toInt();
} if(dulieu == "BD1") // du lieu bat den 1
Wire.write("BD1");// Gửi định danh của dữ liệu
Wire.endTransmission(); // Kết thúc gửi tín hiệu đến Slave 1 lcd.setCursor(5,1); lcd.print("BAT");
Wire.endTransmission(); // Kết thúc gửi tín hiệu đến Slave 1 lcd.setCursor(5,1); lcd.print("TAT");
Wire.endTransmission(); lcd.setCursor(11,1); lcd.print("BAT"); // Kết thúc gửi tín hiệu đến Slave 1 } if(dulieu == "TQ1")
Wire.endTransmission(); lcd.setCursor(11,1); lcd.print("TAT"); // Kết thúc gửi tín hiệu đến Slave 1
// du lieu ve bom 1 if(dulieu == "BB1")
Wire.endTransmission(); lcd.setCursor(17,1); lcd.print("BAT");// Kết thúc gửi tín hiệu đến Slave 1
Wire.endTransmission(); lcd.setCursor(17,1);// Kết thúc gửi tín hiệu đến Slave 1 lcd.print("TAT");
// che do lam viec may 2
// du lieu ve den 2 if(dulieu =="BD2")
Wire.endTransmission(); // Kết thúc gửi tín hiệu đến Slave 2 lcd.setCursor(5,2); lcd.print("BAT");
Wire.endTransmission(); // Kết thúc gửi tín hiệu đến Slave 2 lcd.setCursor(5,2); lcd.print("TAT");
// dulieu về quạt 2 if(dulieu == "BQ2")
Wire.endTransmission(); // Kết thúc gửi tín hiệu đến Slave 2 lcd.setCursor(11,2); lcd.print("BAT");
Wire.endTransmission(); lcd.setCursor(11,2); lcd.print("TAT");// Kết thúc gửi tín hiệu đến Slave 2
// dulieu về bơm 2 if(dulieu == "BB2")
Wire.endTransmission(); // Kết thúc gửi tín hiệu đến Slave 2 lcd.setCursor(17,2); lcd.print("BAT");
Wire.endTransmission(); // Kết thúc gửi tín hiệu đến Slave 2 lcd.setCursor(17,2); lcd.print("TAT");
//chế độ làm việc của máy 3
// dulieu den 3 if(dulieu == "BD3")
Wire.endTransmission(); // Kết thúc gửi tín hiệu đến Slave 3 lcd.setCursor(5,3);
Wire.endTransmission(); // Kết thúc gửi tín hiệu đến Slave 3 lcd.setCursor(5,3); lcd.print("TAT");
// dulieu quạt 3 if(dulieu == "BQ3")
Wire.endTransmission(); // Kết thúc gửi tín hiệu đến Slave 3 lcd.setCursor(11,3); lcd.print("BAT");
Wire.endTransmission(); // Kết thúc gửi tín hiệu đến Slave 3 lcd.setCursor(11,3); lcd.print("TAT");
//dulieu bơm 3 if(dulieu == "BB3")
Wire.endTransmission(); // Kết thúc gửi tín hiệu đến Slave 3 lcd.setCursor(17,3); lcd.print("BAT");
Wire.endTransmission(); // Kết thúc gửi tín hiệu đến Slave 3 lcd.setCursor(17,3); lcd.print("TAT");
// xu li che do auto if(dulieu == "AUTO")
Wire.endTransmission(); // Kết thúc gửi tín hiệu đến Slave 1 //xu lí cho máy 2
Wire.endTransmission(); // Kết thúc gửi tín hiệu đến Slave 2 // xử lí cho máy 3
Wire.endTransmission(); // Kết thúc gửi tín hiệu đến Slave 3 }
// xu li che do main if(dulieu == "MAIN")
// tăt hết sự hoạt động của máy 1
Wire.endTransmission(); // Kết thúc gửi tín hiệu đến Slave 2 // tắt hết sự hoạt động của máy 2
Wire.endTransmission(); // Kết thúc gửi tín hiệu đến Slave 2 // tắt hết sư hoạt động của máy 3
Wire.endTransmission(); // Kết thúc gửi tín hiệu đến Slave 2 }
// hoạt động gửi về từ các chương trình con về master if(m == 0)
{ lcd.setCursor(0,0); lcd.print("HOAT DONG CUA SLAVE");
Wire.requestFrom(SLAVE1_ADDR, 4); while (Wire.available())
// xử lý slave 1 float temperature1 = Wire.read(); float humidity1 = Wire.read(); int giatri1 = Wire.read();
Wire.endTransmission(); // Kết thúc gửi tín hiệu đến Slave 1 } if(giatri1 == 0)
Wire.endTransmission(); // Kết thúc gửi tín hiệu đến Slave 1 } if(temperature1 == 255 || humidity1 == 255)
{ tongt1 = t1 - ( temperature1 + 2 ); tongd1 = d1 - ( humidity1 + 2 ); lcd.setCursor(0,1); lcd.print("M1:T:");
Serial.print(temperature1); lcd.print(temperature1); lcd.setCursor(11,1); lcd.print("RH:");
Serial.print(","); lcd.print(humidity1);
Wire.endTransmission(); // Kết thúc gửi tín hiệu đến Slave 1 } if(tongt1 > 0)
Wire.endTransmission(); // Kết thúc gửi tín hiệu đến Slave 1 } if(tongd1 0)
Wire.endTransmission(); // Kết thúc gửi tín hiệu đến Slave 1 }
Wire.requestFrom(SLAVE2_ADDR, 4); while (Wire.available())
{ float temperature2 = Wire.read(); float humidity2 = Wire.read(); int giatri2 = Wire.read(); if(giatri2 == 1)
Wire.endTransmission(); // Kết thúc gửi tín hiệu đến Slave 2
Wire.endTransmission(); // Kết thúc gửi tín hiệu đến Slave 2 } if(temperature2 == 255 || humidity2 == 255)
{ tongt2 = t2 - ( temperature2 + 2 ); tongd2 = d2 - ( humidity2 + 2 ); lcd.setCursor(0,2); lcd.print("M2:T:");
23 lcd.print(temperature2); lcd.setCursor(11,2); lcd.print("RH:");
Serial.print(","); lcd.print(humidity2);
Wire.endTransmission(); // Kết thúc gửi tín hiệu đến Slave 2 } if(tongt2 > 0)
Wire.endTransmission(); // Kết thúc gửi tín hiệu đến Slave 2 } if(tongd2 0)
Wire.endTransmission(); // Kết thúc gửi tín hiệu đến Slave 2 }
Wire.requestFrom(SLAVE3_ADDR, 4); while (Wire.available())
// xử lý slave 3 float temperature3 = Wire.read(); float humidity3 = Wire.read(); int giatri3 = Wire.read(); if(giatri3 == 1)
Wire.endTransmission(); // Kết thúc gửi tín hiệu đến Slave 2
Wire.endTransmission(); // Kết thúc gửi tín hiệu đến Slave 2 } if(temperature3 == 255.00 || humidity3 == 255.00)
{ tongt3 = t3 - ( temperature3 + 2 ); tongd3 = d3 - ( humidity3 + 2 ); lcd.setCursor(0,3); lcd.print("M3:T:");
Serial.print(temperature3); lcd.print(temperature3); lcd.setCursor(11,3); lcd.print("RH:");
Serial.print(","); lcd.print(humidity3);
Wire.endTransmission(); // Kết thúc gửi tín hiệu đến Slave 3 } if(tongt3 > 0)
Wire.endTransmission(); // Kết thúc gửi tín hiệu đến Slave 3 } if(tongd3 0)
Wire.endTransmission(); // Kết thúc gửi tín hiệu đến Slave 3 }
{ lcd.setCursor(0,0); lcd.print("HOAT DONG CUA SLAVE"); lcd.setCursor(0,1); lcd.print("M1:D:"); lcd.setCursor(9,1); lcd.print("Q:"); lcd.setCursor(15,1); lcd.print("B:"); lcd.setCursor(0,2); lcd.print("M2:D:"); lcd.setCursor(15,2); lcd.print("B:"); lcd.setCursor(9,2); lcd.print("Q:"); lcd.setCursor(0,3); lcd.print("M3:D:"); lcd.setCursor(9,3); lcd.print("Q:"); lcd.setCursor(15,3); lcd.print("B:");
DHT dht(DHTPIN, DHTTYPE); float temperature1; float humidity1; int giatri1; void setup()
{ pinMode(cambien,INPUT); pinMode(den1, OUTPUT); pinMode(quat1, OUTPUT); pinMode(bom1, OUTPUT);
Wire.onRequest(requestEvent); // xử lí về trong master gửi về Wire.onReceive(receiveEvent); // đăng ký trình xử lý sự kiện nhận dht.begin(); digitalWrite(den1,LOW); digitalWrite(quat1,LOW); digitalWrite(bom1,LOW);
{ temperature1 = dht.readTemperature(); humidity1 = dht.readHumidity(); giatri1 = digitalRead(cambien);
String dulieu =""; while (Wire.available())
{ char c = Wire.read(); dulieu += c; // đọc dữ liệu đến
Serial.println(dulieu); if(dulieu == "MAIN")
{ digitalWrite(den1,LOW); digitalWrite(quat1,LOW); digitalWrite(bom1,LOW);
// xử lí auto if(dulieu == "AUTO")
{ digitalWrite(den1,LOW); digitalWrite(quat1,LOW);
DHT dht(DHTPIN, DHTTYPE); float temperature2; float humidity2;
{ pinMode(cambien,INPUT); pinMode(den2, OUTPUT); pinMode(quat2, OUTPUT); pinMode(bom2, OUTPUT);
Wire.onRequest(requestEvent); // xử lí về trong master gửi về Wire.onReceive(receiveEvent); // đăng ký trình xử lý sự kiện nhận dht.begin(); digitalWrite(den2,LOW); digitalWrite(quat2,LOW); digitalWrite(bom2,LOW);
{ temperature2 = dht.readTemperature(); humidity2 = dht.readHumidity(); giatri2 = digitalRead(cambien);
String dulieu =""; while (Wire.available())
{ char c = Wire.read(); dulieu += c; // đọc dữ liệu đến
// xử lí main if(dulieu == "MAIN")
30 digitalWrite(quat2,LOW); digitalWrite(bom2,LOW);
// xử lí auto if(dulieu == "AUTO")
{ digitalWrite(den2,LOW); digitalWrite(quat2,LOW); digitalWrite(bom2,LOW);
DHT dht(DHTPIN, DHTTYPE); float temperature3; float humidity3; int giatri3; void setup()
{ pinMode(cambien,INPUT); pinMode(den3, OUTPUT);
32 pinMode(quat3, OUTPUT); pinMode(bom3, OUTPUT);
Wire.onRequest(requestEvent); // xử lí về trong master gửi về Wire.onReceive(receiveEvent); // đăng ký trình xử lý sự kiện nhận dht.begin(); digitalWrite(den3,LOW); digitalWrite(quat3,LOW); digitalWrite(bom3,LOW);
{ temperature3 = dht.readTemperature(); humidity3 = dht.readHumidity(); giatri3 = digitalRead(cambien);
String dulieu =""; while (Wire.available())
{ char c = Wire.read(); dulieu += c; // đọc dữ liệu đến
// xử lí main if(dulieu == "MAIN")
{ digitalWrite(den3,LOW); digitalWrite(quat3,LOW); digitalWrite(bom3,LOW);
// xử lí auto if(dulieu == "AUTO")
{ digitalWrite(den3,LOW); digitalWrite(quat3,LOW); digitalWrite(bom3,LOW);
Phần code thiết kế giao diện trên phần mềm Visual
FORM 1 using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.IO; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; namespace nopbaitap
{ public partial class Form1 : Form
} private void panel1_Paint(object sender, PaintEventArgs e) {
} private void Form1_Load(object sender, EventArgs e) {
} private void button1_Click(object sender, EventArgs e) {
Form2 fm = new Form2(); fm.Show(); this.Hide();
FORM 2 using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; namespace nopbaitap
{ public partial class Form2 : Form
} private void Form2_Load(object sender, EventArgs e) {
} private void btn_thoat_Click(object sender, EventArgs e) {
Form1 fm = new Form1(); fm.Show(); this.Hide();
} private void button2_Click(object sender, EventArgs e)
Form3 fm = new Form3(); fm.Show(); this.Hide();
FORM 3 using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; using System.IO.Ports; using System.Windows.Forms.DataVisualization.Charting; using System.Reflection; using System.Xml.Linq; using static System.Windows.Forms.VisualStyles.VisualStyleElement; namespace nopbaitap
{ public partial class Form3 : Form
{ int counter = 0; double temperature1 = 0; double doam1 = 0; double temperature2 = 0; double temperature3 = 0; double doam2 = 0; double doam3 = 0; public Form3()
InitializeComponent(); timer1.Interval = 10; timer1.Enabled = false;
// Khởi động timer timer1.Enabled = true; string[] Baudrate = { "1200", "2400", "4800", "9600", "112500" }; cbtruyen.Items.AddRange(Baudrate);
} private void Form3_Load(object sender, EventArgs e)
{ cbport.DataSource = SerialPort.GetPortNames(); cbtruyen.Text = "9600";
} private void button2_Click(object sender, EventArgs e)
{ timer1.Enabled = true; butconnect.Text = "DISCONNECT"; sercom.PortName = cbport.Text; sercom.BaudRate = Convert.ToInt32(cbtruyen.Text); sercom.Open();
{ btnauto.BackColor = Color.White; btnmain.BackColor = Color.White; butconnect.Text = "CONNECT"; sercom.Close();
} private void sercom_DataReceived(object sender,
String data = ""; data += sercom.ReadLine(); data.Trim(); if (data.StartsWith("A"))
{ data = data.Substring(1); string[] values = data.Split(','); hienthit1.Text = values[0]; hienthid1.Text = values[1];
{ data = data.Substring(1); string[] values = data.Split(','); hienthit2.Text = values[0]; hienthid2.Text = values[1];
{ data = data.Substring(1); string[] values = data.Split(','); hienthit3.Text = values[0]; hienthid3.Text = values[1];
{ textBox5.Text = "BAN ĐÊM"; picon.Visible = true; picoff.Visible = false; button1.BackColor = Color.Black;
{ textBox5.Text = "BAN NGÀY"; picoff.Visible = true; picon.Visible = false; button1.BackColor = Color.Red;
{ textBox3.Text = "BAN ĐÊM"; picdenoff1.Visible = false; picdenon1.Visible = true; button1.BackColor = Color.Black;
{ textBox3.Text = "BAN NGÀY"; picdenoff1.Visible = true; picdenon1.Visible = false; button1.BackColor = Color.Red;
{ textBox4.Text = "BAN ĐÊM"; picdenoff2.Visible = false; picdenon2.Visible = true; button1.BackColor = Color.Black;
{ textBox4.Text = "BAN NGÀY"; picdenoff2.Visible = true; picdenon2.Visible = false; button1.BackColor = Color.Red;
} private void timer1_Tick_1(object sender, EventArgs e) {
39 string formattedDateTime = now.ToString("HH:mm:ss MM/dd/yyyy
"); double temperature1 = 0; double doam1 = 0; double temperature2 = 0; double doam2 = 0; double temperature3 = 0; double doam3 = 0;
// nhiet do 1 if (double.TryParse(hienthit1.Text, out temperature1))
// Nếu số lượng dữ liệu trên biểu đồ quá nhiều thì xóa đi các dữ liệu cũ để giữ cho biểu đồ chỉ hiển thị trong 10 giây
// độ ẩm 1 if (double.TryParse(hienthid1.Text, out doam1))
// Nếu số lượng dữ liệu trên biểu đồ quá nhiều thì xóa đi các dữ liệu cũ để giữ cho biểu đồ chỉ hiển thị trong 10 giây
// nhiet do 2 if (double.TryParse(hienthit2.Text, out temperature2))
// Nếu số lượng dữ liệu trên biểu đồ quá nhiều thì xóa đi các dữ liệu cũ để giữ cho biểu đồ chỉ hiển thị trong 10 giây
// độ ẩm 2 if (double.TryParse(hienthid2.Text, out doam2))
// Nếu số lượng dữ liệu trên biểu đồ quá nhiều thì xóa đi các dữ liệu cũ để giữ cho biểu đồ chỉ hiển thị trong 10 giây
// nhiet do 3 if (double.TryParse(hienthit3.Text, out temperature3))
// Nếu số lượng dữ liệu trên biểu đồ quá nhiều thì xóa đi các dữ liệu cũ để giữ cho biểu đồ chỉ hiển thị trong 10 giây
// độ ẩm 3 if (double.TryParse(hienthid3.Text, out doam3))
// Nếu số lượng dữ liệu trên biểu đồ quá nhiều thì xóa đi các dữ liệu cũ để giữ cho biểu đồ chỉ hiển thị trong 10 giây
} private void button4_Click(object sender, EventArgs e)
String D1 = nhapd1.Text; if (btnauto.BackColor == Color.Orange)
{ sercom.Write("S" + T1 + ',' + D1); float value1 = float.Parse(hienthit1.Text); float value3 = float.Parse(hienthid1.Text); if (value1 >= valuet1 - 5 && value1 = valued1 - 5 && value3 = valuet3 - 5 && value1 = valued3 - 5 && value3 = valuet2 - 5 && value1 = valued2 - 5 && value3