[ĐLĐK] Bài 02: GIỚI THIỆU VỀ BOARD THÍ NGHIỆM & LẬP TRÌNH ARDUINO
Nội dung thực hành
a. Lập
trình điều khiển LED đơn
Kết quả đạt được:
-
Khi mới cấp điện(Reset), các 8 led chớp tắt 5 lần
-
Sau đó thực hiện chu kỳ vô tân gồm: dịch 1 led từ trái sang phải (DO -> D7),
trì hoàn 0.5s
+
Hiệu ứng 1: Các led dịch từ trái sang phải
+
Hiệu ứng 2: Các led sáng dần từ phải sang trái
+
Hiệu ứng 3: Các led sáng dần từ trái sang phải
BUOI_2_CAU_A_CODE_2_1
// khai bao chan vao ra
const char PinOut[] =
{22,23,24,25,26,27,28,29};
//=====
void setup(){
for(int i = 0; i< 8 ; i++)
pinMode(PinOut[i], OUTPUT);
blink(5);//ham chop tat led 5 lan
}
//====
void loop(){
shiftLeft(); // ham dich trai Led
delay(500); // ham delay 1S = 1000ms
shiftRight();
delay(500);
LeftToRight();
delay(500);
}
//
// ham ddua 1 byte ra 8 led
void ShiftOut(char dat){
for (int i=0;i<8;i++){
if(dat&0x01)digitalWrite(PinOut[i],HIGH);
else digitalWrite(PinOut[i],LOW);
dat=dat>>1;
}
}
// ham blink 8 lED
void blink(char n){
for(int i=0;i<n;i++){
ShiftOut(0xff); // cho tat ca cac led sang
delay(500); // tri hoan thoi gian 500ms
ShiftOut(0x00);//cho tat ca cac led tat
delay(500);
}
}
//ham dich led tu phai sang trai
void shiftLeft(){
char dat = 0x01;
for(int i=0;i<8;i++){
ShiftOut(dat);
delay(500);
dat = dat<<1; // dich tai 1 bit
}
}
void shiftRight(){
char dat = 0x80;
for(int i=0;i<8;i++){
ShiftOut(dat);
delay(500);
dat = ((dat>>1)&(0x7F)); // dich phai 1 bit
}
}
void LeftToRight(){
char dat = 0x80;
for(int i=0;i<8;i++){
ShiftOut(dat);
delay(500);
dat = (dat>>1); // dich phai 1 bit
}
}
b. Lập trình điều khiến LED 7 đoạn
Kết quả đạt được:
-
Khi mới cấp điện(Reset), led 7 đoạn hiển thị 0000
-
Khi KI tác động: số đếm trên led 7 đoạn tăng 1 đơn vị
-
Khi K2 tác động: số đếm trên led 7 đoạn giảm 1 đơn vị
-
Khi K3 tác động: số đếm trên led 7 đoạn reset về 0000
-
Khi mới cấp điện(Reset), led 7 đoạn hiển thị 0000
-
Khi KI tác động: số đếm trên led 7 đoạn tăng 1 đơn vị và dừng đếm
-
Khi K2 tác động: số đếm trên led 7 đoạn giảm 1 đơn vị và dừng đếm
-
Khi K3 tác động: số đếm trên led 7 tự động tăng với chu kỳ T = ls (giây)
-
Khi K4 tác động: số đếm trên led 7 tự động giảm với chu kỳ T= ls (giây)
BUOI_2_CAU_B_CODE_2_2
// khai bao chan vao ra
const char PinOut[] = {22,23,24,25,26,27,28,29};
const char ctr[] = {37,36,35,34};
#define K1 44
#define K2 46
#define K3 43
#define K0 42
#define COM 33
// khai bao bang ma led 7 doan
const unsigned char code7seg[] =
{0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};
// khai bao bien
char leddat[4] = {4,3,2,1}; // vung nho du lieu can hien thi
char index; // nho vi tri led dang quet
// khai bao bien chuong trinh
int Status=0,Interval=0;
int counter = 0;
/// ddinh nghia ham con
// ham cap nhat gia tri hien thi
void toDisp(int
counter){
leddat[3] =
counter/1000;
leddat[2] =
(counter%1000)/100;
leddat[1] =
((counter%1000)%100)/10;
leddat[0] =
counter%10;
}
// ham dua 1 byte ra 8 led
void ShiftOut(char dat){
for (int
i=0;i<8;i++){
if(dat&0x01)digitalWrite(PinOut[i],HIGH);
else
digitalWrite(PinOut[i],LOW);
dat=dat>>1;
}
}
// daon chuong trinh khoi dong
void setup(){
for(int
i=0;i<8;i++) pinMode(PinOut[i],OUTPUT);
for(int
i=0;i<4;i++) pinMode(ctr[i],OUTPUT);
pinMode(COM,OUTPUT);
digitalWrite(COM,LOW);
pinMode(K1,INPUT_PULLUP);
pinMode(K2,INPUT_PULLUP);
pinMode(K3,INPUT_PULLUP);
}
// chuong trinh chinh
void loop(){
// doc va xua ly
phim an
if(digitalRead(K0)==0)
{
counter++; Status=0;
}
if(digitalRead(K1)==0)
{
counter--; Status=1;
}
if(digitalRead(K2)==0) Status=2;
if(digitalRead(K3)==0) Status=3;
if(Interval++>20)
{
Interval=0;
if(Status==2) counter++;
if(Status==3) counter--;
}
toDisp(counter);
Scanled();
delay(5);
}
//===
void Scanled(){
char ch;
ch = leddat[index];
ShiftOut(code7seg[ch]); // xuat du lieu ra led
// control led
digitalWrite(ctr[index],LOW);
digitalWrite(ctr[index == 0?3:(index-1)],HIGH);
// tang vi tri led
index++;
if(index>=4)index
= 0;
}
c. Lập trình đọc tín hiệu analog
Kết quả đạt được:
-
Khi mới cấp điện(Reset), các 8 led chớp tắt 5 lần
-
Sau đó đọc tín hiệu analog từ các biến trở và xuất giá trị PWM ra các LED RGB
Bài tập thực hành
+ BT1.4: Viết
chương trình đọc giá trị biến trở VR1 và hiển thị ra LED 7 đoạn.
BUOI_2_BT_1.4
const char PinOut[] = {22,23,24,25,26,27,28,29};
const char ctr[] = {37,36,35,34};
// KHAI BAO CHAN VAO RA
#define VR1 A3
#define VR2 A2
#define VR3 A4
#define PHOTO A1
#define COM 33
char leddat[4] = {4,3,2,1}; // vung nho du lieu can hien thi
char index; // nho vi tri led dang quet
// khai bao bien chuong trinh
int Status=0,Interval=0;
unsigned int counter = 0;
const unsigned char code7seg[] =
{0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};
unsigned int
val1,val2,val3;
void toDisp(int
counter){
leddat[3] =
counter/1000;
leddat[2] =
(counter%1000)/100;
leddat[1] =
((counter%1000)%100)/10;
leddat[0] =
counter%10;
}
void setup()
{
for(int
i=0;i<8;i++) pinMode(PinOut[i],OUTPUT);
for(int
i=0;i<4;i++) pinMode(ctr[i],OUTPUT);
pinMode(COM,OUTPUT);
digitalWrite(COM,LOW);
}
void loop(){
val1 = analogRead(VR1);
counter=val1;
toDisp(counter);
Scanled();
delay(5);
}
void ShiftOut(char dat){
for (int
i=0;i<8;i++){
if(dat&0x01)digitalWrite(PinOut[i],HIGH);
else
digitalWrite(PinOut[i],LOW);
dat=dat>>1;
}
}
void Scanled(){
char ch;
ch = leddat[index];
ShiftOut(code7seg[ch]); // xuat du lieu ra led
// control led
digitalWrite(ctr[index],LOW);
digitalWrite(ctr[index == 0?3:(index-1)],HIGH);
// tang vi tri led
index++;
if(index>=4)index
= 0;
}
+ BT1.5: Viết
chương trình đọc giá trị cảm biến LM35 và hiển thị ra LED 7 đoạn.
BUOI_2_BT_1.5
const char PinOut[] = {22,23,24,25,26,27,28,29};
const char ctr[] = {37,36,35,34};
// KHAI BAO CHAN VAO RA
#define VR1 A3
#define VR2 A2
#define VR3 A4
#define PHOTO A1
#define LM35 A0
#define COM 33
char leddat[4] = {4,3,2,1}; // vung nho du lieu can hien thi
char index; // nho vi tri led dang quet
// khai bao bien chuong trinh
int Status=0,Interval=0;
int counter = 0;
const unsigned char code7seg[] =
{0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};
int val1,val2,val3;
void toDisp(int
counter){
leddat[3] =
counter/1000;
leddat[2] =
(counter%1000)/100;
leddat[1] =
((counter%1000)%100)/10;
leddat[0] =
counter%10;
}
void setup()
{
for(int
i=0;i<8;i++) pinMode(PinOut[i],OUTPUT);
for(int
i=0;i<4;i++) pinMode(ctr[i],OUTPUT);
pinMode(COM,OUTPUT);
digitalWrite(COM,LOW);
}
void loop(){
val1 = analogRead(LM35);
counter=val1;
toDisp(counter);
Scanled();
delay(5);
}
void ShiftOut(char dat){
for (int
i=0;i<8;i++){
if(dat&0x01)digitalWrite(PinOut[i],HIGH);
else
digitalWrite(PinOut[i],LOW);
dat=dat>>1;
}
}
void Scanled(){
char ch;
ch = leddat[index];
ShiftOut(code7seg[ch]); // xuat du lieu ra led
// control led
digitalWrite(ctr[index],LOW);
digitalWrite(ctr[index == 0?3:(index-1)],HIGH);
// tang vi tri led
index++;
if(index>=4)index
= 0;
}
+ BT1.6*:
Viết chương trình đọc giá trị biến trở VR1, VR2, VR3, cảm biến LM35 và hiển thị
ra LED 7 đoạn (việc lựa chọn giá trị hiển thị được thực hiện bằng phím K0), cụ
thể:
BUOI_2_BT_1.6
const char PinOut[] = {22,23,24,25,26,27,28,29};
const char ctr[] = {37,36,35,34};
#define K1 44
#define K2 46
#define K3 43
#define K0 42
#define LEDR 13
#define LEDB 11
#define LEDG 12
// KHAI BAO CHAN VAO RA
#define VR1 A3
#define VR2 A2
#define VR3 A4
#define PHOTO A1
#define LM35 A0
#define COM 33
char leddat[4] = {4,3,2,1}; // vung nho du lieu can hien thi
char index; // nho vi tri led dang quet
// khai bao bien chuong trinh
int Status=0,Interval=0;
int counter = 0;
const unsigned char code7seg[] =
{0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};
int
val1=0,val2=0,val3=0,val4,val5;
void toDisp(int
counter){
leddat[3] =
counter/1000;
leddat[2] =
(counter%1000)/100;
leddat[1] =
((counter%1000)%100)/10;
leddat[0] =
counter%10;
}
void setup() {
// put your setup
code here, to run once:
for(int i=0;i<8;i++) pinMode(PinOut[i],OUTPUT);
for(int
i=0;i<4;i++) pinMode(ctr[i],OUTPUT);
pinMode(COM,OUTPUT);
digitalWrite(COM,LOW);
pinMode(K1,INPUT_PULLUP);
pinMode(K2,INPUT_PULLUP);
pinMode(K3,INPUT_PULLUP);
pinMode(K0,INPUT_PULLUP);
}
void loop() {
if(digitalRead(K0)==0) {
delay(5);Status++;}
if(Status>5) Status=1;
// put your main
code here, to run repeatedly:
switch (Status)
{
case 1:
{
analogWrite(LEDG,0);
analogWrite(LEDB,0);
analogWrite(LEDR,255);
val1 =
analogRead(VR1);
toDisp(val1);
Scanled();
delay(5);
break;
}
case 2:
{ analogWrite(LEDG,255);// Blue
analogWrite(LEDB,0);
analogWrite(LEDR,0);
val1=0;
val2 =
analogRead(VR2);
toDisp(val2);
Scanled();
delay(5);
break;
}
case 3:
{
analogWrite(LEDG,0);
analogWrite(LEDB,255);
analogWrite(LEDR,0);
val2=0;
val3 =
analogRead(VR3);
toDisp(val3);
Scanled();
delay(5);
break;
}
case 4:
{
analogWrite(LEDG,0);
analogWrite(LEDB,0);
analogWrite(LEDR,0);
val3=0;
val4 =
analogRead(LM35);
toDisp(val4);
Scanled();
delay(5);
break;
}
}
}
void ShiftOut(char dat){
for (int
i=0;i<8;i++){
if(dat&0x01)digitalWrite(PinOut[i],HIGH);
else
digitalWrite(PinOut[i],LOW);
dat=dat>>1;
}
}
void Scanled(){
char ch;
ch = leddat[index];
ShiftOut(code7seg[ch]); // xuat du lieu ra led
// control led
digitalWrite(ctr[index],LOW);
digitalWrite(ctr[index == 0?3:(index-1)],HIGH);
// tang vi tri led
index++;
if(index>=4)index
= 0;
}
Kết quả đạt được:
- Khi K0 ấn
lần thứ 1, LED 7 đoạn hiển thị giá trị của VR1
- Khi K0 ấn
lần thứ 2, LED 7 đoạn hiển thị giá trị của VR2
- Khi K0 ấn
lần thứ 3, LED 7 đoạn hiển thị giá trị của VR3
- Khi K0 ấn
lần thứ 4, LED 7 đoạn hiển thị giá trị của cảm biến LM35
- Khi K0 ấn
lần thứ 5, quay về lần thứ
BUOI_2_CAU_C_CODE_2_3
const char PinOut[] = {22,23,24,25,26,27,28,29};
// KHAI BAO CHAN VAO RA
#define VR1 A3
#define VR2 A2
#define VR3 A4
#define LEDR 13
#define LEDG 11
#define LEDB 12
// KHAI BAO BIEN CHUONG TRINH
int val1,val2,val3;
void setup(){
pinMode(LEDR,OUTPUT);
pinMode(LEDG,OUTPUT);
pinMode(LEDB,OUTPUT);
analogWrite(LEDR,0);
analogWrite(LEDG,0);
analogWrite(LEDB,0);
for(int i = 0; i<
8 ; i++)
pinMode(PinOut[i],
OUTPUT);
blink(5);//ham chop
tat led 5 lan
}
//
void loop(){
// DOC BIEN TRO VR1 => XUAT LA LED RED
val1 =
analogRead(VR1);
val1 =
map(val1,0,1024,0,225);
analogWrite(LEDR,val1);
// DOC BIEN TRO VR2 => XUAT LA LED GREEN
val2 =
analogRead(VR2);
val2 =
map(val2,0,1024,0,225);
analogWrite(LEDG,val2);
// DOC BIEN TRO VR3 => XUAT LA LED BLUE
val3 =
analogRead(VR3);
val3 = map(val3,0,1024,0,225);
analogWrite(LEDB,val3);
delay(200);
}
void blink(char n){
for(int
i=0;i<n;i++){
ShiftOut(0xff); //
cho tat ca cac led sang
delay(500); // tri
hoan thoi gian 500ms
ShiftOut(0x00);//cho tat ca cac led tat
delay(500);
}
}
void ShiftOut(char dat){
for (int
i=0;i<8;i++){
if(dat&0x01)digitalWrite(PinOut[i],HIGH);
else
digitalWrite(PinOut[i],LOW);
dat=dat>>1;
}
}
d. Giao tiếp và hiển thị trên LCD 16x2
Kết quả đạt được:
- Đọc trạng
thái phím ấn và hiên thị ra dòng thứ 1
- Đọc giá
trị cảm biến nhiệt độ và cảm biến ánh sáng hiển thị dòng 2
Leave a Comment