Or you want a quick look: Bạn có thể làm gì với iNut – Cảm biến
Firmware tương thích với ESP8266v12 trở lên, các module sử dụng ESP8266v12 trở lên như NodeMCU, Wemos, Iot VN Wifi,… đều được hỗ trợ.
Bạn có thể làm gì với iNut – Cảm biến
- Làm một chiếc xe điều khiển qua Wifi bằng App Inventor.
- Làm hệ thống mạng cảm biến trong nhà yến, nhà nấm,…
- Làm quạt thông minh.
- …làm tất cả mọi thứ trong IoT với firmware này!
Làm thế nào mà firmware này lại làm được tất cả mọi thứ như thế?
Bởi vì, cơ chế trao đổi hai chiều từ thiết bị phần cứng của bạn lên Internet và từ Internet về thiết bị của bạn. Phần phía dướil giải thích sâu hơn về học thuật. Đừng lo lắng nếu bạn không nắm hết thông tin, bạn chỉ cần hiểu đơn giản là việc lập trình với iNut – Cảm biến cũng đơn giản như lúc bạn lập trình với board Bluetooth HC-06 hay là HC-05.
Cụ thể, firmware iNut – Cảm biến sẽ đóng vai trò là một thiết bị I2C-to-Internet. Nghĩa là, bạn sẽ lập trình board mạch Arduino của mình trao đổi với iNut – Cảm biến thông qua phương thức I2C với tốc độ rất cao và ít lỗi đường truyền (tốt hơn Serial rất nhiều, việc lập trình lại đơn giản hơn nữa).
Việc gửi dữ liệu từ Arduino tới iNut – Cảm biến được chuẩn hóa thành các khối float. Tại sao lại là float? Mà không phải là kiểu chuỗi hay số nguyên? Vì float biểu diễn được số nguyên. Và các bảm biến cũng chỉ trả về số thực, hoặc số nguyên, như vậy là đủ!
Việc gửi dữ liệu từ thế giới (Internet, điện thoại,… hay là một con esp8266 khác,…) xuống thiết bị của bạn sẽ như thế nào? Có 04 cách:
- Sử dụng REST API – HTTP/HTTPS REQUEST (mọi thiết bị hỗ trợ, trả lời theo yêu cầu, mọi request phức tạp khác đều sử dụng )
- Sử dụng mobitool.net (dành cho web developer, server,… khi có data thì nhận được ngay, đỡ request data)
- Sử dụng MQTT (dành cho IoT Device như ESP8266, những thiết bị có dung lượng flash, ram thấp,… khi có data thì bạn nhận được ngay, đỡ request data).
- Sử dụng kết hợp các cách trên
Một số phương án mà bạn có thể tích hợp với iNut Platform:
- Sử dụng App Inventor với công nghệ REST API rất dễ dàng.
- Với các ứng dụng Web, bạn nên kết hợp giữa mobitool.net hoặc REST API. Hoặc cũng có thể chỉ sử dụng mobitool.net là được rồi.
- Với các ứng dụng điện thoại truyền thống trên iOS và Android hay Hybrid app, bạn có thể tự do sử dụng kết hợp các cách trên sao cho tối ưu với khả năng của bạn.
Đừng ngần ngại thử ngay một firmware và tiến vào làm cách mạng công nghiệp 4.0 cùng với đội ngũ iNut Platform.
Thông số kĩ thuật
- Chân SDA: GPIO 5 (D1)
- Chân SCL: GPIO 4 (D2)
- Địa chỉ bus I2C sẽ được: 10 (Hệ thập phân), 0A (Hệ thập lục phân).
- Hỗ trợ nhấn nút GPIO 0 (D3) để bật tắt đèn LED GPIO4 (D4) để kiểm tra đây có phải là module iNut – Cảm biến hay không.
- Điện áp giao tiếp: 3.3 – 5.5V. Có thể giao tiếp với bất kỳ mạch Arduino nào.
- Các thông số khác về I2C theo mặc định của trình biên dịch Arduino.
Một vài ví dụ
Đọc cảm biến mưa và kiểm tra trên điện thoại thông qua phần mềm iNut
Đoạn code mà bạn sẽ nạp vào Arduino
#include <Wire.h> #define N_SENSOR 2 float sensors[N_SENSOR]; //biến lưu trữ danh sách cảm biến
//rain sensor //Để nối chân cho gọn nên mình sử dụng luôn các chân Analog cho tiện gắn dây, các bạn muốn dùng chân nào cũng được #define VCC A0 #define GND A1 #define PIN_DIGITAL A2 #define PIN_ANALOG A3
void setup() { mobitool.netn(9600); //Bật Serial Montior, các bạn dùng baudrate bao nhiêu cũng được mobitool.netn(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. mobitool.netquest(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 mobitool.nettln(“Xin chao iNut Platform”);
pinMode(VCC, OUTPUT); pinMode(GND, OUTPUT); pinMode(PIN_DIGITAL, INPUT); digitalWrite(VCC, HIGH); digitalWrite(GND, LOW); }
void i2cRequestEvent() { //phải có nhé, chỉ cần 02 dòng này là data đã được gửi đi char *data = (byte*)&sensors; mobitool.nete(data, sizeof(sensors));
//debug – Kiểm tra cho bạn dễ hình dung dữ liệu được gửi đi mobitool.nett(“sizeof(sensors): “); mobitool.nettln(sizeof(sensors)); mobitool.nett(“sizeof(float): “); mobitool.nettln(sizeof(float)); }
void loop() { //Nhiệm vụ của bạn là gán giá trị cảm biến vào các phần tử của mảng sensors sensors[0] = digitalRead(PIN_DIGITAL); sensors[1] = analogRead(PIN_ANALOG);
}
Đối với thiết bị iNut – Cảm biến, bạn sẽ cài đặt như Video này.
Và đây là kết quả của chúng ta:
Đọc cảm biến mưa, cảm biến ánh sáng và kiểm tra trên điện thoại thông qua phần mềm iNut
Bạn cần tải về hai thư viện, mình đã đóng gói trong file zip này:
- SoftwareWire – Tạo một cổng I2C ảo trên Arduino để giao tiếp với cảm biến I2C
- Adafruit-BMP085-Library – Chỉnh sửa để có thể giao tiếp với thư viện SoftwareWire nhằm đọc được nhiều cảm biến BMP180 trên cùng một mạch Arduino.
#include <Wire.h> #include <Adafruit_BMP085.h> #define N_SENSOR 5 float sensors[N_SENSOR];
//rain sensor #define R_VCC A0 #define R_GND A1 #define R_PIN_DIGITAL A2 #define R_PIN_ANALOG A3
//light sensor #define L_VCC 2 #define L_GND 3 #define L_PIN_DIGITAL 4
//bmp180 sensor #define B_VCC 8 #define B_GND 9 #define B_SDA 11 #define B_SCL 10
//Dùng thư viện Adafruit_BMP085 mới! Vì sao? Vì cảm biến BMP180 là một cảm biến I2C. //Bạn có thể dùng thư viện mới mà mình đã chỉnh sửa. //Như vậy, để dùng được một cảm biến I2C, ta phải sửa một chút trong thư viện có sẵn của cảm biến này //Bạn vào trong file .cpp của thư viện Adafruit_BMP085 cũ. Tìm “Wire.” sửa thành “myWire->”. Sau đó, thêm một biến SoftwareWire *myWire; ở dưới phần private: trong file .h của thư viện //Cuối cùng thêm một constructor với 2 tham số (int sda, int scl). Adafruit_BMP085 bmp(B_SDA, B_SCL);
void setup() { mobitool.netn(9600); mobitool.netn(10); mobitool.netquest(i2cRequestEvent); mobitool.nettln(9600); pinMode(13, OUTPUT);
pinMode(R_VCC, OUTPUT); pinMode(R_GND, OUTPUT); pinMode(R_PIN_DIGITAL, INPUT); digitalWrite(R_VCC, HIGH); digitalWrite(R_GND, LOW);
pinMode(L_VCC, OUTPUT); pinMode(L_GND, OUTPUT); pinMode(L_PIN_DIGITAL, INPUT); digitalWrite(L_VCC, HIGH); digitalWrite(L_GND, LOW);
pinMode(B_VCC, OUTPUT); pinMode(B_GND, OUTPUT); digitalWrite(B_VCC, HIGH); digitalWrite(B_GND, LOW);
if (!bmp.begin()) { mobitool.nettln(“Could not find a valid BMP085 sensor, check wiring!”); while (1) {} } }
void i2cRequestEvent() { //Đoạn code phải có char *data = (byte*)&sensors; mobitool.nete(data, sizeof(sensors));
//debug mobitool.nett(“sizeof(sensors): “); mobitool.nettln(sizeof(sensors)); mobitool.nett(“sizeof(float): “); mobitool.nettln(sizeof(float)); }
void loop() { //các bạn chỉ việc gán giá trị là ổn rồi này //rain sensor sensors[0] = digitalRead(R_PIN_DIGITAL); sensors[1] = analogRead(R_PIN_ANALOG);
//light sensor sensors[2] = digitalRead(L_PIN_DIGITAL);
//bmp sensor – sau mỗi 500ms mới đọc một lần chứ cũng không nên đọc nhanh làm gì để tiết kiệm năng lượng static unsigned long timer = 0; if (millis() – timer > 500UL) { timer = millis(); sensors[3] = mobitool.netTemperature(); sensors[4] = mobitool.netPressure(); } }
Kết quả của chúng ta:
Và còn rất nhiều ví dụ khác nữa, bạn hãy vào chuyên mục Làm dự án Internet of Things để tìm hiểu thêm nhé.
Hãy đừng ngần ngại liên hệ với chúng tôi nếu bạn muốn có nhiều thiết bị cảm biến hơn hoặc tương tác với nhiều thiết bị hơn.
Điều khiển xe điều khiển từ xa với các cảm biến môi trường
Ở đây, chúng ta chỉ dùng 2 cảm biến mưa và cảm biến ánh sáng cho đơn giản để thử nghiệm mô hình.
#include <Wire.h> #define N_SENSOR 3 float sensors[N_SENSOR];
//rain sensor #define R_VCC A0 #define R_GND A1 #define R_PIN_DIGITAL A2 #define R_PIN_ANALOG A3
//light sensor #define L_VCC 2 #define L_GND 3 #define L_PIN_DIGITAL 4
//l298 #define IN1 8 #define IN2 7 #define IN3 6 #define IN4 5
volatile char buffer[33]; volatile boolean receiveFlag = false;
void receiveEvent(int howMany) { mobitool.netBytes((byte *)buffer, howMany); buffer[howMany] = 0; receiveFlag = true; }
void setup() { mobitool.netn(9600); mobitool.netn(10); mobitool.netceive(receiveEvent); mobitool.netquest(i2cRequestEvent); pinMode(R_VCC, OUTPUT); pinMode(R_GND, OUTPUT); pinMode(R_PIN_DIGITAL, INPUT); digitalWrite(R_VCC, HIGH); digitalWrite(R_GND, LOW);
pinMode(L_VCC, OUTPUT); pinMode(L_GND, OUTPUT); pinMode(L_PIN_DIGITAL, INPUT); digitalWrite(L_VCC, HIGH); digitalWrite(L_GND, LOW);
pinMode(IN1, OUTPUT); pinMode(IN2, OUTPUT); pinMode(IN3, OUTPUT); pinMode(IN4, OUTPUT); stop();
}
void i2cRequestEvent() { //Buộc phải có nếu bạn muốn gửi dữ liệu char *data = (byte*)&sensors; mobitool.nete(data, sizeof(sensors)); mobitool.nettln(“gui den inut – cam bien”); }
void loop() {
//rain sensor sensors[0] = digitalRead(R_PIN_DIGITAL); sensors[1] = analogRead(R_PIN_ANALOG);
//light sensor sensors[2] = digitalRead(L_PIN_DIGITAL);
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ý mobitool.nett(command);// in ra lệnh mobitool.nett(‘ ‘); mobitool.nettln(millis());//in ra thời gian theo millis tính từ lúc arduino chạy để debug if (command == “UP”) { up(); } else if (command == “DOWN”) { down(); } else if (command == “TURN_LEFT”) { left(); } else if (command == “TURN_RIGHT”) { right(); } else if (command == “STOP”) { stop(); }
receiveFlag = false; //đánh dấu đã xử lý xong lệnh, không cần đọc nữa } }
void up() { digitalWrite(IN1,HIGH); digitalWrite(IN2,LOW); digitalWrite(IN3,HIGH); digitalWrite(IN4,LOW); }
void down() { digitalWrite(IN1,LOW); digitalWrite(IN2,HIGH); digitalWrite(IN3,LOW); digitalWrite(IN4,HIGH); }
void left() { digitalWrite(IN1,HIGH); digitalWrite(IN2,LOW); digitalWrite(IN3,LOW); digitalWrite(IN4,HIGH); }
void right() { digitalWrite(IN1,LOW); digitalWrite(IN2,HIGH); digitalWrite(IN3,HIGH); digitalWrite(IN4,LOW); }
void stop() { digitalWrite(IN1,LOW); digitalWrite(IN2,LOW); digitalWrite(IN3,LOW); digitalWrite(IN4,LOW); }
Và đây là kết quả:
Tải app Apk và Code App Inventor tại đây.