Ngõ ra mắt thu hồng ngoại sẽ bị đảo mức so với chuẩn NEC.
-Xung start:
Hình 2.
9ms xung mức thấp.
4.5ms xung mức cao.
-32 bit data:
8 bit địa chỉ.
8 bit đảo của 8 bit địa chỉ.
8 bit command.
8 bit đảo của 8 bit command
Xung mức logic 0 và 1
Hình 3.
Logical '0' – 562.5µs xung mức thấp, 562.5µs xung mức cao, tổng thời gian 1.125ms
Logical '1' – 562.5µs xung mức mức thấp, 1.6875ms xung mức cao, tổng thời gian 2.25ms.
Giải mã chuẩn NEC.
-Sử dụng STM8S003 giải mã NEC, dùng timer ngắt 0.5 ms và ngắt port để detect xung start, 32 bit data.
-Detect xung start: set port ngắt cạnh xuống, khi port nhảy vào ngắt kiểm tra thời gian timer đếm được ,nếu timer đếm được khoảng 13ms (9 ms + 4.5 ms) => Xung start (Vị trí ngắt màu đỏ Hình 2).
-Detect 32 bit data: set port ngắt cạnh xuống, khi port nhảy vào ngắt kiểm tra thời gian timer đếm được (Vị trí ngắt màu đỏ Hình 3):
Nếu timer đếm được nhỏ hơn 2 ms (562.5µs + 562.5µs ) => Logic 0.
Nếu timer đếm được lớn hơn 2 ms (562.5µs + 1.6875ms ) => Logic 1.
if(count_data==32) //reset sau khi detect 32 bit data
{
count_data=0;
data=0;
start_status=0;
count_ms1=0;
}
////////
}
///////
}
2. Sơ đồ nguyên lý.
3. Sản phẩm hoàn thiện.
Sử dụng mạch nguồn AC-DC 220V-5V 750mA cấp nguồn cho mạch (hình trên)
4. Demo.
Mã command nút power trên remote: 0x00ffA25D
Mã command nút power trên app remote Toshiba: 0x02FD48B7
Mã command nút power trên app remote LG: 0x20DF10EF
Video demo:
Bổ sung.
Chỉnh sửa hardware để điều khiển được bóng đèn huỳnh quang, lý do khi sử dụng relay tiếp điểm để điều khiển đèn huỳnh quang gây nhiễu khi đèn khởi động ("stater" hay "chuột" khởi động tạo hồ quang điện gây nhiễu).
Ngoài ra chọn lại nguồn AC-DC 5V filter tốt hơn (mình dùng mạch sạc Travel Adapter của samsung, mạch này lọc nhiễu đầu vào tốt hơn mạch bên trên mình đã dùng). Để nguồn DC ngõ ra filter tốt hơn ,ít nhiễu hơn mình còn gắn thêm cuộn cảm 330uH nối tiếp DC ngõ ra adapter.
Thay relay tiếp điểm bằng solib state relay (SSR).
Xuất hiện hôp thoại USB Configuration => Tab Parameter settings => Basic parameters => Endpoint 0 Max Packet size => 64 byte. (Maximum gói data endpoint 0 là 64 byte)
STEP 7:
Trong mục Configuration.
Trong cửa sổ chính => Middlewares =>USB_DEVICE.
STEP 8:
Xuất hiện hôp thoại USB_DEVICE Configuration => Tab Parameter settings => Class parameters :
USBD_CUSTOM_HID_REPORT_DESC_SIZE (Total length for Report descriptor
(IN ENDPOINT)): 32 (32 byte mô tả report input).
Trong phần thư viện của STEMWIN.
-Theo đường dẫn STM32Cube_FW_F4_V1.12.0\Middlewares\ST\STemWin\Config và STM32Cube\Repository\STM32Cube_FW_F4_V1.12.0\Middlewares\ST\STemWin\OS =>Ta import vào Kiel C các file GUIConf.c, LCDConf_FlexColor_Template.c, GUI_X.c vào thư mục STEMWIN_Config như hình trên (folder tùy người dùng có thể sử dụng tên khác).
-Theo đường dẫn STM32Cube\Repository\STM32Cube_FW_F4_V1.12.0\Middlewares\ST\STemWin\Lib =>Ta import vào Kiel C file STemWin528_CM4_Keil.lib (tùy dòng STM32 mà ta import file .lib khác nhau ví dụ dòng STM32f103 ta import file STemWin526_CM3_Keil.lib).
-Theo đường dẫn STM32Cube\Repository\STM32Cube_FW_F4_V1.12.0\Middlewares\ST\STemWin\inc =>Ta import toàn bộ file .h vào STEMWIN_Inc.
Sửa lại code trong LCDConf_FlexColor_Template.c
Physical display size => set lại size của LCD TFT.
// Physical display size
//
#define XSIZE_PHYS 240 // To be adapted to x-screen size
#define YSIZE_PHYS 320 // To be adapted to y-screen size
LcdWriteReg
static void LcdWriteReg(U16 Data) {
// ... TBD by user
}
Sửa lại=>
static void LcdWriteReg(U16 Data) {
// ... TBD by user
LCD_WriteReg(Data);
}
LcdWriteData
static void LcdWriteData(U16 Data) {
// ... TBD by user
LCD_WriteData(Data);
}
Sửa lại=>
static void LcdWriteData(U16 Data) {
// ... TBD by user
LCD_WriteData(Data);
}
LcdWriteDataMultiple
static void LcdWriteDataMultiple(U16 * pData, int NumItems) {
while (NumItems--) {
// ... TBD by user
}
}
Sửa lại=>
static void LcdWriteDataMultiple(U16 * pData, int NumItems) {
Trong mục Permitted values for parameter pfFunc Supported display controller
GUIDRV_FLEXCOLOR_F66708: config này dùng cho driver ILI9325, nếu bạn sử dụng driver khác ví dụ như SSD1289 thì dùng config GUIDRV_FLEXCOLOR_F66702. Trong mục Permitted values for parameter pfMode
GUIDRV_FLEXCOLOR_M16C0B16: 16bpp, no cache, 16 bit bus =>Config này giao tiếp 16 bit màu và 16 bit bus.
LCD_X_DisplayDriver
int LCD_X_DisplayDriver(unsigned LayerIndex, unsigned Cmd, void * pData) {
int r;
(void) LayerIndex;
(void) pData;
switch (Cmd) {
case LCD_X_INITCONTROLLER: {
//
// Called during the initialization process in order to set up the
// display controller and put it into operation. If the display
// controller is not initialized by any external routine this needs
// to be adapted by the customer...
//
// ...
return 0;
}
default:
r = -1;
}
return r;
}
Thêm bên dưới case LCD_X_INITCONTROLLER: {hàm khởi tạo LCD
=>
int LCD_X_DisplayDriver(unsigned LayerIndex, unsigned Cmd, void * pData) {
int r;
(void) LayerIndex;
(void) pData;
switch (Cmd) {
case LCD_X_INITCONTROLLER: {
ILI9325_Init(); //khi khởi tạo GUI_Int() sẽ gọi khởi tạo LCD
//
// Called during the initialization process in order to set up the
// display controller and put it into operation. If the display
// controller is not initialized by any external routine this needs
// to be adapted by the customer...
//
// ...
return 0;
}
default:
r = -1;
}
return r;
}
Sửa lại code trong file GUIConf.c
// Define the available number of bytes available for the GUI
#define GUI_NUMBYTES 0x200000
=>Sửa thành
#define GUI_NUMBYTES (1024) * 20
Đây là dung lương ram dành cho thư viện GUI, tùy theo dung lượng ram của VĐK , con STM32F411 mình dùng có 128Kbyte ram nên mình dành cho GUI là 20Kbyte.
Ví dụ cơ bản:
SystemClock_Config();//khởi tạo clock hệ thống __HAL_RCC_CRC_CLK_ENABLE();//bật clock CRC (bắt buộc)
MX_GPIO_Init(); //khởi tạo port
GUI_Init();//khởi tạo GUI GUI_SetBkColor(GUI_BLACK);//set màu backgroud màu đen GUI_SetColor(GUI_GREEN);//set màu font chữ GUI_SetFont(GUI_FONT_32B_ASCII);//set font chữ GUI_DispStringAt("NPL Lab",160,70);//tạo một đoạn text nằm ở tạo độ x=160, y=70.
STM8S003 + LCD16x2 4bit + Temperature and humidity module AM2301
Schematic
Ảnh thực tế module AM2301
Sơ đồ chân module AM2301
Giới thiệu module cảm biến AM2301.
Độ ẩm : 0->99.9%
Độ chính xác: 3%
Độ phân giải: 0.1%
Nhiệt độ: -40->80oC
Độ chính xác: 0.3oC
Độ phân giải: 0.1oC
Hướng dẫn giao tiếp module AM2301
Giao thức one-wire với module AM2301
Tạo xung start:
Set chân SDA(MCU) output =>Đưa chân SDA high =>SDA low ít nhất 800uS->20mS (mình để khoảng 1mS) =>SDA high =>Set SDA input.
Kiểm tra xung Responce.
Nếu chân SDA kéo xuống low khoảng 80uS =>Sau đó SDA high khoảng 80uS =>Báo start read data. (Ở đây mình chỉ cần chờ SDA xuống low khoảng 80uS sao đó lên high là OK, không cần chờ lên high trong 80uS).
Nhận data.
Data bao gồm 5 byte: 2 byte đầu là độ ẩm, 2 byte tiếp theo là nhiệt độ, byte cuối là byte parity.
Byte parity = byte cao dộ ẩm + byte thấp độ ẩm + byte cao nhiệt độ + byte thấp nhiệt độ.
Xung xác định bit 0 và bit 1.
Sao khi kiểm tra xong xung Responce ta chờ SDA lên high bắt đầu delay 50us => kiểm tra nếu SDA vẫn high =>bit 1, còn nếu sau delay 50 mà SDA low =>bit 0 => cứ tiếp tục kiểm tra hết 5 byte ( 40 bit) là xong.
Sao đó cộng 4 byte đầu lại kiểm tra parity =>nếu đúng => OK.