Cảm biến nhiệt độ & độ ẩm thông minh ATH22
Theo dõi môi trường và gửi dữ liệu thời gian thực qua WiFi.
Thông số kỹ thuật
- Model: ATH22
- Kết nối: Wifi 802.11 b/g/n 2.4GHz (Không hỗ trợ 5GHz)
- Dải đo: -15 đến 85 độ C (độ chính xác ±0.2°C)
- Dải độ ẩm: 0-100% (độ chính xác ±1%)
- Độ phân giải: 0,01
- Đo áp suất
- Màn hình: OLED 0.96inch
- Cảm biến: Bosch BME280
- Kích thước: 76x56x29mm
- Nguồn cấp: 5V 1A
- Bảo hành: 1 năm
Mô tả chi tiết
Attico Thermometer Hygrometer WiFi ATH22 – Thiết bị giám sát nhiệt độ & độ ẩm thông minh
Attico Thermometer Hygrometer WiFi là giải pháp đo lường và giám sát môi trường hiện đại, được thiết kế chuyên dụng cho nhà máy, kho bãi và các khu vực yêu cầu kiểm soát nhiệt độ – độ ẩm nghiêm ngặt.
Thiết bị sử dụng cảm biến Bosch BME280 có độ chính xác cao, cho phép đo đồng thời nhiệt độ, độ ẩm và áp suất môi trường. Với khả năng kết nối WiFi 2.4GHz (chuẩn 802.11 b/g/n), thiết bị dễ dàng truyền dữ liệu liên tục về hệ thống, hỗ trợ theo dõi và báo cáo tự động hàng ngày.
Sản phẩm đã được hiệu chuẩn và đang được sử dụng thực tế tại các nhà máy may mặc, đáp ứng yêu cầu kiểm soát môi trường sản xuất. Thiết bị cũng đã được nhiều thương hiệu quốc tế như Adidas, Under Armour (UA), Lululemon, KUIU, Glowin, LTA, Abe, VF chấp thuận sử dụng trong quy trình quản lý chất lượng.
Ưu điểm nổi bật:
- Đo nhiệt độ: -15 đến 85°C (±0.2°C)
- Đo độ ẩm: 0–100% (±1%)
- Tích hợp đo áp suất môi trường
- Kết nối WiFi 802.11 b/g/n 2.4GHz (không hỗ trợ 5GHz)
- Tự động gửi báo cáo dữ liệu hàng ngày
- Màn hình OLED 0.96 inch hiển thị rõ nét
- Thiết kế nhỏ gọn: 76 x 56 x 29 mm
- Nguồn cấp: 5V
- Bảo hành: 12 tháng
Attico Thermometer Hygrometer WiFi là lựa chọn tối ưu giúp doanh nghiệp nâng cao khả năng kiểm soát môi trường, đảm bảo tuân thủ tiêu chuẩn chất lượng và cải thiện hiệu quả vận hành.
Ứng dụng thực tế
- Nhà máy may mặc, dệt may
- Kho hàng, kho nguyên liệu
- Phòng sản xuất, phòng sạch
- Các môi trường cần kiếm soát nhiệt độ - độ ẩm theo tiêu chuẩn
Khách hàng
Đạt quản lý chất lượng của các thương hiệu
Tài liệu hiệu chuẩn
Cẩm nang hướng dẫn sử dụng hệ thống giám sát nhiệt độ & độ ẩm Attico
Cẩm nang gồm 2 phần: cấu hình và kiểm tra cảm biến trước, sau đó chọn cách nhận dữ liệu qua Server/API hoặc phần mềm Attico Monitor.
Cấu hình và vận hành cảm biến
Giới thiệu thiết bị, kết nối WiFi, xem dữ liệu đo, hiệu chuẩn và khởi động lại cảm biến.
Xem toàn bộ hướng dẫn cấu hình cảm biến Có thể thu gọn sau khi hoàn tất
Giới thiệu cảm biến
Attico Thermometer and Hygrometer WiFi là thiết bị đo:
- Nhiệt độ
- Độ ẩm
- Áp suất khí quyển
- Độ cao ước tính (Approx. Altitude)
Thiết bị hỗ trợ hiển thị dữ liệu trên trình duyệt Web, kết nối WiFi, gửi dữ liệu lên Server, hiệu chuẩn và khởi động lại trực tiếp từ giao diện Web.
Giao diện Web của cảm biến
Truy cập giao diện cấu hình lần đầu
Khi mới xuất xưởng hoặc chưa được thiết lập mạng, cảm biến sẽ tự động phát ra một mạng WiFi độc lập để người dùng truy cập cấu hình.
- Sử dụng điện thoại, máy tính bảng hoặc máy tính có WiFi, tìm kiếm mạng WiFi xung quanh.
- Chọn kết nối vào WiFi do cảm biến phát ra:
Tên WiFi (SSID):ATTICO-SENSOR-XXXX(XXXX là mã định danh riêng của từng thiết bị)
Mật khẩu:attico123123 - Sau khi kết nối thành công, mở trình duyệt web và nhập địa chỉ IP:
192.168.4.1 - Giao diện trang quản trị Attico Thermometer and Hygrometer WiFi sẽ hiện ra, hiển thị các thông số đo lường thực tế (Temp. Celsius, Temp. Fahrenheit, Pressure, Altitude, Humidity) cùng 4 tùy chọn: Wifi Settings, Data Upload Settings, Sensor Clibration, Restart Device.
Giao diện trang quản trị cảm biến ATH22
Cấu hình mạng WiFi (Chế độ DHCP hoặc STATIC)
Tại màn hình chính của cảm biến, bấm Wifi Settings để vào giao diện thiết lập mạng:
- WiFi: Nhập tên (SSID) mạng WiFi tại văn phòng/kho xưởng nơi lắp đặt.
- Password: Nhập mật khẩu mạng WiFi đó.
- Device Name: Đặt tên định danh cho cảm biến (Ví dụ:
SENSOR-06). Tên này dùng để khai báo trên phần mềm quản lý.
Tích chọn Radio Button DHCP. Router sẽ tự động cấp một địa chỉ IP ngẫu nhiên cho cảm biến, các ô IP Address, Gateway, Subnet sẽ được bỏ qua.
Nhấn Update để lưu cấu hình.
Tích chọn Radio Button STATIC, điền đầy đủ các thông số:
• IP Address: IP cố định muốn gán cho cảm biến (Ví dụ:
192.168.168.50)• Gateway: IP của Router/Modem (Ví dụ:
192.168.168.1)• Subnet: Thông thường
255.255.255.0Nhấn Update để lưu cấu hình.
Giao diện WiFi Settings
Truy cập giao diện Web sau khi kết nối mạng
Sau khi thiết bị kết nối mạng thành công, mở trình duyệt và nhập địa chỉ IP của thiết bị.
Ví dụ:
http://172.28.14.235
Trang chủ sẽ hiển thị các thông số đo hiện tại.
Trang chủ và thông số đo (Measurement)
Trang chủ hiển thị toàn bộ dữ liệu đo được:
- Temp. Celsius: Nhiệt độ (°C)
- Temp. Fahrenheit: Nhiệt độ (°F)
- Pressure: Áp suất (hPa)
- Approx. Altitude: Độ cao ước tính (m)
- Humidity: Độ ẩm (%)
Bên dưới là các menu chức năng: WiFi Settings, Data Upload Settings, Sensor Calibration và Restart Device.
Hiệu chuẩn cảm biến (Sensor Calibration)
Trang này dùng để hiệu chỉnh cảm biến, có thể cộng hoặc trừ giá trị đo để bù sai số.
- Temperature Increase: Cộng thêm nhiệt độ
- Temperature Decrease: Trừ nhiệt độ
- Humidity Increase: Cộng thêm độ ẩm
- Humidity Decrease: Trừ độ ẩm
Ví dụ: đặt Temperature Increase = 1.0 nếu thiết bị đo thấp hơn 1°C, hoặc Humidity Increase = 2 nếu độ ẩm đo thấp hơn 2%.
Update: Lưu và áp dụng giá trị hiệu chỉnh. Restart: Khởi động lại thiết bị.
Khởi động lại cảm biến (Restart Device)
Từ trang chủ chọn Restart Device. Thiết bị sẽ khởi động lại, tự kết nối WiFi và tiếp tục đo hoặc gửi dữ liệu. Việc khởi động lại không làm mất cấu hình đã lưu.
Chọn phương thức nhận và lưu dữ liệu
Sau khi cấu hình sensor, chọn gửi dữ liệu về Server/API hoặc thu thập bằng Attico Monitor.
Sử dụng phần mềm Attico Monitor
Cài đặt phần mềm trên máy tính Windows để tự động thu thập, lưu trữ và xuất báo cáo dữ liệu từ nhiều cảm biến.
✓ Cần hoàn tất Phần 1 – Cấu hình cảm biến trước khi thêm thiết bị vào phần mềm.
Hướng dẫn sử dụng phần mềm quản lý
Cấu hình hệ thống & Cơ sở dữ liệu Kỹ thuật / Admin
Vào menu Cấu Hình → Cấu hình Hệ thống. Phần mềm hỗ trợ 2 loại cơ sở dữ liệu. Khi chọn 1 trong 2 Radio Button, phần mềm sẽ tự động đổi nguồn lưu trữ tương ứng:
Tích chọn SQL Server. Điền thông tin: Server/Hostname (Ví dụ:
192.168.168.5), Tên Database (App), Tài khoản (app), Mật khẩu.Nhấn Kiểm tra kết nối để xác thực.
Tích chọn SQLite (file cục bộ). Nhấp ... để chọn đường dẫn lưu file database (
.db).Chọn Chu kỳ ghi dữ liệu (Ví dụ: 5 phút).
Nhấn Tạo bảng → khi hệ thống báo "Cơ sở dữ liệu đã sẵn sàng" → nhấn Lưu cấu hình.
Giao diện Cấu hình Hệ thống & Cơ sở dữ liệu
Giao diện Cấu hình Hệ thống & Cơ sở dữ liệu
Quản lý / Thêm mới Thiết bị Cảm biến vào phần mềm
Vào menu Thiết Bị → Quản lý Thiết bị / Cảm biến.
- Nhấn nút + Thêm mới trên thanh công cụ.
- Nhập các thông tin bắt buộc tại khung Thông tin thiết bị bên phải:
- Tên cảm biến: Nhập đúng tên trùng với Device Name đã đặt ở Bước 3 – Cấu hình mạng WiFi (Ví dụ:
SENSOR-06). - Địa chỉ IP: Nhập IP của cảm biến. Nếu chọn STATIC thì nhập IP cố định đã đặt; nếu chọn DHCP thì kiểm tra IP được hiện trên màn hình của cảm biến hoặc cấp trên Router rồi nhập vào đây.
- Vị trí & Mô tả: Nhập vị trí lắp đặt (Ví dụ: Kho lạnh A, Phòng Server...) và ghi chú thêm nếu cần.
- Tên cảm biến: Nhập đúng tên trùng với Device Name đã đặt ở Bước 3 – Cấu hình mạng WiFi (Ví dụ:
- Tích chọn Bật ghi dữ liệu và bấm Lưu.
Có thể thêm nhiều thiết bị ATH22 cùng lúc để quản lý nhiều vị trí.
Giao diện Quản lý / Thêm mới thiết bị
Theo dõi dữ liệu, Tìm kiếm & Xuất báo cáo
Tại giao diện chính (Tab Báo Cáo):
- Tìm kiếm: Chọn khoảng thời gian (Từ ngày – Đến ngày), chọn tên Cảm biến cụ thể hoặc Tất cả, rồi nhấn Tìm kiếm.
- Thông số tổng quan: Hệ thống tự động tính nhanh các chỉ số MAX / MIN / TB của cả Nhiệt độ và Độ ẩm trong khoảng thời gian được lọc.
- Xuất Excel: Nhấn nút Xuất Excel (màu xanh lá, góc phải trên cùng) để kết xuất toàn bộ dữ liệu trên lưới ra tệp
.xlsx.
Giao diện Báo Cáo – Tìm kiếm & Xuất Excel
Giám sát trạng thái vận hành
Theo dõi tiến trình thu thập dữ liệu qua thanh trạng thái dưới cùng của phần mềm:
- Hiển thị: Đang ghi dữ liệu — chu kỳ X phút | Lần cuối: HH:mm:ss
- Nhấn Dừng ghi (màu đỏ) nếu muốn tạm dừng thu thập dữ liệu.
- Nhấn Bắt đầu ghi (màu xanh) để phần mềm tiếp tục quét dữ liệu từ các IP cảm biến.
Thanh trạng thái giám sát vận hành
Gửi dữ liệu từ cảm biến về Server / API
Cấu hình cảm biến để tự động gửi dữ liệu lên Server hoặc API theo chu kỳ, không cần cài đặt phần mềm quản lý trên máy tính.
✓ Cần hoàn tất Phần 1 – Cấu hình cảm biến trước khi thiết lập Server/API.
Hướng dẫn gửi dữ liệu về Server / API
Data Upload Settings
Trang này dùng để cấu hình việc gửi dữ liệu lên Server.
Các tham số:
- URL: Địa chỉ Server nhận dữ liệu
- Location: Vị trí lắp đặt cảm biến
- Device Name: Tên thiết bị
- Duration: Chu kỳ gửi dữ liệu (phút)
Ví dụ URL: http://attico.vn
Ví dụ Location: LASER-B3F2
Ví dụ Device Name: SENSOR-7141
Ví dụ Duration: 60
Thiết bị sẽ gửi dữ liệu mỗi 60 phút.
- Enable: Bắt đầu gửi dữ liệu
- Disable: Ngừng gửi dữ liệu
Quy trình gửi dữ liệu lên Server lần đầu
- Hoàn tất Phần 1 – Cấu hình cảm biến ở phía trên.
- Truy cập giao diện Web bằng địa chỉ IP của cảm biến.
- Mở Data Upload Settings, nhập URL/Location/Device Name/Duration.
- Nhấn Enable để bắt đầu gửi dữ liệu.
Lưu ý khi gửi dữ liệu lên Server
- Thiết bị cần kết nối WiFi để gửi dữ liệu lên Server.
- Khi dùng chế độ Static, cần đảm bảo địa chỉ IP không bị trùng.
- Sau khi thay đổi cấu hình mạng, thiết bị có thể mất vài giây để kết nối lại.
- Kiểm tra URL, chu kỳ gửi và trạng thái Enable nếu Server chưa nhận được dữ liệu.
Data Upload Settings
This page is used to configure data upload to server.
Parameters:
- URL: Server endpoint
- Location: Installation position
- Device Name
- Duration: Upload interval (seconds)
Example URL: http://kanban.crystal-stf.com
Example Location: LASER-B3F2
Example Device Name: SENSOR-7141
Example Duration: 60
The device uploads data every 60 seconds.
- Enable: Start uploading data
- Disable: Stop uploading data
Initial Server Upload Workflow
- Complete Part 1 – Sensor configuration above.
- Open the sensor Web interface using its IP address.
- Open Data Upload Settings and fill URL, Location, Device Name, Duration.
- Click Enable to start uploading data.
Server Upload Notes
- WiFi connection is required for server upload.
- In Static mode, ensure IP address is unique in your network.
- After network changes, reconnect may take a few seconds.
- Check the URL, upload interval, and Enable status if the Server receives no data.
API nhận dữ liệu từ cảm biến và lưu vào SQL Server
Các ví dụ bên dưới nhận dữ liệu bằng phương thức GET qua Query String để tương thích với cấu hình URL của cảm biến.
GET https://your-domain.com/api/sensor?ip=192.168.1.50&temp=27.5&hum=65.2&location=WAREHOUSE-A&deviceName=SENSOR-06
Phản hồi thành công: {"message":"Success"}
| Parameter | Nội dung | Ví dụ |
|---|---|---|
ip | Địa chỉ IP của cảm biến | 192.168.1.50 |
temp | Nhiệt độ đo được | 27.5 |
hum | Độ ẩm đo được | 65.2 |
location | Vị trí lắp đặt | WAREHOUSE-A |
deviceName | Tên định danh cảm biến | SENSOR-06 |
PHPPDO_SQLSRV Xem code
<?php
declare(strict_types=1);
header('Content-Type: application/json; charset=utf-8');
function respond(int $status, string $message): void
{
http_response_code($status);
echo json_encode(['message' => $message], JSON_UNESCAPED_UNICODE);
exit;
}
$ip = trim($_GET['ip'] ?? '');
$temp = filter_var($_GET['temp'] ?? null, FILTER_VALIDATE_FLOAT);
$hum = filter_var($_GET['hum'] ?? null, FILTER_VALIDATE_FLOAT);
$location = trim($_GET['location'] ?? '');
$deviceName = trim($_GET['deviceName'] ?? '');
if (!filter_var($ip, FILTER_VALIDATE_IP)
|| $temp === false
|| $hum === false
|| $location === ''
|| $deviceName === '') {
respond(400, 'Invalid or missing parameters');
}
try {
$pdo = new PDO(
getenv('DB_DSN') ?: '',
getenv('DB_USER') ?: '',
getenv('DB_PASSWORD') ?: '',
[
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
PDO::ATTR_EMULATE_PREPARES => false,
PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
]
);
$sql = <<<'SQL'
INSERT INTO STF_TempHum_Data
(sensor_name, ip_address, location, temp, hum)
VALUES
(:device_name, :ip, :location, :temp, :hum)
SQL;
$statement = $pdo->prepare($sql);
$statement->execute([
':device_name' => $deviceName,
':ip' => $ip,
':location' => $location,
':temp' => $temp,
':hum' => $hum,
]);
respond(200, 'Success');
} catch (Throwable $error) {
error_log($error->getMessage());
respond(500, 'Database error');
}
Biến môi trường: DB_DSN=sqlsrv:Server=YOUR_DB_SERVER;Database=STFApp, DB_USER và DB_PASSWORD.
C# ASP.NET CoreMinimal API Xem code
using Microsoft.Data.SqlClient;
using System.Data;
using System.Net;
var builder = WebApplication.CreateBuilder(args);
var app = builder.Build();
var connectionString = builder.Configuration
.GetConnectionString("DefaultConnection")
?? throw new InvalidOperationException("Missing connection string");
app.MapGet("/api/sensor", async (
string? ip,
decimal? temp,
decimal? hum,
string? location,
string? deviceName) =>
{
if (!IPAddress.TryParse(ip, out _)
|| temp is null
|| hum is null
|| hum < 0 || hum > 100
|| string.IsNullOrWhiteSpace(location)
|| string.IsNullOrWhiteSpace(deviceName))
{
return Results.BadRequest(new
{
message = "Invalid or missing parameters"
});
}
const string sql = @"
INSERT INTO STF_TempHum_Data
(sensor_name, ip_address, location, temp, hum)
VALUES
(@deviceName, @ip, @location, @temp, @hum)";
await using var connection = new SqlConnection(connectionString);
await using var command = new SqlCommand(sql, connection);
command.Parameters.Add("@deviceName", SqlDbType.NVarChar, 100).Value = deviceName;
command.Parameters.Add("@ip", SqlDbType.VarChar, 45).Value = ip;
command.Parameters.Add("@location", SqlDbType.NVarChar, 200).Value = location;
var tempParameter = command.Parameters.Add("@temp", SqlDbType.Decimal);
tempParameter.Precision = 6;
tempParameter.Scale = 2;
tempParameter.Value = temp.Value;
var humParameter = command.Parameters.Add("@hum", SqlDbType.Decimal);
humParameter.Precision = 6;
humParameter.Scale = 2;
humParameter.Value = hum.Value;
await connection.OpenAsync();
await command.ExecuteNonQueryAsync();
return Results.Ok(new { message = "Success" });
});
app.Run();
Cài package: dotnet add package Microsoft.Data.SqlClient. Đặt chuỗi kết nối bằng biến môi trường ConnectionStrings__DefaultConnection.
PythonFlask + pyodbc Xem code
import ipaddress
import os
from decimal import Decimal, InvalidOperation
import pyodbc
from flask import Flask, jsonify, request
app = Flask(__name__)
@app.get("/api/sensor")
def receive_sensor_data():
ip = request.args.get("ip", "").strip()
location = request.args.get("location", "").strip()
device_name = request.args.get("deviceName", "").strip()
try:
ipaddress.ip_address(ip)
temp = Decimal(request.args.get("temp", ""))
hum = Decimal(request.args.get("hum", ""))
except (ValueError, InvalidOperation):
return jsonify(message="Invalid numeric value or IP address"), 400
if not location or not device_name or hum < 0 or hum > 100:
return jsonify(message="Invalid or missing parameters"), 400
sql = """
INSERT INTO STF_TempHum_Data
(sensor_name, ip_address, location, temp, hum)
VALUES (?, ?, ?, ?, ?)
"""
try:
with pyodbc.connect(os.environ["DB_CONNECTION_STRING"]) as connection:
cursor = connection.cursor()
cursor.execute(sql, device_name, ip, location, temp, hum)
connection.commit()
except pyodbc.Error as error:
app.logger.exception("Database error: %s", error)
return jsonify(message="Database error"), 500
return jsonify(message="Success"), 200
if __name__ == "__main__":
app.run(host="0.0.0.0", port=5000)
Cài thư viện: pip install flask pyodbc. Đặt chuỗi ODBC trong biến môi trường DB_CONNECTION_STRING.
JavaSpring Boot + JdbcTemplate Xem code
package com.example.sensorapi;
import java.math.BigDecimal;
import java.util.Map;
import org.springframework.dao.DataAccessException;
import org.springframework.http.ResponseEntity;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping("/api")
public class SensorController {
private final JdbcTemplate jdbcTemplate;
public SensorController(JdbcTemplate jdbcTemplate) {
this.jdbcTemplate = jdbcTemplate;
}
@GetMapping("/sensor")
public ResponseEntity<Map<String, String>> receive(
@RequestParam String ip,
@RequestParam BigDecimal temp,
@RequestParam BigDecimal hum,
@RequestParam String location,
@RequestParam String deviceName) {
if (ip.isBlank()
|| location.isBlank()
|| deviceName.isBlank()
|| hum.compareTo(BigDecimal.ZERO) < 0
|| hum.compareTo(new BigDecimal("100")) > 0) {
return ResponseEntity.badRequest()
.body(Map.of("message", "Invalid or missing parameters"));
}
String sql = """
INSERT INTO STF_TempHum_Data
(sensor_name, ip_address, location, temp, hum)
VALUES (?, ?, ?, ?, ?)
""";
try {
jdbcTemplate.update(
sql,
deviceName,
ip,
location,
temp,
hum
);
} catch (DataAccessException exception) {
return ResponseEntity.internalServerError()
.body(Map.of("message", "Database error"));
}
return ResponseEntity.ok(Map.of("message", "Success"));
}
}
Dùng các dependency spring-boot-starter-web, spring-boot-starter-jdbc và mssql-jdbc. Cấu hình bằng DB_URL, DB_USER, DB_PASSWORD.
Node.jsExpress + mssql Xem code
const express = require("express");
const net = require("node:net");
const sql = require("mssql");
const app = express();
const poolPromise = sql.connect({
server: process.env.DB_SERVER,
database: process.env.DB_NAME,
user: process.env.DB_USER,
password: process.env.DB_PASSWORD,
options: {
encrypt: process.env.DB_ENCRYPT === "true",
trustServerCertificate: process.env.DB_TRUST_CERT === "true"
}
});
app.get("/api/sensor", async (request, response) => {
const { ip, temp, hum, location, deviceName } = request.query;
const tempValue = Number(temp);
const humValue = Number(hum);
if (net.isIP(ip) === 0
|| !Number.isFinite(tempValue)
|| !Number.isFinite(humValue)
|| humValue < 0
|| humValue > 100
|| typeof location !== "string"
|| typeof deviceName !== "string"
|| !location.trim()
|| !deviceName.trim()) {
return response.status(400).json({
message: "Invalid or missing parameters"
});
}
try {
const pool = await poolPromise;
await pool.request()
.input("sensor_name", sql.NVarChar(100), deviceName.trim())
.input("ip_address", sql.VarChar(45), ip)
.input("location", sql.NVarChar(200), location.trim())
.input("temp", sql.Decimal(6, 2), tempValue)
.input("hum", sql.Decimal(6, 2), humValue)
.query(`
INSERT INTO STF_TempHum_Data
(sensor_name, ip_address, location, temp, hum)
VALUES
(@sensor_name, @ip_address, @location, @temp, @hum)
`);
return response.json({ message: "Success" });
} catch (error) {
console.error("Database error", error);
return response.status(500).json({ message: "Database error" });
}
});
app.listen(process.env.PORT || 3000, () => {
console.log("Sensor API is running");
});
Cài thư viện: npm install express mssql. Cấu hình DB_SERVER, DB_NAME, DB_USER và DB_PASSWORD.
Gợi ý thêm: Node.js/Express được bổ sung vì rất phổ biến cho API và IoT. Go cũng phù hợp nếu cần một service nhẹ, chạy độc lập với hiệu năng cao.