##Cách add thêm cảm biến/module cần test vào chương trình
###1. Tạo thêm 2 file xyz.h và xyz.cpp
- Với
xyzlà tên của CB/Module cần thêm vào, ví dụ:Sieu_Am.h,Sieu_Am.cpp - File
.hdùng để giới thiệu cho các file khác biết cácmethod, class, functionđang có. - File
.cppdùng để thực thi cácmethod, class, functionđã được khai báo trong file.h
####a. Viết class của CB/Module vào trong 2 file vừa tạo (xyz.h, xyz.cpp) vói tên class là: xyz_Data, ví dụ: với xyz là SieuAm
// filename: Sieu_Am.h
#ifndef _SIEU_H_AM_H__
#define _SIEU_H_AM_H__
#include "dataAdapter.h"
#include <HCSR04.h>
extern UltraSonicDistanceSensor * distanceSensor;
class SieuAm_Data: public Data_Adapter{
public:
SieuAm_Data();
virtual ~SieuAm_Data(){};
bool getData();
bool init();
bool deInit();
};
extern SieuAm_Data sieuAm_Device;
#endif####b. Giải thích:
#ifndef _SIEU_H_AM_H__
#define _SIEU_H_AM_H__Đoạn define này đảm bảo file này chỉ được khai báo duy nhất 1 lần, tránh hiện tượng trùng lặp file.
Trong example của HCSR04.h, cảm biến sẽ được khai báo trực tiếp:
UltraSonicDistanceSensor distanceSensor(TRIG_PIN, ECHO_PIN);Cảm biến sẽ được khai báo tại file thực thi Sieu_Am.cpp đưới dạng con trỏ
UltraSonicDistanceSensor * distanceSensor;trong file Sieu_Am.h ta sẽ khai báo thêm extern để cho các file khác biết là biến này đã được khai báo ở đâu đó ^^.
extern UltraSonicDistanceSensor * distanceSensor;Do class SieuAm_Data kế thừa từ class cha Data_Adapter, nên thừa kế được các biến:
timeInterval: Thời gian giữa 2 lần đọc cảm biến.nameDevice: Tên của cảm biếnvalueDevice:Giá trị trả về của cảm biến.
và các biến trên sẽ được khai báo trong constructor file Sieu_Am.cpp:
SieuAm_Data::SieuAm_Data(){
this->nameDevice = "Sieu Am";
this->timeInterval=250;
this->valueDevice = "No device";
}tuy nhiên với các method này cần phải viết lại:
bool init(): Khởi tạo cảm biến.bool getData(): Lấy giá trị cảm biên chuyển thành chuỗi rồi xuất ravalueDevice.bool deInit(): Xóa bộ nhớRAM, và RESET chân của cảm biến vềINPUT.
bool SieuAm_Data::init(){
deInit();
distanceSensor = new (UltraSonicDistanceSensor)(TRIG_PIN, ECHO_PIN);
}deInit(): dùng để dảm bảo là cảm biến chỉ 1 lần chiếm bộ nhớ trênRAM.- Toán tử
new: dùng để cấp phátRAMcho cảm biến. TRIG_PIN,ECHO_PINlà 2 chân đã được định nghĩa trong file quản lý I/O"MachTest_SP_IO.h", lưu ý để tránh các trường hợp khai báo trùng, nhầm chân với cảm biến khác.
//Filename: MachTest_SP_IO.h
#ifndef MACH_TEST_H_SP_IO_H__
#define MACH_TEST_H_SP_IO_H__
// Chan Chuan
#define PIN_1 5
#define PIN_2 6
#define PIN_3 A4
#define PIN_4 A5
//sieu am pin out
#define TRIG_PIN PIN_1
#define ECHO_PIN PIN_2bool SieuAm_Data::getData() {
if(distanceSensor){
debug_sieuam(F("doc SIeu am \r\n"));
this->valueDevice = (String)distanceSensor->measureDistanceCm();
}
return true;
}if(distanceSensor)điều kiện là cảm biến đã đượcinit()thì mới đọc giá trị.- Trong chương trình mẫu sẽ thấy là:
distanceSensor.measureDistanceCm().
bool SieuAm_Data::deInit(){
pinMode(TRIG_PIN, INPUT);
// pinMode(ECHO_PIN, INPUT);
this->valueDevice = "No device";
if(distanceSensor){
delete distanceSensor;
distanceSensor = 0;
}
debug_sieuam(F("Xoa SIeu am \r\n"));
}- Hàm này chủ yếu giải phóng
RAMđể đọc cảm biến khác, đồng thời reset chân đang sử dụng thànhINPUT.
SieuAm_Data sieuAm_Device;sieuAm_Devicecần được khai báo để add vào danh sách cảm biến
//filename: Sieu_Am.h
extern SieuAm_Data sieuAm_Device;###2. Add cảm biến vừa tạo vào chương trình chính.
#ifndef _CONTENT_H_MANAGER_H__
#define _CONTENT_H_MANAGER_H__
#include "Sieu_Am.h"
#include "CB_Dht.h"
/*--------------------------------User define------------------------------*/
enum{
SIEU_AM_DEVICE_ID=0,
DHT_DEVICE_ID,
LAST_ID_DEVICE
};
/*================================End user define==========================*/
- Đoạn chương trình trên chỉ khai báo để biết số lượng các loại cảm biến có thể test. Nhớ phải
includethư viện vừa tạo nhé (#include "Sieu_Am.h").
//filename: ContentManager.cpp
#include "ContentManager.h"
Data_Adapter *listDevide[LAST_ID_DEVICE] = {
&Dht_Device,
&sieuAm_Device,
};- Add thêm
&sieuAm_Devicevào danh sáchlistDevide