Arduino Cảm biến nhiệt độ Động cơ servo

Hướng dẫn này trình bày cách sử dụng Arduino và cảm biến nhiệt độ DS18B20 để điều khiển một động cơ servo. Cụ thể, Arduino được lập trình để liên tục đo nhiệt độ bằng cảm biến DS18B20. Động cơ servo sau đó được điều chỉnh theo các quy tắc sau:

Phần cứng cần chuẩn bị

1×Arduino Uno R3
1×USB 2.0 cable type A/B (for USB-A PC)
1×USB 2.0 cable type C/B (for USB-C PC)
1×DS18B20 Temperature Sensor (WITH Adapter)
1×DS18B20 Temperature Sensor (WITHOUT Adapter)
1×động cơ servo
1×dây jumper
1×(Khuyến nghị) Screw Terminal Block Shield for Arduino Uno
1×(Khuyến nghị) Breadboard Shield for Arduino Uno
1×(Khuyến nghị) Enclosure for Arduino Uno
1×(Khuyến nghị) Prototyping Base Plate & Breadboard Kit for Arduino UNO

Or you can buy the following kits:

1×DIYables STEM V3 Starter Kit (Arduino included)
1×DIYables Sensor Kit (30 sensors/displays)
1×DIYables Sensor Kit (18 sensors/displays)

Về động cơ servo và cảm biến nhiệt độ

Nếu bạn chưa biết về động cơ servo và cảm biến nhiệt (bố trí chân, cách hoạt động, cách lập trình ...), hãy tìm hiểu về chúng trong các bài hướng dẫn sau đây:

Sơ đồ đấu dây

  • Sơ đồ đấu dây với breadboard
sơ đồ nối dây ds18b20 với Arduino và động cơ servo

This image is created using Fritzing. Click to enlarge image

  • Sơ đồ nối dây có bộ đổi nguồn (khuyến nghị)
sơ đồ đấu dây cảm biến nhiệt độ Arduino và động cơ servo

This image is created using Fritzing. Click to enlarge image

Chúng tôi đề xuất mua cảm biến DS18B20 đi kèm với một bộ điều hợp dây để kết nối dễ dàng. Bộ điều hợp có một điện trở tích hợp sẵn, loại bỏ nhu cầu có một điện trở riêng trong dây kết nối.

Mã Arduino - Cảm biến Nhiệt độ Kích hoạt Động cơ Servo

/* * Mã Arduino này được phát triển bởi newbiely.vn * Mã Arduino này được cung cấp để sử dụng công khai, không có ràng buộc. * Để xem hướng dẫn chi tiết và sơ đồ kết nối, vui lòng truy cập: * https://newbiely.vn/tutorials/arduino/arduino-temperature-sensor-servo-motor */ #include <Servo.h> #include <OneWire.h> #include <DallasTemperature.h> const int SERVO_PIN = 5; // Arduino pin connected to Servo Motor's pin const int SENSOR_PIN = 2; // Arduino pin connected to DS18B20 sensor's DATA pin const float TEMPERATURE_THRESHOLD = 20; // °C Servo servo; // create servo object to control a servo OneWire oneWire(SENSOR_PIN); // setup a oneWire instance DallasTemperature sensor(&oneWire); // pass oneWire to DallasTemperature library float temperature; int angle; void setup() { Serial.begin(9600); // initialize serial servo.attach(SERVO_PIN); // attaches the servo on pin 9 to the servo object servo.write(0); sensor.begin(); // initialize the sensor } void loop() { sensor.requestTemperatures(); // send the command to get temperatures temperature = sensor.getTempCByIndex(0); // read temperature in Celsius if (temperature > TEMPERATURE_THRESHOLD) angle = 90; // set angle to 90 degree else angle = 0; // set angle to 0 degree servo.write(angle); // rotate servo motor // print to serial Serial.print("Temperature: "); Serial.print(temperature); Serial.print("°C => servo angle: "); Serial.println(angle); }

Hướng dẫn từng bước

  • Thực hiện đấu dây giữa Arduino, cảm biến nhiệt độ và động cơ servo như sơ đồ ở trên.
  • Kết nối Arduino với PC bằng cáp USB.
  • Mở Arduino IDE, chọn board và cổng đúng.
  • Đi tới biểu tượng Thư viện ở thanh bên trái của IDE Arduino.
  • Tìm kiếm “DallasTemperature”, sau đó tìm thư viện DallasTemperature của Miles Burton.
  • Nhấn nút Cài đặt để cài đặt thư viện DallasTemperature.
thư viện dallas temperature cho Arduino
  • Bạn sẽ được yêu cầu cài đặt phụ thuộc của thư viện
  • Nhấp vào nút Cài đặt Tất cả để cài đặt thư viện OneWire.
thư viện onewire cho Arduino
  • Sao chép mã ở trên và mở bằng Arduino IDE
  • Nhấn Tải lên nút trên Arduino IDE để nạp mã vào Arduino
  • Thay đổi nhiệt độ quanh cảm biến nhiệt độ
  • Xem sự thay đổi của động cơ servo
  • Xem kết quả trên Serial Monitor, như dưới đây:
COM6
Send
Temperature: 19.2°C => servo angle: 0 Temperature: 19.5°C => servo angle: 0 Temperature: 19.6°C => servo angle: 0 Temperature: 19.9°C => servo angle: 0 Temperature: 20.2°C => servo angle: 90 Temperature: 20.7°C => servo angle: 90 Temperature: 21.3°C => servo angle: 90
Autoscroll Show timestamp
Clear output
9600 baud  
Newline  

Mã Arduino - Cảm biến nhiệt độ kích hoạt động cơ servo với độ dung sai

Trong quá trình vận hành, nhiệt độ có thể dao động trên hoặc dưới ngưỡng, khiến động cơ servo điều chỉnh nhanh và liên tục. Điều này có thể gây rung động thay vì quay trơn tru đến góc mong muốn. Để giảm thiểu vấn đề này, một độ dung sai có thể được tích hợp vào ngưỡng. Đoạn mã sau minh họa cách thực hiện giải pháp này:

/* * Mã Arduino này được phát triển bởi newbiely.vn * Mã Arduino này được cung cấp để sử dụng công khai, không có ràng buộc. * Để xem hướng dẫn chi tiết và sơ đồ kết nối, vui lòng truy cập: * https://newbiely.vn/tutorials/arduino/arduino-temperature-sensor-servo-motor */ #include <Servo.h> #include <OneWire.h> #include <DallasTemperature.h> const int SERVO_PIN = 5; // Arduino pin connected to Servo Motor's pin const int SENSOR_PIN = 2; // Arduino pin connected to DS18B20 sensor's DATA pin const float TEMPERATURE_THRESHOLD = 20; // °C const float TOLERANCE = 0.5; // °C Servo servo; // create servo object to control a servo OneWire oneWire(SENSOR_PIN); // setup a oneWire instance DallasTemperature sensor(&oneWire); // pass oneWire to DallasTemperature library float temperature; int angle; void setup() { Serial.begin(9600); // initialize serial servo.attach(SERVO_PIN); // attaches the servo on pin 9 to the servo object servo.write(0); sensor.begin(); // initialize the sensor } void loop() { sensor.requestTemperatures(); // send the command to get temperatures temperature = sensor.getTempCByIndex(0); // read temperature in Celsius if (temperature > (TEMPERATURE_THRESHOLD + TOLERANCE)) angle = 90; // set angle to 90 degree else if (temperature < (TEMPERATURE_THRESHOLD - TOLERANCE)) angle = 0; // set angle to 0 degree servo.write(angle); // rotate servo motor // print to serial Serial.print("Temperature: "); Serial.print(temperature); Serial.print("°C => servo angle: "); Serial.println(angle); }

Đoạn mã được trình bày ở trên xác định ngưỡng 20°C và độ dung sai 0,5°C. Các điều kiện sau đây áp dụng:

  • Nếu nhiệt độ dưới 19,5°C, góc của động cơ servo được điều chỉnh về 0°.
  • Nếu nhiệt độ cao hơn 20,5°C, góc của động cơ servo được điều chỉnh về 90°.
  • Nếu nhiệt độ nằm giữa 19,5°C và 20,5°C, không có sự điều chỉnh nào được thực hiện đối với góc của động cơ servo.