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(); }
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!