目錄
- 前言
- 硬體選擇
- 二、使用步驟
- 獲取代碼
- 設備控制命令:
- 設備和協議初始化流程:
- 配置設備資訊
- 回呼函式注冊
- 資料獲取與上報流程
- 總結
前言
做了這么多傳感器都是自己玩,這次家里人看不下去了,非得讓我整一個紫外線傳感器,出門前看看紫外線強度(嚴正宣告:我不是個單身狗!!!(???)?)我看了一下網上還真有合適的模塊,于是就整了一個,這次我們就來做一個智能紫外線傳感器,
硬體選擇
萬能不變,便宜好用的(其實最近發現好像也沒這么好用,但是確實便宜)的安信可 ESP32S ,
紫外線傳感器選擇的是微雪的數字UV紫外線傳感器 UV Sensor C,42塊錢有點小貴QWQ,但是可以直接獲取紫外線強度,不需要自己用模擬量算了,回應波長在280-430nm,官方資料也很完善齊全,

以及我們設備的外置思考回路 - 翼輝 Spirit 1 邊緣計算機,
二、使用步驟
獲取代碼
為了方便講解邏輯,我會打亂代碼的順序可能還會進行裁剪,要是想直接拿代碼跑的朋友可以直接去 靈感桌面的秘密寶庫 獲取代碼,或者直接 clone:
https://gitee.com/inspiration-desktop/DEV-lib-arduino.git
下載或者 clone代碼后這次用到的是這個四個檔案夾:

cjson:我移植的 cjson 庫,就是標準的 cjson 庫,放到 arduino 安裝目錄下的 libraries 檔案夾里,百度一下 cjson 的函式使用就行了,
libsddc:是我移植自官方的SDDC庫和自己寫的 SDK,也是放入 libraries 檔案夾里就行,里面是 SDDC 協議的處理函式,我們不用管,
Waveshare_UV_C: 是微雪官方提供的語音播報模塊的庫,不過這個庫有一點點不同,是給 AVR 架構的芯片做的,編譯的時候會彈出一個警告:

不過我看了一下庫里面的內容,除了一個好像沒有用上的 INT_PIN 定義,其他的應該都能正常使用,
另外在加載庫的時候需要選擇 Waveshare:

demo 檔案夾里面就是我們各種傳感器的 demo 代碼了:

紅圈的 LTR390UV_sddc_sdk_demo檔案夾里面就是我們代碼,點進去就能看見 LTR390UV_sddc_sdk_demo.ino 檔案,雙擊檔案會自動啟動 arduino-IDE 打開代碼,在工具 -> 埠 選擇對應的 COM 口然后點擊上傳就可以把代碼燒錄到板子里:

具體 arduino 使用教程可以看我之前的文章 arduino開發指導 和 手把手帶你 arduino 開發:基于ESP32S 的第一個應用-紅外測溫槍(帶引腳圖)
設備控制命令:
通過 Spirit 1 的應用程式或者嗅探器 向傳感器設備發送的命令:
獲取紫外線強度資料
{
"method": "get",
"obj": ["UV"]
}
設備和協議初始化流程:
基于官方 demo 寫的不需要做什么修改,主要是設備初始化,管腳配置,和協議初始化部分,
/*
* 初始化傳感器
*/
void sensor_init()
{
// 初始化I2C
if(LTR390_Init() != 0)
{
Serial.print("LTR390 init err!!!");
while(1);
}
LTR390_SetIntVal(5, 20);
pinMode(INT_OUT, INPUT);
// 創建傳感器任務,周期性傳感器的資料并發送給 EdgerOS
xTaskCreate(UV_sensor_task, "UV_sensor_task", ESP_TASK_STACK_SIZE, NULL, ESP_TASK_PRIO, NULL);
}
void setup() {
byte mac[6];
Serial.begin(115200);
Serial.setDebugOutput(true);
Serial.println();
sensor_init();
// 清除一下按鍵狀態機的狀態
button.reset();
// 創建按鍵掃描執行緒,長按 IO0 按鍵,松開后ESP32 將會進入 SmartConfig 模式
sddc_printf("長按按鍵進入 Smartconfig...\n");
button.attachLongPressStop(esp_io0_key_task);
xTaskCreate(esp_tick_task, "button_tick", ESP_TASK_STACK_SIZE, NULL, ESP_TASK_PRIO, NULL);
// 啟動 WiFi 并且連接網路
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED)
{
delay(500);
Serial.print(".");
}
// 獲取并列印 IP 地址
Serial.println("");
Serial.println("WiFi connected");
Serial.print("'ip :");
Serial.print(WiFi.localIP());
Serial.println("' to connect");
// sddc協議初始化
sddc_lib_main(&sys_cfg);
// 獲取并列印網卡 mac 地址
WiFi.macAddress(mac);
sddc_printf("MAC addr: %02x:%02x:%02x:%02x:%02x:%02x\n",
mac[5], mac[4], mac[3], mac[2], mac[1], mac[0]);
// 使用網卡 mac 地址設定設備唯一標識 UID
sddc_set_uid(G_sddc, mac);
}
void loop() {
// 運行 SDDC 協議回圈
while (1)
{
sddc_printf("SDDC running...\n");
sddc_run(G_sddc);
sddc_printf("SDDC quit!\n");
}
// 銷毀 SDDC 協議
sddc_destroy(G_sddc);
}
配置設備資訊
這部分代碼可以配置 WiFi 名字和 WiFi 密碼,要使用的引腳,并且配置設備在 Spirit 1 上顯示的資訊:
#define SDDC_CFG_PORT 680U // SDDC 協議使用的埠號
#define PIN_INPUT 0 // 選擇 IO0 進行控制
#define ESP_TASK_STACK_SIZE 4096
#define ESP_TASK_PRIO 25
#define INT_OUT 14 // 選擇 IO14 中斷輸出
static const char* ssid = "EOS-Tenda"; // WiFi 名
static const char* password = "1234567890"; // WiFi 密碼
static double UV;
OneButton button(PIN_INPUT, true);
/*
* 當前設備的資訊定義
*/
DEV_INFO dev_info = {
.name = "紫外線感器",
.type = "device.UV",
.excl = SDDC_FALSE,
.desc = "ESP-32S + LTR390UV",
.model = "IDUV01B",
.vendor = "inspiration-desktop",
};
/*
* 系統注冊物件匯聚
*/
SDDC_CONFIG_INFO sys_cfg = {
.token = "1234567890", // 設備密碼
.devinfo = &dev_info,
.io_dev_reg = io_dev,
.io_dev_reg_num = ARRAY_SIZE(io_dev),
.num_dev_reg = num_dev,
.num_dev_reg_num = ARRAY_SIZE(num_dev),
.state_get_reg = dev_state_get_reg,
.state_get_reg_num = ARRAY_SIZE(dev_state_get_reg),
.dis_dev_reg = dis_dev,
.dis_dev_num = ARRAY_SIZE(dis_dev),
};
回呼函式注冊
這是收到命令后回呼函式注冊的位置,在這里注冊的函式才能被 SDK 正確的呼叫,執行正確的動作,
具體 SDK 的決議可以參考 同人逼死官方系列!基于sddc 協議的SDK框架 sddc_sdk_lib 決議 和 同人逼死官方系列!從 DDC 嗅探器到 sddc_sdk_lib 的資料決議
/*
* 數字量設備物件函式與處理方法注冊
*/
NUM_DEV_REGINFO num_dev[] = {
// {"set_num_demo", demo}, // 字串為輸入命令,demo為命令處理函式
};
/*
* 顯示設備物件函式與處理方法注冊
*/
DIS_DEV_REGINFO dis_dev[] = {
// {"set_dis_demo", demo}, // 字串為輸入命令,demo為命令處理函式
};
/*
* IO設備物件設定函式與處理方法注冊
*/
IO_DEV_REGINFO io_dev[] = {
// {"set_io_demo", demo}, // 字串為輸入命令,demo為命令處理函式
};
/*
* 系統物件狀態獲取注冊
*/
DEV_STATE_GET dev_state_get_reg[] = {
{"UV", DEV_NUM_TYPE, single_get_sensor},
// {"demo", DEV_NUM_TYPE, num_get_demo}, // demo為輸入命令,字串為命令處理函式
// {"demo", DEV_IO_TYPE, io_get_demo},
// {"demo", DEV_DISPLAY_TYPE, dis_get_demo},
};
資料獲取與上報流程
這里是我們自己撰寫的處理流程 ,可以根據你的需求自己更改,收到 set 或者 get 后根據前面的注冊的函式,進入對應的處理函式,
static void UV_sensor_task(void *arg)
{
double val = 0;
while(1)
{
val = LTR390_UVS();
UV = val;
if(digitalRead(8) == 1){
Serial.print("UV = ");
Serial.println(UV);
}
delay(300);
}
}
/*
* 單次獲取資料
*/
sddc_bool_t single_get_sensor(char *objvalue, int value_len)
{
double value = https://www.cnblogs.com/inspiration-desktop/p/UV;
snprintf(objvalue, value_len,"%lf", value);
return SDDC_TRUE;
}
總結
剛才拿去試了一下,外面紫外線強度居然有9!我查了一下:
當紫外線為最弱(0 ~ 2級)時對人體無太大影響,外出時戴上太陽帽即可;紫外線達3 ~ 4級時,外出時除戴上太陽帽外還需備太陽鏡,并在身上涂上防曬霜,以避免皮膚受到太陽輻射的危害;當紫外線強度達到5 ~ 6級時,外出時必須在陰涼處行走;紫外線達7 ~ 9級時,在上午10時至下午4時這段時間最好不要到沙灘場地上曬太陽;當紫外線指數大于等于10時,應盡量避免外出,因為此時的紫外線輻射極具有傷害性,
以前完全沒有注意過!沒到我們這紫外線強度這么高!
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/343941.html
標籤:其他
上一篇:非華為電腦開啟多屏協同
