Thạch Đinh Kim gửi vào
- 29577 lượt xem
Mục đích bài hướng dẫn là mang lại cho bạn các xây dựng một hệ thống giám sát đơn giản, miễn phí, sau đó tùy vào bạn mà mở rộng tính năng theo ý tưởng của mình
Chuẩn bị
Kiến thức cần có
Vì đây là một bài hướng dẫn không phải là kiểu copy run nên để hiểu và hiệu chỉnh được code bạn phải chuẩn bị một số kiến thức như sau
- Lập trình Arduino cơ bản
- Lập trình PHP&MySQL
- Kiến thức về hosting/tên miền
Về phần dụng cụ
- 1 Arduino UNO R3
- 1 Cảm biến DHT 11 để minh họa cho phần gửi nhận thông tin
- 1 Ethernet Shield
- 1 Cáp mạng
- 1 cáp USB
- 1 Tài khoản Hostinger (Lưu ý: FreeVNN không hỗ trợ nhé nó nhé chống việc gửi dữ liệu từ Ethernet Shield) đăng ký tại hostinger.vn
Phần mềm và thư viện
- Arduino IDE 1.6 (Tested)
- DHT11.h
Kiểm tra các thư viện và phần cứng
Sau khi chuẩn bị bạn cần kiểm tra để tránh các lỗi vô duyên kiểu code đúng mà chương trình chạy sai
Đầu tiên mình sẻ kiểm tra con DHT11 trước
Để kiểm tra bạn lắp theo sơ đồ như đây
Chân DATA sẽ nối với điện trở 10k (còn gọi là pulse resistor)
Mình sẽ gửi code của chương trình đó luôn bạn chỉ cần biết sơ sơ về lập trình arduino hoặc c cũng hiểu nên mình không giải thích nhiều
#include "DHT.h" #include <Adafruit_Sensor.h> #define DHTPIN 2 #define DHTTYPE DHT11 // DHT 11 DHT dht(DHTPIN, DHTTYPE); void setup() { Serial.begin(9600); Serial.println("DHTxx test!"); dht.begin(); } void loop() { delay(2000); float h = dht.readHumidity(); float t = dht.readTemperature(); float f = dht.readTemperature(true); if (isnan(h) || isnan(t) || isnan(f)) { Serial.println("Failed to read from DHT sensor!"); return; } float hif = dht.computeHeatIndex(f, h); float hic = dht.computeHeatIndex(t, h, false); Serial.print("Humidity: "); Serial.print(h); Serial.print(" %\t"); Serial.print("Temperature: "); Serial.print(t); Serial.print(" *C "); Serial.print(f); Serial.print(" *F\t"); Serial.print("Heat index: "); Serial.print(hic); Serial.print(" *C "); Serial.print(hif); Serial.println(" *F"); }
Dựa theo code mẫu của DHT Master Library
https://github.com/adafruit/DHT-sensor-library
Nếu chạy đúng thì chương trình sẽ không lỗi và hiện ra được thông tin thời tiết
Tiếp đến là kiểm tra Ethernet shield
Ethernet shield rất dễ sử dụng bạn chỉ cần chồng nó lên và gắm dây mạng vào là được
Code Ethernet shield tích hợp sẵn trong Arduino IDE hoạt động chính xác rồi cho nên bạn chỉ cần vào
File > Examples> Ethernet > WebClient (trong bài viết Arduino sẽ ở vai trò là một web client để gửi GET_ReQUEST)
Và nếu đoạn mã bạn chạy ra như vậy thì bạn đã xong bước 2 để chắc chắn các module này hoặc động tốt
Xây dựng CSDL MySQL và web PHP
Phần này mình sẽ cho các bạn một source để tham khảo dĩ nhiên source này vẫn hoạt động được trên cả môi trường LAN và Internet
Mình đã kiểm tra rồi còn source chính thức của mình sẽ có Javascript và quản lý người dùng và các trạm trữ liệu (Sau khi hoàn thiện mình sẽ up lên sau)
https://drive.google.com/open?id=0B_LM5BFqCr-OZXRYY1ViQlo5S28 (mirror)
Đây là source web tham khảo
Mình sẽ giải thích về code
Mục đich trong Arduino bạn sẽ khai báo đường dẫn của tập tin add.php trên web server kèm theo là 2 $_POST Parameter là temp1 và hum1. Trên CSDL sẽ có 2 cột là temperature, humidity để lưu dữ liệu từ cảm biến một cột là ID khóa chính và một cột thời gian để ghi lại thời gian nhận cho nên với CSDL bạn sẽ có được dự liệu theo thời gian thực của SERVER không lệ thuộc vào các node nên không cần module thời gian thực
Và đây là kết quả
Cấu trúc bảng dữ liệu SQL
Tên bảng: tempLog
temperature: float
humidity: float
id: int(11)
timeStamp: timestamp(CURRENT_TIMESTAMP)
Cấu trúc đường dẫn
địa chỉ host>/add.php/?temp1=<nhiệt độ>&hum1=<độ ẩm>
Bạn có thể nhập vào trình duyệt web thí dụ 127.0.0.1/temp1=34&hum1=56 nếu dữ liệu cập nhập đúng thi bạn đã xong bước 3
Sau các bước trên bạn sẽ tiến hành upload Web lên host để hoàn thành phần này (bạn nào gặp khó khăn chỗ này thì liên hệ với mình hoặc để lại comment nhé nhất là những bạn không rành món lâp trình web)
Viết chương trình gửi dữ liệu cho Arduino
Đây là code mình tham khảo tại trang này
http://arduinotronics.blogspot.com/2015/12/sending-sensor-data-to-web-server.html
Nó cũng rất dễ hiểu
#include <DHT.h> #include <Ethernet.h> #include <SPI.h> byte mac[] = { 0x00, 0xAA, 0xBB, 0xCC, 0xDE, 0x01 }; // Cái này bạn không cần thay đổi tuy nhiên một số Ethernet Shield có địa chỉ trên board thì bạn nên nhập số đó EthernetClient client; #define DHTPIN 2 #define DHTTYPE DHT11 DHT dht(DHTPIN, DHTTYPE); long previousMillis = 0; unsigned long currentMillis = 0; long interval = 250000; // READING INTERVAL int t = 0; // TEMPERATURE VAR int h = 0; // HUMIDITY VAR String data; void setup() { Serial.begin(115200); if (Ethernet.begin(mac) == 0) { Serial.println("Failed to configure Ethernet using DHCP"); } dht.begin(); delay(10000); // GIVE THE SENSOR SOME TIME TO START h = (int)dht.readHumidity(); t = (int)dht.readTemperature(); data = ""; } void loop() { currentMillis = millis(); if (currentMillis - previousMillis > interval) { // READ ONLY ONCE PER INTERVAL previousMillis = currentMillis; h = (int) dht.readHumidity(); t = (int) dht.readTemperature(); } data = "temp1="; data.concat(t); data.concat("&hum1="); data.concat(h); if (client.connect("www.xxxxxx.com", 80)) { //Thay địa chỉ host vào đây client.println("POST /add.php HTTP/1.1"); client.println("Host: xxxxxx.com"); // SERVER ADDRESS HERE TOO client.println("Content-Type: application/x-www-form-urlencoded"); client.print("Content-Length: "); client.println(data.length()); client.println(); client.print(data); } if (client.connected()) { client.stop(); } delay(300000); } } }
Đây là kết quả sau khi hoàn thành khi xem trên Serial
Bước này xong bạn lên web kiểm tra sẽ thấy dữ liêu bạn đã được cập nhật rồi
Vì phần này đòi hỏi khá nhiều kiến thức bản thân mình lần đầu làm cũng không phải thuận lợi lắm nhất là mình test trên nhiều host khác nhau để chọn ra được host tốt nhất, nếu có vấn đề khó khăn bạn có thể để comment để mình hướng dẫn phần đó