Chủ Nhật, 30 tháng 6, 2019
Mình đã làm máy ấp trứng tự động như thế nào - Phần 1
Qua series bài viết này mình sẽ chia sẻ cho các bạn các kiến thức mà mình thu nhặt được để làm được 1 cái máy ấp trứng tự động:
Phần 1: Giới thiệu máy ấp trứng tự động, tổng quan các chức năng của máy ấp trứng.
Phần 2: Lý thuyết cần có để thực hiện đề tài ( phần này mình sẽ trang bị cho các bạn các kiến thức cơ bản mình áp dụng trong dự án này).
Phần 3: Kết luận và các ý tưởng phát triển đề tài.
Trên đây là mình chia ra nhiều phần để các bạn đọc cảm thấy đở chán, bên cạnh đó mỗi phần chỉ cung cấp một lượng kiến thức vừa phải, mong các bạn sẽ thoải mái khi đọc series này.
Bắt đầu thôi nào!
Ở phần giới thiệu này mình sẽ giới thiệu tác dụng khi sử dụng máy ấp trứng, máy ấp trứng dựa trên nguyên lý gia nhiệt 1 vùng chứa trứng ở một nhiệt độ xấp xĩ nhiệt độ con mái ấp trứng ~37.5 độ C. Và thỉnh thoảng đặt tính của các con gà, vịt mẹ sẽ đảo trứng. Lâu lâu đảo trứng 1 lần để tránh dính trứng vào vỏ.
Dựa vào đặt tính trên ta sẽ điều khiển nhiệt độ trong vùng không gian chứa trứng vừa khoảng 37.5 độ C. (Cái này ta sẽ dùng nguyên lý giống với nguyên lý lò nhiệt để thực hiện).
Việc đảo trứng thì đơn giản hơn, chúng ta sẽ sử dụng khay đựng trứng, cứ theo chu kỳ khoảng 2h chúng ta sẽ đảo hướng khay đựng trứng một cách từ từ, chậm rãi.
* Tiếp đến là phần chức năng của mạch:
1. Mạch có chức năng cài đặt được nhiệt độ sấy, sưỡi, phạm vi hoạt động từ 30-45 độ C. Sai số 0.1 độ C. Được điều khiển bằng 3 nút nhấn (SET, UP, DOWN).
2. Điều chỉnh được thời gian đảo khay trứng.
3. Chức năng nâng cao: Thay đổi được hằng số Kp,Ki trong hàm truyền PID.
* Các kiến thức cần trang bị để hiểu sâu hơn về đề tài này:
1. Lý thuyết điều khiển tự động, cái này mình sẽ nói sơ lược về kiến thức cơ bản mình áp dụng trong đề tài này, cũng không quá phức tạp nên các bạn đừng quá lo lắng, yên tâm nhé, sẽ rất dễ hiểu thôi.
2. Điện tử công suất, nói nghe hoành tráng vậy chứ chủ yếu áp dụng một số kiến thức để hiểu được cách mình điều chỉnh công suất ngỏ ra cho bóng đèn sưởi ( Bóng đèn càng sáng --> Nhiệt độ tăng và ngược lại) và cái này quan trọng cho các bạn hiểu được vai trò sử dụng linh kiện để làm mạch, vì các bạn đọc kỹ phần này mình sẽ chia sẻ không chỉ các chức năng của linh kiện mà có thể sử dụng các linh kiện tương đương để thay thế, và rất may mắn là các linh kiện mình sử dụng trong mạch rất dễ kiếm, chúng rất phổ thông.
3. Lập trình nhúng, Khi Arduino xuất hiện thì việc lập trình nhúng trở nên rất thuận tiện, nó hỗ trợ rất nhiều thư viện của cộng đồng và các bạn không cần hiểu quá sâu về chip nhưng vẫn có thể lập trình được ở mức chạy được, còn ở một level cau hơn để debug được lỗi thì em này cũng sẽ khiến chúng ta phải đầu tư khá nhiều thời gian đấy nhé. Sau khi các bạn dùng arduino để lập trình đề tài này thì các bạn sẽ nắm được 1 số kiến thức như sau:
- Điều khiển được các Input Output trong Arduino. Sử dụng được nút nhấn để thao tác các lệnh mình mong muốn.
- Đọc tín hiệu sensor Nhiệt độ DHT22 (con này có cả nhiệt độ và độ ẩm, đắt hơn DHT11 nhưng được cái độ phân giải 0.1 độ C) nên đó là lý do mình chọn, em này đọc nhiệt độ mình thấy khá ok. Thư viện lập trình đầy đủ và dĩ nhiên mình sẽ chia sẻ mọi thứ trong series này.
- Sử dụng ngắt ngoại (External Interrupt), trong đề tài này mình sử dụng ngắt ngoại để phát hiện điểm 0 (zero) của hình sin điện xoay chiều 220VAC. Từ đó là dữ liệu để đi điều khiển độ sáng của bóng đèn, phần này mình sẽ có 1 topic riêng để nói chi tiết, đọc xong chắc chắn các bạn cũng sẽ làm được, và mình cũng sẽ nêu 1 số bug mình gặp phải để các bạn có thể tránh khi thực hành. Tham khảo bài viết này nhé các bạn
- Sử dụng ngắt nội (internal interrupt) hay ngắt timer, trong đề tài này mình sử dụng ngắt timer để đọc dữ liệu Nhiệt độ, điều khiển PID và điều khiển chu kỳ đảo trứng. Sẽ có 1 một topic chi tiết về phần này và các bạn sẽ biết lý do tại sao mình sử dụng ngắt timer chứ không để các lệnh này chạy trong vòng lặp loop().
- Hiển thị các nội dung lên màn hình LCD 16x02, ở đề tài này mình dùng thêm module LCD I2C, để tiết kiệm IO cho vi xử lý.
Thứ Sáu, 7 tháng 6, 2019
Cách tạo serial ảo SoftwareSerial cho ESP 8266 NodeMCU
Ở loạt bài trước mình đã hướng dẫn các bạn tạo thêm cổng Serial cho Arduino, riêng với ESP 8266 có một chút khác biệt ở phần khai báo đó là:
Code ESP 8266: Nhận dữ liệu từ Arduino và in ra màn hình giá trị. Ở đây có khác 1 vài điểm là chúng ta phải cấu hình thêm chân RX là INPUT và TX là OUTPUT. Không có em này là sẽ không chạy đâu.
#include <SoftwareSerial.h>
#include <ESP8266WiFi.h>
SoftwareSerial serial_ESP(D2,D3);//D2 = RX -- D3 = TX
void setup() {
// Open serial communications and wait for port to open:
pinMode(D2,INPUT);
pinMode(D3,OUTPUT);
Serial.begin(115200);
serial_ESP.begin(115200);
}
void loop() { // run over and over
if (serial_ESP.available()>0) {
float dataRecive;
dataRecive = serial_ESP.parseFloat();
Serial.println(dataRecive);
}
}
Code Mega 2560:
#include <SoftwareSerial.h>
float floatval;
SoftwareSerial mySerial(10,11); //RX,TX
void setup() {
// put your setup code here, to run once:
mySerial.begin(115200);
floatval = 3.14;
}
void loop() {
// put your main code here, to run repeatedly:
mySerial.println(floatval,4);
delay(2000);
}
Chúng ta hãy cùng ta kiểm tra kết quả thôi nào.
Cách trao đổi dữ liệu số float giữa 2 arduino với nhau
Ở bài viết này, mình sẽ hướng dẫn các bạn gửi dữ liệu float giữa 2 con arduino.
Bài toán thực tế:
1 con Arduino nhận dữ liệu từ sensor nhiệt độ (Arduino_ND). Giá trị nhiệt độ là giá trị float (kiểu số nguyên). Sau khi có giá trị nhiệt độ. Arduino_ND sẽ gửi giá trị của mình cho board NodeMcu 8266 (NodeMCU) để gửi dữ liệu lên server chẳng hạn, ở bài viết này mình chỉ dừng lại ở việc giao tiếp giữa 2 con arduino với nhau thôi.
Code Arduino_ND:
Giải thích code: Code ở trên có 1 vài điểm lưu ý như sau:
Code ESP8266:
Giải thích code: Để nhận giá trị float trong arduino trong hàm serial có hỗ trợ chúng ta option Serial.parseFloat(). Sẽ convert cho chúng ta ra dữ liệu float luôn rất là tiện lợi.
Code cũng khá là đơn giản thôi các bạn nhỉ. Tùy trường hợp để chúng ta có thể áp dụng các kiểu truyền nhận dữ liệu như vậy. Trên đây là bài chia sẽ của mình. Cám ơn các bạn đã theo dõi nhé.
Bài toán thực tế:
1 con Arduino nhận dữ liệu từ sensor nhiệt độ (Arduino_ND). Giá trị nhiệt độ là giá trị float (kiểu số nguyên). Sau khi có giá trị nhiệt độ. Arduino_ND sẽ gửi giá trị của mình cho board NodeMcu 8266 (NodeMCU) để gửi dữ liệu lên server chẳng hạn, ở bài viết này mình chỉ dừng lại ở việc giao tiếp giữa 2 con arduino với nhau thôi.
Code Arduino_ND:
#include <SoftwareSerial.h>
float floatval;
SoftwareSerial mySerial(10,11); //RX,TX
void setup() {
// put your setup code here, to run once:
mySerial.begin(115200);
floatval = 3.14;
}
void loop() {
// put your main code here, to run repeatedly:
mySerial.println(floatval,4);
delay(2000);
}
Giải thích code: Code ở trên có 1 vài điểm lưu ý như sau:
- Khi chúng ta muốn gửi giá trị float thì phải dùng Serial.println(floatval,4).
- Số 4 ở đằng sau là số chữ số thập phân sau dấu phẩy.
Code ESP8266:
float byteRecive;
void setup() {
// Open serial communications and wait for port to open:
Serial.begin(115200);
while (!Serial) {
; // wait for serial port to connect. Needed for native USB port only
}
}
void loop() { // run over and over
if (Serial.available()) {
byteRecive = Serial.parseFloat();
Serial.print(byteRecive,4);
}
}
Giải thích code: Để nhận giá trị float trong arduino trong hàm serial có hỗ trợ chúng ta option Serial.parseFloat(). Sẽ convert cho chúng ta ra dữ liệu float luôn rất là tiện lợi.
Code cũng khá là đơn giản thôi các bạn nhỉ. Tùy trường hợp để chúng ta có thể áp dụng các kiểu truyền nhận dữ liệu như vậy. Trên đây là bài chia sẽ của mình. Cám ơn các bạn đã theo dõi nhé.
Cách tạo cổng UART Serial Port ảo trên Arduino (Mega/uno/nano/ESP8266 NodeMCU)....
Phạm vi áp dụng cho tất cả các chủng loại Arduino.
Cho tất cả các loại arduino từ lớn cho tới nhỏ, dùng được hết. Thư viện đi kèm phần mềm Arduino IDE (phiên bản mới nhất).Ở đây mình sử dụng phiên bản 1.8.9
Trong ví dụ này mình sẽ truyền dữ liệu từ board Arduino Mega 2560 --> NodeMCU ESP8266
Code cho Arduino Mega 2560 (sẽ làm nhiệm vụ transmit):
#include <SoftwareSerial.h> //Khai báo thư viện SoftwareSerial, không cần cài nha các bạn, cái này có sắn
SoftwareSerial mySerial(10,11); //RX,TX Cấu hình chân 10 là RX và 11 là TX
void setup() {
// put your setup code here, to run once:
mySerial.begin(115200);// khai báo baudrate 115200
}
void loop() {
// put your main code here, to run repeatedly:
mySerial.write("H"); //gửi cho H đi thôi
delay(2000);
}
Code cho ESP 8266 (sẽ làm nhiệm vụ Recive):
void setup() {
// Open serial communications and wait for port to open:
Serial.begin(115200);
while (!Serial) {
; // wait for serial port to connect. Needed for native USB port only
}
}
void loop() { // run over and over
if (Serial.available()) {
Serial.print(Serial.read());
}
}
Chương trình nạp cho 2 con rất là đơn giản phải không các bạn, từ đây các bạn có thể mở rộng được rất nhiều các cổng serial mà không lo phải đụng với cổng Serial mặc định của bo nữa rồi.
Ở bài viết tiếp theo mình sẽ hướng dẫn cách truyền dữ liệu là chuỗi, số int, số float, giữa 2 board Arduino nhé. Đón theo dõi các bạn nhé.
Chúc các bạn thành công, nếu có gì thắc mắc xin hãy để lại comment hoặc gửi mail theo địa chỉ mathangspk@gmail.com cho mình nhé