ESP8266 và Firebase. Điều khiển thiết bị Smarthome

1 Firebase là gì?




Firebase là một dịch vụ cơ sở dữ liệu thời gian thực hoạt động trên nền tảng đám mây được cung cấp bởi Google nhằm giúp các lập trình phát triển nhanh các ứng dụng bằng cách đơn giản hóa các thao tác với cơ sở dữ liệu. Firebase là sự kết hợp giữa nền tảng cloud với hệ thống máy chủ cực kì mạnh mẽ tới từ Google, để cung cấp cho chúng ta những API đơn giản, mạnh mẽ và đa nền tảng trong việc quản lý, sử dụng database. Với firebase chúng ta có thể tạo ra các ứng dụng như chat, game,  hay trong IoT là điều khiển thiết bị thời gian thực.
Firebase  cung cấp cho người dùng các chức năng như:
  • Realtime Database : Cơ sở dữ liệu đám mấy noSQL data được lưu trữ dưới dạng Json. Dữ liệu được đồng bộ hóa với tất cả client trong thời gian thực.
  • Firebase Authentication: Hệ thống xác thực quyền.
  • Firebase Hosting: Giúp tạo một ứng dụng nền web với tên miền *firebaseapp.com
Ở phần real-time database firebase cho chúng ta sử dụng miễn phí 10GB data download, 1GB storage và 100 truy xuất đồng thời trong một tháng. Nếu bạn sử dụng trên mức này thì phải mua thêm data theo các mức giá mà google firebase quy định. Với các ứng dụng IoT hay smarthome ứng dụng trong gia đình hay đồ án sinh viên thì lượng data miễn phí là đủ cho chúng ta sử dụng. Trên là sơ qua về Firebase và những ứng dụng của nó. Sau đây mình sẽ ứng dụng real-time database vào điều khiển thiết bị.

2 Phần cứng

  •  module Node-MCU hoặc ESP8266.
  • 4 LED
  • Beadboard
  • dây nối.

3 Nội dung

3.1 Tạo cơ sở dự liệu trên Firebase
Bước 1:  vào Firebase đăng nhập bằng tài khoản Gmail. click chọn "Đi tới bảng điều khiển"

Bước 2: Tạo project mới
Bước 3: Chọn tên project->Create
Bước 4: tạo các đối tượng trong database
Bước 5:  Đặt quyền đọc ghi với database
3.2 Kết nối với ứng dụng Android
Add package name của ứng dụng android vào firebase
3.3 Code Arduino cho Node-MCU
#include <FirebaseArduino.h>
#include <ESP8266WiFi.h>

#define WIFI_SSID "SSID" // change your WiFi name
#define WIFI_PASSWORD "********"  //change your Password  WiFi

#define Ligh1 16
#define Ligh2 5
#define Ligh3 4
#define Ligh4 14

void setup() {
Serial.begin(9600);

pinMode(Ligh1, OUTPUT);
pinMode(Ligh2, OUTPUT);
pinMode(Ligh3, OUTPUT);
pinMode(Ligh4, OUTPUT);


// connect to wifi.
WiFi.begin(WIFI_SSID, WIFI_PASSWORD);
Serial.print("connecting");
while (WiFi.status() != WL_CONNECTED) {
Serial.print(".");
delay(500);
}
Serial.println();
Serial.print("connected: ");
Serial.println(WiFi.localIP());

Firebase.begin("demolight-c4c76.firebaseio.com"); // thay bằng địa chỉ ứng dụng của bạn
Firebase.stream("/devices"); 
}


void loop() {
if (Firebase.failed()) {
Serial.println("streaming error");
Serial.println(Firebase.error());
}

if (Firebase.available()) {
FirebaseObject event = Firebase.readEvent();
String eventType = event.getString("type");
eventType.toLowerCase();

Serial.print("event: ");
Serial.println(eventType);
if (eventType == "put") {
Serial.print("data: ");
Serial.println(event.getString("data"));
String path = event.getString("path");
String data = event.getString("data");
if (path == "/")
{
JsonVariant payload = event.getJsonVariant("data");
Serial.print("data: ");
bool light1 = payload["light1"];
bool light2 = payload["light2"];
bool light3 = payload["light3"];
bool light4 = payload["light4"];

digitalWrite(Ligh1, light1);
digitalWrite(Ligh2, light2);
digitalWrite(Ligh3, light3);
digitalWrite(Ligh4, light4);

payload.printTo(Serial);
}
if (path == "/light1")
{

bool payload = event.getBool("data");
digitalWrite(Ligh1, payload);
Serial.print("data light1: ");
Serial.println(payload);
}
if (path == "/light2")
{

bool payload = event.getBool("data");
digitalWrite(Ligh2, payload);
Serial.print("data light2: ");
Serial.println(payload);
}
if (path == "/light3")
{

bool payload = event.getBool("data");
digitalWrite(Ligh3, payload);
Serial.print("dalight3: ");
Serial.println(payload);
}
if (path == "/light4")
{
bool payload = event.getBool("data");
digitalWrite(Ligh4, payload);
Serial.print("data light4: ");
Serial.println(payload);
}

}
} 
}
Download Source Code(Android + ESP8266)
https://drive.google.com/drive/folders/10RRH_dFbMZ9O9du5plZKtVnD8l7idr5a?usp=sharing

[STM32F103] Bài 2 Tạo một project mới


1 Cấu trúc một project

Trước tiên download thư viên STM32F10x_StdPeriph_Lib_V3.5.0 này về và giản nén nó ta được các file sau. -Tiếp theo đến nơi mà bạn muốn lưu project tạo một folder mới và coppy file Libraries ở trên vào folder này. -Sau đó tạo thêm các folder như sau. Doc : chứa các tệp ghi chú. Libraries : chứa các file thư viện Project: sẽ chứa file keilc project và file hex sinh ra. User : chứa các file thư viện do người dùng tự tạo.

2. Tạo project trên keilc và cấu hình thư viện

Mở keil C lên chọn new uVision project Một cửa sổ hiện ra bạn trỏ đến nơi lưu project ta đã tạo ở phần trên. Tiếp theo là cửa sổ chọn chip. các bạn chọn chip để lập trinh. ở đây mình chọn chip F103C8T6 Một cửa sổ hiện ra các bạn tắt nó đi. Tiếp theo nhấn vào biểu tượng khoanh màu xanh này. Các bạn tạo 4 Group STARTUP, FWLIB, CMSIS, USER, DOC chọn group STARTUP và thêm file startup_stm32f10x_md trong thư mục project_của_ban\Libraries\CMSIS\startup. Tương tự thêm các file core_cm3.c và system_stm32f10x.c trong thư mục project_của_ban\Libraries\CMSIS vào group CMSIS. group FWLIB thêm các file trong thư mục project_của_ban\Libraries\STM32F10x_StdPeriph_Driver\inc Cuối cùng các bạn nhấn ctrl+n để tạo file mới. sau đó ctrl+s để lưu file này với tên main.c vào thư mục User và add file này vào group USER. ta được các group như hình Thử nhấp nháy một con led luôn. Tiếp theo là cấu hình option. click vào biểu tượng option Chọn tab C/C++ mục define gõ lại như hình. xem file stm32f10x.h để hiểu rõ hơn vì sao lại viết như vậy. phần này mục đích để liên kết đến các folder thư viện. nếu bạn k làm bước này thì vd khi include thư viện bạn phải viết #include <./user/main.h> còn nếu thực hiện bước này bạn chỉ cần viết #include
thôi Tiếp theo sang debug chọn mạch nạp Sau khi cấu hình xong nhấn ok cắm mạch nạp build và load chương trình vào kit

DOWNLOAD PROJECT MẪU : Ở ĐÂY

[ARM STM32F103] Bài 1 Timer hệ thống(SYSTICK)

SYSTICK là gì?

Systick là một bộ đếm xuống 24 bit và có khả năng tự động nạp lại giá trị(auto reload).

Chức năng của nó là gì?

Systick được ví như một cái đồng hồ đếm ngược, nó được tạo ra để cung cấp một bộ thời gian chuẩn cho hệ thống. Đồng hồ Systick được sử dụng để cung cấp một nhịp đập hệ thống cho hệ điều hành thời gian thực RTOS hoặc để tạo một ngắt có tính chu kì hay đơn giản để tạo một khoảng delay.

Các thanh ghi liên quan

1.SysTick control and status register(SYS_CTRL)

Ở đây chúng ta chỉ quan tâm đến các bit COUNTFLAG(bit 16), CLKSOURCE(bit 2), TICKINT(bit 1) và ENABLE(bit 0).
-bit COUNTFLAG: đây là bit đếm cờ. bit này bằng 1 khi giá trị đếm chuyển từ 1 về 0.
-CLKSOURCE : đây là bit chọn nguồn clock. bằng 1 khi clock lấy trực tiếp từ AHB, bằng 0 khi nguồn clock = AHB/8.
-TICKINT: bit yêu cầu ngoại lệ ngắt xảy ra.
- ENABLE: 1=cho phép sử dụng systick. 0= cấm sử dụng systick.

Các bạn có thể xem sơ đồ sau để hiểu hơn cách hoạt độngc của systick

2.SysTick reload value register (STK_LOAD)

Mặc dù đây là thanh ghi 32 bit nhưng nó chỉ sử dụng 24 bit để lưu giá trị đếm.
Giá trị mà nó có thể lưu trữ là 0x00FFFFFF với hệ hexa hay 16.777.215 với hệ thập lục.

3.SysTick current value register (STK_VAL)


Thanh ghi này cũng chỉ có 24 bit được sử dụng. nó có tác dụng trả về giá trị hiện tại mà bộ đếm đang đếm.

4.SysTick calibration value register (STK_CALIB)

Tính toán giá trị cho Load value

ví dụ hệ thống có nguồn clock là 72Mhz. yêu cầu khoản thời gian xảy ra ngắt 10ms(cứ sau 10ms thì giá trị đếm về 0). vậy giá trị load nạp vào là bao nhiêu?
Với Clock period là khoảng thời gian thực hiện một chu kì hay chình bằng 1/frequency. thay công thức trên có:
load = 10ms * frequency -1 = 10ms * 72Mhz -1 = 10*10^-3 * 72 * 10^6 - 1 = 799999

[ARM STM32F103] Bài 0: Hướng dẫn cài đặt Kelc_ARM và phần cứng yêu cầu

1. CÀI ĐẶT VÀ CRACK KEIL C

Chào các bạn. Trong bài đầu tiên này mình sẽ hướng dẫn các bạn cài đặt phần mềm keil C để phục vụ cho việc lập trinh ARM.

CÀI ĐẶT


Bước 1: Đầu tiên các bạn tải Uvision full crack về đã: download keil C Bước 2: Các bạn giải nén file vừa download và chạy file c51v901.exe và chọn Next.
Bước 3: Các bạn chọn “I agree to all the terms of the preceding License Agreement” và chọn Next
Bước 4: Các bạn chọn đường dẫn cho thư mục cài đặt và chọn Next
Bước 5: Điền đầy đủ thông tin vào bảng dưới và chọn Next
Bước 6: Chờ chương trình cài đặt xong và chọn Finish
Bước 7: Tích chọn Show Relase Note để chèn thư viện bạn cần để lập trình Uvision, Trong file bạn tải về có sẵn thư viện ở đường dẫn KeilV5\KeilV5\Pack installer

HƯỚNG DẪN CRACK UVISION KEIL C


Bước 1: Các bạn mở chương trinh Keil C vừa cài đặt, lưu ý chạy dưới quyền admin, sau đó chọn File, chọn License Management và copy phần CID
Bước 2: Mở thư mục giải nén chạy file keygen.exe dán CID vừa copy vào muc CID và nhấn nút Generate để lấy code. Copy key
Bước 3: Mở cửa sổ License Management, dán key vào ô “New License ID Code (LIC)” và ấn Add LIC. Sẽ có thông báo rằng bạn đã key thành công.

2. THƯ VIỆN VÀ PHẦN CỨNG

Thư viện Tiếp theo các bạn download thư viên STM32F10x_StdPeriph_Lib_V3.5.0 này về. Đây là gói thư viện chuẩn phục vụ cho việc lập trinh ARM STM32. Phần cứng yêu cầu Thứ nhất các bạn cần phải có một kit ARM STM32f103. Trong serial này mình sử dụng kit STM32F103C8T6 giá chỉ trên dưới 100k thôi. bạn nào có điều kiện có thể mua kit STM32F103VET6 hoặc STM32F103ZET6 nhé.
Thứ 2 đó là mạch nạp. ở đây mình dùng mạch nạp ST-link v2 giá cũng chỉ trên dưới 100k thôi