ksp gửi vào
- 28366 lượt xem
Theo như yêu cầu của một số anh em, mình sẽ hỗ trợ thêm nút nhấn cho cái 8 relay này. Không chỉ nút nhấn mà còn nút cảm ứng nữa nhé!
Cộng đồng Arduino Việt Nam
Hãy tìm kiếm câu trả lời trong mục bình luận, vì có thể đã có thành viên gặp vấn đề giống bạn để có câu trả lời nhanh nhất!
ksp gửi vào
Theo như yêu cầu của một số anh em, mình sẽ hỗ trợ thêm nút nhấn cho cái 8 relay này. Không chỉ nút nhấn mà còn nút cảm ứng nữa nhé!
Select any filter and click on Apply to see results
ksp gửi vào
Với cổng mini PCI, chúng có thể làm rất nhiều thứ với Intel Galileo, có thể kể đến như kết nối wifi, gắn thêm card đồ họa để xuất màn hình,… Hôm nay, chúng ta sẽ tìm hiểu về cách kết nối wifi cho Intel Galileo thông qua cổng mini PCI này.
ksp gửi vào
Chuyện kể rằng, có 02 sinh viên Việt Nam, trong lúc làm đồ án đại học kết nối điều khiển từ xa qua Internet. Một người thì chọn phương án truyền thống sử dụng máy tính làm máy chủ và demo các tính năng theo yêu cầu đồ án. Người còn lại biết đến iNut Sensor và tìm cách tối ưu hóa phần mềm và phần cứng nhằm chau chuốt cho đồ án của mình trở nên "xịn" và "nhiều tính năng bá đạo". Đến lúc bảo vệ đồ án, cậu sinh viên 01 cảm thấy choáng ván với muôn vàn vấn đề từ việc nơi trình bày đồ án không có wifi, mạng chập chờn, máy tính mở không lên, đứt cáp biển,... Cuối cùng cũng bảo vệ được với điểm số không ưng ý lắm dù tốn rất nhiều thời gian và công sức. Cậu còn lại nhờ vào việc chau chuốt phần mềm, tối ưu hóa và comment kĩ từng lệnh trong dòng code, viết báo cáo bài bản chuẩn bị slide như ý, dùng điện thoại cài wifi, quét mã QRcode để chia sẻ quyền truy cập đến phần mềm rất chuyên nghiệp, mọi thứ cậu chủ động hoàn toàn mà không bị các vấn đề "học tài thi phận" bủa vây mà kết quả hết sức mĩ mãn, điểm số mĩ miều, kiến thức IoT được chuẩn hóa. Thực vậy, các dự án, đồ án sử dụng nền tảng iNut Platform bên dưới cho phép các bạn sinh viên làm các dự án hết sức hoàn hảo: từ xe điều khiển, bãi giữ xe thông minh, hệ thống máy lạnh, máy bơm, điều hòa thông minh,... do chinh các bạn tự làm nên đã đạt được những điểm số tốt và tuyệt đối. Cũng chính vì thế, iNut JSC (công ty chủ quản của iNut Platform) đã kết hợp với Khu Công nghệ phần mềm - ĐHQGHCM để tổ chức những khóa đào tạo ngắn hạn cho sinh viên Việt Nam sử dụng nền tảng IoT do iNut JSC phát triển. Và để mở con đường tri thức tiếp cận IoT trong nháy mắt, iNut JSC đã tạo ra một phiên bản firmware trị giá 50.000 đồng sử dụng clouding của CloudMQTT và tài trợ 1000 firmware cho tất cả các bạn học sinh, sinh viên Việt Nam có thể tiếp cận IoT một cách dễ dàng và nhanh chóng nhất!
Hãy trở thành thành viên của Cộng đồng Arudino Việt Nam để mở khóa chức năng này.
Ok, anh em cần làm các phần được yêu cầu trong bài này. Chuẩn bị sẵn phần cứng, module, phần mềm cài đặt các kiểu, vâng vâng và mây mây nha.
Anh em phải cài thêm thư viện OneButton nữa thì đoạn code bên dưới mới chạy được nhé.
Tiếp tới, phần nối dây, anh em nối theo 02 bảng sau:
Dành cho nút nhấn thường
#include<OneButton.h> // thư viện one button #include <Wire.h> #define N_SENSOR 8 float sensors[N_SENSOR]; //biến lưu trữ danh sách cảm biến #define RELAY_COUNT 8 //Relay kích ở mức thấp thì như thế này #define ON LOW #define OFF HIGH //Xóa comment 2 dòng dưới nếu là relay kích ở mức cao //#define ON HIGH //#define OFF LOW const int relayPins[RELAY_COUNT] = {4, 5, 6, 7, 8, 9, 10, 11}; //Nếu bạn dùng INPUT_PULLUP thì uncomment dòng dưới #define BUTTON_TYPE true //Nếu bạn dùng Nút cảm ứng thì uncomment dòng dưới //#define BUTTON_TYPE false const int buttonPins[RELAY_COUNT] = {2, 3, 12, 13, A0, A1, A2, A3}; OneButton button0(buttonPins[0], BUTTON_TYPE); OneButton button1(buttonPins[1], BUTTON_TYPE); OneButton button2(buttonPins[2], BUTTON_TYPE); OneButton button3(buttonPins[3], BUTTON_TYPE); OneButton button4(buttonPins[4], BUTTON_TYPE); OneButton button5(buttonPins[5], BUTTON_TYPE); OneButton button6(buttonPins[6], BUTTON_TYPE); OneButton button7(buttonPins[7], BUTTON_TYPE); void toggle0() { digitalWrite(relayPins[0], !digitalRead(relayPins[0])); } void toggle1() { digitalWrite(relayPins[1], !digitalRead(relayPins[1])); } void toggle2() { digitalWrite(relayPins[2], !digitalRead(relayPins[2])); } void toggle3() { digitalWrite(relayPins[3], !digitalRead(relayPins[3])); } void toggle4() { digitalWrite(relayPins[4], !digitalRead(relayPins[4])); } void toggle5() { digitalWrite(relayPins[5], !digitalRead(relayPins[5])); } void toggle6() { digitalWrite(relayPins[6], !digitalRead(relayPins[6])); } void toggle7() { digitalWrite(relayPins[7], !digitalRead(relayPins[7])); } void setup() { Serial.begin(9600); Wire.begin(10); //Theo như yêu cầu của iNut Platform, các bạn sẽ dùng cổng I2C với địa chỉ là 10. Wire.onRequest(i2cRequestEvent); //Mỗi khi iNut - Cảm biến yêu cầu thì sẽ chạy hàm này nhằm mục tiêu gửi dữ liệu lên cho iNut - Cảm biến, cứ 01 giây sẽ yêu cầu gửi 01 lần //Đăng ký lệnh lắng nghe lệnh từ iNut - Cảm biến. iNut Cảm biến => Arduino Wire.onReceive(receiveEvent); for (int i = 0 ; i < RELAY_COUNT; i++) { pinMode(relayPins[i], OUTPUT); digitalWrite(relayPins[i], OFF); } button0.attachClick(toggle0); button1.attachClick(toggle1); button2.attachClick(toggle2); button3.attachClick(toggle3); button4.attachClick(toggle4); button5.attachClick(toggle5); button6.attachClick(toggle6); button7.attachClick(toggle7); Serial.println("Xin chao iNut Platform"); } void i2cRequestEvent() { //phải có nhé, chỉ cần 02 dòng này là data đã được gửi đi char *data = (byte*)&sensors; Wire.write(data, sizeof(sensors)); //debug - Kiểm tra cho bạn dễ hình dung dữ liệu được gửi đi Serial.print("sizeof(sensors): "); Serial.println(sizeof(sensors)); Serial.print("sizeof(float): "); Serial.println(sizeof(float)); } //Các biến lưu trữ lệnh khi nhận được lệnh từ iNut - Cảm biến volatile char buffer[33]; volatile boolean receiveFlag = false; //Khi nhận được lệnh từ iNut cảm biến thì lắng nghe void receiveEvent(int howMany) { Wire.readBytes((byte *)buffer, howMany); buffer[howMany] = 0; receiveFlag = true; } void loop() { for (int i = 0 ; i < RELAY_COUNT; i++) { int state = digitalRead(relayPins[i]); // đọc trạng thái của các relay if (state == ON) { sensors[i] = (i + 1) * 10 + 2; } else if (state == OFF) { sensors[i] = (i + 1) * 10 + 1; } } button0.tick(); button1.tick(); button2.tick(); button3.tick(); button4.tick(); button5.tick(); button6.tick(); button7.tick(); if (receiveFlag) { //khi có tín hiệu là đã nhận được lệnh String command = buffer; //chép lệnh vào biến String cho dễ xử lý Serial.print(command);// in ra lệnh Serial.print(' '); Serial.println(millis());//in ra thời gian theo millis tính từ lúc arduino chạy để debug int index = command[0]; int state = command[1]; if ('1' <= index && index <= '8') { // Chúng ta chỉ có 8 relay, đánh số từ 0-7 index -= '1'; // Chuyển từ ký tự số sang số. '1' => 0, '2' => 1. Vì khi lập trình, mảng bắt đầu bằng số 0 Serial.print("Relay thu "); Serial.println(index); if (state == '1' || state == '2') { // Nếu state truyền là 0 => Tắt relay, 1 => Bật relay if (state == '1') { Serial.println("OFF"); digitalWrite(relayPins[index], OFF); } else if (state == '2') { Serial.println("ON"); digitalWrite(relayPins[index], ON); } } } receiveFlag = false; //đánh dấu đã xử lý xong lệnh, không cần đọc nữa } }Dành cho nút cảm ứng loại 8 chạm
#include<OneButton.h> // thư viện one button #include <Wire.h> #define N_SENSOR 8 float sensors[N_SENSOR]; //biến lưu trữ danh sách cảm biến #define RELAY_COUNT 8 //Relay kích ở mức thấp thì như thế này #define ON LOW #define OFF HIGH //Xóa comment 2 dòng dưới nếu là relay kích ở mức cao //#define ON HIGH //#define OFF LOW const int relayPins[RELAY_COUNT] = {4, 5, 6, 7, 8, 9, 10, 11}; //Nếu bạn dùng INPUT_PULLUP thì uncomment dòng dưới //#define BUTTON_TYPE true //Nếu bạn dùng Nút cảm ứng thì uncomment dòng dưới #define BUTTON_TYPE false const int buttonPins[RELAY_COUNT] = {2, 3, 12, 13, A0, A1, A2, A3}; OneButton button0(buttonPins[0], BUTTON_TYPE); OneButton button1(buttonPins[1], BUTTON_TYPE); OneButton button2(buttonPins[2], BUTTON_TYPE); OneButton button3(buttonPins[3], BUTTON_TYPE); OneButton button4(buttonPins[4], BUTTON_TYPE); OneButton button5(buttonPins[5], BUTTON_TYPE); OneButton button6(buttonPins[6], BUTTON_TYPE); OneButton button7(buttonPins[7], BUTTON_TYPE); void toggle0() { digitalWrite(relayPins[0], !digitalRead(relayPins[0])); } void toggle1() { digitalWrite(relayPins[1], !digitalRead(relayPins[1])); } void toggle2() { digitalWrite(relayPins[2], !digitalRead(relayPins[2])); } void toggle3() { digitalWrite(relayPins[3], !digitalRead(relayPins[3])); } void toggle4() { digitalWrite(relayPins[4], !digitalRead(relayPins[4])); } void toggle5() { digitalWrite(relayPins[5], !digitalRead(relayPins[5])); } void toggle6() { digitalWrite(relayPins[6], !digitalRead(relayPins[6])); } void toggle7() { digitalWrite(relayPins[7], !digitalRead(relayPins[7])); } void setup() { Serial.begin(9600); Wire.begin(10); //Theo như yêu cầu của iNut Platform, các bạn sẽ dùng cổng I2C với địa chỉ là 10. Wire.onRequest(i2cRequestEvent); //Mỗi khi iNut - Cảm biến yêu cầu thì sẽ chạy hàm này nhằm mục tiêu gửi dữ liệu lên cho iNut - Cảm biến, cứ 01 giây sẽ yêu cầu gửi 01 lần //Đăng ký lệnh lắng nghe lệnh từ iNut - Cảm biến. iNut Cảm biến => Arduino Wire.onReceive(receiveEvent); for (int i = 0 ; i < RELAY_COUNT; i++) { pinMode(relayPins[i], OUTPUT); digitalWrite(relayPins[i], OFF); } button0.attachClick(toggle0); button1.attachClick(toggle1); button2.attachClick(toggle2); button3.attachClick(toggle3); button4.attachClick(toggle4); button5.attachClick(toggle5); button6.attachClick(toggle6); button7.attachClick(toggle7); Serial.println("Xin chao iNut Platform"); } void i2cRequestEvent() { //phải có nhé, chỉ cần 02 dòng này là data đã được gửi đi char *data = (byte*)&sensors; Wire.write(data, sizeof(sensors)); //debug - Kiểm tra cho bạn dễ hình dung dữ liệu được gửi đi Serial.print("sizeof(sensors): "); Serial.println(sizeof(sensors)); Serial.print("sizeof(float): "); Serial.println(sizeof(float)); } //Các biến lưu trữ lệnh khi nhận được lệnh từ iNut - Cảm biến volatile char buffer[33]; volatile boolean receiveFlag = false; //Khi nhận được lệnh từ iNut cảm biến thì lắng nghe void receiveEvent(int howMany) { Wire.readBytes((byte *)buffer, howMany); buffer[howMany] = 0; receiveFlag = true; } void loop() { for (int i = 0 ; i < RELAY_COUNT; i++) { int state = digitalRead(relayPins[i]); // đọc trạng thái của các relay if (state == ON) { sensors[i] = (i + 1) * 10 + 2; } else if (state == OFF) { sensors[i] = (i + 1) * 10 + 1; } } button0.tick(); button1.tick(); button2.tick(); button3.tick(); button4.tick(); button5.tick(); button6.tick(); button7.tick(); if (receiveFlag) { //khi có tín hiệu là đã nhận được lệnh String command = buffer; //chép lệnh vào biến String cho dễ xử lý Serial.print(command);// in ra lệnh Serial.print(' '); Serial.println(millis());//in ra thời gian theo millis tính từ lúc arduino chạy để debug int index = command[0]; int state = command[1]; if ('1' <= index && index <= '8') { // Chúng ta chỉ có 8 relay, đánh số từ 0-7 index -= '1'; // Chuyển từ ký tự số sang số. '1' => 0, '2' => 1. Vì khi lập trình, mảng bắt đầu bằng số 0 Serial.print("Relay thu "); Serial.println(index); if (state == '1' || state == '2') { // Nếu state truyền là 0 => Tắt relay, 1 => Bật relay if (state == '1') { Serial.println("OFF"); digitalWrite(relayPins[index], OFF); } else if (state == '2') { Serial.println("ON"); digitalWrite(relayPins[index], ON); } } } receiveFlag = false; //đánh dấu đã xử lý xong lệnh, không cần đọc nữa } }Chúc các bạn thành công!