👉 Table of Contents


Xin chào mọi người. Đây là bài viết đầu tiên chia sẽ về một trong những project mà mình đã và đang phát triển…

Repo các bạn có thể nhấn vào các Button Github ở đầu bài (star, watch, fork, follow) để Clone Repo về máy tính cá nhân. Nếu máy các bạn không hiện ra thì có thể nhấn ở đây để truy cập Repo.

Khuyên dùng: Sử dụng Git (GitHub Desktop, GitLab), TortoiseGit để lưu trữ & Clone Repo về.

bài viết này mình sẽ mô tả chi tiết và tuần tự mọi thứ khi mình bắt đầu làm nó (theo phong cách kể chuyện nha). Cách mạng công nghiệp 4.0 như bây giờ thì việc mua 1 cái đồng hồ thông minh có tính năng hay ho với giá thành vừa phải là điều rất dễ dàng. Thế nên bài viết này chi mang tính chất trao đổi kiến thức, kinh nghiệm khi đam mê làm đồ chơi handmade thôu nhé!

industrial4.0


Việc đầu tiên các bạn cần chuẩn bị:

  • Phần cứng:
    • Board ESP266 Wemos D1 mini (Sơ đồ nguyên lí đây nhấn vô đây cơ).
    • Một cộng cáp Micro USB connection để nạp code nha! Mình lấy cáp sạc điện thoại Samsung nạp luôn, nhưng nhớ là chuẩn Micro USB nha… Type-C là ngéo luôn á nha mọi người.
    • Lcd 20x04.
    • Mạch chuyển đổi I2C cho màn hình LCD2004.
    • Mica dày 3mm (có hay không củng không quan trọng, các bạn cứ chạy ra tiệm nào nhận cắt mica rồi đưa bản vẽ ra, họ cân tất cả. Có một số cửa hàng cắt mica khá ngon mình sẽ đính kèm địa chỉ cuối bài viết hoặc tìm gg “Mica Sinh Viên” - nếu bạn ở thành phố Hồ Chí Minh nhé).
    • Buzzer 5-12v (hoặc loa liếc gì đấy tùy vào kỹ năng chơi điện của các bạn.).
    • Một vài cọng dây đực cái, cái đực, dây điện (nối để test mạch hoạt động), vv…
    • Nguồn cung cấp cho ESP266 Wemod D1 (Nguồn 5v-2A, dư dòng tí mình sử dụng trong các mục đích khác).
  • Phần mềm:
  • Ngôn ngữ lập trình:
    • Chắc chắc là C/C++ là không thể thiếu sót rầu nhé.
    • Một chút tẹo tẹo về Java để chơi app Android. (Đọc hiểu củng đơn giản lắm - chỉ easy so với ứng dụng mình làm thôu nhé).
    • Một chút kiến thức về debug, vị trí đặt lệnh kiểm tra giá trị này nọ…
  • Vài thứ linh tinh:
    • Đọc hiểu được HTTP Methods GET vs POST.
    • Cáu trúc dữ liệu JavaScript Object Notation (thường được viết tắt là JSON).
    • … đại loại như đam mê kiểu “Em yêu khoa học:3”.

Giới thiệu chút về Wemos D1 mini mà mình sẽ sử dụng nhé!

Technical specs


esp8266

Microcontroller ESP-8266EX
Operating Voltage 3.3V
Digital I/O Pins 11
Analog Input Pins 1(Max input: 3.2V)
Clock Speed 80MHz/160MHz
Flash 4M bytes
Length 34.2mm
Width 25.6mm
Weight 3g

Pin

pinout_esp8266

Warning: Tất cả các pin IO của bé nó đều sài 3.3v nha!

Mục tiêu & tính năng của project này:

  • Một cái đồng hồ thời gian thực trang trí phòng ngon lành. Độ chính xác của giờ lấy từ pool.ntp.org đem lại độ chính xác tin cậy cho người dùng.
  • Thấy được nhiệt độ, độ ẩm không khí của địa phương (set mode tới 5 vị trí địa lí muốn lấy dữ liệu thời tiết với độ tin cậy từ OpenWeathermap)
  • Với khả năng kết nối mạng không dây nhanh gọn được hổ trợ bởi nhà sản xuất ESP32 & ESP8266.
  • Củng có báo thức luôn (set báo thức từ phím cứng trên đồng hồ hoặc smartphone luôn).
  • Cá nhân hóa được nè (thẩm mĩ tí khúc khắc lazer mica các bạn sẽ có sản phẩm toẹt vời).
  • Đèn ngủ cũng được nữa, đêm nó củng sang sáng lắmđèn ngủ siêu tiết kiệm điện á nha.

Hướng đi & giải pháp nào?


Thời gian

Việc đầu tiên, đã là cái đồng hồ thì điều quan trọng là phải xem được giờ mà phải chính xác luôn - thời gian thực.

lcd2004

Từ đó chúng ta thấy "xem được giờ" tức là phải có cái gì đó nhìn trực quan được. Có nhiều sự lựa chọn cho việc đó như LCD 20x04, LCD Graphic, LCD Oled… Và mình chọn LCD 20x04 vì nó khá dễ sử dụng với bộ thư viện phong phú trên Github và các diễn đàn IoT.

ds1307

Tiếp theo là việc lựa chọn nguồn cung cấp thời gian? RTC DS1307? Nó thì mình củng đã từng sử dụng qua rồi… Việc cấu hình khá vất vả, phụ thuộc vào viên pin Backup, độ chính xác không cao (thạch anh và vị trí đặt thạch anh trên mạch như thế nào củng ảnh hưởng đến sai số thời gian - và việc này làm chúng ta code bù trừ thời gian thêm phức tạp), vân vân mấy mây…


Đến với 4.0 và pool.ntp.org

ntp

Với công nghiệp 4.0 như bây giờ cái việc nhà nhà có internet, người người có internet thì tại sao mình lại không sử dụng nó để cập nhật giờ giống như các thiết bị di động, laptop nhỉ? Sau khi tìm hiểu trên các diễn đàn IoT trong nước củng như nước ngoài, mình đã thu thập được một vài kiến thức về cách thức hoạt động và lấy dữ liệu giờ từ trang pool.ntp.org.


MCU - Smartconfig - Kết nối mạng

Để lấy được giờ từ internet thì MCU của chúng ta phải có khả năng kết nối internet (hoặc là kết nối không dây hoặc là có dây). Mình sử dụng ESP8266 Wemos D1 mini như đã giới thiệu ở trên. Thứ khiến mình băn khoăn ở đây chính là vấn đề kết nối mạng cho em nó. Đối với một số bạn thì dòng code này rất quen thuộc:

#include <ESP8266WiFi.h>

const char* ssid = "********";
const char* password = "********";
void setup(void)
{
  Serial.begin(115200);
  Serial.println();

  Serial.printf("Connecting to %s \n", ssid);
  WiFi.begin(ssid, password);
  WiFi.config(staticIP, gateway, subnet);
  while (WiFi.status() != WL_CONNECTED)
  {
    delay(500);
    Serial.print(".");
  }
  Serial.println();
  Serial.print("Connected, IP address: ");
  Serial.println(WiFi.localIP());
}

void loop() {}

Nếu sử dụng kiểu này, sản phẩm của chúng ta khi đóng hộp sẽ sử dụng cố định một tên SSID & PASS duy nhất rất bất tiện trọng quá trình sử dụng khi chuyển nhà, đổi tên mạng Wifi, vv… Mỗi lần như vậy chúng ta phải nạp lại code để cập nhật ssid và password mới cho ESP8266 (hoặc là phải đổi tên của modun Wifi thành ssid và pass như chúng ta đã cấu hình trong code).

Vậy thứ chúng ta cần là một cái đồng hồ có khả năng kết nối wifi và thay đổi wifi. Giải pháp được mình tìm thấy chính là Smartconfig.

Smartconfig - ESPTouch là một khái niệm được nhắc đến khi khi muốn cấu hình thông tin cho thiết bị WiFi kết nối nhanh chóng đến Internet nhất từ người dùng bằng chính thiết bị (điện thoại) của họ.

  • Dễ dàng cấu hình wifi cho ESP8266 thông qua smartphone.
  • Không cần phải nạp lại code để cấu hình
  • Có thể dùng Smartconfig để cấu hình nhiều thiết bị một lúc

smartconfig


EEPROM - bộ nhớ backup lưu trữ data

Với việc sử dụng Smartconfig thì chúng ta cần một vùng nhớ lưu ssid và pass phòng khi reset đồng hồ hoặc mất điện vì lí do nào đó.

#include <ESP8266WiFi.h>
#include <Wire.h>
#include <EEPROM.h>
void setup()
{
	/* Initialize eeprom */
	EEPROM.begin(512);
	Serial.println(" ");
	Serial.println("Lay gio bao thuc:");
	hen_gio = EEPROM.read(index_eeprom_hengio);
	Serial.print("hen_gio: ");
	Serial.println(EEPROM.read(index_eeprom_hengio));
	hen_phut = EEPROM.read(index_eeprom_henphut);
	Serial.print("hen_phut: ");
	Serial.println(EEPROM.read(index_eeprom_henphut));
	value_Location_EEPROM = EEPROM.read(index_eeprom_location_eeprom);
	Serial.print("value_Location_EEPROM: ");
	Serial.println(EEPROM.read(index_eeprom_location_eeprom));
}
...

Như các bạn đã thấy trong trích đoạn code trên mình sử dụng EEPROM để lưu một số giá trị cho chức năng báo thức, vị trí địa lí, ssid & pass wifi.


Thời tiết - cảm biến

cambien_dht cambien_ds18b20

Cái đồng hồ mình trông có vẻ “xịn hơn thì thêm một vài tính năng nhiệt độ, độ ẩm không khí. Như các hình ảnh trên thì những cảm biến DH111, DHT22, DS18b20 được rất nhiều các bạn sài.

Để tiết kiệm được PIN IN/OUT & theo Hot trend 4.0, ở dự án này mình không sử dụng phần cứng như thế. Với khả năng kết nối internet chúng ta sẽ tìm một nguồn cung cấp thông tin thời tiết tin cậy và lấy thông tin từ đó.

OpenWeatherMap

Đây OpenWeatherMap sẽ là nơi mình chọn lựa nơi để lấy data thời giữa hàng loạt các sự lựa chọn khác.

OpenWeatherMap API

  • OpenWeatherMap API này cung cấp dịch vụ dữ liệu thời tiết và dự báo miễn phí, thích hợp cho bất kỳ dịch vụ bản đồ như các ứng dụng web và điện thoại thông minh.
  • Ý tưởng được lấy cảm hứng từ OpenStreetMapWikipedia nhằm cung cấp thông tin miễn phí và sẵn có cho mọi người.
  • OpenWeatherMap cung cấp nhiều dữ liệu thời tiết như:
    • Bản đồ thời tiết hiện tại,
    • Dự báo tuần, lượng mưa, gió, mây,
    • Dữ liệu từ các trạm thời tiết và nhiều thứ khác.
    • Dữ liệu thời tiết được nhận từ các dịch vụ phát sóng khí tượng toàn cầu và hơn 40.000 trạm khí tượng.
  • Bạn có thể nhận được bất kỳ dữ liệu thời tiết nào cho ứng dụng của bạn bằng cách sử dụng API JSON / XML.

Với những thông số trên về OpenWeatherMap thì nó là sự lựa chọn đáng tin cậy cho mình.


Cơ bản là đã giới thiệu sơ bộ những linh kiệnkiến thức cần thiết sử dụng trong project này rồi.

Note: Phần 2 mình sẽ đào vào logic code của mình. Hẹn gặp lại ở phần tiếp theo (Feb - 2020)!