技術背景
在日常生活中,我們常見的電子測溫器有較大的弊端,首先大部分電子測溫計都無法自動保存儲存數據,無法得知過去幾天的溫度與濕度。
同時常見的電子測溫計會始終處于工作狀態,LCD始終亮屏功耗較高。我們組設計的無接觸式自動測溫器可以很好的解決以上問題。同時在以低功耗消耗的同時,仍然以較高精度地對溫度和濕度完成測量。
除此之外,我們設計的電子測溫器仍然具有超過溫度閾值自動報警引起注意、獲取實時天氣系統API等功能,實現了更多的功能完善。
技術目標
我們組設計的目標是自動化零接觸式溫濕度傳感器,它會始終測量空氣中的溫度和濕度,同時將其數據上傳至OneNET云平臺并進行儲存,同時會以折線圖等形式數據化展現,便于處理。
同時他具有自動檢測空氣溫度,若溫度超過設定閾值便會報警的功能。同時他會自動檢測和人們的距離,若沒有人靠近,LCD會處于息屏狀態減少消耗,只是在后臺記錄數據。若人們靠近,LCD會展示測量的溫度和濕度,便于觀察。
我們也獲得了天氣API,得到廣州市的實時天氣信息,可以將室外的溫濕度與室內的溫濕度進行比較。
AP3216接近傳感器測接近值,AHT20溫濕度線程將溫度與濕度數據傳給240x240并行LCD線程.
同時傳給OneNET 云平臺接入線程,然后將溫度數據傳給蜂鳴器線程。接近傳感器線程返回值傳遞給240x240 并行LCD線程。
LCD和配置顯示:
如下圖所示,星火1號開發板中裝載有240*240的LCD顯示屏。顯示屏的驅動芯片是ST7789 v3,通信接口8080并口。通過 fsms 模擬出驅動時序和單片機進行通訊。
在main函數里,通過調用已經封裝哈的LCD API函數,進行清屏操作。通過將背景刷為白色和黑色,進行屏幕的亮熄屏操作,同時在LCD上顯示溫濕度傳感器所測量到的數值。
配置ap3216c進行距離檢測
單片機通過I2C scl 、 I2C sda 對ap3216c 發送命令、讀取數據等。
我們先初始傳感器ap3216c,傳入參數i2c1為該傳感器掛載的i2c總線的名稱;然后將返回設備對象分別傳入獲取的ps函數,獲得測量的ps值。通過最后串口返回的ps值大小代表是否有人靠近,如果靠近便會亮屏顯示數據,未靠近便會息屏節省功耗。
收集數據并可視化
連接網絡
先通過rw007軟件包使用 SPI 與主機通信,在終端輸入wifi join的指令,將星火一號開發板接入網絡。
獲取溫度濕度數據
將aht10采集到的溫濕度數據信息同步。
將數據上傳至云平臺
OneNET平臺將會收錄數據并形成折線圖,以便用戶看到溫度濕度的變化趨勢。
將數據直觀展示
為了更方便的讓用戶查詢溫濕度信息,將數據可視化的展示在頁面上,并且實時更新。這樣用戶就可以遠程查詢溫濕度。
查詢實時天氣
從網頁獲取API密匙,并生成API接口地址。
連網后,通過軟件代碼用API獲取實時天氣數據。
設計心得
我們通過這次實訓學習到了很多知識:
首先是在前面5天,我們了解了嵌入式操作系統的應用與發展,學習了rt-thread的基本知識,初步明白了線程的運行原理和通過線程來控制系統的運行。
因為是第一次接觸這些知識,我們遇到了很多的困難,但因為有樂于幫助的老師和同學,困難都被一一解決。
同時我們還明白了借助已有的軟件包和代碼資源來實現功能的重要性,畢竟在短時間內想自己寫出強大而復雜的程序對于我們初學者而言是極其困難的。
除此之外,體會最深的就是不斷練習才是掌握這門技術最有效的方法,即使課上聽懂了的內容也要課后自己練習,只有當工程運行成功的那一刻,才算是真正的了解。
以下是我們設計的代碼:
#include
#include
#include
#include "aht10.h"
#include "ap3216c.h"
#include
#include
#define DBG_TAG "main"
#define DBG_LVL DBG_LOG
#include
/* 配置 KEY 輸入引腳 /
#define PIN_KEY1 GET_PIN(C, 1) // PC1: KEY1 --> KEY
#define PIN_WK_UP GET_PIN(C, 5) // PC5: WK_UP --> KEY
/ 配置蜂鳴器引腳 /
#define PIN_BEEP GET_PIN(B, 0) // PA1: BEEP --> BEEP (PB1)
/ 中斷回調 */
void irq_callback(void args)
{
rt_uint32_t sign = (rt_uint32_t) args;
switch (sign)
{
case PIN_WK_UP :
rt_pin_write(PIN_BEEP,PIN_HIGH);
LOG_D("WK_UP interrupt. beep on.");
break;
case PIN_KEY1 :
rt_pin_write(PIN_BEEP,PIN_LOW);
LOG_D("KEY1 interrupt. beep off.");
break;
default:
LOG_E("error sign= %d !", sign);
break;
}
}
int main(void)
{
/ 設置按鍵引腳為輸入模式 /
rt_pin_mode(PIN_KEY1, PIN_MODE_INPUT_PULLUP);
rt_pin_mode(PIN_WK_UP, PIN_MODE_INPUT_PULLUP);
/ 設置蜂鳴器引腳為輸出模式 /
rt_pin_mode(PIN_BEEP, PIN_MODE_OUTPUT);
/ 設置按鍵中斷模式與中斷回調函數 */
rt_pin_attach_irq(PIN_KEY1, PIN_IRQ_MODE_FALLING, irq_callback, (void *) PIN_KEY1);
rt_pin_attach_irq(PIN_WK_UP, PIN_IRQ_MODE_FALLING, irq_callback, (void ) PIN_WK_UP);
/ 使能中斷 /
rt_pin_irq_enable(PIN_KEY1, PIN_IRQ_ENABLE);
rt_pin_irq_enable(PIN_WK_UP, PIN_IRQ_ENABLE);
float humidity, temperature;
aht10_device_t dev;
/ 總線名稱 */
const char *i2c_bus_name = "i2c3";
int count = 0;
ap3216c_device_t dev1;
const char i2c_bus_name1 = "i2c2";
/ 等待傳感器正常工作 /
rt_thread_mdelay(2000);
/ 初始化 aht10 /
dev = aht10_init(i2c_bus_name);
if (dev == RT_NULL)
{
LOG_E(" The sensor initializes failure");
return 0;
}
/ 初始化 ap3216c /
dev1 = ap3216c_init(i2c_bus_name1);
if (dev1 == RT_NULL)
{
LOG_E("The sensor initializes failure.");
return 0;
}
while (count++ < 100)
{
rt_uint16_t ps_data;
/ 讀接近感應值 /
ps_data = ap3216c_read_ps_data(dev1);
if (ps_data == 0)
{
LOG_D("object is not proximity of sensor.");
}
else
{
LOG_D("current ps data : %d.", ps_data);
}
/ 讀取濕度 /
humidity = aht10_read_humidity(dev);
/ 讀取溫度 /
temperature = aht10_read_temperature(dev);
rt_thread_mdelay(1000);
if(temperature>35)
{
rt_pin_write(PIN_BEEP, PIN_HIGH);
}
if(ps_data>=10)
{
lcd_clear(WHITE);
lcd_show_image(0, 0, 240, 69, image_rttlogo);
/ set the background color and foreground color /
lcd_set_color(WHITE, BLACK);
/ show some string on lcd /
lcd_show_string(10, 69, 24, "Temperature:");
lcd_show_string(10, 69+24, 24, "Humidity:");
lcd_show_num(170,69,temperature,4,24);
lcd_show_num(170,69+24,humidity,7,24);
/ draw a line on lcd /
lcd_draw_line(0, 69 + 16 + 24 + 32, 240, 69 + 16 + 24 + 32);
/ draw a concentric circles */
lcd_draw_point(120, 194);
for (int i = 0; i < 46; i += 4)
{
lcd_draw_circle(120, 194, i);
}
}
else
lcd_clear(BLACK);
}
return 0;
}
評論
查看更多