TỔNG QUAN
Lý do chọn đề tài
Dựa trên kiến thức từ môn lập trình Visual Basic, hệ thống điều khiển động cơ và các thiết bị điện tử, chúng em đã quyết định thực hiện đề tài thiết kế hệ thống thông tin và quản lý xe cân bằng qua điện thoại thông minh Mục đích của dự án là tìm hiểu sâu hơn về Arduino, làm quen với các thiết bị điện tử, thực hành với các kiến thức về cảm biến và nâng cao hiểu biết cá nhân.
Truyền dữ liệu không dây đang trở thành xu hướng phát triển mạnh mẽ trong ngành kỹ thuật ô tô và các lĩnh vực kỹ thuật điều khiển, nhờ vào những lợi ích thực tế và tiềm năng phát triển trong tương lai Các công ty ô tô lớn đã tích hợp nhiều tính năng điều khiển lên màn hình cảm ứng LCD, đồng thời sử dụng màn hình thứ hai để hiển thị đa nhiệm các thông số của xe ô tô.
Hình 1.2 Sử dụng màn LCD để hiển thị và điều khiển trên xa VOLVO.
Mục tiêu đề tài
Với sự tiến bộ của khoa học và công nghệ, việc truyền thông tin và dữ liệu không dây ngày càng trở nên phổ biến Đề tài của chúng tôi tập trung vào ứng dụng của công nghệ Bluetooth, một phần quan trọng trong lĩnh vực này.
Ba phần mềm di động mở Android kết hợp với khả năng xử lý tín hiệu và điều khiển mạnh mẽ của Arduino đang mở ra hướng phát triển tương lai cho công nghệ, đặc biệt trong ngành ô tô Thay vì dựa vào mạng LAN hay CAN, việc sử dụng truyền dữ liệu không dây mang lại nhiều lợi thế vượt trội về không gian và thẩm mỹ.
Đối tƣợng và phạm vi nghiên cứu
Đối tượng nghiên cứu của đề tài này là phương thức truyền thông tin và dữ liệu không dây, kết hợp giữa vi mạch điện tử và điện thoại thông minh Nhóm nghiên cứu cần tập trung vào các yếu tố chính để phát triển một sản phẩm hoàn thiện theo mục tiêu đã đề ra.
Vi mạch điện tử bao gồm 1 boad mạch arduino,1 moduel Bluetooth và các cảm biến
Phần mềm tạo ứng dụng trên Android.Mọi tín hiệu từ arduino sẽ truyền đến điện thoại nhờ vào Bluetooth
Tập trung nghiên cứu cách xử lí tín hiệu truyền từ Arduino đến Android
Giải quyết các vướng bận về mặt sóng tín hiệu, giảm nhiễu
CƠ SỞ LÝ THUYẾT
Tổng quan về arduino
Arduino đã tạo ra một cơn sốt trong cộng đồng DIY toàn cầu trong những năm gần đây, thu hút một lượng lớn người dùng với trình độ từ phổ thông đến đại học Sự phổ biến này đã khiến cả những nhà sáng lập Arduino cũng phải ngạc nhiên.
Hình 2.1 Các thành viên khởi xướng arduino
Arduino là một nền tảng mã nguồn mở được ưa chuộng, thu hút sự quan tâm của sinh viên và nhà nghiên cứu tại các trường đại học danh tiếng như MIT, Stanford và Carnegie Mellon Sự hỗ trợ từ Google với bộ kit Arduino Mega ADK cho thấy tiềm năng của Arduino trong việc phát triển các ứng dụng Android tương tác với cảm biến và thiết bị khác.
Arduino là một bo mạch vi xử lý cho phép 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ơ và đèn Điểm mạnh của Arduino nằm ở môi trường phát triển dễ sử dụng và ngôn ngữ lập trình thân thiện, giúp người mới bắt đầu, ngay cả những ai ít kiến thức về điện tử, có thể nhanh chóng tiếp cận và thực hiện các dự án.
5 điều làm nên hiện tƣợng Arduino chính là mức giá rất thấp và tính chất nguồn mở từ phần cứng tới phần mềm.
Mạch Arduino bao gồm vi điều khiển AVR cùng nhiều linh kiện bổ sung, giúp lập trình dễ dàng và mở rộng với các mạch khác Một điểm nổi bật của Arduino là các kết nối tiêu chuẩn, cho phép người dùng kết nối với các module mở rộng gọi là shield Một số shield giao tiếp trực tiếp qua các chân khác nhau, trong khi nhiều shield khác sử dụng giao thức I²C để kết nối song song Arduino thường sử dụng chip megaAVR như ATmega8, ATmega168, ATmega328, ATmega1280 và ATmega2560 Hầu hết các mạch đều có bộ điều chỉnh tuyến tính 5V và thạch anh dao động 16 MHz, mặc dù một số phiên bản như LilyPad hoạt động ở 8 MHz và không sử dụng bộ điều chỉnh điện áp do kích thước nhỏ Vi điều khiển Arduino có thể được lập trình sẵn với boot loader, cho phép tải chương trình vào bộ nhớ flash on-chip dễ dàng, giúp việc sử dụng Arduino trở nên thuận tiện hơn với máy tính gốc như một bộ nạp chương trình.
Arduino, được ra đời tại thị trấn Ivrea, Ý, được đặt theo tên vua Arduin từ thế kỷ thứ 9 Chính thức giới thiệu vào năm 2005 bởi giáo sư Massimo Banzi tại trường Interaction Design Institute Ivrea (IDII), Arduino ban đầu là một công cụ đơn giản dành cho sinh viên Mặc dù không được tiếp thị rộng rãi, nhưng tin tức về Arduino nhanh chóng lan truyền nhờ sự giới thiệu tích cực từ những người dùng đầu tiên Ngày nay, Arduino đã trở thành một biểu tượng nổi tiếng, thu hút du khách đến thăm Ivrea để khám phá nguồn gốc của nó.
2.1.1 Lý thuyết về board Arduino Uno R3
Dòng mạch Arduino UNO, nổi bật trong lập trình Arduino, đã phát triển đến thế hệ thứ 3 (R3) Bo mạch này được thiết kế với bộ xử lý trung tâm điều khiển AVR Atmega328.
Hình 2.2 Boad mạch arduino Uno R3
Bảng 2.1 Một vài thông số của Arduino UNO R3
Vi điều khiển ATmega328 họ 8bit Điện áp hoạt động 5V DC (chỉ đƣợc cấp qua cổng USB)
Tần số hoạt động 16 MHz
Dòng tiêu thụ khoảng 30mA Điện áp vào khuyên dùng 7-12V DC Điện áp vào giới hạn 6-20V DC
Số chân Digital I/O 14 (trong đó 6 chân pin có khả năng điều khiển xung PWM)
Số chân Analog 6 (độ phân giải 10bit)
Dòng tối đa trên mỗi chân I/O 30 mA
Dòng ra tối đa (5V) 500 mA
Dòng ra tối đa (3.3V) 50 mA
Bộ nhớ flash 32 KB (ATmega328) với 0.5KB dùng bởi bootloader
GND (Ground) là cực âm của nguồn điện cung cấp cho Arduino UNO Khi sử dụng các thiết bị với nguồn điện riêng biệt, các chân GND này cần phải được kết nối với nhau để đảm bảo hoạt động ổn định.
-5V: cấp điện áp 5V đầu ra Dòng tối đa cho phép ở chân này là 500mA
-3.3V: cấp điện áp 3.3V đầu ra Dòng tối đa cho phép ở chân này là 50mA
-Vin (Voltage Input): để cấp nguồn ngoài cho Arduino UNO, bạn nối cực dương của nguồn với chân này và cực âm của nguồn với chân GND
Chân IOREF trên Arduino UNO cho phép đo điện áp hoạt động của vi điều khiển, luôn duy trì ở mức 5V Tuy nhiên, không nên sử dụng chân này để lấy nguồn 5V, vì chức năng chính của nó không phải là cung cấp nguồn điện.
-RESET: việc nhấn nút Reset trên board để reset vi điều khiển tương đương với việc chân RESET đƣợc nối với GND qua 1 điện trở 10KΩ
*Các cổng vào/ra trên Arduino Board
Hình 2.3 Các cổng ra vào trên arduino Uno R3
Mạch Arduino UNO sở hữu 14 chân digital cho phép đọc và xuất tín hiệu với 2 mức điện áp là 0V và 5V Mỗi chân có dòng vào/ra tối đa là 40mA Các chân này được trang bị điện trở pull-up tích hợp trong vi điều khiển ATmega328, mặc dù mặc định các điện trở này không được kết nối.
Một số chân digital có các chức năng đặc biệt nhƣ sau:
- 2 chân Serial: 0 (RX) và 1 (TX): dùng để gửi (transmit – TX) và nhận (receive –
Arduino Uno có khả năng giao tiếp với các thiết bị khác thông qua hai chân dữ liệu TTL Serial Kết nối Bluetooth thường được hiểu là một dạng kết nối Serial không dây Nếu không cần sử dụng giao tiếp Serial, bạn không nên sử dụng hai chân này để tránh lãng phí tài nguyên.
- Chân PWM (~): 3, 5, 6, 9, 10, và 11: cho phép bạn xuất ra xung PWM với độ phân giải 8 bit (giá trị từ 0 → 2 8 -1 tương ứng với 0V → 5V) bằng hàm analogWrite() Nói một
9 cách đơn giản, bạn có thể điều chỉnh đƣợc điện áp ra ở chân này từ mức 0V đến 5V thay vì chỉ cố định ở mức 0V và 5V nhƣ những chân khác
Chân giao tiếp SPI bao gồm 10 (SS), 11 (MOSI), 12 (MISO) và 13 (SCK) Ngoài các chức năng cơ bản, bốn chân này còn được sử dụng để truyền dữ liệu qua giao thức SPI với các thiết bị khác.
- LED 13: Trên Arduino UNO có 1 đèn led màu cam (kí hiệu chữ L) Khi bấm nút
Reset, bạn sẽ thấy đèn này nhấp nháy để báo hiệu Nó đƣợc nối với chân số 13 Khi chân này được người dùng sử dụng, LED sẽ sáng
- Arduino UNO Broad : có 6 chân analog (A0 → A5) cung cấp độ phân giải tín hiệu
Arduino UNO sử dụng độ phân giải 10bit để đọc giá trị điện áp trong khoảng từ 0V đến 5V Bạn có thể cung cấp điện áp tham chiếu vào chân AREF để điều chỉnh phạm vi đo, ví dụ, nếu cấp 2.5V, các chân analog sẽ đo điện áp từ 0V đến 2.5V với độ phân giải 10bit Ngoài ra, Arduino UNO còn có 2 chân A4 (SDA) và A5 (SCL) hỗ trợ giao tiếp I2C/TWI với các thiết bị khác.
2.1.2 Lý thuyết về arduino IDE và ngôn ngữ lập trình
Thiết kế bo mạch nhỏ gọn và tính năng thông dụng của Arduino mang lại nhiều lợi ích, nhưng sức mạnh thực sự nằm ở phần mềm Môi trường lập trình đơn giản và dễ sử dụng, cùng với ngôn ngữ Wiring dựa trên C/C++, rất quen thuộc với kỹ sư Đặc biệt, số lượng thư viện mã nguồn mở phong phú được cộng đồng chia sẻ là một điểm cộng lớn cho người dùng.
Môi trường lập trình Arduino IDE hỗ trợ ba hệ điều hành phổ biến: Windows, Macintosh OSX và Linux Với tính chất mã nguồn mở, Arduino IDE hoàn toàn miễn phí và cho phép người dùng có kinh nghiệm tùy chỉnh và mở rộng.
Ngôn ngữ lập trình C++ cho phép mở rộng thông qua các thư viện, và nhờ vào nền tảng ngôn ngữ C của AVR, người dùng có thể dễ dàng nhúng mã code viết bằng AVR hoặc C vào chương trình của mình.
Hình 2.4 Giao diện màn hinh arduino IDE
2 2 Lý thuyết các cảm biến đƣợc sử dụng trong đề tài
2.2.1 Cảm biến nhiệt độ LM35
THIẾT LẬP PHẦN CỨNG VÀ LẬP TRÌNH VỚI ARDUINO
Lập trình,lắp đặt cho mạch đo nhiệt độ với arduino
Cảm biến LM35 hoạt động bằng cách cho ra một giá trị điện thế nhất định tại chân Voul (chân giữa) ứng với mỗi mức nhiệt độ
Để đo nhiệt độ từ cảm biến LM35, bạn cần kết nối chân bên trái của cảm biến với nguồn 5V và chân bên phải với đất Tiếp theo, sử dụng chân giữa của cảm biến để đo hiệu điện thế thông qua pin A0 trên Arduino, tương tự như cách đọc giá trị từ biến trở Kết quả sẽ cho bạn nhiệt độ trong khoảng 0-100 độ C theo công thức tính phù hợp.
Hình 3.1 Mạch đo cảm nhiệt độ với arduino
Int sensorPin = A0;// chân analog kết nối tới cảm biến LM35 void setup() {
Serial.begin(9600); //Khởi động Serial ở mức baudrate 9600
//đọc giá trị từ cảm biến LM35 int reading = analogRead(sensorPin);
//tính ra giá trị hiệu điện thế (đơn vị Volt) từ giá trị cảm biến float voltage = reading * 5.0 / 1023.0;
// ở trên mình đã giới thiệu, cứ mỗi 10mV = 1 độ C
// Vì vậy nếu biến voltage là biến lưu hiệu điện thế (đơn vị Volt)
// thì ta chỉ việc nhân voltage cho 100 là ra đƣợc nhiệt độ! float temp = voltage * 100.0;
Serial.println(temp); delay(1000);//đợi 1 giây cho lần đọc tiếp theo
Hình 3.2 Kết quả hiển thị đo nhiệt độ từ arduino
Lập trình,lắp đặt cho mạch đo cường độ sáng với arduino
Khi mô-đun cảm biến rung được kích hoạt, điện áp đầu vào của IC393 sẽ thay đổi IC này nhận diện sự thay đổi và phát ra tín hiệu thấp để thông báo về rung động.
Hình 3.3 Mạch đo cường độ sáng với arduino
*code lập trình int OutPin = A0; // Lưu chân ra của cảm biến void setup()
//Đối với một chân analog bạn không cần pinMode
Serial.begin(9600);//Mở cổng Serial ở mức 9600 pinMode (7, INPUT_PULLUP); pinMode (13, OUTPUT);
{ int value = analogRead(OutPin); // Ta sẽ đọc giá trị hiệu điện thế của cảm biến
// Giá trị đƣợc số hóa thành 1 số nguyên có giá trị
Serial.println(value);//Xuất ra serial Monitor delay(10);
Lắp đặt mạch kết nối bluetooth HC05 với arduino
Module HC-05 sử dụng lệnh AT để giao tiếp với các thiết bị khác Để kết nối với Arduino, chỉ cần sử dụng hai chân Tx và Rx Kết nối chân Tx của HC-05 với chân Rx của Arduino và chân Rx của HC-05 với chân Tx của Arduino, là có thể thiết lập giao tiếp giữa chúng.
Hình 3.5 Mạch kết nối bluetooth HC05 với arduino
Sau khi thiết bị Bluetooth HC05 kết nối thành công với thiết bị khác, đèn LED trên module sẽ nhấp nháy chậm, cho thấy rằng kết nối Serial đã được thiết lập.
Lắp đặc đo điện áp accu
Để đo điện áp của ắc quy, chúng ta sử dụng cầu phân áp nhằm lấy điện áp đầu vào kết nối với chân analog input của Arduino, với mức điện áp quy định từ DC 0-5V.
Trong các khối nguồn thường dùng cầu phân áp 2 điệt trở nên viêc tính áp sẽ nhanh hơn :
Hình 3.6 Mạch kết nối đo điện áp accu với arduino
Vout1 là điện áp đo đƣợc tại 2 đầu điện trở R2:
Với cầu phân áp 2 điện trở , ta có thể dùng công thức biến đổi :
// Chương trình như sau: void setup() {
// Đặt kết nối cho Arduino 9600 bits trên giây:
// Vòng lặp chính, làm cho chương trình chạy liên tục: void loop() {
// Đọc tín hiệu analog từ chân A0: int sensorValue = analogRead(A0);
// Chuyển đổi tín hiệu đọc được: float voltage = 11*sensorValue * (5.0 / 1023.0);// Tỷ lệ điện áp đầu vào 36V sau khi phân áp vào arduino
// Xuất ra ngoài màn hình:
Hình 3.7 Kết quả hiển thị điện áp accu
Vì đây là điện áp nạp cho accu, số liệu đo đƣợc lớn hơn điện áp định mức của accu
Lập trình,lắp đặt cho mạch hall với aruidno
Hình 3.8 Mạch kết đo tín hiệu xung của hall với arduino
Cảm biến Hall thường có 5 chân, trong đó 2 chân cung cấp tín hiệu xung để xác định chiều quay của động cơ, bao gồm cả chiều thuận và ngược Ngoài ra, cảm biến còn có một chân xuất tín hiệu I/O Dưới đây là hình ảnh động cơ xe điện được tích hợp sẵn cảm biến Hall.
Hình 3.9 Đầu kết nối với cảm biến Hall
#define PIN_DO 2 volatile unsigned int pulses; float rpm; unsigned long timeOld;
#define HOLES_DISC 2 void counter()
Serial.begin(9600); pinMode(PIN_DO, INPUT_PULLUP); pulses = 0; timeOld = 0; attachInterrupt(digitalPinToInterrupt(PIN_DO), counter, FALLING);
{ detachInterrupt(digitalPinToInterrupt(PIN_DO)); rpm = (pulses * 60) / (HOLES_DISC);
Serial.println(rpm); timeOld = millis(); pulses = 0; attachInterrupt(digitalPinToInterrupt(PIN_DO), counter, FALLING);
Kết quả đo tốc độ động cơ cân bằng khi động cơ hoạt động ở chế độ thông thường
Hình 3.9 Kết quả hiển thị số quay quay động cơ cân bằng (rpm)
Lập trình,lắp đặt cho mạch đo cường độ dòng điện với arduino
Khi đo DC, cần mắc tải nối tiếp Ip+ và Ip- theo đúng chiều, với dòng điện chảy từ Ip+ đến Ip- Vout sẽ cho ra mức điện thế từ 2.5V đến 5V tương ứng với dòng từ 0A đến 5A Nếu mắc ngược, Vout sẽ giảm xuống từ 2.5V đến 0V, tương ứng với dòng từ 0A đến -5A.
Khi cấp nguồn 5V cho module mà chưa có dòng Ip (không có tải mắc nối tiếp với domino), Vout sẽ là 2.5V Khi dòng Ip đạt 5A, Vout sẽ tăng lên 5V, cho thấy mối quan hệ tuyến tính giữa Vout và dòng Ip trong khoảng từ 2.5V đến 5V tương ứng với dòng từ 0 đến 5A Để kiểm tra giá trị Vout, bạn có thể sử dụng đồng hồ VOM thang đo DC.
Khi đo dòng điện AC, do dòng điện AC không có chiều nên không cần quan tâm chiều
Khi cung cấp nguồn 5V cho module mà chưa có dòng Ip (không có tải mắc nối tiếp với domino), điện áp Vout sẽ là 2.5V Khi có dòng xoay chiều Ip (dòng AC), do độ lớn của dòng xoay chiều thay đổi liên tục theo hàm sin, điện áp Vout sẽ trở thành điện áp xoay chiều hình sin với độ lớn tuyến tính.
26 với dòng điện AC , 0 đến 5V(thế xoay chiều xoay chiều) tương ứng với -5A đến 5A (dòng xoay chiều) Để kiểm tra dùng đồng hồ VOM thang đo AC đo Vout
Hình 3.10 Lắp đặt cho mạch đo cường độ dòng điện với arduino
Code lập trình const int analogIn = A2; int mVperAmp = 100; // use 100 for 20A Module and 66 for 30A Module int ACSoffset = 2500; void setup(){
} void loop(){ int RawValue = analogRead(analogIn); float Voltage = (RawValue / 1024.0) * 5000; // Gets you mV float Amps = ((Voltage - ACSoffset) / mVperAmp);
Serial.print("Raw Value = " ); // shows pre-scaled value
Serial.print("\t mV = "); // shows the voltage measured
Serial.print(Voltage,3); // the '3' after voltage allows you to display 3 digits after decimal point
Serial.print("\t Amps = "); // shows the voltage measured
Serial.println(Amps,0); // the '3' after voltage allows you to display 3 digits after decimal point delay(2500);
Hiển thị kết quả đo dòng:
Hinh 3.11 Kết quả Hiển thị đo cường độ dòng điện từ arduino
LẬP TRÌNH ANDROID MIT APP INVENTOR 2
Giới thiệu về Mit App Inventor
MIT App Inventor là một công cụ do MIT phát triển, cho phép người dùng tạo ứng dụng Android dễ dàng thông qua phương pháp kéo thả, mà không cần có kiến thức lập trình Phiên bản mới nhất hiện nay là MIT App Inventor 2.
Hình 4.1 Sơ đồ nguyên truyền phiên bản mới nhất hiện nay là MIT App Inventor 2
App Inventor, dựa trên nguyên tắc "những gì bạn thấy là những gì bạn có" (WYSIWYG), mang đến khả năng tiếp cận dễ dàng cho việc xây dựng ứng dụng Android Với giao diện trực quan và dễ hiểu, người dùng có thể truy cập vào nhiều chức năng của điện thoại, bao gồm cả GPS Đây là công cụ lý tưởng để làm phong phú thêm bộ sưu tập ứng dụng Android.
+ Không cần biết nhiều về code
+ Chỉ có động tác kéo thả đơn giản
Hỗ trợ đầy đủ các tập lệnh cảm biến, cơ sở dữ liệu và kết nối Bluetooth, bài viết này hướng đến những ai quan tâm đến IoT Điều này cho phép bạn điều khiển các thiết bị điện trong nhà chỉ bằng điện thoại Android.
+ Hỗ trợ các kết nối mạng xã hội, google maps…
+ Nặng, chạy chậm nếu như có quá nhiều code do chương trình phát sinh thêm nhiều code thừa không cần thiết trong quá trình build sang file cài APK
+ Không tối ƣu hoá code đƣợc
Mỗi màn hình (Activity) trong ứng dụng hoạt động độc lập, chỉ cho phép truyền một biến duy nhất sang màn hình tiếp theo, điều này có nghĩa là không tồn tại biến toàn cục cho tất cả các màn hình.
4.2 Giới thiệu lập trình khối Để sử dụng đƣợc App inventor, ta phải truy cập vào địa chỉ ai2.appinventor.mit.edu sau đó tiến hành đăng nhập tài khoản Google của bạn để mở rộng trang quản lý
Hình 4.2 Giao diện quản lý Project
30 Để tạo một Project mới ta chọn Start New Project và đặt tên cho project đó
Hình 4.3 Giao diện Start New Project
The Project design interface is user-friendly, featuring controls on the left side, including User Interface, Media, Sensor, and Social options Users can easily drag and drop these elements onto the central Screen, which simulates the application's display On the right side, there is a management window for handling Components, Media, and Properties for each Control within the app.
Inventor có hai chế độ làm việc: designer và block
4.2.1 Chế Độ Designer: chế độ dành cho thiết kế, tạo giao diện bên ngoài
Hình 4.4 Giao diện các thành phần chính của chế độ designer
Giao diện của thể chia ra thành 4 thành phần chính:
+ 1: Palette: Chứa các đối tƣợng để thiết kế ứng dụng
+ 2:Properties: Chứa các thuộc tính của đối tƣợng đang đƣợc chọn
+ 3:Screen Viewer: Nơi cho phép thiết kế screen cho ứng dụng của mình bằng cách kéo thả các đối tƣợng vào
+ 4: Nơi bạn quản lý screen (màn hình) và chế độ thiết kế / khối lệnh
4 2.1.1 palette: là nơi chứa các đối tƣợng của App Inventor và đƣợc chia làm 9 nhóm
User inteface (Giao diện người dùng)
Hình 4.5 Giao diện User inteface (Giao diện người dùng) Bảng 4.1 Nhóm những đối tượng dùng để thiết kế giao diện cho screen mà người dùng nhìn thấy đƣợc
Nút lệnh thực hiện công việc nào đó Cho phép bạn nhập vào văn bản Tạo danh sách lựa chọn
Hộp thoại chọn ngày tháng
Hộp thoại chọn thời gian Hộp thoại đánh dấu check Nhãn để hiển thị nội dung văn bản Danh sách chọn, cũng tương tự như Listview Thanh trƣợt
Hộp nhập mật khẩu, mật khẩu sẽ chỉ hiện dấu * khi nhập
Tạo hộp thoại cảnh báo, nhắc nhở Hiển thị hình ảnh
Hiển thị danh sách dạng menu sổ xuống
Hình 4.6 Giao diện Layout (Bố cục)
Tại mục này chứa các giải pháp giúp bạn sắp xếp các đối tƣợng theo một bố cục nhất định:
Bảng 4.2 Nhóm lệnh sắp xếp các đối tƣợng theo một bố cục
Sắp xếp đối tƣợng theo dạng bảng
Sắp xếp đối tƣợng theo chiều dọc
Sắp xếp đối tƣợng theo chiều ngang
Media (Phương tiện truyền thông)
Hình 4.7 Giao diện Media (Phương tiện truyền thông)
Mục này giúp bạn có thể làm việc liên quan đến đa phương tiện như âm thanh, video, máy ảnh, ghi âm,
Bảng 4.3:Nhóm lệnh liên quan đến đa phương tiện như âm thanh, video, máy ảnh, ghi âm
Có thể chơi âm thanh vào điều khiển rung điện thoại
Chơi các tập tin âm thanh Phát âm một văn bản Dịch ngôn ngữ, đƣợc cung cấp bởi Yandex Chơi tệp video
Quay phim Chụp ảnh Chuyển đổi lời nói thành văn bản Chọn ảnh từ thƣ viện ảnh trong máy
Drawing and Animation (Vẽ và chuyển động)
Hình 4.8 Giao diện Drawing and Animation (Vẽ và chuyển động)
Tại đây giúp bạn tạo ra những chuyển động hay tương tác:
Bảng 4.4: Nhóm lệnh tạo ra những chuyển động hay tương tác
Nơi cho phép Imagesprite có thể di chuyển trên nó Đƣợc đặt trên Canvas, có thể chạm và kéo,
Hình quả bóng, đƣợc đặt trên Canvas
Hình 4.9 Giao diện Sensors (Cảm biến)
Bảng 4.5: Nhóm này giúp bạn tiếp cận đƣợc những cảm biến nhƣ định vị, quét mã
Thông tin về thời gian và đồng hồ hệ thống Tính năng quét mã QR qua camera
Vị trí và định vị địa điểm đóng vai trò quan trọng trong việc định hướng trong không gian Công nghệ giao tiếp gần NFC giúp kết nối và truyền tải dữ liệu một cách nhanh chóng Bên cạnh đó, cảm biến gia tốc, độ nghiêng và rung lắc cung cấp thông tin chính xác về chuyển động Cuối cùng, cảm biến tiệm cận gần xa cho phép nhận diện khoảng cách và tương tác hiệu quả với môi trường xung quanh.
Social (Giao tiếp - Xã hội)
Hình 4.10 Giao diện Social (Giao tiếp - Xã hội)
Bảng 4.6 Nhóm Các đối tƣợng này giúp bạn thao tác về liên lạc, giao tiếp và mạng xã hội
Hộp văn bản cho phép nhập địa chỉ email Văn bản tin nhắn
Hộp thoại chọn số điện thoại Gọi điện thoại
Chia sẻ dữ liệu giữa hai máy đã cài ứng dụng Giao tiếp với mạng xã hội Twitter
Chọn một liên hệ trong danh bạ
Hình 4.11 Giao diện Storage (Lưu trữ)
Bảng 4.7 Nhóm chức năng này giúp bạn lưu trữ thông tin, dữ liệu, theo nhiều cách khác nhau
Liên kết với Google Fusion Tables Cho phép bạn lưu trữ, truy vấn và chia sẻ bảng dữ liệu
Cho phép bạn lưu trữ trên tập tin trên bộ nhớ điện thoại
Giúp giao tiếp với web server, lưu trữ và truy vấn dữ liệu Lưu trữ và truy vấn dữ liệu ngay trong ứng dụng
Hình 4.12 Giao diện Connectivity (Kết nối)
Bảng 4.8 Nhóm giúp bạn hoàn toàn có thể dùng chúng để kết nối bluetooth, giao thức web,
Bluetooth khách (theo mô hình khách - chủ) Bluetooth chủ (theo mô hình khách - chủ) Cung cấp các chức năng HTTP GET, POST, PUT,
Có thể chạy một "activity" thông qua phương thức StartActivity
Ngôn ngữ dễ nhất để làm việc với Mindstorm là LEGO MINDSTORMS NXT SOFTWARE 2.1, đi kèm với bản NXT và bán riêng cho bản Education Phần mềm này được xây dựng từ LABVIEW, một ngôn ngữ lập trình Robot phổ biến.
Hình 4.13 Giao diện LEGO® MINDSTORMS®
App Inventor cũng cung cấp cho bạn những đối tƣợng có thể làm việc với Lego Mindstorm nhƣ sau:
Bảng 4.9 Nhóm giúp cho bạn những đối tƣợng có thể làm việc với Lego Mindstorm
4 2.1.2 Thành phần - thuộc tính Ứng với mỗi thảnh phần, có những thuộc tính nhất định
Hình 4.14 Giao diện Thành phần - thuộc tính
Gửi lệnh trực tiếp đến NXT cho phép robot hoạt động hiệu quả hơn Cảm biến màu sắc giúp robot nhận diện và phân loại màu sắc, trong khi cảm biến ánh sáng giúp robot phản ứng với ánh sáng môi trường Âm thanh trên robot cho phép nhận diện âm thanh xung quanh, và cảm biến siêu âm hỗ trợ trong việc đo khoảng cách và phát hiện vật cản Cảm biến chạm giúp robot nhận biết khi nào nó tiếp xúc với một vật thể Tất cả các cảm biến này đóng vai trò quan trọng trong việc điều khiển robot di chuyển và chuyển hướng một cách linh hoạt.
Screen view cho phép thiết kế giao diện bằng cách kéo thả các đối tượng Tại đây, người dùng có thể làm việc với các thành phần hiển thị (Visible component) và các thành phần không hiển thị (Non-visible component).
4 2.1.4 Quản lý a Screen (màn hình)
Tại đây, hiện màn hình hiện tại, thêm màn hình mới và xóa màn hình hiện tại b Chế độ làm việc
Chế độ làm việc có hai chế độ:
Designer: Dành cho nhà thiết kế
Chế độ Blocks có dạng:
4.2.2 Chế Độ Blocks: chế độ làm việc với các khối lệnh xử lý bên trong chương trình.
Hình 4.15 Giao diện Lệnh tích hợp sẵn
Những nhóm lệnh tích hợp sẵn (Build-in) gồm những nhóm nhƣ sau:
1 Control là nhóm lệnh liên quan đến các câu lệnh điều kiện, điều khiển, vòng lặp,
2 Logic là những nhóm giá trị liên quan đến logic nhƣ true, false, phủ định, các phép so sánh,
3 Math là nhóm lệnh, giá trị liên quan đến tính toán, con số,
4 Text là nhóm lệnh những câu lệnh xử lý và làm việc với chuổi, xâu ký tự,
5 Lists là nhóm lệnh làm việc với danh sách
6 Colors là nhóm lệnh làm việc với màu sắc
7 Variables là nhóm giúp bạn tạo, khai thác và xử lý các biến (toàn cục hoặc địa phương)
8 Procedure giúp bạn xây dựng chương trình con, thủ tục,
Hình 4.16 Giao diện Lệnh Creen
Màn hình hiển thị danh sách các đối tượng mà bạn đã kéo thả, mỗi đối tượng đi kèm với những câu lệnh cụ thể để tương tác hiệu quả.
Hình 4.17 Giao diện Lệnh Any component
Any Component(Bất kỳ thành phần nào) là bạn có thể quy định các câu lệnh cho nhóm đối tƣợng theo một thành phần nào đó
Khi sử dụng câu lệnh cho Any Image, tất cả các đối tượng Image sẽ tuân theo cùng một câu lệnh chung Những câu lệnh này có tính chất tổng quát, không áp dụng riêng lẻ cho từng đối tượng.
Hình 4.18 Giao diện vùng làm việc
Vùng làm việc của Blocks có thể chia thành 4 phần nhƣ sau:
1: Vùng chứa những khối lệnh đề xuất từ một đối tƣợng mà bạn đã chọn từ Blocks, bạn có thể kéo thả những khối lệnh này vào vùng làm việc thật sự để trở thành lệnh cho ứng dụng thực thi
2: Những khối lệnh đã đƣợc kéo ra từ những khối lệnh đề xuất Ứng dụng sẽ thực thi những khối lệnh này
3: Backpack:Giúp bạn sao chép và dán các khối lệnh đến màn hình khác hoặc project khác
4: Thùng rác: Để xóa những khối lệnh, bạn chỉ cần kéo thả chúng vào thùng rác này
Pop-up menu bạn có thể hiểu là những cửa sổ bật lên, lúc bạn chọn vào một đối tƣợng nào đó hoặc chuột phải vào vùng trống
Khi bạn kéo các khối lệnh vào vùng làm việc, nhấn chuột phải sẽ hiển thị một menu với những đề xuất để bạn lựa chọn.
Disable Block / Enable Block Đề xuất này giúp bạn có thể vô hiệu hóa / kích hoạt khối lệnh
Với những khối lệnh bạn không muốn ứng dụng thực hiện nhƣng vẫn muốn giữ nó trên vùng làm việc thì bạn chọn Disable Block
Khi bạn muốn cho ứng dụng thực hiện khối lệnh vừa vô hiệu hóa thì bạn chọn Enable
Khối lệnh bị vô hiệu hóa Khối lệnh đƣợc kích hoạt
Giúp bạn thêm khối lệnh đã chọn vào trong Backpack:
Con số nằm trong dấu ngoặc đơn là số lƣợng các khối lệnh hiện có trong Backpack Backpack sẽ đƣợc đề cập ở các bài viết sau
Số lượng n phụ thuộc vào số khối lệnh con trong khối lệnh đã chọn Việc chọn đề xuất này sẽ bao gồm khối lệnh đang chọn cùng với các khối lệnh con mà nó chứa.
Lệnh này tương đương với việc bạn kéo thả khối lệnh vào thùng rác
Khi bạn chuột phải vào vùng trống (không có khối lệnh) thì sẽ hiện lên menu nhƣ thế này:
Download Blocks as Image: Cho phép bạn tải về hình ảnh biểu diễn các khối lệnh giống nhƣ bạn nhìn thấy trên vùng làm việc
Collapse Blocks: Thu gọn tất cả các khối lệnh có trên vùng làm việc
Expand Blocks: Mở rộng tất cả các khối lệnh có trên vùng làm việc
Arrange Blocks Horizontally: Sắp xếp các khối lệnh theo chiều ngang
Arrange Block Vertically: Sắp xếp các khối lệnh thành chiều dọc
Sort Blocks by Category: Sắp xếp các khối lệnh theo danh mục
Paste All Blocks from Backpack: Dán tất cả các khối lệnh có trong Backpack ra vùng làm việc
Copy All Blocks to Backpack: Sao chép tất cả các khối lệnh có trên vùng làm việc vào trong Backpack
Empty Backpack: Xóa hết những khối lệnh có trong Backpack
Hình 4.19 Giao diện hộp cảnh báo
Hộp cảnh báo là một khung nhỏ nằm ở dưới góc trái của vùng làm việc:
Hộp này có nhiệm vụ cảnh báo cho bạn biết những chỗ không hợp lệ, những chỗ sai cú pháp trên vùng làm việc các khối lệnh
Chương 5 ỨNG DỤNG MIT APP INVENTOR 2 VÀO HIỂN THỊ THÔNG TIN
Thiết lập màn hình đăng nhập
Việc bảo mật với một chiếc xe, chúng ta cần cài đặt password để có thể đăng nhập, màn hình này có các chức năng chính là:
Thay đổi mật khẩu đã đặt
Reset lại mật khẩu ban đầu thiệt lập
Đăng nhập vào ứng dụng
Hình 5.1 Giao diện của ứng dụng
49 Để thiết lập đƣợc nhƣ vậy chúng ta cần sử dụng các đối tƣợng sau:
Hình 5.2 Giao diện cửa sổ components Ở của số components chúng ta thầy ở Screen 1 cần sủ dụng
4 button : dùng cho các nút change pass, reset, ok và find xe
2 passbox : dùng để nhập và thay đổi password
1 listpicker :dùng để tự động kết nối bluetouth
1 tinyDB1 : dùng để lưu passwword dưới dạng kí tự văn bản
Bluetoothclient : để kết nối với xe và tìm xe
Clock1 : dùng để kết nối bluetooth một cách liên tục
Sử dụng Hozizontal và Vertical để sắp xếp và thiết kes bố cục của ứng dụng
Có rất nhiều cách thiết lập với một hệ điều hành mở Android, đây là một cách cơ bản dễ dàng sử dụng và thiết kế
Lập trình khối là một phương pháp lập trình đơn giản và tiện lợi, giúp lập trình viên dễ dàng thao tác mà không cần lo lắng về các dòng code phức tạp Các cấu trúc điều khiển, vòng lặp, phép toán logic và so sánh đã được tích hợp sẵn, mang lại sự thuận tiện tối đa cho người sử dụng.
5.1.2.1 Thiết lập kết nối bluetooth
Trong MIT App Inventor 2, các màn hình hoạt động độc lập và cần thiết lập kết nối Bluetooth mỗi khi một màn hình mới được mở.
Để thiết lập kết nối Bluetooth, chúng ta cần tạo một biến toàn cục nhằm đếm số lần nháy của đèn và thực thi quá trình này.
Khi thiết lập Screen1, tất cả các lệnh sẽ được thực hiện nếu bluetoothClient1 có sẵn Bluetooth sẽ được kết nối thông qua ListPicker1 với địa chỉ 98:D3:31:FD:39:27, địa chỉ này tương ứng với mô-đun Bluetooth tích hợp với bộ Arduino.
Mặc dù khối lệnh đơn giản, nhưng vẫn có nhiều yếu tố tác động đến chương trình và ứng dụng, gây ra lỗi như việc kết nối Bluetooth bị ngắt Để khắc phục sự cố này, chúng ta cần sử dụng thêm các khối lệnh phù hợp.
Hình 5.4 khối code thiết lập kết nối Bluetooth khi phát hiện lỗi
Khối lệnh trên có nhiệm vụ kết nối ngay lại với bluetooth khi phát hiện lỗi
5.1.2.2 Thiết lập mở screen2 Để mở đƣợc Screen2 chúng ta nhập password và ấn nút OK
Hình 5.5 khối code thiết lập mở screen2
Khi nhập mật khẩu vào passbox1, chúng ta sẽ so sánh thuộc tính văn bản của nó với mật khẩu đã được cài đặt trước, mà được lưu trữ trong TinyDB1 với thứ tự là đầu tiên, do đó chúng ta sử dụng tag 1.
Nếu đúng password thì sẽ ngắt kết nối bluetooth và mở screen2
Reset password cho ứng dụng
Hình 5.6 khối code thiết lập Reset password cho ứng dụng
Chúng ta cài password mặc định cho ứng dụng là spkt thứ tự lưu trong TinyDB1 là 1
Hình 5.7 khối code thiết lập thay đổi password cho ứng dụng
Khi chúng ta thay đổi password thì hai passbox sẽ hiện ra, thay đổi tag 1 trong TinyDB1 thanh password mà bạn yêu thích
5.1.2.3 thiết lập báo vị trị xe và tìm xe trong bãi
Khi bạn bước vào khu vực hoạt động của Bluetooth và khởi động ứng dụng, đèn xe và còi sẽ phát tín hiệu giúp bạn xác định vị trí của xe.
Để tự định vị xe, chúng ta cần tạo một biến toàn cục để đếm số lần nháy của đèn và cho phép nó hoạt động liên tục.
Để thiết lập chức năng tự định vị xe, chúng ta sử dụng khối code trong Hình 5.8 Khi gửi dữ liệu qua Android thông qua module Bluetooth HC05, chúng ta gọi hàm BluetoothClient.SendText Gửi ký tự 'A' sẽ làm đèn sáng, trong khi gửi ký tự '9' sẽ tắt đèn Đây là các trường hợp lập trình trong Arduino Ngoài ra, người dùng có thể tìm xe bằng cách nhấn nút bấm.
Để chủ động xác định vị trí xe trong bãi, bạn chỉ cần nhấn nút FIND Khi giữ nút này, đèn xe sẽ sáng, và khi thả tay ra, đèn sẽ tắt.
Hình 5.9 khối code thiết lập Tìm xe bằng nút bấm
Với text A,B là các trường hợp lập trình trong arduino.Và khối lệnh để truyền dữ liệu vẫn là call BluetoothClient
Nếu bạn không muốn sử dụng SendText thì hãy lựa chọn một thuộc tính khác trong của sổ Block phía trái màn hình Designer
Hình 5.10 khối lệnh call bluetooth
Nhƣng với tính năng tìm xe thì chúng ta nên gửi một text chiếm một byte bộ nhớ để chương trình nhẹ hơn và có phản hồi nhanh hơn
Thiết lập màn hình hiển thị thống số xe
5.2.1.1 Designer hiển thị thông số
Mục đích của Screen2 là hiển thị chính xác tình trạng của xe, bao gồm tốc độ xe, tốc độ động cơ và công suất điện tiêu thụ Nó tích hợp các nút điều khiển hệ thống đèn chiếu sáng và đèn tín hiệu, tất cả được điều khiển và gửi dữ liệu qua kết nối không dây Bluetooth.
In MIT App Inventor 2, to create motion on Screen 2, we need to use image files in formats such as JPG, PNG, or JPEG These files can be uploaded to the screen using specific components designed for this purpose.
Tạo nền chuyển động, xác định vị trí hình ảnh bằng hệ tọa độ XY
Sprite này cho phép hình ảnh chạy trên nền của Canvas hỗ trợ định dạng PNG .JPEG
Khi tải lên Canvas và ImageSprite, việc chú ý đến thuộc tính Properties là rất quan trọng Đặc biệt, với thuộc tính Speed của Canvas, chúng ta cần xem xét các thuộc tính liên quan để tối ưu hóa hiệu suất và trải nghiệm người dùng.
Góc của hình ảnh, mặc định là 0 và hình ảnh quay lên trên
Kích thước của hình ảnh
Khoảng thời gian giữa 2 lần chuyển động đơn vị ms
Vị trị của ảnh trong hệ tọa độ Oxyz
5.2.1.2 Designer button điều khiển đèn
Việc thay thế bảng táp lô trên xe điện đã đưa tính năng điều khiển đèn vào ứng dụng, mặc dù có một số bất tiện trong việc điều khiển Tuy nhiên, điều này vẫn cho phép người dùng vận hành xe một cách hiệu quả Mặc dù hiện tại còn một số hạn chế trong tính thuận tiện, nhưng với sự phát triển công nghệ trong tương lai, các công tắc truyền thống sẽ dần được thay thế và ít được sử dụng hơn.
Hình 5.10 Màn hình hiển thị tốc độ động cơ và tích hợp tính năng điều khiển đèn
Các công tắc quen thuộc được thiết kế đơn giản, dễ dàng cho việc điều khiển Mặc dù vẫn giữ đầy đủ chức năng, nhưng kích thước của chúng đã được thu nhỏ và gọn gàng hơn so với các công tắc truyền thống.
5.2.2.1 Thiết lập điều khiển hiển thị thông số
Khi kết nối Bluetooth được thiết lập, Arduino truyền dữ liệu số đến Android thông qua module HC05 Những dữ liệu này cần được xử lý để điều khiển kim đồng hồ, giúp tài xế dễ dàng quan sát hơn so với việc hiển thị đồng hồ số Dưới đây là khối lệnh cơ bản để xoay thuộc tính heading của imageSprite.
Hình 5.11 khối code thiết lập điều khiển hiển thị thông số
Khi tín hiệu Bluetooth được kết nối, Arduino sẽ gửi dữ liệu đến Android, và chúng ta sẽ phân tách dữ liệu đó thành ba thành phần khác nhau.
Tốc độ động cơ cân bằng
Chúng ta lưu trữ các giá trị đã cắt vào một danh sách mang tên data, theo một thứ tự cụ thể Các góc quay được tính toán dựa trên thiết kế của mặt đồng hồ và hệ số nhân tương ứng.
Khối code sẽ xoay các imageSprite theo đơn vị độ, cần nhân với hệ số âm do quy định chiều dương là chiều ngược kim đồng hồ.
5.2.2.2 Thiết lập điều khiển đèn Đây là khối code điều khiển đèn cơ bản, gần tương tự với khối lệnh tìm xe
Hình 5.12 khối code thiết lập điều khiển hiển điều khiển đèn cơ bản
Khi Bluetooth nhận tín hiệu "1" hoặc "2", đèn báo rẽ sẽ được kích hoạt, trong khi tín hiệu "4" sẽ tắt đèn Các tín hiệu này được lập trình thành các trường hợp (Case) trong Arduino Để hệ thống hoạt động, người dùng cần nhấn vào nút.
Hình 5.13 khối code thiết lập điều kiện để hoạt động là click vào button
Khối mã điều khiển đèn chiếu sáng sử dụng các chức năng như click, longclick, TouchDown và Touchup Việc thay thế cụm công tắc phía dưới tay lái ô tô bằng những ứng dụng này không chỉ giúp giảm chi phí lắp đặt mà còn tiết kiệm chi phí sửa chữa.
Thiết lập màn hình điều khiển và hiển thị công suất tiêu thụ
Màn hình thứ ba được thiết kế chủ yếu cho việc điều khiển, với các nút bấm lớn hơn và dữ liệu xe hiển thị dưới dạng số gọn gàng Đây là lựa chọn lý tưởng cho tài xế khi cần xử lý nhiều chức năng một cách hiệu quả.
Trog màn hình này chúng ta hiển thị các thông số nhƣ điện áp, nhiệt độ, công suất tiêu thụ và quãng đường xe chạy
Hình 5.14 Màn hình hiển thị creen 3
Với màn hình này chúng ta chỉ cần sử dụng
Với hệ điều hành Android mạnh mẽ, việc điều khiển và hiển thị trạng thái hoạt động trở nên đơn giản Trong MIT App Inventor, để phân tích một gói dữ liệu thành các phần tử khác nhau, chúng ta sử dụng công cụ split trong khối code list Để hiển thị các thông số dưới dạng số liệu trên các TextBox, cần thay đổi thuộc tính text của chúng theo thông số gửi từ Arduino.
Hình 5.15 khối code thiết lập truyền dữ liệu số từ arduino đến android
KẾT QUẢ NGHIÊN CỨU VÀ ỨNG DỤNG TRÊN XE CÂN BẰNG
Thiết kế phần cứng cho hệ thống thông tin
Phương thức truyền dữ liệu qua Bluetooth cho phép điện thoại smartphone Android hoạt động như một smartkey, giúp người dùng điều khiển, tìm xe trong bãi và khóa xe khi cần thiết Dưới đây là sơ đồ nguyên lý cơ bản của hệ thống truyền và nhận thông tin.
Hình 6.1:Sơ đồ nguyên lý hệ thống quản lý thông tin và điều khiển
Hình 6.2:Sơ đồ mạch điện thực tế
Sơ đồ đi dây các cảm biến công tác và relay điều khiển
kết quả hiển thị
Hình 6.4 Kết quả hiển thị khi xe hoạt động theo dạng đồng hồ kim
Hình 6.5 Hiển thị kết quả theo đồng hồ số
Hình 6.6 Kết quả điều khiển đèn chiếu sang
Mạch đƣợc tích hợp và bố trí một cách gọn gàng, và đƣợc gắn ngay phần điều khiển của xe cân bằng
Code lập trình tham khảo
[code] int tempPin = A4; int lightPin = A0; int voltPin = A3; int ampePin = A2; int Rbutton = 4; int Lbutton = 5; int Flbutton = 6; int Hbutton = 7; char start;
#define PIN_DO_3 3 volatile unsigned int pulses; volatile unsigned int pulses_1; unsigned int rpm; unsigned int rpm_1; unsigned int rpm2; unsigned int vantoc; unsigned long timeOld;
#define HOLES_DISC_1 2 void counter1()
Serial.begin(9600); pinMode(Hbutton, INPUT);
In the setup for the circuit, various pins are configured for input and output, including the right, left, and front buttons as well as headlights and LEDs The digital pins 9, 10, and 11 are set to HIGH, while pins PIN_DO_2 and PIN_DO_3 are configured with INPUT_PULLUP for reliable reading Two variables, pulses and pulses_1, are initialized to zero, and an interrupt is attached to PIN_DO_2 and PIN_DO_3 to count falling edges, allowing for precise pulse counting in the system.
// tính nhiệt độ động cơ float reading = analogRead(tempPin); float volt_temp = reading * 5.0 / 1024.0; unsigned int temp = volt_temp * 100.0;
// cdas int cdas = analogRead(lightPin);
// tính điện áp accu int sensorValue = analogRead(voltPin); float voltage = 11*sensorValue * (5.0 / 1024.0);
// dong dien int RawValue = analogRead(ampePin); float VoltageA2 = (RawValue / 1024.0) * 5000; // Gets you mV float Amps = ((VoltageA2 - 2500) / 100); if (millis() - timeOld >= 1000)
{ detachInterrupt(digitalPinToInterrupt(PIN_DO_2)); detachInterrupt(digitalPinToInterrupt(PIN_DO_3)); rpm = (pulses * 60) / (HOLES_DISC);
67 rpm2 = rpm /100; // chia 10 100 1000 de hien thi len dong do rpm_1 = (pulses_1 * 60) / (HOLES_DISC_1); timeOld = millis(); pulses = 0; pulses_1=0; attachInterrupt(digitalPinToInterrupt(PIN_DO_2), counter1, FALLING); attachInterrupt(digitalPinToInterrupt(PIN_DO_3), counter2, FALLING);
//CODE ĐIỀU KHIỂN ĐÈN if(Serial.available() > 0){ start = Serial.read();
} int RStatus = digitalRead(Rbutton); if ((RStatus == HIGH) ) { digitalWrite(10,LOW); delay(400); digitalWrite(10,HIGH); delay(400);
} int LStatus = digitalRead(Lbutton); if ((LStatus == HIGH)) { digitalWrite(11,LOW);
} int HStatus = digitalRead(Hbutton); int FlStatus = digitalRead(Flbutton); if ((HStatus == HIGH)||(FlStatus == HIGH)) { digitalWrite(9,LOW);
} else { // ngƣợc lại digitalWrite(9,HIGH);
The code snippet utilizes a switch statement to control various functions based on the input variable 'start' When 'A' is received, it activates two outputs, simulating a search for a vehicle, followed by a brief delay before turning them off Input '9' turns off the turn signal lights, while input '3' and '5' manage the headlight and flash functions, respectively, by setting the headlight to low Lastly, input '6' triggers a sequence for the hazard lights, briefly turning both outputs off and then reactivating them with a delay.
The code snippet includes functions for controlling turn signal lights and headlights in a digital system When the case '1' is triggered, the left turn signal is activated for 400 milliseconds before turning off Similarly, case '2' activates the right turn signal with the same timing Case '4' turns off both turn signals Additionally, when case 'D' is executed, the headlight is turned off if the variable 'cdas' exceeds 150; otherwise, the headlight is activated.