MỤC LỤC
MỤC LỤC ......................................................................................................... 3
MỞ ĐẦU .......................................................................................................... 4
I.
MÔ HÌNH LÒ NHIỆT ............................................................................... 5
1.
Cấu trúc mô hình .................................................................................... 5
2.
Xây dựng mô hình .................................................................................. 8
II.
TỔNG QUAN VỀ BO MẠCH ARDUINO ................................................ 9
1.
Bo mạch Arduino ................................................................................... 9
2.
Phần mềm lập trình .............................................................................. 13
3.
Lập trình Arduino ................................................................................. 15
4.
Bo mạch Arduino ATmega 2560 .......................................................... 19
III.
LẬP TRÌNH ĐIỀU KHIỂN ỔN ĐỊNH NHIỆT ĐỘ ................................ 22
1.
Trình tự lập trình .................................................................................. 22
2.
Lập trình điều khiển ổn định nhiệt độ ................................................... 23
KẾT LUẬN...................................................................................................... 28
3
MỞ ĐẦU
Trong thực tế công nghiệp và sinh hoạt hàng ngày, năng lượng nhiệt
đóng một vai trò rất quan trọng. Năng lượng nhiệt có thể được dùng trong các
quá trình công nghệ khác nhau như nung nấu vật liệu: nấu gang thép, khuôn
đúc...Vì vậy việc sử dụng nguồn năng lượng này một cách hợp lý và hiệu quả là
rất cần thiết. Lò nhiệt được ứng dụng rộng rãi trong công nghiệp vì đáp ứng
được nhiều yêu cầu thực tiễn đặt ra. Ở lò nhiệt, yêu cầu kỹ thuật quan trọng nhất
là phải điều chỉnh và khống chế được nhiệt độ của lò. Bài toán điều khiển ổn
định nhiệt độ yêu cầu phải có một thuật toán điều khiển phù hợp bên cạnh đó
phải nắm bắt được các kiến thức về vi điều khiển, lập trình vi điều khiển (Cấu
trúc chức năng của vi điều khiển, ngôn ngữ lập trình, khả năng giao tiếp của vi
điều khiển….)
Với mục tiêu vận dụng các kiến thức được trang bị trong môn học: Lập
trình vi điều khiển nâng cao nhóm đề tài chọn đề tài: “Điều khiển ổn định
nhiệt độ”. Với mục tiêu đó, nhóm đề tài sẽ chế tạo và điều khiển ổn định nhiệt
độ một mô hình lò nhiệt đơn giản thông qua điều khiển một bóng đèn sợi đốt để
tạo nhiệt độ, sử dụng cảm biến LM35 đo nhiệt độ và ứng dụng bo mạch Arduino
để điều khiển. Nhóm đề tài không đi sâu vào phần lý thuyết điều khiển tự động
mà sẽ tập trung vào cấu trúc bo mạch Arduino, ngôn ngữ, cách thức lập trình, và
xây dựng một chương trình điều khiển ổn định nhiệt độ cho mô hình theo bộ
điều khiển PID.
4
I. MÔ HÌNH LÒ NHIỆT
1. Cấu trúc mô hình
Nhóm đề tài xây dựng một mô hình lò nhiệt đơn giản có cấu trúc như sau:
Hình 1.1 Sơ đồ cấu trúc mô hình ổn định nhiệt độ
Các khối trong sơ đồ:
CPU (Arduino Atmega2560): Bộ xử lý trung tâm, thực hiện thu nhận
các tín hiệu từ cảm biến, giao tiếp với máy tính, tính toán đưa ra tín hiệu điều
khiển. Trong đề tài sử dụng bo mạch Arduino Atmega2560
LCD: Sử dụng LCD 16x2 để hiển thị giá trị đặt và nhiệt độ đọc từ cảm
biến
-
Hình 1.2
Hình 1.2: LCD 16 x2
5
Máy tính: Giao tiếp với Arduino Atmega2560, đưa giá trị đặt, các tham
số PID xuống Arduino, nhận giá trị nhiệt độ tức thời, tính sai số, hiển thị trên đồ
thị
Hình 1.3 Giao diện điều khiển và giám sát nhiệt độ trên máy tính
Giao diện điều khiển được xây dựng trên phần mềm Labview
Mạch công suất
Sơ đồ nguyên lý mạch
Hình 1.4 Sơ đồ nguyên lý
6
Khối đo lường:
Cảm biến nhiệt độ LM35 là một loại cảm
biến tương tự, được ứng dụng trong các ứng dụng
đo nhiệt độ thời gian thực. LM35 hoạt động khá
chính xác với sai số nhỏ, đồng thời với kích thước
nhỏ và giá thành rẻ là một trong những ưu điểm của
nó.
Nhiệt độ được xác định bằng cách đo hiệu điện thế
Hình 1.5 Cảm biến LM35
ngõ ra của LM35.
→ Đơn vị nhiệt độ: °C.
→ Nhiệt độ thay đổi tuyến tính: 10mV/°C
Cảm biến LM35 hoạt động bằng cách cho ra một giá trị hiệu điện thế nhất
định tại chân Vout (chân giữa) ứng với mỗi mức nhiệt độ.
Như vậy, bằng cách đưa vào chân bên trái của cảm biến LM35 hiệu điện thế
5V, chân phải nối đất, đo hiệu điện thế ở chân giữa bằng các chân analog trên
arduino ta sẽ có được nhiệt độ (0-100ºC) bằng công thức:
Nhiệt độ= 5.analogRead(chân Output).100/1024
(Chân Output của cảm biến được nối với chân analog của arduino)
Đối tượng điều khiển
Bóng đèn sợi đốt 220v -25W
Hình 1. 6 Bóng đèn sợi đốt 220V – 25W
7
Sơ đồ nguyên lý hệ thống
Hình 1.7 Sơ đồ nguyên lý của hệ thống
2. Xây dựng mô hình
Hình 1.8 Mô hình thực tế
8
II. TỔNG QUAN VỀ BO MẠCH ARDUINO
1. Bo mạch Arduino
Arduino là một bo mạch vi xử lý được dùng để lập trình tương tác với các
thiết bị phần cứng như cảm biến, động cơ, đèn hoặc các thiết bị khác. Đặc điểm
nổi bật của Arduino là môi trường phát triển ứng dụng cực kỳ dễ sử dụng, với
một ngôn ngữ lập trình có thể học một cách nhanh chóng ngay cả với người ít
am hiểu về điện tử và lập trình.
Arduino được chọn làm bộ não xử lý của rất nhiều thiết bị từ đơn giản đến
phức tạp. Trong số đó có một vài ứng dụng thực sự chứng tỏ khả năng vượt trội
của Arduino do chúng có khả năng thực hiện nhiều nhiệm vụ rất phức tạp.
Bo mạch Arduino sử dụng dòng vi xử lý 8-bit megaAVR của Atmel với
hai chip phổ biến nhất là ATmega328 và ATmega2560. Các dòng vi xử lý này
cho phép lập trình các ứng dụng điều khiển phức tạp do được trang bị cấu hình
mạnh với các loại bộ nhớ ROM, RAM và Flash, các ngõ vào ra digital I/O trong
đó có nhiều ngõ có khả năng xuất tín hiệu PWM, các ngõ đọc tín hiệu analog và
các chuẩn giao tiếp đa dạng như UART, SPI, TWI (I2C).
Sức mạnh xử lý
Xung nhịp: 16MHz
EEPROM: 1KB (ATmega328) và 4KB (ATmega2560)
SRAM: 2KB (Atmega328) và 8KB (Atmega2560)
Flash: 32KB (Atmega328) và 256KB (Atmega2560)
Đọc tín hiệu cảm biến ngõ vào:
- Digital:
Các bo mạch Arduino đều có các cổng digital có thể cấu hình làm ngõ
vào hoặc ngõ ra bằng phần mềm. Do đó người dùng có thể linh hoạt quyết định
số lượng ngõ vào và ngõ ra.
Tổng số lượng cổng digital trên các mạch dùng Atmega328 là 14, và trên
Atmega2560 là 54.
- Analog:
Các bo mạch Arduino đều có trang bị các ngõ vào analog với độ phân giải
10 bit .
9
Số lượng cổng vào analog là 6 đối với Atmega328, và 16 đối với
Atmega2560.
Với tính năng đọc analog, người dùng có thể đọc nhiều loại cảm biến
như nhiệt độ, áp suất, độ ẩm, ánh sáng, gyro, accelerometer…
Xuất tín hiệu điều khiển ngõ ra:
- Digital output:
Tương tự như các cổng vào digital, người dùng có thể cấu hình trên
phần mềm để quyết định dùng ngõ digital nào là ngõ ra.
Tổng số lượng cổng digital trên các mạch dùng Atmega328 là 14, và
trên Atmega2560 là 54.
- PWM output:
Trong số các cổng digital, người dùng có thể chọn một số cổng dùng để
xuất tín hiệu điều chế xung PWM. Độ phân giải của các tín hiệu PWM này là 8bit. Số lượng cổng PWM đối với các bo dùng Atmega328 là 6, và đối với các bo
dùng Atmega2560 là 14.
Chuẩn Giao tiếp
- Serial:
Đây là chuẩn giao tiếp nối tiếp được dùng rất phổ biến trên các bo mạch
Arduino. Mỗi bo có trang bị một số cổng Serial cứng (việc giao tiếp do phần
cứng trong chip thực hiện). Bên cạnh đó, tất cả các cổng digital còn lại đều có
thể thực hiện giao tiếp nối tiếp bằng phần mềm (có thư viện chuẩn, người dùng
không cần phải viết code). Mức tín hiệu của các cổng này là TTL 5V.
Số lượng cổng Serial cứng của Atmega328 là 1 và của Atmega2560 là 4.
Với tính năng giao tiếp nối tiếp, các bo Arduino có thể giao tiếp được với
rất nhiều thiết bị như PC, touchscreen, …
- USB:
Các bo Arduino tiêu chuẩn đều có trang bị một cổng USB để thực hiện
kết nối với máy tính dùng cho việc tải chương trình. Tuy nhiên các chip AVR
không có cổng USB, do đó các bo Ardunino phải trang bị thêm phần chuyển đổi
10
từ USB thành tín hiệu UART. Do đó máy tính nhận diện cổng USB này là cổng
COM chứ không phải là cổng USB tiêu chuẩn.
- SPI:
Đây là một chuẩn giao tiếp nối tiếp đồng bộ có bus gồm có 4 dây. Với
tính năng này các bo Arduino có thể kết nối với các thiết bị như LCD, bộ điều
khiển video game, bộ điều khiển cảm biến các loại, đọc thẻ nhớ SD và MMC…
- I2C:
Đây là một chuẩn giao tiếp đồng bộ khác nhưng bus chỉ có hai dây. Với
tính năng này, các bo Arduino có thể giao tiếp với một số loại cảm biến như
thermostat của CPU, tốc độ quạt, một số màn hình OLED/LCD, đọc real-time
clock, chỉnh âm lượng cho một số loại loa…
Về mặt chức năng, các bo mạch Arduino được chia thành hai loại: loại
bo mạch chính có chip Atmega và loại mở rộng thêm chức năng cho bo mạch
chính (thường được gọi là shield).
Các bo mạch chính về cơ bản là giống nhau về chức năng, tuy nhiên về
mặt cấu hình như số lượng I/O, dung lượng bộ nhớ, hay kích thước có sự khác
nhau. Một số bo có trang bị thêm các tính năng kết nối như Ethernet và
Bluetooth. Các bo mở rộng chủ yếu mở rộng thêm một số tính năng cho bo
mạch chính ví dụ như tính năng kết nối Ethernet, Wireless, điều khiển động cơ
v.v…
Hình 2.1 Các bo mở rộng cho Arduino
11
12
Hình 2.2: Một số bo mạch Arduino
2. Phần mềm lập trình
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ợi thế 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 là số lượng thư viện code được viết sẵn và chia sẻ bởi cộng đồng là cực kỳ
lớn.
Hình 2.3: Giao diện phần mềm lập trình bo mạch Arduino
Môi trường lập trình Arduino 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à Linux. 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 thêm 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à do
ngôn ngữ lập trình này dựa trên nền tảng 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 C vào chương trình nếu
muốn.
13
2.1.
Giao diện chương trình
Vùng lệnh
Vùng viết
chương
trình
Vùng
thông báo
Hình 2.4: Giao diện chương trình
Vùng lệnh: Bao gồm các nút lệnh menu (File, Edit, Sketch, Tools,
Help). Bên dưới là các icon chức năng cho phép truy cập nhanh các chức
năng thường dùng của IDE
Vùng viết chương trình: Vùng người lập trình viết các đoạn mã chương
trình
Vùng thông báo: Vùng này sẽ hiển thị một số thông tin về chương trình:
Dung lượng bộ nhớ đã sử dụng, các lỗi trong lập trình….
14
3. Lập trình Arduino
3.1. Cấu trúc cơ bản của chương trình
Cấu trúc cơ bản của một chương trình lập trình cho Arduino là khá đơn giản.
- Setup() là vùng dành cho khởi tạo, thiết lập các biến, chế độ các chân..chỉ
được gọi một lần khi chương trình bắt đầu chạy.
- Loop() là phần chương trình sẽ chạy liên tục, lặp đi lặp lại.
Hai hàm này là bắt buộc trong một chương trình, kể cả khi không có câu
lệnh nào trong các hàm trên.
- Ngoài 2 hàm chính trên, người sử dụng có thể tạo thêm các chương trình
con phục vụ cho mục đích của mình.
3.2. Một số hàm cơ bản trong lập trình Arduino
- pinMode(pin, mode) : Thiết lập các chân ở chế độ Output hoặc Input
(pin: Chân trên bo mạch, mode : Chế độ yêu cầu (OUTPUT, INPUT,
INPUT_PULLUP))
- digitalWrite(pin, value): Thiết lập mức điện áp cho chân pin, value:
HIGH (5v) hoặc LOW (0v)
- digitalRead(pin): Đọc trạng thái của chân pin
- analogRead(pin): Đọc giá trị ở chân analog. Trả về một số nguyên trong
khoảng 0 đến 1023 (Các chân analog trên arduino đều là 10bit)
- analogWrite(pin, value): Tạo xung trên chân pin, độ rộng xung được xác
định thông qua biến value (0 - 255)
- delay(ms): Dừng chương trình trong khoảng ms (mili giây)
- Từ giao diện chương trình ta có thể vào: Help- Reference để xem tất cả
các hàm, kiểu dữ liệu, các cấu trúc lập trình mà Arduino hỗ trợ.
15
\
16
17
Bên cạnh đó, với một cộng đồng rộng lớn đã tạo ra một số lượng lớn các
thư viện hỗ trợ cho Arduino, giúp cho việc lập trình đơn giản và ngắn gọn hơn.
Để thêm các thư viện, vào Sketch – Include Library – Add.ZIP
Library…
Hình 2.5: Thêm thư viện cho lập trình
18
4. Bo mạch Arduino ATmega 2560
Arduino ATmega 2560 là một bo mạch vi điều khiển trên nền tảng vi điều
khiển Atmega2560; Nó có 54 chân vào/ra (14 trong số 54 chân có thể sử dụng
như các chân PMW). 16 chân analog, 4 cổng UART, một bộ tạo dao động
16Mhz, một cổng USB, một giắc nguồn, một đầu ICSP, và một nút reset.
Hình 2.5: Bo mạch Arduino ATmega 2560
Thông số Arduino Atmega2560
19
Hình 2.6: Phân bố chân trên Arduino ATmega 2560
Atmega2560 có 256 KB bộ nhớ cho phép lưu trữ code chương trình (8 trong
số 256KB được sử dụng cho bootloader); 8 KB SRAM và 4 KB EEPROM (Có
thể đọc ghi với thư viện EEPROM).
- 54 chân vào ra trên board có thể sử dụng như các chân input hoặc ouput
bằng cách sử dụng các hàm có sẵn trong phần mềm lập trình đi liền với board
Arduino (pinMode(), digitalWrite(), digitalRead()….). các chân này hoạt động ở
điện áp 5V. Mỗi chân có thể cung cấp hoặc nhận dòng tối đa 40mA và có một
điển trở kéo bên trong khoảng 20-50K (Ở chế độ mặc định các điện trở kéo này
không được nối). Bên cạnh đó, một số chân có thêm các chức năng đặc biệt:
• Serial: 0 (RX) và 1 (TX); Serial1: 19 (RX) và 18 (TX); Serial2:
17(RX) và 16(TX); Serial 3: 15 (RX) và 14 (TX)
• 6 chân ngắt ngoài: 2 (interrupt 0), 3 (interrupt 1), 18(interrupt 5), 19
(interrupt 4), 20 (interrupt 3) và 21 (interrupt 2)
• PMW: 0 đến 13 (8 bit)
• I2C: 20 (SDA) và 21 (SCL)
• Atmega2560 có 16 chân analog (10bit)
20
Kích thước bo mạch Arduino Atmega 2560 (mm)
Hình 2.7: Kích thước board Arduino ATmega2560
21
III. LẬP TRÌNH ĐIỀU KHIỂN ỔN ĐỊNH NHIỆT ĐỘ
1. Trình tự lập trình
- Khai báo thư viện sử dụng
- Đặt tên các chân sử dụng
- Định nghĩa và thiết lập trạng thái các chân
- Thiết lập ngắt ngoài (INT0, INT1) (Tăng, giảm nhiệt độ)
- Thiết lập truyền thông
- Thiết lập LCD
- Thiết lập Timer
- Khởi tạo giá trị ban đầu cho các biến
- Đọc cảm biến LM35
- Đọc giá trị đặt (Từ nút nhấn, Từ máy tính)
- Gửi LCD và máy tính
Setup()
Loop()
Tính sai số nhiệt độ
PID số
Hàm ngắt của
timer
Tín hiệu điều khiển
Các chương trình con phục vụ cho chương trình
- Ngắt INT0 (Giảm nhiệt độ)
- Ngắt INT1 (Tăng nhiệt độ)
- Hàm ngắt truyền thông
- Hàm hiển thị LCD
Hình 3.1: Trình tự lập trình
22
Các chương trình
con
2. Lập trình điều khiển ổn định nhiệt độ
/* Chuong trinh dieu khien nhiet do su dung PID
Dieu khien nhiet do thong qua dieu khien do sang cua bong den 220VAC 25w
Su dung cam bien nhiet do LM35, Bong den 220 25W
Chan analog cam bien LM35 noi voi chan A13
2 chan ngat INT0, INT1 duoc su dung de tang giam nhiet do dat thong qua 2
nut nhan
Chan cap xung dieu khien do sang bong den : Chan so 13
*/
// ---------------------------------Khai bao cac thu vien can thiet---------------------#include <TimerOne.h>
// Bo dinh thoi timer
#include <LiquidCrystal_I2C.h> // Thu vien LCD giao tiep I2C
#include <SimpleKalmanFilter.h> // Thu vien bo loc Kalman
SimpleKalmanFilter simpleKalmanFilter(2, 2, 0.015);
LiquidCrystal_I2C lcd(0x3F, 16, 2);
//--------------------------------------- Dinh nghia cac chan----------------------------#define Light 13
// Chan cap xung dieu khien den
#define pin_LM35 A13
// Chan doc cam bien LM35
//----------------------------------- Khai bao bien----------------------------------------float LM35_Read;
// Doc analog tu LM35
int set_temp ;
// Nhiet do dat
float read_temp, giatridoc, giatrido;
// Nhiet do doc tu LM35
float T, anpha, beta, gama; // Chu ki lay mau PID va cac he so trung gian
float Output, LastOutput, Kp, Ki, Kd, E, E1, E2 ;
String a, strKp, strKi, strKd, datasend; // Cho nhan du lieu tu May tinh
int i=0;
//--------------------------------- Khoi tao cac gia tri ban dau-------------------------void setup() {
// put your setup code here, to run once:
pinMode(pin_LM35,INPUT);
// Chan analog doc LM35
pinMode(Light, OUTPUT);
// Chan cap xung dieu khien den
// Khoi tao ngat Int0 Int1
pinMode(2, INPUT);
pinMode(3, INPUT);
attachInterrupt(digitalPinToInterrupt(2), Tangnhietdo, RISING );
// Ngat INT0, nhan suon len
attachInterrupt(digitalPinToInterrupt(3), Giamnhietdo, RISING );
// Ngat INT1, nhan suon len
23
// Khoi tao truyen thong
Serial.begin(9600);
// Hien thi LCD luc khoi dong
lcd.begin();
lcd.backlight();
// In ra man hinh LCD
lcd.print(" WELCOME ");
lcd.setCursor(0, 1);
lcd.print("ON DINH NHIET DO");
delay(5000);
lcd.clear();
// Xoa man hinh LCD
lcd.setCursor(0, 0);
lcd.print("T DAT:
oC");
lcd.setCursor(0, 1);
lcd.print("T DO :
oC");
// Thiet lap timer
Timer1.initialize(200000);
// Khoi tao chu ki timer la 200ms
Timer1.attachInterrupt( PID ); // Khi co ngat Timer goi ham PID
// Khoi tao gia tri ban dau cho cac bien
Kp = 95; Ki = 2.05; Kd = 10; E = 0; E1 = 0; E2 = 0; T = 0.2, anpha = 0; beta =
0; gama = 0;
Output = 0; LastOutput = 0;
set_temp=25; // Nhiet do dat, mac dinh ban dau=30
read_temp=0; giatridoc=0; giatrido=0;
datasend = String(' '); // Khoi tao lai datasend de bat dau qua trinh tiep theo
}
//-------------------------------------------------Void loop ------------------------------void loop() {
giatridoc = analogRead(pin_LM35);
giatrido = giatridoc * 5.0 / 1024.0;
//float dienap=map(LM35_Read, 0, 1024, 0, 5); // Co the su dung ham nay de
tinh
read_temp = giatrido * 100.0;
read_temp = simpleKalmanFilter.updateEstimate(read_temp);
for(i=0;i<=100;i++) {};
hienthiLCD(set_temp, 7,0);
hienthiLCD(read_temp,7,1);
}
24
//------------------------------------------------Ham PID -------------------------------void PID()
{
E = set_temp - read_temp;
// Tinh sai so nhiet do
anpha = 2 * T * Kp + Ki * T * T + 2 * Kd;
beta = T * T * Ki - 4 * Kd - 2 * T * Kp;
gama = 2 * Kd;
Output = (anpha * E + beta * E1 + gama * E2) / (2 * T) + LastOutput;
LastOutput = Output;
E1 = E;
E2 = E1;
Output=constrain(Output, 0, 255);
analogWrite(Light, 255-Output) ; // Tao xung dieu khien bong den
// Dong goi du lieu chuyen ra cong giao tiep
datasend += set_temp;
datasend += '@';
datasend += read_temp*100;
datasend.remove(0, 1);
datasend += 'P';
datasend += Kp*100;
datasend += 'I';
datasend += Ki*100;
datasend += 'D';
datasend += Kd*100;
Serial.println(datasend); // Gui du lieu qua cong serial
datasend = ' ';
}
// ------------------------------------------------Truyen thong----------------------------// Nhan Kp, Ki, Kd va Nhiet do dat tu may tinh
void serialEvent()
{ unsigned char b = 0, c = 0, moc1 = 0, moc2 = 0;
a = Serial.readString();
b = a.length();
if (a.charAt(0) == 'v')
{ a.remove(0, 1);
set_temp = a.toFloat() / 100; //Du lieu truyen tu may tinh xuong da nhan
100
}
else
25
{ for (int i = 1; i <= b; i++)
{
if (a.charAt(i) == '@')
{ if (moc1 != 0) moc2 = i;
if (moc2 == 0) moc1 = i;
}
}
a.remove(0, 1);
strKp = a;
strKi = a;
strKd = a;
strKp.remove(moc1 - 1);
Kp = strKp.toFloat()/100; // Du lieu truyen
tu may tinh xuong da nhan 100
strKi.remove(moc2 - 1);
strKi.remove(0, moc1);
Ki = strKi.toFloat()/100;
strKd.remove(0, moc2);
Kd = strKd.toFloat()/100;
}
}
//-------------------------- Doc nut bam thong qua ngat ngoai-----------------------// Ngat doc nut giam nhiet do
void Giamnhietdo()
{
set_temp=set_temp-1;
}
// Ngat doc nut tang nhiet do
void Tangnhietdo()
{
set_temp=set_temp+1;
}
//------------------------------------- Hien thi LCD---------------------------------------void hienthiLCD(float i, unsigned char ci,unsigned char hi)
{ if (i<10)
{ lcd.setCursor(ci,hi);
lcd.print("00");
lcd.setCursor(ci+2,hi);
}
else if(i>=100)
lcd.setCursor(ci,hi);
26
else {
lcd.setCursor(ci,hi);
lcd.print("0");
lcd.setCursor(ci+1,hi);
}
lcd.print(i);
}
27