Sử dụng mạch bSmart để làm dự án Internet Of Things đầu tiên!

I. Mô tả dự án

Chào các bạn thân yêu!

Lập trình Internet of Things được biết đến là một thứ vô cùng khó khăn và phức tạp. Nơi này, trước đây không phải dành cho tất cả mọi người. Nhưng, để đưa Việt Nam trở thành một cường quốc về công nghệ cao và đi tắt đón đầu nhờ cuộc cách mạng công nghệ 4.0 thì bài toán Internet of Things phải được giải quyết bằng chính trí tuệ của tất cả mọi người. Cuối cùng, để giải quyết được sự giao thoa giữa Đa dụng và Dễ sử dụng, BusMap đã cho ra đời bSmart, giải pháp cung cấp một phương pháp sáng tạo, cho phép người dùng lập trình ứng dụng IoT bằng chính arduino IDE cùng với các example đơn giản, với những ví dụ ngay trong thư viện mẫu. Ngay cả một học sinh trung học học STEM cũng có thể làm được. Hãy cùng khám phá nhé!
Mặc dù trên google đã có rất nhiều bài viết về lập trình 4G nhưng chưa có một bài viết nào cụ thể dành cho các bạn newbie khi mới mua các mạch lập trình module sim về thì phải làm như thế nào, bắt đầu từ đâu, các bước thực hiện như thế nào….? Bài viết này sẽ hướng dẫn các bạn lập trình một dự án nhỏ với mạch bSmart để thấy được ứng dụng mạnh mẽ của nó ở các dự án lớn hơn. Ở mỗi mục mình sẽ hướng dẫn một cách cụ thể nhất, từ đó có cái nhìn tổng quát nhất khi mới bắt đầu sử dụng bSmart.

Chần chừ gì nữa, bắt tay cùng mình làm dự án đầu tiên với mạch bSmart nha.

II. Chuẩn bị

Phần cứng

  • Mạch bSmart
  • dây Micro USB
  • Ăngten ngoài (dành cho những bạn muốn độ thêm khoảng cách thu phát sóng)

Hình ảnh mạch bSmart đã được độ thêm Angten màu trắng

Phần mềm

  • MQTT Box

  • Arduino IDE

Thư viện: trong dự án lần này mình sẽ sử dụng 2 thư viện có sẵn trên github

https://github.com/vshymanskyy/TinyGSM

https://github.com/knolleary/pubsubclient

III. Lập trình và cài đặt

Code cho mạch bSmart (cài thư viện xong,copy đoạn code này vào Arduino IDE)

#define TINY_GSM_MODEM_SIM7600
// Set serial for debug console (to the Serial Monitor, default speed 115200)
#define SerialMon Serial

// Set serial for AT commands (to the module)
// Use Hardware Serial on Mega, Leonardo, Micro
#define SerialAT Serial2

// See all AT commands, if wanted
// #define DUMP_AT_COMMANDS

// Define the serial console for debug prints, if needed
#define TINY_GSM_DEBUG SerialMon

// Range to attempt to autobaud
#define SIM7600_BAUD 115200

// Add a reception delay - may be needed for a fast processor at a slow baud rate
// #define TINY_GSM_YIELD() { delay(2); }

// Define how you're planning to connect to the internet
#define TINY_GSM_USE_GPRS true

// set GSM PIN, if any
#define GSM_PIN ""

// Your GPRS credentials, if any
const char apn[] = "m-wap";
const char gprsUser[] = "";
const char gprsPass[] = "";

// MQTT details
const char* broker = "broker.hivemq.com";
const char* topicLed = "/BSmart/led";
const char* topicInit = "/BSmart/init";
const char* topicLedStatus = "/BSmart/ledStatus";
#define PORT_MQTT 1883
#include <TinyGsmClient.h>
#include <PubSubClient.h>

#ifdef DUMP_AT_COMMANDS
#include <StreamDebugger.h>
StreamDebugger debugger(SerialAT, SerialMon);
TinyGsm modem(debugger);
#else
TinyGsm modem(SerialAT);
#endif
TinyGsmClient client(modem);
PubSubClient mqtt(client);

#define LED_PIN 2
int ledStatus = LOW;
uint32_t lastReconnectAttempt = 0;

void mqttCallback(char* topic, byte* payload, unsigned int len) {
  SerialMon.print("Message arrived [");
  SerialMon.print(topic);
  SerialMon.print("]: ");
  SerialMon.write(payload, len);
  SerialMon.println();

  // Only proceed if incoming message's topic matches
  if (String(topic) == topicLed) {
    ledStatus = !ledStatus;
    digitalWrite(LED_PIN, ledStatus);
    mqtt.publish(topicLedStatus, ledStatus ? "1" : "0");
  }
}

boolean mqttConnect() {
  SerialMon.print("Connecting to ");
  SerialMon.print(broker);


  // Connect to MQTT Broker
  boolean status = mqtt.connect("BsmartClient");

  // Or, if you want to authenticate MQTT:
  //boolean status = mqtt.connect("GsmClientName", "mqtt_user", "mqtt_pass");

  if (status == false) {
    SerialMon.println(" fail");
    return false;
  }
  SerialMon.println(" success");
  mqtt.publish(topicInit, "GsmClientTest started");
  mqtt.subscribe(topicLed);
  return mqtt.connected();
}

void setup() {
  // Set console baud rate
  SerialMon.begin(115200);
  delay(10);
  pinMode(LED_PIN, OUTPUT);
  // !!!!!!!!!!!
  // Set your reset, enable, power pins here
  // !!!!!!!!!!!
  SerialMon.println("Wait...");
  // Set GSM module baud rate
  SerialAT.begin(SIM7600_BAUD);
  delay(6000);
  SerialMon.println("Initializing modem...");
  modem.init();
  String modemInfo = modem.getModemInfo();
  SerialMon.print("Modem Info: ");
  SerialMon.println(modemInfo);

#if TINY_GSM_USE_GPRS
  // Unlock your SIM card with a PIN if needed
  if ( GSM_PIN && modem.getSimStatus() != 3 ) {
    modem.simUnlock(GSM_PIN);
  }
#endif

  SerialMon.print("Waiting for network...");
  if (!modem.waitForNetwork()) {
    SerialMon.println(" fail");
    delay(1000);
    return;
  }
  SerialMon.println(" success");

  if (modem.isNetworkConnected()) {
    SerialMon.println("Network connected");
  }

#if TINY_GSM_USE_GPRS
  // GPRS connection parameters are usually set after network registration
  SerialMon.print(F("Connecting to "));
  SerialMon.print(apn);
  if (strlen(gprsUser) > 0) {
    if (!modem.gprsConnect(apn, gprsUser, gprsPass)) {
      SerialMon.println(" fail (gprs User)");
      delay(1000);
      return;
    }
  } else {
    if (!modem.gprsConnect(apn)) {
      SerialMon.println(" fail");
      delay(1000);
      return;
    }
  }

  SerialMon.println(" success");
  if (modem.isGprsConnected()) {
    SerialMon.println("GPRS connected");
  }
#endif

  // MQTT Broker setup
  mqtt.setServer(broker, PORT_MQTT);
  mqtt.setCallback(mqttCallback);
}

void loop() {
  if (!mqtt.connected()) {
    SerialMon.println("=== MQTT NOT CONNECTED ===");
    // Reconnect every 10 seconds
    uint32_t t = millis();
    if (t - lastReconnectAttempt > 10000L) {
      lastReconnectAttempt = t;
      if (mqttConnect()) {
        lastReconnectAttempt = 0;
      }
    }
    delay(100);
    return;
  }
  mqtt.loop();
}
Cài đặt MQTT Box
Bước 1: sau khi mở MQTT Box, chọn vào phần Create MQTT Client 
 
Bước 2: Nhập thông tin như trong hình, lần lượt theo chỗ đã đóng khung màu đỏ và chọn save.
Bước 3: Sau khi save, nếu bạn nhập đúng thông tin sẽ hiện connected màu xanh lá, nếu sai thì sẽ hiện connection error màu đỏ
Bước 4: Chọn Add Subcriber (màu vàng) và điền vào ô Topic to subcribe như hình, sau đó click vào Subcribe, phía bên ô Topic to publish điền vào như hình (trong code mình code như vậy nên mình sẽ điền như vậy)
Chọn Add Subcriber
điền vào ô Topic to subcribe và chọn subscribe, sau đó điền vàoTopic to publish
Được rồi, sau khi cài đặt tất cả mọi thứ và bấm subcribe, giao diện sẽ như hình dưới đây.
Mỗi lần các bạn nhập 0 hoặc 1 ở mục Payload thì Broker sẽ gửi một gói tin xuống cho bSmart để thực hiện lệnh. Ở đoạn chương trình trên, khi mình gửi 0 hoặc 1 xuống client thì đó là lệnh để bật/tắt đèn led. Cùng xem thành quả hôm nay và cách thực hiện qua video ở dưới nha.

IV Tổng kết

Thật là mệt mỏi đúng không nào, chạy ra ngoài và tự thưởng cho mình một lon nước ngọt nhé!
Đây là thành quả đầu tiên của chúng ta với mạch bSmart, tuy là dự án nhỏ nhưng nó sẽ là tiền thân của các dự án lớn sau này nếu chúng ta thực sự nghiêm túc với nó. Đừng nản lòng, hãy cùng chiến đấu hết mình vì một kỉ 4.0 nhé. Giờ thì cùng thưởng thức thành quả nhé, chúc bạn vui!

Trả lời

Email của bạn sẽ không được hiển thị công khai. Các trường bắt buộc được đánh dấu *